Linux - K8S - 调度策略 - Pod策略之亲和和反亲和性

## Pod调度 - 亲和podAffinity

### 硬亲和requiredDuringSchedulingIgnoredDuringExecution

```sh
[15:25:06 root@master1 scheduler]#cat 07-scheduler-pod-affinity-base.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-dev
  labels:
    env: dev
spec:
  containers:
  - name: pod-test
    image: 10.0.0.55:80/mykubernetes/pod_test:v0.1
    imagePullPolicy: IfNotPresent
  nodeSelector:
    env: dev
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  labels:
    env: test
spec:
  containers:
  - name: pod-test
    image: 10.0.0.55:80/mykubernetes/pod_test:v0.1
    imagePullPolicy: IfNotPresent
  nodeSelector:
    env: test
[15:25:18 root@master1 scheduler]#kubectl apply -f 07-scheduler-pod-affinity-base.yaml 
pod/pod-dev created
pod/pod-test created
[15:25:27 root@master1 scheduler]#kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
pod-dev    1/1     Running   0          5s    10.244.3.10   node1.noisedu.cn   <none>           <none>
pod-test   1/1     Running   0          5s    10.244.4.9    node2.noisedu.cn   <none>           <none>

# 此时建立了两个pod分别有各自的标签,下面根据pod的标签创建基于硬亲和的pod
[15:26:06 root@master1 scheduler]#cat 08-scheduler-pod-affinity-required.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-affinity
spec:
  containers:
  - name: pod-test
    image: 10.0.0.55:80/mykubernetes/pod_test:v0.1
    imagePullPolicy: IfNotPresent
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: env
            operator: In
            values:
            - test
        namespaces: ["default"]
        topologyKey: kubernetes.io/hostname

[15:25:32 root@master1 scheduler]#kubectl apply -f 08-scheduler-pod-affinity-required.yaml 
pod/pod-affinity created
[15:25:40 root@master1 scheduler]#kubectl get pod -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
pod-affinity   1/1     Running   0          4s    10.244.4.10   node2.noisedu.cn   <none>           <none>
pod-dev        1/1     Running   0          17s   10.244.3.10   node1.noisedu.cn   <none>           <none>
pod-test       1/1     Running   0          17s   10.244.4.9    node2.noisedu.cn   <none>           <none>
[15:25:44 root@master1 scheduler]#kubectl get pod -o wide --show-labels 
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES   LABELS
pod-affinity   1/1     Running   0          26s   10.244.4.10   node2.noisedu.cn   <none>           <none>            <none>
pod-dev        1/1     Running   0          39s   10.244.3.10   node1.noisedu.cn   <none>           <none>            env=dev
pod-test       1/1     Running   0          39s   10.244.4.9    node2.noisedu.cn   <none>           <none>            env=test





```

### 软亲和preferredDuringSchedulingIgnoredDuringExecution

```sh
# 多满足条件,选择权重高的node
[15:30:53 root@master1 scheduler]#cat 09-scheduler-pod-affinity-preferred.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-affinity
spec:
  containers:
  - name: pod-test
    image: 10.0.0.55:80/mykubernetes/pod_test:v0.1
    imagePullPolicy: IfNotPresent
  affinity:
    podAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 60
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - {key: env, operator: In, values: ["dev"]}
          topologyKey: kubernetes.io/hostname
      - weight: 30
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - {key: env, operator: In, values: ["test"]}
          topologyKey: kubernetes.io/hostname
[15:31:26 root@master1 scheduler]#kubectl apply -f 09-scheduler-pod-affinity-preferred.yaml 
pod/pod-affinity created
[15:32:32 root@master1 scheduler]#kubectl get pod -o wide
NAME           READY   STATUS    RESTARTS   AGE     IP            NODE               NOMINATED NODE   READINESS GATES
pod-affinity   1/1     Running   0          9s      10.244.3.11   node1.noisedu.cn   <none>           <none>
pod-dev        1/1     Running   0          7m14s   10.244.3.10   node1.noisedu.cn   <none>           <none>
pod-test       1/1     Running   0          7m14s   10.244.4.9    node2.noisedu.cn   <none>           <none>

# 这种方式,一般会适用于一些服务和后台存储必须放在一起
```

## Pod调度 - 反亲和podAntiAffinity

