K8S Troubleshooting 经验集

K8S Troubleshooting 经验集

  • Pod问题定位流程
    • 1.查看pod详情
    • 2.查看pod日志
    • 3.查看节点状态
  • Pod常见问题
    • 长时间处于Pending状态
    • ImagePullBackOff
  • PVC相关
    • Pending Pod错误提示:pod has unbound immediate PersistentVolumeClaims
      • PVC错误:no persistent volumes available for this claim and no storage class is set
      • PVC错误:failed to provision volume with StorageClass "xxxx": claim Selector is not supported
      • PVC错误:failed to provision volume with StorageClass "xxxx": invalid AccessModes [ReadWriteMany]: only AccessModes [ReadWriteOnce ReadOnlyMany] are supported
  • 其他问题

Pod问题定位流程

1.查看pod详情

kubectl describe po --namespace

一般比如configmap/secret/pvc等问题都可以在pod详情这里初步定位到。需要注意的是,这里Event提示的内容不一定是最终导致pod起不来的结果,有可能是之前的log,现在已经修复的了。

2.查看pod日志

kubectl logs --namespace -c

如果是pod中的某个container起不来,可以通过查看对应container的log定位问题。

如果log中定位不到问题,那么可能就需要进入到pod里面看问题了。此时,可以先把其中container执行的command修改为sleep命令,等container起来以后,再执行原来的命令,一步一步定位问题。

可以通过edit deployment来修改container的启动command:

kubectl edit deployment --namespace

修改的内容:

containers:
- name: init-env
  command: ["sleep"]
  args:
    - "1000"

修改完后,等待pod重新创建后,就可以通过以下命令进入pod进一步排查问题

kubectl exec -it --namespace -c bash

3.查看节点状态

kubectl get nodes

如果出现cpu不足的情况,有可能是有节点down掉了,检查是否所有的节点都是Ready状态。

Pod常见问题

长时间处于Pending状态

通过describe命令查看pod详情,

kubectl describe pod --namespace  

错误信息1:0/3 nodes are available: 3 node(s) didn’t match node selector.

  • 可能原因:node上没有pod定义selector对应的label。

  • 解决方法:检查node的label,确认没有selector对应的label后,给node添加label。

    检查node label的命令:

    kubectl get nodes --show-labels

    添加label的命令:

    kubectl label node

错误信息2:0/4 nodes are available: 1 node(s) had no available volume zone, 2 Insufficient cpu, 3 Insufficient memory.

  • 可能原因:节点资源不足。

  • 解决方法:查看node详情,通过Allocatable和Allocated resources字段确认是否资源不足。如果确认是资源不足,资源该增就增;资源没得增就考虑调整replicas和resource request。

    查看node详情的命令:

    kubectl describe node

    • Allocatable: 表示此节点能够申请的资源总和
    • Allocated resources: 表示此节点已分配的资源 (Allocatable 减去节点上所有 Pod 总的 Request)

    前者与后者相减,可得出剩余可申请的资源。如果这个值小于 Pod 的 request,就不满足 Pod 的资源要求,Scheduler 在 Predicates (预选) 阶段就会剔除掉这个 Node,也就不会调度上去。

ImagePullBackOff

通过describe命令查看pod详情,

错误信息1:Back-off pulling image “” xxxxx Error: ImagePullBackOff

  • 可能原因1:imageurl填写错误,远程docker registry没有对应的docker image。
  • 可能原因2:imagePullPolicy是Never,但是本地没有对应的docker image。

错误信息2:rpc error: code = Unknown desc = Error response from daemon: unauthorized: The client does not have permission for manifest xxxxxx Error: ErrImagePull

  • 可能原因:docker registry需要认证,没有正确配置pullSecret。

PVC相关

出现有pod一直处于Pending状态,通过命令

kubectl describe po --namespace

看到描述:pod has unbound immediate PersistentVolumeClaims

Pending Pod错误提示:pod has unbound immediate PersistentVolumeClaims

通过命令

kubectl get pvc --namespace

查看pvc的状态,发现有的pvc一直处于Pending状态,并且通过以下命令

kubectl describe pvc --namespace

看到以下错误描述:

PVC错误:no persistent volumes available for this claim and no storage class is set

可能原因:pvc的storageClass设置为“”,但是没有提前创建好对应的pv。(就是找不到PV)

解决方法:创建对应的pv即可。

pv定义文件可参考:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 1Gi
  accessModes: ["ReadWriteMany"]
  hostPath:
    path: /var/log/test
  storageClassName: ""

使用命令创建对应pv

kubectl create -f

PVC错误:failed to provision volume with StorageClass “xxxx”: claim Selector is not supported

可能原因:配置pvc时设置了selector,但是没有提前创建好对应的pv。(就是找不到PV)

解决方法:创建带对应labels的pv即可。

pv定义文件可参考:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
  labels:
    pv: label-example
spec:
  capacity:
    storage: 1Gi
  accessModes: ["ReadWriteMany"]
  hostPath:
    path: /var/log/test
  storageClassName: "xxxx"

使用命令创建对应pv

kubectl create -f

PVC错误:failed to provision volume with StorageClass “xxxx”: invalid AccessModes [ReadWriteMany]: only AccessModes [ReadWriteOnce ReadOnlyMany] are supported

可能原因:pvc配置的storageClass不支持ReadWriteMany模式。

解决方法:删除原有的pvc,重新创建一个支持ReadWriteMany模式的pvc。

通过命令以下命令删除pvc:

kubectl delete pvc --namespace

创建新的pvc,pvc的定义文件可以参考:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
  namespace: >
spec:
  accessModes: ["ReadWriteMany"]
  storageClassName: "xxxx"
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      pv: label-example

使用命令创建对应pvc

kubectl create -f

Persistent Volumes支持类型参考

其他问题

排错指南

你可能感兴趣的:(cloud,native,kubernetes,运维)