公司产品基于K8s部署,在通过yaml编排启动对应容器时,发现POD一直处于Pending状态。
通常是由于pod的nodeSelector选择器未匹配节点所导致的,需要检查pod配置中定义的nodeSelector相关字段,确保能够与节点标签相匹配。
$ kubectl describe pod pod-xxx
Warning FailedScheduling <unknown> default-scheduler 0/1 nodes are available: 1 node(s) didn't match node selector.
排查思路
查看容器配置
可以通过查看deployment或者pod中nodeSelector的配置,来判断节点分配规则。
[root@localhost ~]# kubectl edit job -n prophet flyway-test
# 节点标签
nodeSelector:
lolicp.com/system: "true"
[root@localhost ~]# kubectl edit pod -n monitoring prometheus-k8s-0
nodeSelectorTerms:
- matchExpressions:
- key: lolicp.com/prometheus
operator: In
values:
- "true"
节点打标签
根据nodeSelector的配置内容,容器分配至指定labels的节点中。
kubectl label nodes <node-name> <label-key>=<label-value>
示范:
kubectl label nodes 192.168.252.145 lolicp.com/prometheus=true
添加标签完成后,容器恢复正常。