```sh
[15:45:56 root@master1 scheduler]#cat 12-scheduler-pod-anaffinity-required.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-antiaffinity
spec:
  containers:
  - name: pod-test
    image: 10.0.0.55:80/mykubernetes/pod_test:v0.1
    imagePullPolicy: IfNotPresent
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - {key: env, operator: In, values: ["dev"]}
        topologyKey: kubernetes.io/hostname
[15:46:08 root@master1 scheduler]#kubectl apply -f 12-scheduler-pod-anaffinity-required.yaml 
pod/pod-antiaffinity created
[15:46:31 root@master1 scheduler]#kubectl get pod -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES
pod-antiaffinity   1/1     Running   0          5s    10.244.4.11   node2.noisedu.cn   <none>           <none>
pod-dev            1/1     Running   0          21m   10.244.3.10   node1.noisedu.cn   <none>           <none>
pod-test           1/1     Running   0          21m   10.244.4.9    node2.noisedu.cn   <none>           <none>
[15:46:36 root@master1 scheduler]#kubectl get pod -o wide --show-labels 
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE               NOMINATED NODE   READINESS GATES   LABELS
pod-antiaffinity   1/1     Running   0          24s   10.244.4.11   node2.noisedu.cn   <none>           <none>            <none>
pod-dev            1/1     Running   0          21m   10.244.3.10   node1.noisedu.cn   <none>           <none>            env=dev
pod-test           1/1     Running   0          21m   10.244.4.9    node2.noisedu.cn   <none>           <none>            env=test

# 因为是反亲和性,所以会调度到pod-test的相应节点
```

  

# 软反亲和
[22:09:48 root@master1 scheduler]#cat 13-scheduler-pod-anaffinity-preferred.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-antiaffinity
spec:
  containers:
  - name: pod-test
    image: 10.0.0.55:80/mykubernetes/pod_test:v0.1
    imagePullPolicy: IfNotPresent
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
              - {key: env, operator: In, values: ["dev"]}
            topologyKey: kubernetes.io/hostname
        - weight: 50
          podAffinityTerm:
            labelSelector:
              matchExpressions:
              - {key: env, operator: In, values: ["test"]}
            topologyKey: kubernetes.io/hostname
[22:09:51 root@master1 scheduler]#kubectl apply -f 13-scheduler-pod-anaffinity-preferred.yaml 
pod/pod-antiaffinity created
[22:10:03 root@master1 scheduler]#kubectl get pod -o wide
NAME               READY   STATUS              RESTARTS   AGE   IP           NODE               NOMINATED NODE   READINESS GATES
pod-antiaffinity   0/1     ContainerCreating   0          5s    <none>       node2.noisedu.cn   <none>           <none>
pod-dev            1/1     Running             0          21s   10.244.3.3   node1.noisedu.cn   <none>           <none>
pod-test           1/1     Running             0          21s   10.244.4.3   node2.noisedu.cn   <none>           <none>
[22:10:08 root@master1 scheduler]#kubectl get pod -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP           NODE               NOMINATED NODE   READINESS GATES
pod-antiaffinity   1/1     Running   0          12s   10.244.4.4   node2.noisedu.cn   <none>           <none>
pod-dev            1/1     Running   0          28s   10.244.3.3   node1.noisedu.cn   <none>           <none>
pod-test           1/1     Running   0          28s   10.244.4.3   node2.noisedu.cn   <none>           <none>
[22:10:15 root@master1 scheduler]#kubectl describe pod pod-antiaffinity 
Name:         pod-antiaffinity
Namespace:    default
Priority:     0
Node:         node2.noisedu.cn/10.0.0.54
Start Time:   Sun, 16 Jan 2022 22:10:03 +0800
Labels:       <none>
Annotations:  cni.projectcalico.org/containerID: 62ba17bfd69068d6c93cb2ca894749e93af745193ecb0f7bddc125847567894f
              cni.projectcalico.org/podIP: 10.244.4.4/32
              cni.projectcalico.org/podIPs: 10.244.4.4/32
Status:       Running
IP:           10.244.4.4
IPs:
  IP:  10.244.4.4
Containers:
  pod-test:
    Container ID:   docker://3b8321e664753a0c54fbc74b903cd7c0614e03d44e33618b3998b3d119b9fbf1
    Image:          10.0.0.55:80/mykubernetes/pod_test:v0.1
    Image ID:       docker-pullable://10.0.0.55:80/mykubernetes/pod_test@sha256:54402cda2ef15f45e4aafe98a5e56d4de076e3d4100c2a1bf1b780c787372fed
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 16 Jan 2022 22:10:08 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-vclbc (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-vclbc:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  35s   default-scheduler  Successfully assigned default/pod-antiaffinity to node2.noisedu.cn
  Normal  Pulled     30s   kubelet            Container image "10.0.0.55:80/mykubernetes/pod_test:v0.1" already present on machine
  Normal  Created    30s   kubelet            Created container pod-test
  Normal  Started    30s   kubelet            Started container pod-test

# 由于test权重低,所以调度到node2上面

  

posted @ 2022-01-16 15:50  每天都在学习的自己  阅读(301)  评论(0)    收藏  举报