关于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
大佬可以的,解决了我的问题
10 -
夜愿小夜
提问者
2022-04-05
今天又看了后续的课程,发现这个nodeSelector是老师自己加的,我拿到的mandatory.yaml原来是后续课程的,怪不得一开始起不来。
感觉老师的课程是持续几年,不同的视频缝合在一起的。安装环境和后面使用的环境也不是一样的。总觉得,怪怪的!这样真的导致了很多不便啊。
00
相似问题