Kubernetes Affinity

Node

add label to Node

1
kubectl label nodes <node-name> <label-key>=<label-value>

Affinity

亲和性/反亲和性是在Node上设置如何被Scheduler选择的规则一种方式。

  • 必需的规则(Required)

只有满足必需的规则的Pod才会被调度到特定的Node上。如果没有Node匹配条件(加上所有其他所有正常的条件,例如为Pod请求提供足够的可用资源),
否则Pod不会被调度。必需满足的规则在nodeAffinity的requiredDuringSchedulingIgnoredDuringExecution字段中指定。

例如,要求在多可用区域(Multiple Zones)的us-central1-a(GCE)区域中的节点上进行调度

1
2
3
4
5
6
7
8
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "failure-domain.beta.kubernetes.io/zone"
operator: In
values: ["us-central1-a"]

注意:如果修改为requiredDuringSchedulingRequiredDuringExecution,意味着一旦不满足节点亲和性规则,将从Node上驱逐不再匹配规则的Pod。

  • 首选的规则(Preferred)

首选规则意味着如果节点与规则匹配,则将优先选择它们,并且仅当没有优选节点可用时才选择非优选节点。可以选择使用首选规则,而不是通过必需规则强制将
Pod部署到GCE的us-central1-a区域中的节点上。

使用首选规则,则需指定preferredDuringSchedulingIgnoredDuringExecution:

1
2
3
4
5
6
7
8
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "failure-domain.beta.kubernetes.io/zone"
operator: In
values: ["us-central1-a"]

AntiAffinity

Node的反亲和性能够使用负操作符(NotIn, DoesNotExist等)来表示。

例如,禁止Pod被调度到us-central1-a的区域中

1
2
3
4
5
6
7
8
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "failur-domain.beta.kubernetes.io/zone"
operator: NotIn
values: ["us-central1-a"]

Taints and Tolerations

此功能允许您标记一个Node(“受污染”,“有污点”),以便没有Pod可以被调度到此节点上,除非Pod明确地“容忍”污点。
标记的是Node而不是Pod(如节点的亲和性和反亲和性),对于集群中大多数Pod应该避免调度到特定的节点上的功能特别有用。

例如,您可能希望主节点(Master)标记为仅可调度Kubernetes系统组件,或将一组节点专用于特定的用户组,或者让常规的
Pod远离具有特殊硬件的Node,以便为有特殊硬件需求的Pod留出空间。

  • 设置Node的Taints
1
kubectl taint nodes node1 key=value:NoSchedule

创建一个污点并标记到Node,那些没有设置容忍的Pod,不能调度到该Node上。其他污点的选项是PerferredNoSchedule,这是NoSchedule首选版本。

NoExecute,这个选项意味着在当Node被标记有污点时,该Node上运行的任何没有设置容忍的Pod都将被驱逐。容忍将被添加到PodSpec中,看起来像这样:

1
2
3
4
5
tolerations: 
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"

除了将污点和容忍(Taints and Tolerations)特性在Kubernetes 1.6中移至Beta版外,我们还引入了一个使用污点和容忍的Alpha的特性:
允许用户自定义一个Pod被绑定到Node上后遇到了诸如网络分区的问题时的行为(可能Pod希望长时间允许在这个Node上,或者网络分区会很快恢复),
而不是现在默认的等待五分钟超时。

Pod

Affinity

  • 部署到指定label的node
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd

pod只会调度到具有disktype=ssd的node上面

AntiAffinity