4.9. 运行自定义调度程序
您可以与默认调度程序一起运行多个自定义调度程序,并配置要用于每个 pod 的调度程序。
支持在 OpenShift Container Platform 中使用自定义调度程序,但红帽不直接支持自定义调度程序的功能。
有关如何配置默认调度程序的详情,请参阅使用调度程序控制 pod 放置。
要使用特定的调度程序调度给定 pod,在该 Pod
的规格中指定调度程序的名称。
4.9.1. 部署自定义调度程序
要在集群中包含自定义调度程序,请在部署中包含自定义调度程序的镜像。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 您有一个调度程序二进制文件。
注意有关如何创建调度程序二进制文件的信息超出了本文档的讨论范围。例如,请参阅 Kubernetes 文档中的配置多个调度程序。请注意,红帽不支持自定义调度程序的实际功能。
- 您已创建了包含调度程序二进制文件的镜像,并将其推送到 registry。
流程
创建包含调度程序配置文件的配置映射的文件:
Example
scheduler-config-map.yaml
apiVersion: v1 kind: ConfigMap metadata: name: scheduler-config namespace: kube-system 1 data: scheduler-config.yaml: | 2 apiVersion: kubescheduler.config.k8s.io/v1beta2 kind: KubeSchedulerConfiguration profiles: - schedulerName: custom-scheduler 3 leaderElection: leaderElect: false
创建配置映射:
$ oc create -f scheduler-config-map.yaml
创建一个包含自定义调度程序部署资源的文件:
custom-scheduler.yaml
文件示例apiVersion: v1 kind: ServiceAccount metadata: name: custom-scheduler namespace: kube-system 1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: custom-scheduler-as-kube-scheduler subjects: - kind: ServiceAccount name: custom-scheduler namespace: kube-system 2 roleRef: kind: ClusterRole name: system:kube-scheduler apiGroup: rbac.authorization.k8s.io --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: custom-scheduler-as-volume-scheduler subjects: - kind: ServiceAccount name: custom-scheduler namespace: kube-system 3 roleRef: kind: ClusterRole name: system:volume-scheduler apiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1 kind: Deployment metadata: labels: component: scheduler tier: control-plane name: custom-scheduler namespace: kube-system 4 spec: selector: matchLabels: component: scheduler tier: control-plane replicas: 1 template: metadata: labels: component: scheduler tier: control-plane version: second spec: serviceAccountName: custom-scheduler containers: - command: - /usr/local/bin/kube-scheduler - --config=/etc/config/scheduler-config.yaml 5 image: "<namespace>/<image_name>:<tag>" 6 livenessProbe: httpGet: path: /healthz port: 10259 scheme: HTTPS initialDelaySeconds: 15 name: kube-second-scheduler readinessProbe: httpGet: path: /healthz port: 10259 scheme: HTTPS resources: requests: cpu: '0.1' securityContext: privileged: false volumeMounts: - name: config-volume mountPath: /etc/config hostNetwork: false hostPID: false volumes: - name: config-volume configMap: name: scheduler-config
在集群中创建部署资源:
$ oc create -f custom-scheduler.yaml
验证
验证调度程序 pod 是否正在运行:
$ oc get pods -n kube-system
自定义调度程序 pod 列为
Running
:NAME READY STATUS RESTARTS AGE custom-scheduler-6cd7c4b8bc-854zb 1/1 Running 0 2m
4.9.2. 使用自定义调度程序部署 pod
在集群中部署自定义调度程序后,您可以将 pod 配置为使用该调度程序,而不是默认调度程序。
每个调度程序具有集群中资源的单独视图。因此,每个调度程序应在自己的一组节点上运行。
如果两个或多个调度程序在同一节点上运行,它们可能会相互干扰,并在同一个节点上调度多个 pod,而不是用于的可用资源。在这种情况下,Pod 可能会因为资源不足而被拒绝。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 - 自定义调度程序已在集群中部署。
流程
如果您的集群使用基于角色的访问控制 (RBAC),将自定义调度程序名称添加到
system:kube-scheduler
集群角色。编辑
system:kube-scheduler
集群角色:$ oc edit clusterrole system:kube-scheduler
将自定义调度程序的名称添加到
leases
和endpoints
的resourceNames
列表中:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "true" creationTimestamp: "2021-07-07T10:19:14Z" labels: kubernetes.io/bootstrapping: rbac-defaults name: system:kube-scheduler resourceVersion: "125" uid: 53896c70-b332-420a-b2a4-f72c822313f2 rules: ... - apiGroups: - coordination.k8s.io resources: - leases verbs: - create - apiGroups: - coordination.k8s.io resourceNames: - kube-scheduler - custom-scheduler 1 resources: - leases verbs: - get - update - apiGroups: - "" resources: - endpoints verbs: - create - apiGroups: - "" resourceNames: - kube-scheduler - custom-scheduler 2 resources: - endpoints verbs: - get - update ...
创建
Pod
配置并在schedulerName
参数中指定自定义调度程序的名称:custom-scheduler-example.yaml
文件示例apiVersion: v1 kind: Pod metadata: name: custom-scheduler-example labels: name: custom-scheduler-example spec: schedulerName: custom-scheduler 1 containers: - name: pod-with-second-annotation-container image: docker.io/ocpqe/hello-pod
- 1
- 要使用的自定义调度程序的名称,本例中为
custom-scheduler
。如果没有提供调度程序名称,pod 会自动使用默认调度程序来调度。
创建 pod:
$ oc create -f custom-scheduler-example.yaml
验证
输入以下命令检查 pod 是否已创建:
$ oc get pod custom-scheduler-example
custom-scheduler-example
pod 在输出中列出:NAME READY STATUS RESTARTS AGE custom-scheduler-example 1/1 Running 0 4m
输入以下命令检查自定义调度程序是否已调度 pod:
$ oc describe pod custom-scheduler-example
调度程序
custom-scheduler
如以下截断的输出所示:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled <unknown> custom-scheduler Successfully assigned default/custom-scheduler-example to <node_name>