k8s не может запланировать модуль из-за того, что один узел не удовлетворяет существующим правилам антиподства модулей

#kubernetes

Вопрос:

У меня есть кластер k8s с 3 узлами. Когда я развертываю набор состояний в этом кластере k8s, я обнаружил вопрос о правиле антиаффинности K8S pod.

Это сообщение об ошибке.

 Warning  FailedScheduling  32s (x8 over 6m44s)  default-scheduler  0/3 nodes are available: 3 node(s) didn't match pod affinity/anti-affinity, 3 node(s) didn't satisfy existing pods anti-affinity rules.
 

Это код о nodeAffinity и podAntiAffinity.

     spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dolphin.region/name
                operator: In
                values:
                - common
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app.kubernetes.io/name
                operator: In
                values:
                - redis-sentinel
            topologyKey: kubernetes.io/hostname
 

Информация об узлах .

 [root@k8s-10 ~]#  kubectl get nodes --show-labels
NAME              STATUS   ROLES    AGE   VERSION   LABELS
k8s-10.67.42.10   Ready    master   86d   v1.13.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,dolphin.region/name=common,k8s_ceph=ceph,kubernetes.io/hostname-master=kube-master,kubernetes.io/hostname=k8s-10.67.42.10,node-role.kubernetes.io/master=
k8s-10.67.42.11   Ready    master   86d   v1.13.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,dolphin.region/name=common,k8s_ceph=ceph,kubernetes.io/hostname-master=kube-master,kubernetes.io/hostname=k8s-10.67.42.11,node-role.kubernetes.io/master=
k8s-10.67.42.12   Ready    master   86d   v1.13.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,dolphin.region/name=common,k8s_ceph=ceph,kubernetes.io/hostname-master=kube-master,kubernetes.io/hostname=k8s-10.67.42.12,node-role.kubernetes.io/master=
 

Есть только 3 стручка с этикеткой app.kubernetes.io/name=redis-sentinel.

 [root@k8s-10 ~]# kubectl get pod -n project -l app.kubernetes.io/name=redis-sentinel -o wide 
NAME                   READY   STATUS    RESTARTS   AGE   IP              NODE              NOMINATED NODE   READINESS GATES
dol-redis-sentinel-0   1/1     Running   0          18h   10.244.243.2    k8s-10.67.42.12   <none>           <none>
dol-redis-sentinel-1   1/1     Running   0          16h   10.244.35.170   k8s-10.67.42.10   <none>           <none>
dol-redis-sentinel-2   0/1     Pending   0          29m   <none>          <none>            <none>           <none>
 

Также нет никаких загрязнений в узле k8s-10.67.42.11

 [root@k8s-10 ~]# kubectl describe node k8s-10.67.42.11 | grep Taint 
Taints:             <none>
 
 [root@k8s-10 ~]# kubectl get pods --show-labels -n project |grep sentinel 
dol-redis-sentinel-0                              1/1     Running   0          18h     app.kubernetes.io/instance=dol-redis-sentinel,app.kubernetes.io/name=redis-sentinel,app=dol-redis-sentinel,controller-revision-hash=dol-redis-sentinel-b4975b6bd,statefulset.kubernetes.io/pod-name=dol-redis-sentinel-0
dol-redis-sentinel-1                              1/1     Running   0          16h     app.kubernetes.io/instance=dol-redis-sentinel,app.kubernetes.io/name=redis-sentinel,app=dol-redis-sentinel,controller-revision-hash=dol-redis-sentinel-b4975b6bd,statefulset.kubernetes.io/pod-name=dol-redis-sentinel-1
dol-redis-sentinel-2                              0/1     Pending   0          38m     app.kubernetes.io/instance=dol-redis-sentinel,app.kubernetes.io/name=redis-sentinel,app=dol-redis-sentinel,controller-revision-hash=dol-redis-sentinel-b4975b6bd,statefulset.kubernetes.io/pod-name=dol-redis-sentinel-2
dol-redis-sentinel-exporter-75c8cbdc97-wztpk      1/1     Running   0          7d      app.kubernetes.io/part-of=redis-sentinel,app=dol-redis-sentinel-exporter,dolphin/part-of-instance=dol-redis-sentinel,pod-template-hash=75c8cbdc97
 

Версия сервера kubenetes-v1.13.3

 [root@k8s-10 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20:08:12Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20:00:57Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
 

Как я могу запланировать модуль в узел k8s-10.67.42.11 .

Комментарии:

1. Убедитесь, что у узла k8s-10.67.42.11 достаточно процессора/памяти для нового модуля.

2. podanitaffinity означает , что новые модули не будут запланированы ,если там уже запущены такие модули, если я прав, у вас уже есть модули с такими метками, которые упомянуты в правиле антиаффинности, вам нужно изменить правило антиаффинности

3. @nobb, вы используете очень старую, устаревшую версию Kubernetes. Вы хотите использовать текущий? Кроме того, сработало ли для вас решение запутанного гения?

Ответ №1:

Я думаю, это потому, что есть узел с меткой «app.kubernetes.io/name»

         podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app.kubernetes.io/name
                operator: In
                values:
                - redis-sentinel
[root@k8s-10 ~]# kubectl get pod -n project -l app.kubernetes.io/name=redis-sentinel -o wide 
NAME                   READY   STATUS    RESTARTS   AGE   IP              NODE              NOMINATED NODE   READINESS GATES
dol-redis-sentinel-0   1/1     Running   0          18h   10.244.243.2    k8s-10.67.42.12   <none>           <none>
dol-redis-sentinel-1   1/1     Running   0          16h   10.244.35.170   k8s-10.67.42.10   <none>           <none>
dol-redis-sentinel-2   0/1     Pending   0          29m   <none>          <none>            <none>           <none>

 
  • пожалуйста, установите ярлык «app.kubernetes.io/name=redis-sentinel» к узлам и проверьте .

Комментарии:

1. Я пытаюсь это сделать, но это не работает. Три узла имеют одинаковые метки .

2. можете ли вы обновить вывод kubectl получить узлы —показать метки после применения «app.kubernetes.io/name=redis-sentinel» для них ..