本文主要是介绍k8s排错指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、排查顺序:
查看node状态→查看pod状态→查看service流量是否路由到pod→查看ingress配置是否正确→查看kubelet系统日志
二、具体排查思路:
1、排查node故障:
#查看各节点状态:
kubectl get node <node-name>#查看node事件:
kubectl describe node <node-name>
2、排查pod故障
#查看 Pod 状态:
kubectl get pods <pod-name> -n <namespace> -o wide#查看 Pod 的 yaml 配置:
kubectl get pods <pod-name> -n <namespace> -o yaml#查看 Pod 的事件:
kubectl describe pods <pod-name> -n <namespace>#查看 Pod 容器日志:
kubectl logs -n <namespace> <pod-name> [-c <container-name>]#常见错误
##启动时的错误包括:
ImagePullBackoff
ImageInspectError
ErrImagePull
ErrImageNeverPull
RegistryUnavailable
InvalidImageName
##运行中的错误包括:
CrashLoopBackOff
RunContainerError
KillContainerError
VerifyNonRootError
RunInitContainerError
CreatePodSandboxError
ConfigPodSandboxError
KillPodSandboxError
SetupNetworkError
TeardownNetworkError
3、service故障排查
kubectl describe svc h5sdk -n dev
4、ingress故障排查
kubectl describe ingress h5sdk -n dev
5、查看kubelet系统日志
#查看系统Kubelet 日志:
journalctl -l -u kubelet -n 1000
kube-apiserver 日志
PODNAME=$(kubectl -n kube-system get pod -l component=kube-apiserver -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100
kube-controller-manager 日志
PODNAME=$(kubectl -n kube-system get pod -l component=kube-controller-manager -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100
kube-scheduler 日志
PODNAME=$(kubectl -n kube-system get pod -l component=kube-scheduler -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100
kube-dns 日志
PODNAME=$(kubectl -n kube-system get pod -l k8s-app=kube-dns -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME -c kubedns
Kubelet 日志
查看 Kubelet 日志需要首先 SSH 登录到 Node 上。
journalctl -l -u kubelet
Kube-proxy 日志
Kube-proxy 通常以 DaemonSet 的方式部署
kubectl -n kube-system get pod -l component=kube-proxy
NAME READY STATUS RESTARTS AGE
kube-proxy-42zpn 1/1 Running 0 1d
kube-proxy-7gd4p 1/1 Running 0 3d
kube-proxy-87dbs 1/1 Running 0 4d
kubectl -n kube-system logs kube-proxy-42zpn
Kube-dns/Dashboard CrashLoopBackOff
由于 Dashboard 依赖于 kube-dns,所以这个问题一般是由于 kube-dns 无法正常启动导致的。查看 kube-dns 的日志
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c sidecar
三、常见问题:
Node NotReady
Node 处于 NotReady 状态,大部分是由于 PLEG(Pod Lifecycle Event Generator)问题导致的。社区 issue #45419 目前还处于未解决状态。
NotReady 的原因比较多,在排查时最重要的就是执行 kubectl describe node <node name> 并查看 Kubelet 日志中的错误信息。常见的问题及修复方法为:
- Kubelet 未启动或者异常挂起:重新启动 Kubelet。
- CNI 网络插件未部署:部署 CNI 插件。
- Docker 僵死(API 不响应):重启 Docker。
- 磁盘空间不足:清理磁盘空间,比如镜像、临时文件等。
这篇关于k8s排错指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!