Please enable Javascript to view the contents

Kubernetes 集群 troubleshooting

 ·  ☕ 4 分钟

FailedCreatePodSandBox

  • 错误

Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:402: getting the final child's pid from pipe caused: EOF: unknown

  • 处理

清理 cache

1
echo 3 > /proc/sys/vm/drop_caches
  • 原因

内存碎片过多

calico-node 不停重启 increase max user

  • 错误

runtime: failed to create new OS thread (have 11 already; errno=11),runtime: may need to increase max user processes (ulimit -u)

  • 处理

增加 ulimit 限制额度

1
ulimit -u unlimited
  • 原因

用户进程数耗尽

calico-node BIRD is not ready

  • 错误

Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refused

  • 处理

执行 ifconfig 找到当前主机 IP 绑定的网卡,例如 ens192

kubectl -n kube-system edit ds calico-node

1
2
- name: IP_AUTODETECTION_METHOD
  value: can-reach=$(NODEIP)

改为

1
2
- name: IP_AUTODETECTION_METHOD
  value: "interface=ens192"

使得 interface 值能正则匹配上 ens192 即可。

  • 原因

Calico 没有自动识别到正确的网卡。

cgroup 内存泄露问题 cannot allocate memory

  • 错误

mkdir /sys/fs/cgroup/memory/kubepods/burstable/pod7a1e89bd-b85e-46c6-9674-bbfd3ead02d1: cannot allocate memory

如果有 fork 相关字样,可能是 PID 耗尽。

  • 临时处理

清理 cache

1
echo 3 > /proc/sys/vm/drop_caches
  • 永久处理
  1. 修改 /etc/default/grub

GRUB_CMDLINE_LINUX 加上了 cgroup.memory=nokmem

  1. 生成配置

/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg

  1. 重启机器

reboot

  • 原因

cgroup 内存泄露

kubectl 404 page not found

  • 错误

执行 kubectl exec 时,报错 error: unable to upgrade connection: 404 page not found

  • 处理

在 kubelet 启动参数中添加当前节点的 IP,Environment="KUBELET_EXTRA_ARGS=--node-ip=x.x.x.x"

  • 原因

安装工具未能准确识别主机 IP

容器内系统调用出错、没权限

  • 错误

Problem executing scripts Post-Invoke Sub-process returned an error code 没权限提示

  • 处理

在运行时,添加参数 --security-opt seccomp=unconfined 禁用 seccomp

  • 原因

内核中的 Seccomp 安全模块,限制了容器对主机的系统调用能力。

NodePort 服务不能通过 localhost 访问

  • 错误

NodePort 暴露的服务,不能通过 localhost:port 访问,只能通过主机的 ip:port 访问。

  • 处理

检测回环转发参数

1
sysctl net.ipv4.conf.all.route_localnet

临时生效

1
sysctl -w net.ipv4.conf.all.route_localnet=1

永久生效

1
echo "net.ipv4.conf.all.route_localnet=1" >> /etc/sysctl.conf && sysctl -p
  • 原因

ipvs 模式默认关闭了该转发路径

创建 Pod 失败 fork/exec /usr/bin/runc

  • 错误
1
OCI runtime create failed: unable to retrieve OCI runtime error (open /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/488165d6dd80c997d252ac1a5f36f41edc567cc828d98c0c0b8f1c2acf2e2524/log.json: no such file or directory):
  • 处理

查看 PID 限制

1
cat /proc/sys/kernel/pid_max

查看当前用户使用

1
ps -eLf | wc -l

永久调大 PID 限制

echo "kernel.pid_max=65535 " >> /etc/sysctl.conf && sysctl -p

kubelet volume subpaths are still present on disk

  • 错误

kubelet 大量错误日志

1
Jan 29 01:37:40 k8s-node-2510 kubelet[2080]: E0129 01:37:40.567812    2080 kubelet_volumes.go:154] orphaned pod "1683eaf9-1b46-4ea1-99e5-337bc9c2232c" found, but volume subpaths are still present on disk : There were a total of 14 errors similar to this. Turn up verbosity to see them.
  • 原因

使用 --force --grace-period=0 强制删除 Pod 时,资源没有被回收。

  • 处理

/var/lib/kubelet/pods/ 找到相关 Pod 信息,确认 Pod 已经停止之后,删除 Pod 的目录。

查看 Pod 名字

1
2
3
4
5
6
7
cat /var/lib/kubelet/pods/1683eaf9-1b46-4ea1-99e5-337bc9c2232c/etc-hosts

# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback

10.233.73.154	fmovedaemon-b9c68cd45-qm2wr

fmovedaemon-b9c68cd45-qm2wr 即为 Pod 名字,确认 Pod 停止后,直接删除目录即可。

