Pod被创建后被部署到哪个节点上是有这几个要素组成的:节点要满足Pod运行时的硬件要求和端口要求,Pod对节点的亲和性,Pod对Pod的亲和性,还有节点上的污点Pod是否可以容忍。
Pod对node的亲和性:
亲和性又分硬亲和和软亲和。
硬亲和:如果所用节点上没有指定的亲和键值对就不部署(Pod会处于挂起状态);
软亲和:如果全部节点没有指定的亲和键值对还是会部署到节点上。
硬亲和:
apiVesion: v1
kind: Pod
metadata:
name: www
namespace: default
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.12
affinity:
nodeaffinity
requiredDuringSchedulingIgnoredDuringExecution:
nodeselectorTerms:
- matchExpression:
key: app
operator: In
values:
- www
#这个Pod只会部署在有www标签的node上,如果没有就挂起。
软亲和:
apiVersion: v1
kind: Pod
metadata:
name: www
namespace: default
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.12
affinity:
nodeAffinity:
- preference:
matchExpressions:
- key: api
operator: In
values:
- www
weight: 80
#Pod会优先去部署在标签为api:www的node,如果有多个规则会根据权重判断优先级。
Pod对Pod的亲和性:
和Pod对node的亲和性差不多只是目标换成了Pod对Pod。
软亲和:
apiVersion: v1
kind: Pod
metadata:
name: www
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.12
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- www
topologyKey: kubernetes.io/hostname
#Pod只部署到有app:www且主机名和自己一样的node上。
#topologyKey:条件必须和已有的即将匹配的那个pod在一个主机里(必须是同台机器)。
反亲和:
[root@master qinhe]# vim b3-podAntiAffinity.yaml
apiVersion: v1
kind: Pod
metadata:
name: www
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.12
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- www
topologyKey: kubernetes.io/hostname
#不和app:www标签的Pod部署在一起。
污点和包容:
Pod部署时node检测Pod能否容忍自己的污点可以就部署不可以就拒绝,检查规则有只在部署时检查也有运行也检查两种。
kubectl taint node node01.wl.com app=mysql:NoSchedule
#给node01.wl.com节点上添加污点并设置为部署时检查。
#如果要运行时也检查需要把NoSchedule换成NoExecute。
Pod容忍污点:
apiVersion: apps/v1beta1
kind: Pod
metadata:
name: www
spec:
containers:
- name: nginx
image: wlzyr/nginx:v1.12
tolerations:
- key: "api"
operator: "Equal"
value: mysql
effect: "NoSchedule"
#如果value字段为空则可以容key为api的污点,value可以为如何字符。
#effect字段必须指清是NoSchedule还是NoExecute,不然会判断失败,如果为空则两则都可以容忍。