卸载 Calico 安装 Kube-OVN¶
若 Kubernetes 集群已安装 Calico 需要变更为 Kube-OVN 可以参考本文档。
本文以 Calico v3.24.1 为例,其它 Calico 版本需要根据实际情况进行调整。
准备工作¶
为了保证切换 CNI 过程中集群网络保持畅通,Calico ippool 需要开启 nat outgoing,或在所有节点上关闭 rp_filter:
sysctl net.ipv4.conf.all.rp_filter=0
sysctl net.ipv4.conf.default.rp_filter=0
# IPIP 模式
sysctl net.ipv4.conf.tunl0.rp_filter=0
# VXLAN 模式
sysctl net.ipv4.conf.vxlan/calico.rp_filter=0
# 路由模式,eth0 需要修改为实际使用的网卡
sysctl net.ipv4.conf.eth0.rp_filter=0
部署 Kube-OVN¶
下载安装脚本¶
wget https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.13/dist/images/install.sh
修改安装脚本¶
将安装脚本中重建 Pod 的部分删除:
echo "[Step 4/6] Delete pod that not in host network mode"
for ns in $(kubectl get ns --no-headers -o custom-columns=NAME:.metadata.name); do
for pod in $(kubectl get pod --no-headers -n "$ns" --field-selector spec.restartPolicy=Always -o custom-columns=NAME:.metadata.name,HOST:spec.hostNetwork | awk '{if ($2!="true") print $1}'); do
kubectl delete pod "$pod" -n "$ns" --ignore-not-found
done
done
按需修改以下配置:
REGISTRY="kubeovn" # 镜像仓库地址
VERSION="v1.13.1" # 镜像版本/Tag
POD_CIDR="10.16.0.0/16" # 默认子网 CIDR 不要和 SVC/NODE/JOIN CIDR 重叠
SVC_CIDR="10.96.0.0/12" # 需要和 apiserver 的 service-cluster-ip-range 保持一致
JOIN_CIDR="100.64.0.0/16" # Pod 和主机通信网络 CIDR,不要和 SVC/NODE/POD CIDR 重叠
LABEL="node-role.kubernetes.io/master" # 部署 OVN DB 节点的标签
IFACE="" # 容器网络所使用的的宿主机网卡名,如果为空则使用 Kubernetes 中的 Node IP 所在网卡
TUNNEL_TYPE="geneve" # 隧道封装协议,可选 geneve, vxlan 或 stt,stt 需要单独编译 ovs 内核模块
注意:POD_CIDR 及 JOIN_CIDR 不可与 Calico ippool 的 CIDR 冲突,且 POD_CIDR 需要包含足够多的 IP 来容纳集群中已有的 Pod。
执行安装脚本¶
bash install.sh
逐个节点迁移¶
按照以下方法为每个节点逐个进行迁移。 注意:命令中的 \<NODE> 需要替换为节点名称。
驱逐节点¶
kubectl drain --ignore-daemonsets <NODE>
若此命令一直等待 Pod 被驱逐,执行以下命令强制删除被驱逐的 Pod:
kubectl get pod -A --field-selector=spec.nodeName=<NODE> --no-headers | \
awk '$4=="Terminating" {print $1" "$2}' | \
while read s; do kubectl delete pod --force -n $s; done
重启节点¶
在节点中执行:
shutdown -r 0
恢复节点¶
kubectl uncordon <NODE>
卸载 Calico¶
删除 k8s 资源¶
kubectl -n kube-system delete deploy calico-kube-controllers
kubectl -n kube-system delete ds calico-node
kubectl -n kube-system delete cm calico-config
# 删除 CRD 及相关资源
kubectl get crd -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | while read crd; do
if ! echo $crd | grep '.crd.projectcalico.org$' >/dev/null; then
continue
fi
for name in $(kubectl get $crd -o jsonpath='{.items[*].metadata.name}'); do
kubectl delete $crd $name
done
kubectl delete crd $crd
done
# 其它资源
kubectl delete --ignore-not-found clusterrolebinding calico-node calico-kube-controllers
kubectl delete --ignore-not-found clusterrole calico-node calico-kube-controllers
kubectl delete --ignore-not-found sa -n kube-system calico-kube-controllers calico-node
kubectl delete --ignore-not-found pdb -n kube-system calico-kube-controllers
清理节点文件¶
在每个节点中执行:
rm -f /etc/cni/net.d/10-calico.conflist /etc/cni/net.d/calico-kubeconfig
rm -f /opt/cni/bin/calico /opt/cni/bin/calico-ipam
微信群 Slack Twitter Support Meeting