暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用Trimaran在Kubernetes中进行实时负载感知调度

云原生CTO 2021-04-14
2827


点击上方 云原生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多年总结的经验,增加你对此技术的深入理解,同样也是一本升职加薪的好帮手,对一些生产的疑问,你都可以在书中找到你的答案,现在点击下方即可获取。



文章转载自云原生CTO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论