k8s集群网络插件caclico切换为flannel

比起君子讷于言而敏于行,我更喜欢君子善于言且敏于行。

目录

前言

[1. 先拿到真实 CIDR](#1. 先拿到真实 CIDR)

[2. 备份](#2. 备份)

[(1)etcd 快照](#(1)etcd 快照)

[(2)当前 CNI 配置](#(2)当前 CNI 配置)

[(3)备份现有的 Calico 配置](#(3)备份现有的 Calico 配置)

[3. 安装 Flannel(并行,老 Pod 仍走 Calico)](#3. 安装 Flannel(并行,老 Pod 仍走 Calico))

[(1)下载并注入相同 CIDR](#(1)下载并注入相同 CIDR)

(2)验证一下版本

(3)master机器上打包镜像

(4)node设备拉取并导入

(5)验证

[(6)如果你用 containerd](#(6)如果你用 containerd)

[4. 逐节点滚动切换(唯一中断窗口)](#4. 逐节点滚动切换(唯一中断窗口))

[窗口 1:执行脚本](#窗口 1:执行脚本)

[窗口 2:实时看 Pod 迁移](#窗口 2:实时看 Pod 迁移)

或者只看节点状态

[5. 验证新网络](#5. 验证新网络)

[(1)跨节点 Pod 互通](#(1)跨节点 Pod 互通)

[(2)Service 解析](#(2)Service 解析)

[6. 卸载 Calico(全网验证通过后再做)](#6. 卸载 Calico(全网验证通过后再做))

[(1) 删除 Calico 所有资源(根据你当初安装方式选一条)](#(1) 删除 Calico 所有资源(根据你当初安装方式选一条))

[(2)若用 tigera-operator](#(2)若用 tigera-operator)

[(3)删除 Calico 的控制组件](#(3)删除 Calico 的控制组件)

[(4)删除 Calico 的节点 DaemonSet](#(4)删除 Calico 的节点 DaemonSet)

[(5)删除 Calico 的 CRD(可选,若想彻底干净)](#(5)删除 Calico 的 CRD(可选,若想彻底干净))

[(6)删除与 Calico 相关的 ConfigMap 和 ServiceAccount](#(6)删除与 Calico 相关的 ConfigMap 和 ServiceAccount)

[7. 清理残留(可选)](#7. 清理残留(可选))

每台节点删旧二进制

总结


前言

别问为什么这么高产,问就是恶补操作文档......开发反馈要用flannel,比我想象中好切。也是之前做的了。


1. 先拿到真实 CIDR

复制代码
export CALICO_CIDR=$(kubectl get ippool -o jsonpath='{.items[0].spec.cidr}')
echo $CALICO_CIDR

2. 备份

(1)etcd 快照

复制代码
ETCDCTL_API=3 etcdctl snapshot save /srv/etcd-$(date +%F).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

(2)当前 CNI 配置

复制代码
tar zcf /srv/cni-backup-$(date +%F).tar.gz /etc/cni/net.d

(3)备份现有的 Calico 配置

复制代码
mkdir -p ~/backup-calico
kubectl get all -n kube-system -l k8s-app=calico-node -o yaml > ~/backup-calico/calico-node.yaml
kubectl get all -n kube-system -l k8s-app=calico-kube-controllers -o yaml > ~/backup-calico/calico-controllers.yaml
kubectl get cm,ds,deploy,sa,clusterrole,clusterrolebinding -n kube-system | grep calico > ~/backup-calico/calico-resources-list.txt

3. 安装 Flannel(并行,老 Pod 仍走 Calico)

(1)下载并注入相同 CIDR

复制代码
curl -sL https://github.com/flannel-io/flannel/archive/v0.25.5.tar.gz | tar -xz
cp flannel-0.25.5/Documentation/kube-flannel.yml .
rm -rf flannel-0.25.5

(2)验证一下版本

复制代码
#查看 flannel 使用的镜像版本
grep image: kube-flannel.yml

#修改 Flannel 的集群网段(Pod IP 段)。把配置文件里的网络地址,替换成你环境的网段变量 CALICO_CIDR。告诉 Flannel咱们集群的 Pod 要用哪个 IP 段。
sed -i "s|\"Network\":.*|\"Network\": \"${CALICO_CIDR}\",|g" kube-flannel.yml

#把 Flannel 网络插件真正部署到 K8s 集群里
kubectl apply -f kube-flannel.yml

#等待 Flannel 全部启动成功
kubectl -n kube-flannel rollout status ds/kube-flannel-ds

(3)master机器上打包镜像

复制代码
sudo docker save docker.io/flannel/flannel:v0.25.5 \
             docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1 | \
   gzip > /tmp/flannel-0.25.5.tar.gz

(4)node设备拉取并导入

复制代码
scp -r ubuntu@<mstaer-ip>:/tmp/flannel-0.25.5.tar.gz .
sudo su
gzip -dc ./flannel-0.25.5.tar.gz | docker load

(5)验证

复制代码
sudo docker images | grep flannel
flannel/flannel                                                      v0.25.5                                        b9f4beb93d68   15 months ago   80.4MB
flannel/flannel-cni-plugin                                           v1.5.1-flannel1                                0b2af0d15971   15 months ago   10.4MB

(6)如果你用 containerd

复制代码
#判断用的是docker还是containerd
kubectl get nodes -o wide
#把离线 tar 镜像导入到 containerd 里
ctr -n=k8s.io images import ./flannel-0.25.5.tar.gz

4. 逐节点滚动切换(唯一中断窗口)

窗口 1:执行脚本

复制代码
./mvpod.sh 2>&1 | tee mvpod-$(date +%F_%T).log

窗口 2:实时看 Pod 迁移

复制代码
watch -n 1 kubectl get pods -A -o wide

或者只看节点状态

复制代码
watch -n 1 kubectl get nodes

5. 验证新网络

(1)跨节点 Pod 互通

复制代码
kubectl run ping-test --image=busybox --rm -it -- ping <另一节点PodIP>

(2)Service 解析

复制代码
kubectl run dns-test --image=busybox --rm -it -- nslookup kubernetes.default

6. 卸载 Calico(全网验证通过后再做)

(1) 删除 Calico 所有资源(根据你当初安装方式选一条)

复制代码
kubectl delete -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

(2)若用 tigera-operator

复制代码
kubectl delete ns calico-system
kubectl delete clusterrole/calico-node clusterrolebinding/calico-node

(3)删除 Calico 的控制组件

复制代码
kubectl delete deployment calico-kube-controllers -n kube-system --ignore-not-found

(4)删除 Calico 的节点 DaemonSet

复制代码
kubectl delete daemonset calico-node -n kube-system --ignore-not-found

(5)删除 Calico 的 CRD(可选,若想彻底干净)

复制代码
kubectl delete crd bgppeers.crd.projectcalico.org \
   bgpconfigurations.crd.projectcalico.org \
   ippools.crd.projectcalico.org \
   felixconfigurations.crd.projectcalico.org \
   hostendpoints.crd.projectcalico.org \
   clusterinformations.crd.projectcalico.org \
   globalnetworkpolicies.crd.projectcalico.org \
   globalnetworksets.crd.projectcalico.org \
   networkpolicies.crd.projectcalico.org \
   networksets.crd.projectcalico.org --ignore-not-found

(6)删除与 Calico 相关的 ConfigMap 和 ServiceAccount

复制代码
kubectl delete cm calico-config -n kube-system --ignore-not-found
kubectl delete sa calico-node -n kube-system --ignore-not-found
kubectl delete clusterrole calico-node calico-kube-controllers --ignore-not-found
kubectl delete clusterrolebinding calico-node calico-kube-controllers --ignore-not-found

7. 清理残留(可选)

每台节点删旧二进制

复制代码
kubectl get nodes -o name | xargs -I{} ssh {} 'rm -f /opt/cni/bin/calico /opt/cni/bin/calico-ipam'

总结

Calico使用时间挺短的,没有什么使用感悟。flannel使用了这么久,目前没啥缺点。

相关推荐
阿里云云原生5 小时前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生8 小时前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事2 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson4 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
阿里云云原生4 天前
AI 开发新常态:当 Cursor、Claude、Codex 并行,如何统一管理散落的 Skill 资产?
云原生·ai编程
探索云原生4 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美5 天前
从edge-trigger到level-trigger,谈谈 Kubernetes controller 的开发范式
云原生
阿里云云原生5 天前
深度解构:当 Append-only 的 SLS 遇上 Update/Delete,是如何实现设计权衡的?
云原生