一、同一应用分布在不同机房

1.1 同一应用尽量分布在不同机房

1、给机房添加不同的标签

kubectl label node k8s-master01 zone=beijing-haidian
kubectl label node k8s-node01 zone=beijing-chaoyang
kubectl label node k8s-node02 zone=beijing-haidian

验证,观察到目前分为两个域,第一个域beijing-haidian分布的节点为k8s-master01和k8s-node02,第二个域beijing-chaoyang分布的节点为k8s-node01

[root@k8s-master01 ~]# kg node --show-labels | grep zone
k8s-master01   Ready    control-plane   9d    v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=,zone=beijing-haidian
k8s-node01     Ready    <none>          9d    v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux,zone=beijing-chaoyang
k8s-node02     Ready    <none>          9d    v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux,zone=beijing-haidian

2、定义一个名为podAntiAffinity03的yaml文件

[root@k8s-master01 ~]# vim podAntiAffinity03.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: diff-zone
  name: diff-zone
spec:
  replicas: 2
  selector:
    matchLabels:
      app: diff-zone
  template:
    metadata:
      labels:
        app: diff-zone
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - diff-zone
            topologyKey: zone
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: diff-zone

3、开始部署

[root@k8s-master01 ~]# kaf podAntiAffinity03.yaml 

4、验证,观察到一个分配在k8s-master01,一个分配在k8s-node01

[root@k8s-master01 ~]# kgp -owide 
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
diff-zone-6877d75455-cqmd6   1/1     Running   0          3s    192.168.58.194   k8s-node02   <none>           <none>
diff-zone-6877d75455-lc2k6   1/1     Running   0          3s    192.168.85.194   k8s-node01   <none>           <none>

5、重启deploy

[root@k8s-master01 ~]# k rollout restart deploy diff-zone

# 观察到虽然zone为beijing-haidian有两个节点,但是仍然保持强制性,就是一个zone只能分配到一个pod
[root@k8s-master01 ~]# kgp -owide 
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
diff-zone-6877d75455-cqmd6   1/1     Running   0          27s   192.168.58.194   k8s-node02   <none>           <none>
diff-zone-6877d75455-lc2k6   1/1     Running   0          27s   192.168.85.194   k8s-node01   <none>           <none>
diff-zone-7db96875f4-5ljct   0/1     Pending   0          2s    <none>           <none>       <none>           <none>

6、环境复原

[root@k8s-master01 ~]# k delete -f podAntiAffinity03.yaml

1.2 同一应用尽量分布在不同机房

1、给机房添加不同的标签

kubectl label node k8s-master01 zone=beijing-haidian
kubectl label node k8s-node01 zone=beijing-chaoyang
kubectl label node k8s-node02 zone=beijing-haidian

验证,观察到目前分为两个域,第一个域beijing-haidian分布的节点为k8s-master01和k8s-node02,第二个域beijing-chaoyang分布的节点为k8s-node01

[root@k8s-master01 ~]# kg node --show-labels | grep zone
k8s-master01   Ready    control-plane   9d    v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=,zone=beijing-haidian
k8s-node01     Ready    <none>          9d    v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux,zone=beijing-chaoyang
k8s-node02     Ready    <none>          9d    v1.32.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux,zone=beijing-haidian

2、定义一个名为podAntiAffinity03的yaml文件

[root@k8s-master01 ~]# vim podAntiAffinity04.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: diff-zone
  name: diff-zone
spec:
  selector:
    matchLabels:
      app: diff-zone
  replicas: 2
  template:
    metadata:
      labels:
        app: diff-zone
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - diff-zone
              topologyKey: zone
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: diff-zone

3、开始部署

[root@k8s-master01 ~]# kaf podAntiAffinity03.yaml 

4、验证,观察到一个分配在k8s-master01,一个分配在k8s-node01

[root@k8s-master01 ~]# kgp -owide
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
diff-zone-7b6899b8c9-5sgzs   1/1     Running   0          76s   192.168.32.131   k8s-master01   <none>           <none>
diff-zone-7b6899b8c9-rbzsb   1/1     Running   0          76s   192.168.85.252   k8s-node01     <none>           <none>

5、重启deploy

[root@k8s-master01 ~]# k rollout restart deploy diff-zone

# 观察到仍然分配到不同的zone
[root@k8s-master01 ~]# kgp -owide
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
diff-zone-68d444fd97-8jj2q   1/1     Running   0          12s   192.168.85.255   k8s-node01   <none>           <none>
diff-zone-68d444fd97-r9s59   1/1     Running   0          14s   192.168.58.255   k8s-node02   <none>           <none>

6、环境复原

[root@k8s-master01 ~]# k delete -f podAntiAffinity04.yaml