4.9. 运行自定义调度程序


您可以与默认调度程序一起运行多个自定义调度程序,并配置要用于每个 pod 的调度程序。

重要

支持在 OpenShift Container Platform 中使用自定义调度程序,但红帽不直接支持自定义调度程序的功能。

有关如何配置默认调度程序的详情,请参阅使用调度程序控制 pod 放置

要使用特定的调度程序调度给定 pod,在该 Pod 的规格中指定调度程序的名称

4.9.1. 部署自定义调度程序

要在集群中包含自定义调度程序,请在部署中包含自定义调度程序的镜像。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 您有一个调度程序二进制文件。

    注意

    有关如何创建调度程序二进制文件的信息超出了本文档的讨论范围。例如,请参阅 Kubernetes 文档中的配置多个调度程序。请注意,红帽不支持自定义调度程序的实际功能。

  • 您已创建了包含调度程序二进制文件的镜像,并将其推送到 registry。

流程

  1. 创建包含调度程序配置文件的配置映射的文件:

    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

    1
    此流程使用 kube-system 命名空间,但您可以使用自己选择的命名空间。
    2
    当此流程稍后定义 Deployment 资源时,您可以使用 --config 参数将此文件传递给调度程序命令。
    3
    为自定义调度程序定义调度程序配置集。在 Pod 配置中定义 schedulerName 时使用此调度程序名称。
  2. 创建配置映射:

    $ oc create -f scheduler-config-map.yaml
  3. 创建一个包含自定义调度程序部署资源的文件:

    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

    1 2 3 4
    此流程使用 kube-system 命名空间,但您可以使用自己选择的命名空间。
    5
    自定义调度程序的命令可能需要不同的参数。
    6
    指定您为自定义调度程序创建的容器镜像。
  4. 在集群中创建部署资源:

    $ 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 角色的用户访问集群。
  • 自定义调度程序已在集群中部署。

流程

  1. 如果您的集群使用基于角色的访问控制 (RBAC),将自定义调度程序名称添加到 system:kube-scheduler 集群角色。

    1. 编辑 system:kube-scheduler 集群角色:

      $ oc edit clusterrole system:kube-scheduler
    2. 将自定义调度程序的名称添加到 leasesendpointsresourceNames 列表中:

      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
      ...
      1 2
      本例使用 custom-scheduler 作为自定义调度程序名称。
  2. 创建 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 会自动使用默认调度程序来调度。
  3. 创建 pod:

    $ oc create -f custom-scheduler-example.yaml

验证

  1. 输入以下命令检查 pod 是否已创建:

    $ oc get pod custom-scheduler-example

    custom-scheduler-example pod 在输出中列出:

    NAME                       READY     STATUS    RESTARTS   AGE
    custom-scheduler-example   1/1       Running   0          4m
  2. 输入以下命令检查自定义调度程序是否已调度 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>

4.9.3. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.