k8s 亲和度

2022-09-02  本文已影响0人  与狼共舞666
kind: Pod
metadata:
        name: pod-node-affinity-demo
        namespace: default
        labels:
            app: myapp
            tier: frontend
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
    affinity:
         nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                   nodeSelectorTerms:
                   - matchExpressions:
                     - key: zone
                       operator: In
                       values:
                       - foo
                       - bar

以上内容表示将 pod-node-affinity-demo调度到一个拥有标签zone是foo/bar的node节点上,kubectl apply -f pod-nodeaffinity-demo.yaml创建后,查看pod,kubectl get pods -o wide | grep pod-node,显示pod的状态是pending挂起,因为此处是required应亲和(与此对应的是软亲和preferred),所以必须满足调度条件才会完成调度。

[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo   0/1     Pending   0          20s   <none>   <none>   <none>           <none>

接着,对任意一个node工作节点打一个类似的zone标签,例如对node1节点打标签,如下所示:

[root@master1 pods]# kubectl label nodes node1 zone=bar
node/node1 labeled
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo   0/1     ContainerCreating   0          11m   <none>   node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo   0/1     ContainerCreating   0          11m   <none>   node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo   0/1     ContainerCreating   0          11m   <none>   node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo   0/1     ContainerCreating   0          11m   <none>   node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo   0/1     ContainerCreating   0          11m   <none>   node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo   0/1     ContainerCreating   0          11m   <none>   node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo   1/1     Running   0          11m   172.16.166.131   node1   <none>           <none>

可以看到经过对node1打标签后满足了pod-nodeaffinity-demo的调度条件,开始在node1上调度创建,最终显示running状态。
例二(nodeAffinity软亲和):

apiVersion: v1
kind: Pod
metadata:
        name: pod-node-affinity-demo-2
        namespace: default
        labels:
            app: myapp
            tier: frontend
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
    affinity:
        nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - preference:
               matchExpressions:
               - key: zone1
                 operator: In
                 values:
                 - foo1
                 - bar1
              weight: 60

直接运行,结果是在node1节点上调度创建完成,由此可见nodeAffinity(preferred)软亲和并不一定需要满足对应的匹配表达式条件,调度所需条件更低更试用。
Node节点亲和性针对的是pod和node的关系,Pod调度到node节点的时候匹配的条件


[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo     1/1     Running             0          19m   172.16.166.131   node1   <none>           <none>
pod-node-affinity-demo-2   0/1     ContainerCreating   0          17s   <none>           node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo     1/1     Running             0          19m   172.16.166.131   node1   <none>           <none>
pod-node-affinity-demo-2   0/1     ContainerCreating   0          21s   <none>           node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo     1/1     Running             0          19m   172.16.166.131   node1   <none>           <none>
pod-node-affinity-demo-2   0/1     ContainerCreating   0          22s   <none>           node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo     1/1     Running             0          19m   172.16.166.131   node1   <none>           <none>
pod-node-affinity-demo-2   0/1     ContainerCreating   0          24s   <none>           node1   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo     1/1     Running   0          19m   172.16.166.131   node1   <none>           <none>
pod-node-affinity-demo-2   1/1     Running   0          26s   172.16.166.132   node1   <none>           <none>

例三(podAffinity亲和度,前提条件是依据一个已经创建运行的pod作为参照标准)

apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  labels:
    app2: myapp2
    tier: frontend
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
    tier: db
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["sh","-c","sleep 3600"]
    affinity:
      podAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
         - labelSelector:
              matchExpressions:
              - {key: app2, operator: In, values: ["myapp2"]}
           topologyKey: kubernetes.io/hostname
[root@master1 pods]# kubectl apply -f pod-required-affinity-demo.yaml 
pod/pod-first created
pod/pod-second created
[root@master1 pods]# kubectl get pods -o wide | grep pod
pod-first                  0/1     ContainerCreating   0          27s   <none>           node2   <none>           <none>
pod-node-affinity-demo     1/1     Running             0          33m   172.16.166.131   node1   <none>           <none>
pod-node-affinity-demo-2   1/1     Running             0          14m   172.16.166.132   node1   <none>           <none>
pod-second                 0/1     ContainerCreating   0          25s   <none>           node2   <none>           <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod
pod-first                  1/1     Running   0          37s   172.16.104.4     node2   <none>           <none>
pod-node-affinity-demo     1/1     Running   0          33m   172.16.166.131   node1   <none>           <none>
pod-node-affinity-demo-2   1/1     Running   0          14m   172.16.166.132   node1   <none>           <none>
pod-second                 1/1     Running   0          35s   172.16.104.5     node2   <none>           <none>

上面说明第一个pod调度到哪,第二个pod也调度到哪,这就是pod节点亲和性
例四

apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  labels:
    app1: myapp1
    tier: frontend
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
    tier: db
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["sh","-c","sleep 3600"]
    affinity:
      podAntiAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
         - labelSelector:
              matchExpressions:
              - {key: app1, operator: In, values: ["myapp1"]}
           topologyKey: kubernetes.io/hostname
[root@master1 pods]# kubectl apply -f pod-required-anti-affinity-demo.yaml

[root@master1 pods]# kubectl get pods -o wide | grep node
pod-first                  1/1     Running   0          42s   172.16.104.6     node2   <none>           <none>
pod-node-affinity-demo     1/1     Running   0          56m   172.16.166.131   node1   <none>           <none>
pod-node-affinity-demo-2   1/1     Running   0          37m   172.16.166.132   node1   <none>           <none>
pod-second                 1/1     Running   0          42s   172.16.166.133   node1   <none>           <none>

显示两个pod不在一个node节点上,这就是pod节点反亲和性

上一篇 下一篇

猜你喜欢

热点阅读