在当前的Kubernetes实践环境中,Calico作为优选的网络解决方案应用非常广泛,它提供了高效的网络连接和安全策略管理,是构建和维护大规模云基础设施的关键组件,所以其稳定运行至关重要。
01、Calico的简介与原理
Calico是一个纯三层的数据中心网络方案,它提供了高性能、大规模的网络解决方案,支持动态路由、网络策略和网络隔离等功能。Calico利用标准的IP路由,简化了网络布局,同时也支持广泛的私有云和公有云平台。 核心原理:
- IP路由:Calico使用基于IP的路由而不是传统的overlay网络,这减少了封包封装的开销,提高了网络性能。
- 网络策略:提供细粒度的网络安全策略,可以控制哪些Pod可以通信。这是通过直接与Kubernetes API集成来实现的,使得策略定义既直观又灵活。
- BGP(Border Gateway Protocol):Calico使用BGP来广播和学习路由,这使得它能够在不同的物理和云基础设施上无缝工作。 Calico在Kubernetes环境中尤其重要,因为它不仅提供容器网络接口(CNI),还提供网络安全策略,确保Pod间的安全通信。
02、故障描述
最近,在技术交流群里有兄弟反馈他们生产环境的k8s集群出现Calico Controller无法正常启动的情况,报cannot find a qualified ippool,业务Pod也无法正常重启,这是一个很严重且比较罕见的故障,Calico的故障可能导致Pod与Pod的通信中断、新启动的Pod无法正常获取ip导致启动失败等问题,如果不及时处理或者处理姿势不对,将有可能升级为更大的故障。
03、故障排查
看到下图的报错内容,起初想到的是可能是ip地址池满了,亦或ip地址池被删?被禁用?于是,我们开始沿着这个思路进行排查,但关键是我们要怎么查看Calico ip地址池的状态呢?
是的,我们需要借助一个工具叫calicoctl,如下是二进制安装方法
代码语言:javascript复制# 下载calicoctl二进制文件
curl -o calicoctl -O -L "https://github.com/projectcalico/calico/releases/download/v3.24.1/calicoctl-linux-amd64"
# 赋予可执行权限
chmod x calicoctl
# 将calicoctl复制到/usr/bin目录下
mv calicoctl /usr/bin/
安装完成后,我们可以根据如下指令查看ipPool状态
代码语言:javascript复制calicoctl get ipPool -o wide
从结果我们得知ip地址池是有的,只是被禁用了,DISABLED的状态被设置为true,将其改为false后故障估计就能恢复
04、解决过程
在定位到问题后,我们尝试着通过下面的指令将ip地址池状态修改为启用
代码语言:javascript复制calicoctl patch ippool default-ipv4-ippool -p '{"spec": {"disabled": false}}'
在执行指令后通过calicoctl get ippool -o yaml查看ip地址池状态,发现未能得偿所愿,disabled还是true,Why???这就有点蛋疼了。。。
要怎么办呢?反正地址池也用不了,要么我们重建一个?但是直接删吗?不,运维人员要有备份的习惯,我们通过calicoctl get ippool -o yaml将配置进行备份,然后通过下面的指令删除现有的ip地址池
代码语言:javascript复制calicoctl delete ippool default-ipv4-ippool
接着,我们用下面的指令进行创建
代码语言:javascript复制calicoctl create -f - <<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 10.233.64.0/18
ipipMode: Always
natOutgoing: true
EOF
在创建完成后,我们再次执行calicoctl get ippool -o wide观察到ip地址池已经启用了,牛逼!!!
接着,就是重启Calico Controller的Pod,然后可以从Pod事件日志中我们看到Calico Controller已经正常启动了,重新启动的业务Pods也可以正常获取到ip并完成启动,故障解决。
05、总结
当涉及到生产环境,尤其是核心组件的变更时,我们必须持有敬畏之心。在进行任何关键变更之前,都应该进行充分的预演,以确保我们了解变更的影响和可能的风险。特别是在遇到Calico故障时,务必保持冷静,不要仓促行动。切记不要随意重启容器,因为这可能导致容器无法启动。在执行任何操作之前,必须确保操作符合我们的认知,不清楚的情况下,绝对不要随意尝试,分享就到这里,谢谢!