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=fedora3 创建包含准入控制器信息的文件:
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=fedora1 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 会在该处调度。