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 会在该处调度。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.