分配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依然可以调度