• K8S 报错笔记--持续更新


    一、ContainerCreating

    这种报错其实不算报错,容器正在创建中,通常是我们配置问题导致的,

    1、docker服务问题

    有一天起来有个应用说容器创建不出来,卡在ContainerCreateing状态

    按照习惯,我们去describe去看事件,但并没发现有什么报错信息,容器本身还创建出来了

    并且通过exec 是可以登陆的,当然logs日志看不了,尝试重启node节点上的kube-proxy、kubelet后

    依然是不可用的,重启docker服务后创建成功就绪, 原因未查明( ̄﹃ ̄)

    2、 K8挂载远程存储问题

    这种情况通常是远程nfs、gfs等存储问题导致的,这个我们可以还原一下

    举个栗子

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. labels:
    5. app: nginx
    6. name: nginx
    7. namespace: default
    8. spec:
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. app: nginx
    13. template:
    14. metadata:
    15. labels:
    16. app: nginx
    17. spec:
    18. containers:
    19. - image: nginx
    20. imagePullPolicy: Always
    21. name: nginx
    22. volumeMounts:
    23. - mountPath: /tmp/
    24. name: www
    25. volumes:
    26. - name: www
    27. nfs:
    28. path: /nfs/web/date
    29. readOnly: true
    30. server: 192.168.1.21

    这里的nfs主机并不存在,我们直接去部署这个yaml,他会一直卡在创建中

    查看报错事件

    类似 mount failed: exit status 32的报错很多,比如

    1. 1、nfs 挂载报错mount failed: exit status 32 是存储nfs不存在
    2. 2、 nfs 挂载报错mount failed: exit status 1 记不清了,反正在nfs的问题,试试挂载目录或者权限吧
    3. 3、 gfs 挂载报错mount failed: exit status 32 是指 node节点上没有安装 gfs的客户端
    4. 4、 gfs 挂载报错mount failed: exit status 1 可能是我们没有在gfs服务端创建要挂载的卷

    上面的不一定全对,提供一个思路,存储之类的报错通常都可以从pod的事件信息中得到的

    3、configmap 问题

    这个不是很常见,不过也出现过,在搞paas平台的时候,我们写应用通常要传入一些paas的变量,这个通过挂载configmap来获取,但因为奇奇怪怪的原因没挂上,就会出现了,或者简单点就是cm的名称写错了之类的

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. labels:
    5. app: nginx
    6. name: nginx
    7. namespace: default
    8. spec:
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. app: nginx
    13. template:
    14. metadata:
    15. labels:
    16. app: nginx
    17. spec:
    18. containers:
    19. - image: nginx
    20. imagePullPolicy: Always
    21. name: nginx
    22. volumeMounts:
    23. - mountPath: /tmp/
    24. name: www
    25. volumes:
    26. - name: www
    27. configMap:
    28. name: nginx-config

    返回

    1. Events:
    2. Type Reason Age From Message
    3. ---- ------ ---- ---- -------
    4. Normal Scheduled 2m21s default-scheduler Successfully assigned default/nginx-59d6d76f78-2kh7n to vm-16-16-centos
    5. Warning FailedMount 18s kubelet Unable to attach or mount volumes: unmounted volumes=[www], unattached volumes=[www kube-api-access-hvk9s]: timed out waiting for the condition
    6. Warning FailedMount 13s (x9 over 2m21s) kubelet MountVolume.SetUp failed for volume "www" : configmap "nginx-config" not found

    解决方法

    1. 每个人的环境不同解决方法也不一样,如果是自己写错了名称,改一下就OK
    2. 如果是别人开发的环境,那就只能找开发来看了

     这部分能想到的就这些,其他有的再补充

    二、ErrImagePull   或者    ImagePullBackOff

    1、仓库镜像问题

    这种情况一般是镜像推送的流程有问题,我们做了ci/cd,但是在推送镜像的时候刚好赶上镜像仓库在清理镜像,那么就会有部分的仓库同步不到镜像,这样可能导致我们拉取镜像失败

    ,简单来说就是仓库没镜像

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. labels:
    5. app: nginx
    6. name: nginx
    7. namespace: default
    8. spec:
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. app: nginx
    13. template:
    14. metadata:
    15. labels:
    16. app: nginx
    17. spec:
    18. containers:
    19. - image: nginx:1111111111 #不存在的镜像
    20. imagePullPolicy: Always
    21. name: nginx
    22. volumeMounts:
    23. - mountPath: /tmp/
    24. name: www
    25. volumes:
    26. - name: www
    27. configMap:
    28. name: nginx-config

     

    2、startContainer 

    这个报错好久没看到了,我隐约记得是在更新二进制的docker更新崩了后出现的

     解决方法

    1. 把docker和container 的文件清理掉重新安装即可
    2. rm -rf /var/run/containerd/*
    3. rm -rf /var/lib/docker/*

    三、Pending

    pending状态其实涉及的方向有很多的这里先简单列举一下

    1. 1、 K8调度组件 scheduler 组件异常, 集群组件挂了
    2. 2、 sa 没有权限或者不存在
    3. 3、 用户指定的匹配节点策略有问题 (nodeselector 容忍、污点等等调度策略)
    4. 通常是应用用户标签写错了
    5. 4、 节点没有足够的资源满足调度 //测试环境通常资源较小,用户软限制太大无法调度
    6. 5、pv 卷问题

     隐约记得还有几项的,但是想不起来了,想起来在加

    四、CrashLoopBackOff  或者 ERROR

    这种涉及到的方向也不少,这种情况我们大多数的时候都可以通过容器日志、容器服务日志得到答案

    1. 1、 容器服务配置有问题,导致容器服务的守护进程启动直接挂掉了,检查配置
    2. 2、容器健康检查探针检查端口不正常会杀死容器重启,
    3. 3、容器有什么启动后的操作,操作到一般发现跑不下去了,比如容器服务启动脚本里面有
    4. //ftp 链接
    5. //域名无法解析
    6. //远程主机端口无法通讯等等
    7. 4、容器资源限制太小,内存软硬限制一般是1:1的 然后内存超出我们的硬限制后oom 导致容器重启报错

    五、Terminating或Unknown

    这种资源一般情况下都是 大批量node节点掉线导致的,比如之前我们集群网络波动,所有node需要重启组件  就能看到大量的 这种状态的pod, 或者说我们在删除某个pod的时候node节点发生了异常导致 出现   1/1 Terminating  的情况,这种直接强制删除pod就行

    六、UnexpectedAdmissionError

    说白了,就是node节点上磁盘满了,我们node写不进去日志了

    你可以发现大量这种的pod都是来自于同一台node主机,你登陆node主机去把文件系统清理一下,然后批量删除掉这些pod

    kubectl get pods -A | grep  UnexpectedAdmissionError | awk '{print("kubectl delete pod ", $2, " -n ", $1)}' | /bin/bash

    七,一个误以为是K8问题的linux问题

     我们K8集群环境有一天发现有个节点掉了(notready)登陆主机发现df -h命令阻塞无法使用

    猜测为远程挂载存储异常,但主机数量非常多,不清楚是那里的存储导致的下面是解决方法

     还原场景

    1. //部署nfs服务
    2. echo "/home/nfs *(rw,async,no_root_squash)" >> /etc/exports
    3. //启动nfs
    4. systemctl start nfs
    5. //登陆客户端创建目录
    6. mkdir -p /tmp/test1/
    7. //挂载nfs
    8. mount -t nfs 10.0.16.16:/home/nfs /tmp/test1/
    9. //查看
    10. df -h | grep /tmp/test1

    这个前提是我们df -h 能用的情况下,下面我们演示df -h 不可用的情况怎么查询

    1. //停止nfs服务
    2. systemctl stop nfs
    3. //查看df命令
    4. df -h

     

    可以看到nfs挂掉后df -h已经阻塞不可用了,下面我们通过mount -l命令去查询挂载信息

    mount -l | grep nfs

     

     通过mount 命令我们得知nfs地址是10.0.16.16,登陆nfs主机重启服务恢复

     

  • 相关阅读:
    TFM—用于实时监控和数据管理的远程试验管理平台
    ELK8.4安装配置错误记录
    淘宝一键上货API:自动化上架商品、批量获取商品详情信息
    彻底理解线程
    idea自动封装方法
    Java面试题大全(2021版)
    交换机与路由技术-13-三层交换
    HTML定位相关
    lazarus开发应用提供http接口
    Java代理模式
  • 原文地址:https://blog.csdn.net/qq_42883074/article/details/126221693