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 准入控制器:
使用以下方法之一配置 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
创建包含准入控制器信息的文件:
podNodeSelectorPluginConfig: clusterDefaultNodeSelector: "k3=v3" ns1: region=west,env=test,infra=fedora,os=fedora
然后,在 master 配置中引用该文件:
admissionConfig: pluginConfig: PodNodeSelector: location: <path-to-file>
注意如果项目没有指定节点选择器,则与该项目关联的 pod 将使用默认节点选择器(
clusterDefaultNodeSelector
)进行合并。
重启 OpenShift Container Platform 以使更改生效。
# master-restart api # master-restart controllers
创建包含
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=test
和infra=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 准入插件处理。创建在节点选择器中包含标签的 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
- 与项目标签匹配的节点选择器。
在项目中创建 pod:
# oc create -f pod.yaml --namespace=ns1
检查节点选择器标签是否已添加到 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 会在该处调度。