美文网首页
k8s 亲和度

k8s 亲和度

作者: 与狼共舞666 | 来源:发表于2022-09-02 16:27 被阅读0次
    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节点反亲和性

    相关文章

      网友评论

          本文标题:k8s 亲和度

          本文链接:https://www.haomeiwen.com/subject/nwmenrtx.html