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

相关推荐
Zhu7581 小时前
【问题处理】minIO(AIStor)在k8s部署后,API访问失败的问题,TLS
云原生·容器·kubernetes
临街的小孩2 小时前
Docker 容器内运行 ROS Noetic 图形界面(rqt_image_view)极简教程总结
运维·docker·容器
Altruiste4 小时前
minikube 搭clickhouse 集群
clickhouse·kubernetes
古城小栈5 小时前
通过 Kind 快速构建 k8s 集群
云原生·kubernetes·kind
Apache RocketMQ5 小时前
RocketMQ源码解析——秒级定时消息介绍
java·云原生·消息队列·rocketmq·java-rocketmq
smileNicky6 小时前
Docker 部署 SpringBoot 项目超详细教程
spring boot·docker·容器
珂玥c7 小时前
kubeadm方式部署 k8s 1.21
云原生·容器·kubernetes
小义_8 小时前
【Kubernetes】(十九)监控与升级
云原生·容器·kubernetes
炸炸鱼.9 小时前
Kubernetes Pod 深度理解:从入门到实战
云原生·容器·kubernetes·pod