Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

16.5.4. 控制 Pod 放置到项目

Pod Node Selector 准入控制器允许您将 pod 强制到与特定项目关联的节点上,并防止 pod 调度到这些节点上。

Pod Node Selector 准入控制器使用项目中的标签和在 pod 中指定的节点选择器决定 pod 放置的位置。只有 pod 中的节点选择器与项目中的标签匹配时,才会将新 pod 放置到与项目关联的节点上。

在 pod 创建后,节点选择器合并到 pod 中,以便 pod 规格包括最初包含在规格中的标签以及节点选择器中的任何新标签。以下示例说明了合并效果。

Pod Node Selector 准入控制器还允许您创建在特定项目中允许的标签列表。此列表充当 白名单,使开发人员能够知道可在项目中使用哪些标签,并让管理员更好地控制集群中的标签。

激活 Pod Node Selector 准入控制器:

  1. 使用以下方法之一配置 Pod Node Selector 准入控制器和白名单:

    • 将以下内容添加到 master 配置文件 /etc/origin/master/master-config.yaml 中:

      admissionConfig:
        pluginConfig:
          PodNodeSelector:
            configuration:
              podNodeSelectorPluginConfig: 1
                clusterDefaultNodeSelector: "k3=v3" 2
                ns1: region=west,env=test,infra=fedora,os=fedora 3
      1
      添加 Pod Node Selector 准入控制器插件。
      2
      为所有节点创建默认标签。
      3
      在指定项目中创建允许的标签白名单。在这里,项目是 ns1,标签是后续的 key=value 对。
    • 创建包含准入控制器信息的文件:

      podNodeSelectorPluginConfig:
          clusterDefaultNodeSelector: "k3=v3"
           ns1: region=west,env=test,infra=fedora,os=fedora

      然后,在 master 配置中引用该文件:

      admissionConfig:
        pluginConfig:
          PodNodeSelector:
            location: <path-to-file>
      注意

      如果项目没有指定节点选择器,则与该项目关联的 pod 将使用默认节点选择器(clusterDefaultNodeSelector)进行合并。

  2. 重启 OpenShift Container Platform 以使更改生效。

    # master-restart api
    # master-restart controllers
  3. 创建包含 scheduler.alpha.kubernetes.io/node-selector 注解和标签的项目对象。

    apiVersion: v1
    kind: Namespace
    metadata
      name: ns1
      annotations:
        scheduler.alpha.kubernetes.io/node-selector: env=test,infra=fedora 1
    spec: {},
    status: {}
    1
    创建标签以匹配项目标签选择器的注释。此处的键/值标签是 env=testinfra=fedora
    注意

    使用 Pod Node Selector 准入控制器时,您无法使用 oc adm new-project <project-name> 来设置项目节点选择器。当您使用 oc adm new-project myproject --node-selector='type=user-node,region=<region> 命令设置项目节点选择器时,OpenShift Container Platform 会设置 openshift.io/node-selector 注解,该注解由 NodeEnv 准入插件处理。

  4. 创建在节点选择器中包含标签的 pod 规格,例如:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        name: hello-pod
      name: hello-pod
    spec:
      containers:
        - image: "docker.io/ocpqe/hello-pod:latest"
          imagePullPolicy: IfNotPresent
          name: hello-pod
          ports:
            - containerPort: 8080
              protocol: TCP
          resources: {}
          securityContext:
            capabilities: {}
            privileged: false
          terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      nodeSelector: 1
        env: test
        os: fedora
      serviceAccount: ""
    status: {}
    1
    与项目标签匹配的节点选择器。
  5. 在项目中创建 pod:

    # oc create -f pod.yaml --namespace=ns1
  6. 检查节点选择器标签是否已添加到 pod 配置中:

    get pod pod1 --namespace=ns1 -o json
    
    nodeSelector": {
     "env": "test",
     "infra": "fedora",
     "os": "fedora"
    }

    节点选择器合并到 pod 中,容器集应当调度到适当的项目中。

如果您创建了一个没有在项目规格中指定的标签的 pod,则 pod 不会被调度到该节点上。

例如,这里的标签 env: production 不在任何项目规格中:

nodeSelector:
 "env: production"
 "infra": "fedora",
 "os": "fedora"

如果有一个没有节点选择器注解的节点,则 pod 会在该处调度。