解决一次K8s的ingress-nginx-controller的Pod为Pending

错误信息

Name:           nginx-dispatch-697775dcd8-sdgbc
Namespace:      dev
Priority:       0
Node:           <none>
Labels:         app=nginx-dispatch
                pod-template-hash=697775dcd8
Annotations:    <none>
Status:         Pending
IP:             
Controlled By:  ReplicaSet/nginx-dispatch-697775dcd8
Containers:
  nginx-dispatch:
    Image:      nginx:1.9.7
    Port:       80/TCP
    Host Port:  0/TCP
    Limits:
      cpu:     100m
      memory:  100Mi
    Requests:
      cpu:      100m
      memory:   100Mi
    Liveness:   tcp-socket :80 delay=5s timeout=5s period=10s #success=1 #failure=3
    Readiness:  http-get http://:80/ delay=5s timeout=2s period=10s #success=1 #failure=3
    Environment:
      DB_HOST:  <set to the key 'DB_HOST' of config map 'nginx-dispatch'>  Optional: false
    Mounts:
      /etc/localtime from localtime (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nwjmh (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  localtime:
    Type:          HostPath (bare host directory volume)
    Path:          /usr/share/zoneinfo/Asia/Shanghai
    HostPathType:  
  default-token-nwjmh:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-nwjmh
    Optional:    false
QoS Class:       Guaranteed
Node-Selectors:  run=pro
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  20s (x2 over 32s)  default-scheduler  0/2 nodes are available: 2 node(s) didn't match node selector.

从Events 分析到,scheduler 调度失败,没有匹配的工作节点。
此时需要分析本pod 采用了什么调度方式。从以上信息可以找到 Node-Selectors: run=pro 采用了 NodeSelector 方式调度,调度到node节点标签为 run=pro的。那我们查询一下 node 上的标签信息有没有。

-> # kubectl get nodes --show-labels                              
NAME                STATUS   ROLES         AGE   VERSION   LABELS
21.host.com   Ready    master,node   32d   v1.15.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=hdss7-21.host.com,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/node=
22.host.com   Ready    master,node   32d   v1.15.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=hdss7-22.host.com,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/node=

以上node节点上并没有 run=pro 标签的。所以我们需要加上一个标签

-> # kubectl label nodes 21.host.com run=pro 
node/21.host.com labeled

再次查看pods信息。显示调度成功

-> # kubectl get pods -n dev -o wide
NAME                              READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
nginx-dispatch-697775dcd8-sdgbc   1/1     Running   0          8m35s   172.7.21.7   21.host.com   <none>           <none>


这是将node节点打标找到对应的节点,

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