这是我参与更文挑战的第12天,活动详情查看: 更文挑战
一些概念 Affinity对应pod的pod.spec.affinity字段,下面有多种组合配置,需要先明白一些概念
Affinity和Anti-affinity 亲和性分为正向的Affinity,表示愿意被分配至目标node,和反向的Anti-affinity,表示不愿意被分配至目标node。
NodeAffinity和PodAffinity 两个不同维度的亲和性策略,NodeAffinity是根据node的标签去决定是否分配。而PodAffinity是根据pod的标签去决定要不要和别的pod分配到一个node。
软策略和硬策略 软策略字段以preferred开头,表示尽量达到,没满足也没关系,多个软策略之间会有各自权重。硬策略字段以required开头,表示必须满足。
实际操作 因为本节的概念理解起来相对容易,所以直接上手操作。不过因为字段组合较多,建议多利用kubectl explain pod.spec.affinity查看各个字段的含义。
以下所有yaml文件托管在我的Github仓库
NodeAffinity实际操作 硬策略 通过下面的yaml文件test-nodeaffinity-hard.yaml来验证下node亲和性的硬策略
apiVersion: v1
kind: Pod
metadata:
name: test-nodeaffinity-hard
labels:
app: app1
spec:
containers:
- name: mynginx
image: mynginx:v2
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node3
这里的matchExpressions是比配node的labels,底下的三个字段如下
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | node的标签的key |
| operator | string | 判断符号,可以选In/NotIn/Exists/DoesNotExist/Gt/Lt |
| values | list | 一组值,结合上面的运算符号进行判断 |
| node的labels可以用如下方式查看 |
NAME STATUS ROLES AGE VERSION LABELS
k8s-master Ready master 14d v1.15.11 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8s-node1 Ready <none> 14d v1.15.11 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
我这里有两个node,它们的hostname都不是k8s-nodes,在这种硬策略下该pod没有node可以分配
[root@k8s-master affinity]# kubectl apply -f test-nodeaffinity-hard.yaml
pod/test-nodeaffinity-hard created
[root@k8s-master affinity]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-nodeaffinity-hard 0/1 Pending 0 6s <none> <none> <none> <none>
这是修改下pod的信息
apiVersion: v1
kind: Pod
metadata:
name: test-nodeaffinity-hard
labels:
app: app1
spec:
containers:
- name: mynginx
image: mynginx:v2
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-master
再启动,无论启动多少次都只会在master节点
[root@k8s-master affinity]# kubectl apply -f test-nodeaffinity-hard.yaml
pod/test-nodeaffinity-hard created
[root@k8s-master affinity]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-nodeaffinity-hard 1/1 Running 0 5s 10.244.0.19 k8s-master <none> <none>
我这里没有足够节点所以选择master节点,一般master节点是不会分配pod的