比起君子讷于言而敏于行,我更喜欢君子善于言且敏于行。
目录
[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)
[(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使用了这么久,目前没啥缺点。