一、Pod只能部署在Node节点上¶
方式一:同一个topology设置Pod反亲和力使Pod只能部署在Node节点上
1.查看节点污点情况
[root@k8s-master01 ~]# kubectl describe node | grep Taint
Taints: <none>
Taints: <none>
Taints: <none>
Taints: <none>
2.给node节点打上标签
[root@k8s-master01 ~]# kubectl label node k8s-node01 k8s-node02 app=must-be-diff-nodes
3.定义一个名为podAntiAffinity02的yaml文件
[root@k8s-master01 Affinity]# vim podAntiAffinity02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: must-be-diff-nodes
name: must-be-diff-nodes
namespace: kube-public
spec:
replicas: 2
selector:
matchLabels:
app: must-be-diff-nodes
template:
metadata:
labels:
app: must-be-diff-nodes
spec:
nodeSelector:
app: must-be-diff-nodes
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: IfNotPresent
name: must-be-diff-nodes
4.开始部署
[root@k8s-master01 Affinity]# kubectl create -f podAntiAffinity02.yaml
deployment.apps/must-be-diff-nodes created
5.查看pod状态,观察到pod被部署到不同节点
[root@k8s-master01 Affinity]# kubectl get po -n kube-public -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
must-be-diff-nodes-bdbb64998-2l9j4 1/1 Running 0 4m19s 172.27.14.221 k8s-node02 <none> <none>
must-be-diff-nodes-bdbb64998-lx444 1/1 Running 0 4m19s 172.17.125.19 k8s-node01 <none> <none>
must-be-diff-nodes-bdbb64998-slntf 1/1 Running 0 4m19s 172.18.195.5 k8s-master03 <none> <none>
方式二:设置不同topology使Pod只能部署在Node节点上
1.查看节点污点情况
[root@k8s-master01 ~]# kubectl describe node | grep Taint
Taints: <none>
Taints: <none>
Taints: <none>
Taints: <none>
2.给master节点打上app=must-be-diff-nodes标签
[root@k8s-master01 ~]# kubectl label node k8s-master01 k8s-master02 k8s-master03 app=must-be-diff-nodes
3.定义一个名为podAntiAffinity03的yaml文件
[root@k8s-master01 Affinity]# vim podAntiAffinity03.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: must-be-diff-nodes
name: must-be-diff-nodes
namespace: kube-public
spec:
replicas: 2
selector:
matchLabels:
app: must-be-diff-nodes
template:
metadata:
labels:
app: must-be-diff-nodes
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: NotIn
values:
- must-be-diff-nodes
topologyKey: app
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: IfNotPresent
name: must-be-diff-nodes
4.开始部署
[root@k8s-master01 Affinity]# kubectl create -f podAntiAffinity03.yaml
deployment.apps/must-be-diff-nodes created
5.查看pod状态,观察到pod被部署到node节点
[root@k8s-master01 Affinity]# kubectl get po -n kube-public -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
must-be-diff-nodes-b594b4ff4-f54ch 1/1 Running 0 21s 172.17.125.14 k8s-node01 <none> <none>
must-be-diff-nodes-b594b4ff4-p767f 1/1 Running 0 21s 172.27.14.202 k8s-node02 <none> <none>
方式三:设置节点亲和力使Pod只能部署在Node节点上
1.查看节点污点情况
[root@k8s-master01 ~]# kubectl describe node | grep Taint
Taints: <none>
Taints: <none>
Taints: <none>
Taints: <none>
2.给master节点打上app=must-be-diff-nodes标签
[root@k8s-master01 ~]# kubectl label node k8s-master01 k8s-master02 k8s-master03 app=must-be-diff-nodes
3.定义一个名为podAntiAffinity04的yaml文件
[root@k8s-master01 Affinity]# vim podAntiAffinity04.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: must-be-diff-nodes
name: must-be-diff-nodes
namespace: kube-public
spec:
replicas: 2
selector:
matchLabels:
app: must-be-diff-nodes
template:
metadata:
labels:
app: must-be-diff-nodes
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: app
operator: NotIn
values:
- must-be-diff-nodes
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: IfNotPresent
name: must-be-diff-nodes
4.开始部署
[root@k8s-master01 Affinity]# kubectl create -f podAntiAffinity04.yaml
deployment.apps/must-be-diff-nodes created
5.查看pod状态,观察到pod被部署到node节点
[root@k8s-master01 Affinity]# kubectl get po -n kube-public -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
must-be-diff-nodes-b594b4ff4-f54ch 1/1 Running 0 21s 172.17.125.14 k8s-node01 <none> <none>
must-be-diff-nodes-b594b4ff4-p767f 1/1 Running 0 21s 172.27.14.202 k8s-node02 <none> <none>
二、同一个应用不同副本的固定节点¶
有时候公司会有一些有状态的服务需要部署在Kubernetes集群中,我们并不需要该服务所在节点宕机时自动漂移Pod,因为可能会带来数据上的丢失,所以需要固定节点去运行,而我们同时也不想每个副本出现部署在同一台宿主机的情况,此时可以使用NodeSelector(NodeAffinity也可以)+PodAntiAffinity实现这一需求。
1.查看节点污点情况
[root@k8s-master01 ~]# kubectl describe node | grep Taint
Taints: <none>
Taints: <none>
Taints: <none>
Taints: <none>
2.给master节点打上app=must-be-diff-nodes标签
[root@k8s-master01 ~]# kubectl label node k8s-master01 k8s-master02 k8s-master03 app=must-be-diff-nodes
3.定义一个名为podAntiAffinity06的yaml文件
[root@k8s-master01 Affinity]# vim podAntiAffinity06.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: must-be-diff-nodes
name: must-be-diff-nodes
namespace: kube-public
spec:
replicas: 3
selector:
matchLabels:
app: must-be-diff-nodes
template:
metadata:
labels:
app: must-be-diff-nodes
spec:
nodeSelector:
app: must-be-diff-nodes
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- must-be-diff-nodes
topologyKey: kubernetes.io/hostname
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: IfNotPresent
name: must-be-diff-nodes
4.开始部署
[root@k8s-master01 Affinity]# kubectl create -f podAntiAffinity06.yaml
5.查看pod状态,观察到pod被部署到不同master节点
[root@k8s-master01 Affinity]# kubectl get po -n kube-public -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
must-be-diff-nodes-776df5fc4c-l4nbk 1/1 Running 0 5s 172.18.195.16 k8s-master03 <none> <none>
must-be-diff-nodes-776df5fc4c-mbjf8 1/1 Running 0 5s 172.25.244.216 k8s-master01 <none> <none>
must-be-diff-nodes-776df5fc4c-x5s22 1/1 Running 0 5s 172.25.92.81 k8s-master02 <none> <none>