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

目录

前言

1. 先拿到真实 CIDR

2. 备份

(1)etcd 快照

(2)当前 CNI 配置

(3)备份现有的 Calico 配置

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

(1)下载并注入相同 CIDR

(2)验证一下版本

(3)master机器上打包镜像

(4)node设备拉取并导入

(5)验证

(6)如果你用 containerd

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

窗口 1:执行脚本

窗口 2:实时看 Pod 迁移

或者只看节点状态

5. 验证新网络

(1)跨节点 Pod 互通

(2)Service 解析

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

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

(2)若用 tigera-operator

(3)删除 Calico 的控制组件

(4)删除 Calico 的节点 DaemonSet

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

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

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使用了这么久,目前没啥缺点。

更多推荐