关于ingress-nginx资源配置及nginx-ingress-controller这个pod的pending的解决!

来源:6-6 部署ingress-nginx(下)

夜愿小夜

2022-04-04

关于ingress-nginx资源配置及nginx-ingress-controller这个pod的pending的解决!
相信有不少同学都和我一样,被这个问题困扰很久很久,一度要放弃!
问题描述:
跟着老师的二进制安装,然后配置ingress-nginx插件:

kubectl apply -f mandatory.yaml

按照老师给的mandatory.yaml,始终是有pending的问题:

[root@emon k8s_soft]# kubectl get all -n ingress-nginx
NAME                                            READY   STATUS    RESTARTS   AGE
pod/default-http-backend-6b849d7877-jsbfg       1/1     Running   0          3m25s
pod/nginx-ingress-controller-7b84bdf45b-c8pdn   0/1     Pending   0          3m25s

NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/default-http-backend   ClusterIP   10.233.7.168   <none>        80/TCP    3m25s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/default-http-backend       1/1     1            1           3m25s
deployment.apps/nginx-ingress-controller   0/1     1            0           3m25s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/default-http-backend-6b849d7877       1         1         1       3m25s
replicaset.apps/nginx-ingress-controller-7b84bdf45b   1         1         0       3m25s

经过对kubectl命令的学习,对pod详情描述的命令如下:

[root@emon k8s_soft]# kubectl describe po -n ingress-nginx nginx-ingress-controller-7b84bdf45b-c8pdn
Name:           nginx-ingress-controller-7b84bdf45b-c8pdn
Namespace:      ingress-nginx
Priority:       0
Node:           <none>
Labels:         app.kubernetes.io/name=ingress-nginx
                app.kubernetes.io/part-of=ingress-nginx
                pod-template-hash=7b84bdf45b
Annotations:    prometheus.io/port: 10254
                prometheus.io/scrape: true
