Kubernetes排障指南

pod故障排查

大多数情况下,问题大多出在pod本身,我们可以按照如下步骤进行分析定位问题

  1. kubectl get pod 查看是否存在不正常的pod
  2. journalctl -u kubelet -f 查看kubelet,是否存在异常日志
  3. kubectl logs pod/xxxxx -n kube-system

示例排查 CrashLoopBackOff和OOMkilled异常

  • 查看节点运行情况
[root@k8s-m1 src]# kubectl get node
NAME          STATUS   ROLES    AGE   VERSION
k8s-c1   Ready    <none>   16h   v1.14.2
k8s-m1    Ready    master   17h   v1.14.2
  • 首先查看pod状态是否正常
[root@k8s-m1 docker]# kubectl get pod -n kube-system 
NAME                                 READY   STATUS             RESTARTS   AGE
coredns-fb8b8dccf-5g2cx              1/1     Running            0          2d14h
coredns-fb8b8dccf-c5skq              1/1     Running            0          2d14h
etcd-k8s-master                      1/1     Running            0          2d14h
kube-apiserver-k8s-master            1/1     Running            0          2d14h
kube-controller-manager-k8s-master   1/1     Running            0          2d14h
kube-flannel-ds-arm64-7cr2b          0/1     CrashLoopBackOff   629        2d12h
kube-flannel-ds-arm64-hnsrv          0/1     CrashLoopBackOff   4          2d12h
kube-proxy-ldw8m                     1/1     Running            0          2d14h
kube-proxy-xkfdw                     1/1     Running            0          2d14h
kube-scheduler-k8s-master            1/1     Running            0          2d14h

发现网络插件kube-flannel一直在尝试重启,有时能够正常,有时提示 CrashLoopBackOff有时OOMKilled
查看kublet日志

[root@k8s-m1 src]# journalctl -u kubelet -f
12月 09 09:12:45 k8s-master kubelet[35667]: E1209 09:12:45.895575   35667 pod_workers.go:190] Error syncing pod 2eaa8ef9-1822-11ea-a1d9-70fd45ac3f1f ("kube-flannel-ds-arm64-7cr2b_kube-system(2eaa8ef9-1822-11ea-a1d9-70fd45ac3f1f)"), skipping: failed to "StartContainer" for "kube-flannel" with CrashLoopBackOff: "Back-off 5m0s restarting failed container=kube-flannel pod=kube-flannel-ds-arm64-7cr2b_kube-system(2eaa8ef9-1822-11ea-a1d9-70fd45ac3f1f)"

如日志提示网络插件kube-flannel崩溃,于是开始查看网路插件kube-flannel的日志

[root@k8s-m1 src]# kubectl logs kube-flannel-ds-arm64-88rjz -n kube-system
E1209 01:20:42.527856       1 iptables.go:115] Failed to ensure iptables rules: Error checking rule existence: failed to check rule existence: running [/sbin/iptables -t nat -C POSTROUTING ! -s 10.244.0.0/16 -d 10.244.0.0/16 -j MASQUERADE --random-fully --wait]: exit status -1: 
E1209 01:20:46.928502       1 iptables.go:115] Failed to ensure iptables rules: Error checking rule existence: failed to check rule existence: running [/sbin/iptables -t filter -C FORWARD -s 10.244.0.0/16 -j ACCEPT --wait]: exit status -1: 
E1209 01:20:52.128049       1 iptables.go:115] Failed to ensure iptables rules: Error checking rule existence: failed to check rule existence: running [/sbin/iptables -t filter -C FORWARD -s 10.244.0.0/16 -j ACCEPT --wait]: exit status -1: 
E1209 01:20:52.932263       1 iptables.go:115] Failed to ensure iptables rules: Error checking rule existence: failed to check rule existence: fork/exec /sbin/iptables: cannot allocate memory

刚开始一直怀疑是iptables问题,当我尝试把iptables.go中执行命令拷贝到命令行之后可以正常执行,这个时候就不知所以然了,直到我发现有时pod会提示;

kube-flannel-ds-arm64-hnsrv          0/1     OOMKilled   4          2d12h

一直在思考是不是kube-flannel内存配置太小导致的,我直接尝试把内存从50M修改到150M,直接解决问题了,如下所示:

containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.11.0-amd64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN"]

ImagePullBackOff 异常解决

一般出现这个异常大多以下两个原因造成的

  • 镜像名称无效-例如,你拼错了名称,或者 image 不存在
  • 你为 image 指定了不存在的标签

网络插件kube-flannel无法启动问题

一般情况下是因为网络插件flannel下载问题,默认的网络插件下载地址是quay.io/coreos/flannel,但是这个地址国内网络无法直接访问到,这个时候我们需要从quay-mirror.qiniu.com/coreos/flannel地址下载,然后重命名城quay.io,然后执行

kubectl create -f kube-flannel.yml

子节点无法加入问题

主节点一切安装成功,并且提示子节点加入命令,当输入到子节点时发现无法加入,或者一直卡在加入shell命令行界面,无法加入。
第一:先看防火墙 systemctl firewalld.service status 因为集群间需要组网通信,如果防火墙是打开的建议关闭或者加入到iptables里面。默认可以访问。
第二: 查看自己是否配置host组件

  1. 执行cat /etc/hosts命令,修改hosts文件。
  2. 添加集群所有节点的IP及hostname信息
  3. hostnamectl --static set-hostname centos-1依次田间
    在这里插入图片描述
    如果还是没有解决则需要根据节点日志,具体问题具体分析解决。

OCI runtime create failed

12月 09 08:56:41 k8s-client1 kubelet[39382]: E1209 08:56:41.691178   39382 kuberuntime_sandbox.go:68] CreatePodSandbox for pod "kube-flannel-ds-arm64-hnsrv_kube-system(2eaafd62-1822-11ea-a1d9-70fd45ac3f1f)" failed: rpc error: code = Unknown desc = failed to start sandbox container for pod "kube-flannel-ds-arm64-hnsrv": Error response from daemon: OCI runtime create failed: systemd cgroup flag passed, but systemd support for managing cgroups is not available: unknown
  • 查看daemon.json文件
    cat /etc/docker/daemon.json
    {
    “registry-mirrors”: [“https://registry.docker-cn.co”],
    “exec-opts”: [“native.cgroupdriver=systemd”]
    }
    因为指定了systemd,导致文件docker 运行镜像失败,
  • 去掉 “exec-opts”: [“native.cgroupdriver=systemd”]
  • 重启docker 服务

The connection to the server localhost:8080 was refused - did you specify the right host or port?

出现这个问题的原因是kubectl命令需要使用kubernetes-admin来运行,

  • 解决方法如下,将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下,然后如提示配置环境变量:
    Your Kubernetes control-plane has initialized successfully!
     
    To start using your cluster, you need to run the following as a regular user:
     
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 另外一种解决办法
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    
source ~/.bash_profile

总结

kubernetes作为解耦开发和运维的利器,架构设计超前,部署和使用的过程中会出现各种各样问题。我们要学会从kubelet、node、pod甚至container结合日志进行分析解决问题。在CSDN转眼已经将近5年时间,积累了大概100多遍文章,谈不上原创,更多的是一种分享和记录,计划移步公众号【 编程e站(programmer_java)】如果需要请关注。
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值