【K8S】常用操作与常见问题

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

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

猜你喜欢

转载自blog.csdn.net/daohangtaiqian/article/details/131698342