一起来学k8s 17.calico

Calico

在容器生态中,要说到像 Flannel host-gw 这样的三层网络方案,我们就不得不提到这个领域里的“龙头老大”Calico 项目了。

实际上,Calico 项目提供的网络解决方案,与 Flannel 的 host-gw 模式,几乎是完全一样的。也就是说,Calico 也会在每台宿主机上,添加一个格式如下所示的路由规则:

< 目的容器 IP 地址段 > via < 网关的 IP 地址 > dev eth0

其中,网关的 IP 地址,正是目的容器所在宿主机的 IP 地址。

而正如前所述,这个三层网络方案得以正常工作的核心,是为每个容器的 IP 地址,找到它所对应的、“下一跳”的网关

不过,不同于 Flannel 通过 Etcd 和宿主机上的 flanneld 来维护路由信息的做法,Calico 项目使用了一个“重型武器”来自动地在整个集群中分发路由信息。

这个“重型武器”,就是 BGP。

BGP 的全称是 Border Gateway Protocol,即:边界网关协议。它是一个 Linux 内核原生就支持的、专门用在大规模数据中心里维护不同的“自治系统”之间路由信息的、无中心的路由协议。

这个概念可能听起来有点儿“吓人”,但实际上,我可以用一个非常简单的例子来为你讲清楚。

img

图 2 自治系统

在这个图中,我们有两个自治系统(Autonomous System,简称为 AS):AS 1 和 AS 2。而所谓的一个自治系统,指的是一个组织管辖下的所有 IP 网络和路由器的全体。你可以把它想象成一个小公司里的所有主机和路由器。在正常情况下,自治系统之间不会有任何“来往”。

但是,如果这样两个自治系统里的主机,要通过 IP 地址直接进行通信,我们就必须使用路由器把这两个自治系统连接起来。

比如,AS 1 里面的主机 10.10.0.2,要访问 AS 2 里面的主机 172.17.0.3 的话。它发出的 IP 包,就会先到达自治系统 AS 1 上的路由器 Router 1。

而在此时,Router 1 的路由表里,有这样一条规则,即:目的地址是 172.17.0.2 包,应该经过 Router 1 的 C 接口,发往网关 Router 2(即:自治系统 AS 2 上的路由器)。

所以 IP 包就会到达 Router 2 上,然后经过 Router 2 的路由表,从 B 接口出来到达目的主机 172.17.0.3。

但是反过来,如果主机 172.17.0.3 要访问 10.10.0.2,那么这个 IP 包,在到达 Router 2 之后,就不知道该去哪儿了。因为在 Router 2 的路由表里,并没有关于 AS 1 自治系统的任何路由规则。

所以这时候,网络管理员就应该给 Router 2 也添加一条路由规则,比如:目标地址是 10.10.0.2 的 IP 包,应该经过 Router 2 的 C 接口,发往网关 Router 1。

像上面这样负责把自治系统连接在一起的路由器,我们就把它形象地称为:边界

### Kubernetes 1.23 安装 Calico 网络插件教程 以下是关于在 Kubernetes 1.23 版本中安装 Calico 网络插件的具体方法: #### 准备工作 确保 Kubernetes 集群已经正确初始化并运行。可以通过以下命令验证集群的状态: ```bash kubectl get nodes ``` 确认所有节点处于 `Ready` 状态[^2]。 #### 步骤一:下载 Calico 的配置文件 执行以下命令来创建 Calico 插件所需的资源对象: ```bash kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml ``` 此操作会部署 Tigera Operator,它是管理 Calico 资源的核心组件[^1]。 #### 步骤二:应用默认的 Calico 配置 继续通过以下命令完成 Calico 的实际部署: ```bash kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml ``` 这一步将定义具体的网络策略和其他必要的参数设置。 #### 检查安装状态 等待一段时间后,可以检查 Pod 和 Node 的状态以确认 Calico 是否已成功启动: ```bash kubectl get pods -n kube-system kubectl get nodes ``` 理想情况下,所有的 Calico Pods 应该进入 `Running` 或者其他稳定状态而不是 `CrashLoopBackOff` 等错误状态[^3]。 如果发现某些 Pod 存在于异常状态,则可进一步排查其日志信息: ```bash kubectl logs <pod-name> -n kube-system ``` #### 常见问题处理 - 如果部分 Pod 处于 Pending 状态,请检查是否有足够的资源分配给这些容器实例。 - 若遇到网络连通性问题,需重新审视 CNI (Container Network Interface) 的配置细节以及防火墙规则是否允许所需端口通信。 --- ### 注意事项 在整个过程中保持耐心很重要,因为有时由于镜像拉取延迟等原因可能导致一些初始阶段看起来像是失败的情况实际上只是时间上的差异而已。 ```python # 示例 Python 脚本用于自动化检测 calico pod 状态 import time from subprocess import run, PIPE def check_calico_status(): while True: result = run(['kubectl', 'get', 'pods', '-n', 'kube-system'], stdout=PIPE) output = result.stdout.decode('utf-8') if "calico-node" in output and "Running" in output: print("Calico is running successfully.") break print("Waiting for Calico to start...") time.sleep(10) check_calico_status() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值