
点击上方 云原生CTO,选择设为星标
优质文章,每日送达

----------------------------------------------
🌛 "错的人会走散,对的人迟早会遇见"

「【只做懂你de云原生干货知识共享】」
使用Trimaran在Kubernetes中进行实时负载感知调度
为什么在Kubernetes中进行调度效率低下?
Kubernetes中的本机调度由kube-scheduler服务处理。通过声明性资源模型定义Pod的资源利用,并且kube-scheduler与kubelet服务一起使用以提供pod QoS保证。该模型可能导致群集资源的利用率低下和浪费,因为在调度决策中不考虑活动节点的资源利用率。此外,用户在定义pod系列规格时很难预测其pod系列的正确使用值。
Trimaran Scheduler
从Kubernetes 1.15开始,调度程序已变得灵活多变,可以使用Scheduling Framework进行自定义。(PayPal)的团队利用这一优势开发了Trimaran调度程序,该调度程序可处理活动节点利用率值,以有效利用集群资源并节省成本。并且还开发了TargetLoadPacking插件和Load Watcher并将其贡献给了开源社区。
TargetLoadPacking插件
在调度框架中有多个扩展点,我们可以将其挂钩起来进行定制。TargetLoadPacking插件扩展了分数扩展点,该点负责对节点进行评分,以便在每个调度周期中调度pod。我们的算法是标准bin pack算法的混合变体,该算法通过从最适合到最不适合的方式,支持在目标利用率周围的节点上打包pod。换句话说,给定x%的目标利用率,插件更喜欢接近x%的节点。目前支持CPU利用率,并且还可以扩展到多个资源。

部署教程
本教程将指导您在任何K8s设置(包括Minikube,Kind等)中部署Trimaran调度程序。Trimaran取决于要运行的负载监视程序服务,而后者又取决于要从中加载度量标准的度量标准提供程序。当前,受支持的提供程序是Kubernetes Metrics Server(默认)和SignalFx,目前正在进行工作以增加对Prometheus的支持。在部署负载监视程序之前,请确保在K8s群集中部署要使用的指标提供程序。
请注意,在撰写本文时,您的Kubernetes版本至少应为v1.19.0。
作为Trimaran调度程序部署的一部分,我们将为两个服务(配置了TargetLoadPacking插件的kube-scheduler(trimaran镜像)和Load Watcher服务(load-watcher镜像))创建Docker镜像,并将它们作为单个pod进行部署。
load-watcher可以在此处找到构建Docker镜像的说明。
要构建trimaran图像,请首先构建kube-scheduler镜像,如下所示:
git clone https://github.com/kubernetes-sigs/scheduler-plugins.git
cd scheduler-plugins
env GOARCH=amd64 GOOS=linux go build -o kube-scheduler main.go
将以下Trimaran调度程序配置保存在中scheduler-config.yaml:
apiVersion: kubescheduler.config.k8s.io/v1beta1
kind: KubeSchedulerConfiguration
leaderElection:
leaderElect: false
clientConnection:
kubeconfig: "REPLACE_ME_WITH_KUBE_CONFIG_PATH"
profiles:
- schedulerName: trimaran
plugins:
score:
disabled:
- name: NodeResourcesBalancedAllocation
- name: NodeResourcesLeastAllocated
enabled:
- name: TargetLoadPacking
pluginConfig:
- name: TargetLoadPacking
args:
watcherAddress: http://127.0.0.1:2020
强烈建议禁用上述两个本机插件,以防止评分冲突
在上面克隆的存储库的根目录中创建一个包含以下内容的Dockerfile:
FROM golang:1.5-alpine
ADD ./kube-scheduler /usr/local/bin/kube-scheduler
ADD ./scheduler-config.yaml /home/scheduler-config.yaml
如下构建Docker镜像:
docker build -t trimaran .
docker tag trimaran:latest <your-docker-repo>:latest
docker push <your-docker-repo>
以下是Trimaran K8部署的YAML规范:
apiVersion: v1
kind: ServiceAccount
metadata:
name: trimaran
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: trimaran-as-kube-scheduler
subjects:
- kind: ServiceAccount
name: trimaran
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:kube-scheduler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: trimaran-as-volume-scheduler
subjects:
- kind: ServiceAccount
name: trimaran
namespace: kube-system
roleRef:
kind: ClusterRole
name: system:volume-scheduler
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: trimaran-extension-apiserver
namespace: kube-system
subjects:
- kind: ServiceAccount
name: trimaran
namespace: kube-system
roleRef:
kind: Role
name: extension-apiserver-authentication-reader
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
component: scheduler
tier: control-plane
name: trimaran
namespace: kube-system
spec:
selector:
matchLabels:
component: scheduler
tier: control-plane
replicas: 1
template:
metadata:
labels:
component: scheduler
tier: control-plane
version: second
spec:
serviceAccountName: trimaran
hostNetwork: true
containers:
- name: trimaran
command:
- /usr/local/bin/kube-scheduler
- --address=0.0.0.0
- --leader-elect=false
- --scheduler-name=trimaran
- --config=/home/scheduler-config.yaml
- -v=6
image: <replace-me>
imagePullPolicy: Always
resources:
requests:
cpu: '0.1'
securityContext:
privileged: false
volumeMounts:
- mountPath: /shared
name: shared
- name: load-watcher
command:
- /usr/local/bin/load-watcher
image: <replace-me>
imagePullPolicy: Always
volumes:
- name: shared
hostPath:
path: /tmp
type: Directory
将以上内容保存在名为“ trimaran-scheduler.yaml”的文件中,并使用以下命令进行部署:
kubectl apply -f trimaran-scheduler.yaml
对于要使用Trimaran调度程序进行调度的任何Pod,schedulerName需要trimaran使用相应Pod spec YAML文件中的值进行修改。下面是一个示例pod规范:
apiVersion: v1
kind: Pod
...
spec:
schedulerName: trimaran
containers:
- name: pod-with-annotation-container
...
验证是否已使用以下命令将Pod进行了调度,并且状态为“正在运行”。
kubectl describe pod
贡献
在Trimaran的工作有一些有趣的领域可以扩展。例如,多资源(CPU、内存、网络带宽等),用于利用率预测的ML/AI模型。
参考
https://medium.com/paypal-tech/real-load-aware-scheduling-in-kubernetes-with-trimaran-a8efe14d51e2
最后推荐一本非常有价值的书籍,我自己也在看,讲解的非常清晰透彻
这本书真的是深入挖掘了kubernetes生产化时间过程中所遇到的挑战和方案细节,帮你少走弯路的一本好书,经过这几年云原生技术的沉淀的积累,很多的企业都在使用这门技术,对于很多入门或是进行深入研究其真理的技术人员,帮助很大,如果你认真阅读你会中你可以学到ebay在生产上使用k8s多年总结的经验,增加你对此技术的深入理解,同样也是一本升职加薪的好帮手,对一些生产的疑问,你都可以在书中找到你的答案,现在点击下方即可获取。




