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 准入控制器:
使用以下方法之一配置 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 会在该处调度。