新版 K3s CNI 目录变化导致 Istio 安装失败

最近在研究 Istio,在最新正式版的 K3s v1.31.5+k3s1 版本下,安装最新正式版 Istio 1.24.3 时,一直卡在 ztunnel 安装这里,于是来发个牢骚。

现象

使用 Helm 安装 ztunnel 之后,发现 ztunnel 无法调度,报错 IP 池不足:failed to allocate for range 0: no IP addresses available in range set。事实上每个节点上调度的 Pod 相当少,IP 不足是不可能的。而且在这之后,其它 Pod 如果重新调度,也会报同样错误,说明集群网络可能出现问题了。

调查

任选一个节点,发现 /var/lib/cni/networks/cbr0 目录下已经整个 IP 池被占用,没有释放。参考一个 Issue:pod creation failure: “no IP addresses available in range set” · Issue #4682 · k3s-io/k3s,尝试将 IP 释放,释放后发现,如果再次尝试安装 ztunnel 就会导致 IP 快速被耗尽,而且 ztunnel 的报错信息中有 CNI 组件相关内容(忘记截图),因此考虑 K3s 中是否有其它不同的因素导致其工作异常。

经过一番搜寻之后发现 K3s 还真的有一个相关的变化,CNI bin dir changes with K3s version · Issue #10869 · k3s-io/k3s 这里引入了一个 CNI 路径的变化,从 /var/lib/rancher/k3s/data/current/bin/ 变为了 /var/lib/rancher/k3s/data/cni/

一开始我看到 Rancher 当下的文档 Additional Steps for Installing Istio on RKE2 and K3s Clusters | Rancher 中提到的路径都是前者,就没有怀疑,看来问题就恰好出在这里。

注意到 Istio 的 Helm Chart 中,有一个提交对此做出了适配:fix: fix k3s cniBinDir to static path (#54112) · istio/istio@7693f57 · GitHub,但是不幸的是还没有正式版的 Release,也就是说,当前安装的 Istio 1.24.3 仍然是旧的 CNI 路径,因此和较新版本的 K3s 不兼容。不过,我发现当下已经有 RC 版本(1.25.0-rc.0)的 Helm Chart 带上了这个变更,所以尝试清理 IP 池后,将 Istio 组件都更新到 1.25.0-rc.0,果然 ztunnel 成功运行了。

引用

Istio / Platform-Specific Prerequisites

kubenet/kubelet leaks ips on docker restart · Issue #34278 · kubernetes/kubernetes

kubenet ip泄漏 – xiaoqing blog

「Bug」K8s 节点的 IP 地址泄漏,导致 IP 被耗尽 – 於清樂 – 博客园

failed to allocate for range 0: no IP addresses available in range set: 172.20.xx.1-172.20.xx.254 – yuxiaoba – 博客园

Containerd IP leakage · Issue #5768 · containerd/containerd

Kubernetes-cni issue with 1.9.0 – no ip address available in range · Issue #57280 · kubernetes/kubernetes

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

目录