作者:mobiledu2502902037 | 来源:互联网 | 2023-08-29 12:28
文章目录Kubernetestroubleshooting常见问题解决思路和方法前言Kubernetestroubleshooting流程图流程图详解Pod为Pending状态Po
文章目录 Kubernetes troubleshooting 常见问题解决思路和方法 前言 Kubernetes troubleshooting流程图 流程图详解 Pod为Pending状态 Pod为ImagePullBackOff状态 Pod为CrashLoopBackOff状态 Pod没有Ready Pod状态正常,但是通过Service不能访问到Pod 通过Service能访问Pod,但是集群外不能访问Pod Troubleshooting命令小结 参考文档
Kubernetes troubleshooting 常见问题解决思路和方法 前言 本文基于learnk8s的Kubernetes troubleshooting流程图,说明了Kubernetes常见问题解决思路和方法。
Kubernetes troubleshooting流程图
流程图详解 使用kubens 来切换namespace,让kubectl
命令更加简单。
如果使用OpenShift,直接用oc
命令替换下面的kubectl
命令。
另外,可以安装jq 命令行工具来方便对Kubernetes jsonpath进行解析。
查看Pod状态:
kubectl get pods
Pod为Pending状态 Pod为Pending状态的可能原因包括:
集群资源不够,无法分配资源给新的Pod。 资源配额限制(ResourceQuota)。 需要通过PVC绑定PV存储资源,但是没有可用的PV。 指定了专门的调度策略,比如要调度到特定节点上,但是不满足调度条件。 先查看Pod events来定位问题原因:
kubectl describe pod < pod-name>
查看Pod被调度到哪个节点上&#xff1a;
kubectl get pods -o wide
查看Pod的labels&#xff1a;
kubectl get pods --show-labels
Pod为ImagePullBackOff状态 Pod为ImagePullBackOff状态的可能原因包括&#xff1a;
Image name不正确。 Image tag不正确。 如果是从外网拉取镜像&#xff0c;需要检查&#xff1a; 网络是否正常。 否正确配置了代理。 是否将外网镜像仓库加入了白名单。 如果是从私有镜像仓库&#xff08;private image registry&#xff09;&#xff0c;需要检查&#xff1a; 私有镜像仓库的地址是否正确&#xff0c;特别是地址中包含的项目名称是否一致。 私有镜像仓库是否工作正常。 是否因为私有镜像仓库重启导致之前的镜像丢失。 网络是否正常。 用来拉取镜像的账号是否正确&#xff0c;且有权限。 先查看Pod events来定位问题原因&#xff1a;
kubectl describe pod < pod-name>
Pod为CrashLoopBackOff状态 Pod为CrashLoopBackOff状态的可能原因&#xff1a;
程序错误&#xff0c;导致不断重启。 Dockerfile中没有配置程序入口。 Pod健康检查配置错误&#xff0c;比如配置了错误的健康检查端点或方式。 先查看Pod events来定位问题原因&#xff1a;
kubectl describe pod < pod-name>
查看Pod日志&#xff1a;
kubectl logs < pod-name>
如果容器死的太快来不及查看日志&#xff0c;可以查看上一个容器的日志&#xff1a;
kubectl logs < pod-name> --previous
Pod没有Ready Pod没有Ready的可能原因包括&#xff1a;
程序错误&#xff0c;没有完全启动成功。 Readiness探针配置错误。 先查看Pod events来定位问题原因&#xff1a;
kubectl describe pod < pod-name>
查看Pod日志&#xff1a;
kubectl logs < pod-name>
Pod状态正常&#xff0c;但是通过Service不能访问到Pod 通过Service不能访问到Pod的可能原因包括&#xff1a;
Service的.spec.selector
和Pod的.metadata.label
不匹配。 Service的端口和Pod的端口不匹配。 查看Service配置&#xff1a;
kubectl get svc < service-name> -o yaml
查看Service的selector&#xff1a;
kubectl get svc customer -o jsonpath&#61; &#39;{.spec.selector}&#39; kubectl get svc customer -o jsonpath&#61; &#39;{.spec.selector}&#39; | jq
查看Service关联的Pod&#xff1a;
service_name&#61; customer sel&#61; ${ $( kubectl get svc $service_name --output&#61; json | jq -j &#39;.spec.selector | to_entries | .[ ] | "\( .key) &#61; \( .value) ,"&#39;) %?} echo $( kubectl get pods --selector&#61; $sel --output&#61; jsonpath&#61; { .items.. metadata.name} )
查看Pod的labels&#xff1a;
kubectl get pods --show-labels | grep < pod-name-prefix>
通过Service能访问Pod&#xff0c;但是集群外不能访问Pod 如果是Kubernetes&#xff0c;则检查是否正确配置了Ingress。
如果是OpenShift&#xff0c;则检查是否正确配置了Route。
如果使用Service Mesh&#xff0c;还需要检查是否正确配置Ingress Gateway和VirtualService。
Troubleshooting命令小结 命令小结&#xff1a;
kubens kubens < ns-name> kubens -c kubectl get pods kubectl get pods --show-labels kubectl get pods -o wide kubectl get pod < pod-name> -o yaml kubectl get pod < pod-name> -o jsonpath&#61; &#39;{.root.parent.sub}&#39; | jq kubectl describe pod < pod-name> kubectl logs < pod-name> kubectl logs < pod-name> --previous
搜索指令小结&#xff1a;
keyword site:stackoverflow.com
在Kubernetes GitHub issues中搜索&#xff1a;
https://github.com/kubernetes/kubernetes/issues 参考文档 https://kubernetes.io/docs/reference/kubectl/jsonpath/ https://kubernetes.io/docs/reference/kubectl/cheatsheet/ https://stedolan.github.io/jq/