分配Pod到节点¶
可以约束一个Pod只运行在部分节点,或者优先运行在部分节点。有多种方式可以达成,并且建议都采用标签选择来决定。通常这种约束并不是必须的,调度器会自动进行和合理分布(例如,将pods分布跨节点,不会将pod分配到不合适的节点),但是有些情况下你需要更多地控制pod分布,例如pod分配到具有SSD的服务器,或者协调2个不同服务的pod在相同可用区域以便通讯。
nodeSelector¶
nodeSelector
是最简单的推荐节点选择约束。 nodeSelector
是PodSpec的一个字段,设置了一个 key-value 数据对映射。对于需要pod合理调度到一个节点,节点必须具有这个 key-value 数据对作为标签。
使用
kubectl get nodes
获取集群节点在节点上附加标签:
kubectl label nodes <node-name> <label-key>=<label-value>
举例,要设置一个 kubernetes-foo-node-1.c.a-robinson.internal
节点的标签 disktype=ssd
使用如下命令:
kubectl label nodes kubernetes-foo-node-1.c.a-robinson.internal disktype=ssd
在pod配置中添加
nodeSelector
字段:apiVersion: v1 kind: Pod metadata: name: nginx labels: env: test spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent nodeSelector: disktype: ssd
上述配置中:
nodeSelector:
disktype: ssd
就是使得pod创建选择 disktype=ssd
标签的节点进行分布。
内建的节点标签¶
除了你添加的节点标签,Kubernetes节点有标准标签集:
kubernetes.io/hostname
failure-domain.beta.kubernetes.io/zone
failure-domain.beta.kubernetes.io/region
beta.kubernetes.io/instance-type
kubernetes.io/os
kubernetes.io/arch
节点隔离/限制¶
对节点对象添加标签可以指定节点或一组节点。这样可以确保特定的pod只运行在一些隔离的、安全的或者受监管的节点。当使用标签时,强烈建议不要通过节点的kubelet进程来修改所采用标签key,这样可以避免一个异常的kubelet自己设置节点标签,进而影响调度器调度。
使用 NodeRestriction
admission插件可以防止kubelets设置或修改具有 node-restriction.kubernetes.io/
开头的节点标签:
确保使用了 Node authorizer ,并且激活了
NodeRestriction admission plugin
在标签前面加上
node-restriction.kubernetes.io/
前缀,并使用这些标签,例如:example.com.node-restriction.kubernetes.io/fips=true example.com.node-restriction.kubernetes.io/pci-dss=true
亲和性(affinity)和抗亲和性(anti-affinity)¶
nodeSelector
提供了一个非常简单的节点选择的方法。而 affinity/anti-afinity 功能,则极大扩展了限制类型。
主要增强点有:
语言更具有表现性(expressive)
你可以标记规则是软性/优选的,而不是硬要求,这样即使调度器不能满足,pod依然可以调度