1.节点故障排查流程
1. 登录到服务器
ssh user@host
2. 输入密码
3. 切换到root用户
sudo su root
以下命令默认已经登录root用户,如果没有登录root用户请在命令前面加上sudo。
查看所有pod状态
kubectl get pods -n [namespace]
查看所有service对象
kubectl get svc -n [namespace]
查看node详细信息
kubectl describe node [node name]
查看kubelet\docker是否启动
systemctl status kubelet
systemctl status docker
查看kubelet\docker的启动日志
journalctl -u kubelet
journalctl -u docker
查看磁盘使用情况
du -sh *
df -h
查看docker镜像
docker ps -a
2.服务故障排查流程
查看 pod 状态
筛选指定pod
kubectl get pods -n [namespace] |grep xxx
查看service对象
kubectl get svc -n [namespace]
查看 pod 的日志
# 打印从现在开始的日志
kubectl logs -f -l app=[svc name] -c [container name] -n [namespace]
# 打印从头开始的日志
kubectl logs -f [pod name] [container name] -n [namespace]
# 排除无关日志
kubeclt logs -f -l app=[svc name] -c [container name] -n [namespace] |grep -v actuator
查看 pod 的详细信息以及event
kubectl describe pod [pod name] -n [namespace]
查看配置文件
kubectl describe cm [svc name] -n [namespace]
查看configmap对象
kubectl get cm -n [namespace]
调整组件副本数
kubectl scale --replicas=1 deployment/[deployment name] -n [namespace]
进入容器调试
kubectl exec -it [pod name] -c [container name] -n [namespace] -- sh
kubectl exec -it -- /bin/bash
3.网络故障排查流程
从pod内部访问其它服务
检查 service name 是否存在
检查 service name 是否正确
nslookup\dig\ping 测试域名解析
检查EndPoint
kubectl get endpoints ${service name}
- 查看是否存在 endpoint
- 查看对应endpoint端口是否映射正确
kubectl get pods --selector=${service selector}
- 查看对应pod是否处于 RUNNING 状态
- 查看服务是否真实可用
- 查看服务开放端口是否与Endpoint中配置一致
4.常见问题
如果列表中对应服务不存在READY列处于0/1或STATUS列不处于Running的pod,则表示服务启动成功。
1.pod处于ContainerCreating
通过describe查看出错原因:
kubectl describe pods [service name]
可以在最后看到类似如下的列表:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedMount 45m (x26 over 5h42m) kubelet Unable to attach or mount volumes: unmounted volumes=[storage], unattached volumes=[default-token-ccgd7 storage]: timed out waiting for the condition
Warning FailedMount 7m11s (x124 over 5h51m) kubelet Unable to attach or mount volumes: unmounted volumes=[storage], unattached volumes=[storage default-token-ccgd7]: timed out waiting for the condition
Warning FailedMount 2m12s (x118 over 5h52m) kubelet MountVolume.WaitForAttach failed for volume "pvc-936ff918-76af-4eaa-aef3-64ae5ee15bfd" : rbd image sata_pool/kubernetes-dynamic-pvc-d6d869fc-57b8-442b-95fc-a67c06aeea03 is still being used
这个表说明了我们的卷挂载失败了,我们需要去解决对应的问题。
2.pod处于CrashLoopBackOff状态
pod处于CrashLoopBackOff状态说明K8S试图启动这个pod,但pod内的一个或多个容器启动失败,可以通过过describe来查看pod的Event信息
kubectl describe pods [service name]
3.pod处于RunContainerError状态
当pod要用到一个还没创建的ConfigMap时,状态会显示为RunContainerError。先使用describe查看事件信息。会有类似于:configmaps xxxxxxx not found的事件提示信息。
kubectl describe pods [service name]
4.pod处于Evicted状态
Evicted意为驱逐。 Kubelet 主动监测和防止计算资源的全面短缺。在资源短缺时,kubelet 可以主动地结束一个或多个 Pod 以回收短缺的资源。 当 kubelet 结束一个 Pod 时,它将终止 Pod 中的所有容器,而 Pod 的 Phase 将变为 Failed。 如果被驱逐的 Pod 由 Deployment 管理,这个 Deployment 会创建另一个 Pod 给 Kubernetes 来调度。 被驱逐的pods可以直接删除。
sudo kubectl delete pods [pod name]
5.pod中服务连接数据库异常
查看pod中日志
如果数据库连接异常,确认pod中配置文件是否配置正确
kubectl get configmap [pod name] -o yaml
如果无法确定配置文件中k8s配置的host所指向的ip
kubectl describe service [service name]
6.检查pod资源占用情况
kubectl top pods | grep [podname]
7.服务无法启动如何定位
常见操作:
- 检查pod状态以及event
- 检查pod日志
- 根据情况判断问题
sudo kubectl describe pods [pod] -n [namespace]
sudo kubectl logs -f [pod] -n [namespace]
8.需要对外暴露端口
注意,正常情况下,生产环境不对外暴露服务端口,服务间通过ClusterIP通信。
sudo kubectl get svc -n 【namespace】 # 找到服务的service name
sudo kubectl edit svc 【svc】 -n 【namespace】 #编辑service,将ClusterIP修改为NodePort
sudo kubectl get svc 【svc】 -n 【namespace】 #查看对外暴露端口,端口一般大于30000