Status:         Pending
IP:             
IPs:            <none>
Controlled By:  ReplicaSet/nginx-ingress-controller-7b84bdf45b
Containers:
  nginx-ingress-controller:
    Image:       quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0
    Ports:       80/TCP, 443/TCP
    Host Ports:  80/TCP, 443/TCP
    Args:
      /nginx-ingress-controller
      --default-backend-service=$(POD_NAMESPACE)/default-http-backend
      --configmap=$(POD_NAMESPACE)/nginx-configuration
      --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
      --udp-services-configmap=$(POD_NAMESPACE)/udp-services
      --publish-service=$(POD_NAMESPACE)/default-http-backend
      --annotations-prefix=nginx.ingress.kubernetes.io
    Liveness:   http-get http://:10254/healthz delay=10s timeout=1s period=10s #success=1 #failure=3
    Readiness:  http-get http://:10254/healthz delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:
      POD_NAME:       nginx-ingress-controller-7b84bdf45b-c8pdn (v1:metadata.name)
      POD_NAMESPACE:  ingress-nginx (v1:metadata.namespace)
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from nginx-ingress-serviceaccount-token-8vf28 (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  nginx-ingress-serviceaccount-token-8vf28:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  nginx-ingress-serviceaccount-token-8vf28
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  app=ingress
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
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  11m   default-scheduler  0/2 nodes are available: 2 node(s) didn't match Pod's node affinity.
  Warning  FailedScheduling  11m   default-scheduler  0/2 nodes are available: 2 node(s) didn't match Pod's node affinity.

看到最后的Events描述,提示:

 Warning  FailedScheduling  11m   default-scheduler  0/2 nodes are available: 2 node(s) didn't match Pod's node affinity.

百度了这个错误,给出解决方案!
https://blog.csdn.net/sinat_36118270/article/details/103487848
本质原因是:
因为deployment(或其他控制器)或Pod的yaml文件中使用了nodeSelector,例如:老师提供的mandatory.yaml文件:

    spec:
     serviceAccountName: nginx-ingress-serviceaccount
     hostNetwork: true
     nodeSelector:
       app: ingress

表示,worker节点并不具备这样label,所以,无法加载,一直是pending。
如何解决?
添加label即可,我为了验证,执行如下操作:

# 删除资源配置
$ kubectl delete -f mandatory.yaml
# 查看node标签
kubectl get node --show-labels
# 发现两台worker都不具备 app=ingress 标签,对其中一台添加,我的是emon2,可以理解为node-2
$ kubectl label node emon2 app=ingress
# 再次配置资源
$ kubectl apply -f mandatory.yaml
# 查看
[root@emon k8s_soft]# kubectl get all -n ingress-nginx
NAME                                            READY   STATUS    RESTARTS   AGE
pod/default-http-backend-6b849d7877-4wbvb       1/1     Running   0          12m
pod/nginx-ingress-controller-7c55698fb9-w2n2r   1/1     Running   0          12m

NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/default-http-backend   ClusterIP   10.233.79.32   <none>        80/TCP    12m

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/default-http-backend       1/1     1            1           12m
deployment.apps/nginx-ingress-controller   1/1     1            1           12m

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/default-http-backend-6b849d7877       1         1         1       12m
replicaset.apps/nginx-ingress-controller-7c55698fb9   1         1         1       12m

# 发现已经是Running了,再次查看 pod/nginx-ingress-controller-7c55698fb9-w2n2r  详情
[root@emon k8s_soft]# kubectl describe pod nginx-ingress-controller-7c55698fb9-w2n2r -n ingress-nginx
Name:         nginx-ingress-controller-7c55698fb9-w2n2r
Namespace:    ingress-nginx
Priority:     0
Node:         emon2/192.168.200.117
Start Time:   Mon, 04 Apr 2022 19:16:43 +0800
Labels:       app.kubernetes.io/name=ingress-nginx
             app.kubernetes.io/part-of=ingress-nginx
             pod-template-hash=7c55698fb9
Annotations:  prometheus.io/port: 10254
             prometheus.io/scrape: true
Status:       Running
IP:           192.168.200.117
IPs:
 IP:           192.168.200.117
Controlled By:  ReplicaSet/nginx-ingress-controller-7c55698fb9
Containers:
 nginx-ingress-controller:
   Container ID:  containerd://13ad058edd03d8ce8df46ac2c6f10ae6e839bd574503246ef4c5f8856af6ce4f
   Image:         quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0
   Image ID:      sha256:0eaf7c96a4f125138de5f4c75343e6d90ed1b8867d31cde8bbb6167b34e6e985
   Ports:         80/TCP, 443/TCP
   Host Ports:    80/TCP, 443/TCP
   Args:
     /nginx-ingress-controller
     --default-backend-service=$(POD_NAMESPACE)/default-http-backend
     --configmap=$(POD_NAMESPACE)/nginx-configuration
     --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
     --udp-services-configmap=$(POD_NAMESPACE)/udp-services
     --publish-service=$(POD_NAMESPACE)/ingress-nginx
     --annotations-prefix=nginx.ingress.kubernetes.io
   State:          Running
     Started:      Mon, 04 Apr 2022 19:16:44 +0800
   Ready:          True
   Restart Count:  0
   Liveness:       http-get http://:10254/healthz delay=10s timeout=1s period=10s #success=1 #failure=3
   Readiness:      http-get http://:10254/healthz delay=0s timeout=1s period=10s #success=1 #failure=3
   Environment:
     POD_NAME:       nginx-ingress-controller-7c55698fb9-w2n2r (v1:metadata.name)
     POD_NAMESPACE:  ingress-nginx (v1:metadata.namespace)
   Mounts:
     /var/run/secrets/kubernetes.io/serviceaccount from nginx-ingress-serviceaccount-token-cz4sr (ro)
Conditions:
 Type              Status
 Initialized       True 
 Ready             True 
 ContainersReady   True 
 PodScheduled      True 
Volumes:
 nginx-ingress-serviceaccount-token-cz4sr:
   Type:        Secret (a volume populated by a Secret)
   SecretName:  nginx-ingress-serviceaccount-token-cz4sr
   Optional:    false
QoS Class:       BestEffort
Node-Selectors:  app=ingress
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  12m   default-scheduler  Successfully assigned ingress-nginx/nginx-ingress-controller-7c55698fb9-w2n2r to emon2
 Normal  Pulled     12m   kubelet            Container image "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.19.0" already present on machine
 Normal  Created    12m   kubelet            Created container nginx-ingress-controller
 Normal  Started    12m   kubelet            Started container nginx-ingress-controller

请咨询看最后的Events,提示emon2可以了

至此,问题解决!
希望对其他同学也有帮助,我能理解到如果卡主,是多么的痛苦!!!也希望你们减少痛苦的时间!!!

写回答

2回答

举个栗子__

2022-10-08

大佬可以的,解决了我的问题

1
0

夜愿小夜

提问者

2022-04-05

今天又看了后续的课程,发现这个nodeSelector是老师自己加的,我拿到的mandatory.yaml原来是后续课程的,怪不得一开始起不来。
感觉老师的课程是持续几年,不同的视频缝合在一起的。安装环境和后面使用的环境也不是一样的。总觉得,怪怪的!

这样真的导致了很多不便啊。

0
0

Kubernetes生产落地全程实践

一个互联网公司落地Kubernetes全过程点点滴滴

2293 学习 · 2216 问题

查看课程