一、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>