1
rm -rf /var/lib/kubelet/pods/1683eaf9-1b46-4ea1-99e5-337bc9c2232c/

kubelet MountVolume failed

  • 错误
1
2
3
kubelet MountVolume.MountDevice failed for volume "pvc-4c79c2aa-3a55-4dde-92f2-636b30ea8921" : rpc error: code = Internal desc = format of disk "/dev/longhorn/pvc-4c79c2aa-3a55-4dde-92f2-636b30ea8921" failed: type:("ext4") target:("/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-4c79c2aa-3a55-4dde-92f2-636b30ea8921/globalmount") options:("defaults") errcode:(exit status 1) output:(mke2fs 1.46.4 (18-Aug-2021)
/dev/longhorn/pvc-4c79c2aa-3a55-4dde-92f2-636b30ea8921 is apparently in use by the system; will not make a filesystem here!
)
  • 处理

编辑多路径文件

1
vim /etc/multipath.conf

新增如下内容:

1
2
3
blacklist {
    devnode "^sd[a-z0-9]+"
}

重启服务

1
systemctl restart multipathd.service
  • 原因

多路径为任何符合条件的设备路径创建了多路径设备,包括 Longhorn 存储卷设备,导致 Kubelet 挂载错误。

大内存 Pod 启动失败 page allocation failure

  • 错误
1
starting container process caused \"process_linux.go:245: running exec setns process for init caused \\\"exit status 6
  • 处理
1
echo 3 > /proc/sys/vm/drop_caches
  • 原因

系统内存碎片化,导致创建系统 namespace 时没有足够的大页内存。可以通过一下命令查看内存使用,如果 0 较多说明内存碎片化严重:

1
cat /proc/buddyinfo

使用 IPVS 模式下,服务 No route to host

  • 错误
No route to host
  • 原因

当有大量短连接时,很多链接处于 TIME_WAIT 状态,内核会重用这些链接端口。

内核参数 net.ipv4.vs.conn_reuse_mode 设置为 0 ,重用端口时,IPVS 将流量直接转发至之前的 RS,绕过负载均衡,部分流量被转发到销毁的 Pod 上,导致 No route to host。

  • 处理

在内核 5.9 版本之前建议使用 iptables 模式。

但 iptables 模式下,当集群的服务数量超过 2000 之后,变更规则、转发效率会开始明显下降,CPU 使用率会上升。

在内核 5.9 版本之后建议使用 IPVS 模式。

  1. net.ipv4.vs.conn_reuse_mode设为 1,强制复用连接走负载均衡
  2. net.ipv4.vs.conntrack 设为 0,防止 IPVS 对复用连接进行 DROP SYNC 操作

集群 kube-apiserver P99 解决 20s

  • 错误

  • 处理

删除掉已经停机的、状态为 NotReady 的节点。

  • 原因

可能的原因是,集群中有节点已经停机,但是没有从集群中被剔除。导致某处经过 kube-apiserver 的请求,需要等待超时,超时时间为 20s。

具体原因还需要进一步验证,但删除已经停机的节点后,kube-apiserver P99 能恢复正常。

Pod 创建慢

  • 错误
Sep 11 08:23:17 node3 kubelet[1437]: E0911 08:23:17.770706    1437 kubelet_volumes.go:225] "There were many similar errors. Turn up verbosity to see them." err="orphaned pod \"10ff3c51-ebf2-47dd-b837-fd584319a754\" found, but error not a directory occurred when trying to remove the volumes dir" numErrs=10
  • 原因

可能的原因之一是,创建 Pod 依赖 Secret、ConfigMap 等资源,但在当前命名空间下,这些资源不存在,导致 Kubelet 一直尝试去获取这些资源,直到超时,影响了 Pod 的创建。

  • 处理

找到缺失的资源,创建之。

创建调试的 Pod

  • 创建 DaemonSet
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: demo-ubuntu-daemonset
  namespace: default
spec:
  selector:
    matchLabels:
      app: demo-ubuntu-daemonset
  template:
    metadata:
      labels:
        app: demo-ubuntu-daemonset
    spec:
      containers:
      - name: ubuntu
        image: registry.cn-hangzhou.aliyuncs.com/shaowenchen/demo-ubuntu
EOF
  • 指定节点创建 Deployment
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
export NODE_NAME=MyHostName

```bash
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-ubuntu-deploy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-ubuntu-deploy
  template:
    metadata:
      labels:
        app: demo-ubuntu-deploy
    spec:
      nodeName: $NODE_NAME
      containers:
      - name: demo-ubuntu
        image: registry.cn-hangzhou.aliyuncs.com/shaowenchen/demo-ubuntu
EOF

微信公众号
作者
微信公众号