集群互联(Alpha)
支持在网络模式同为 Kube-OVN 的集群之间配置集群互联,使集群间 Pod 可以互通访问。集群互联控制器是 Kube-OVN 提供的扩展组件,负责收集不同集群之间的网络信息,并通过下发路由将多个集群的网络打通。
前提条件
-
不同集群的子网 CIDR 不能相互重叠。
-
需要存在一组机器可以被每个集群的 kube-ovn-controller 通过 IP 访问,用来部署跨集群互联的控制器。
-
每个集群需要有一组可以通过 IP 进行跨集群互访的机器作为之后的网关节点。
-
该功能只对默认 VPC 生效,用户自定义 VPC 无法使用互联功能。
多节点搭建 Kube-OVN 联通控制器
共存在三种部署方式:Deploy 部署(平台 v3.16.0 及之后版本支持该部署方式)、Docker 部署,Containerd 部署。
Deploy 部署
注意:平台 v3.16.0 及之后版本支持该部署方式。
操作步骤
-
在集群 Master 节点执行如下命令获取 install-ic-server.sh 安装脚本。
wget https://github.com/kubeovn/kube-ovn/blob/release-1.12/dist/images/install-ic-server.sh -
打开当前目录下的脚本文件,找到并修改如下参数。
REGISTRY="kubeovn" VERSION=""修改后的参数配置如下:
REGISTRY="<Kube-OVN 镜像仓库地址>" ##例如:REGISTRY="registry.alauda.cn:60080/acp/" VERSION="<Kube-OVN 版本>" ##例如:VERSION="v1.9.25" -
保存脚本文件,使用如下命令执行此文件。
sh install-ic-server.sh
Docker 及 Containerd 部署
-
选择 任意集群中的三个或三个以上节点 部署联控控制器,在本例中准备了三个节点。
-
选择任一节点当作 Leader,按照不同的部署方式执行如下命令。
注意:配置前请检查下
/etc下是否有 ovn 的目录,如果没有,则需使用命令mkdir /etc/ovn创建。-
Docker 部署需执行的命令
说明:可执行
docker images | grep ovn命令获取 Kube-OVN 镜像地址。-
Leader 节点命令如下:
docker run \ --name=ovn-ic-db \ -d \ --env "ENABLE_OVN_LEADER_CHECK="false"" \ --network=host \ --restart=always \ --privileged=true \ -v /etc/ovn/:/etc/ovn \ -v /var/run/ovn:/var/run/ovn \ -v /var/log/ovn:/var/log/ovn \ -e LOCAL_IP="<当前节点的 IP 地址>" \ ##例如:-e LOCAL_IP="192.168.39.37" -e NODE_IPS="<所有节点的 IP 地址,多个 IP 地址使用逗号分隔>" \ ##例如:-e NODE_IPS="192.168.39.22,192.168.39.24,192.168.39.37" <镜像仓库地址> bash start-ic-db.sh ##例如:192.168.39.10:60080/acp/kube-ovn:v1.8.8 bash start-ic-db.sh -
其余两个节点命令如下:
docker run \ --name=ovn-ic-db \ -d \ --env "ENABLE_OVN_LEADER_CHECK="false"" \ --network=host \ --restart=always \ --privileged=true \ -v /etc/ovn/:/etc/ovn \ -v /var/run/ovn:/var/run/ovn \ -v /var/log/ovn:/var/log/ovn \ -e LOCAL_IP="<当前节点的 IP 地址>" \ ##例如:-e LOCAL_IP="192.168.39.24" -e LEADER_IP="<Leader 节点的 IP 地址>" \ ##例如:-e LEADER_IP="192.168.39.37" -e NODE_IPS="<所有节点的 IP 地址,多个 IP 地址使用逗号分隔>" \ ##例如:-e NODE_IPS="192.168.39.22,192.168.39.24,192.168.39.37" <镜像仓库地址> bash start-ic-db.sh ##例如:192.168.39.10:60080/acp/kube-ovn:v1.8.8 bash start-ic-db.sh
-
-
Containerd 部署需执行的命令
说明:可执行
crictl images | grep ovn命令获取 Kube-OVN 镜像地址。-
Leader 节点命令如下:
ctr -n k8s.io run \ -d \ --env "ENABLE_OVN_LEADER_CHECK="false"" \ --net-host \ --privileged \ --mount="type=bind,src= /etc/ovn/,dst=/etc/ovn,options=rbind:rw" \ --mount="type=bind,src= /var/run/ovn,dst=/var/run/ovn,options=rbind:rw" \ --mount="type=bind,src= /var/log/ovn,dst=/var/log/ovn,options=rbind:rw" \ --env="NODE_IPS="<所有节点的 IP 地址,多个 IP 地址使用逗号分隔>"" \ ##例如:--env="NODE_IPS="192.168.178.97,192.168.181.93,192.168.177.192"" --env="LOCAL_IP="<当前节点的 IP 地址>"" \ ##例如:--env="LOCAL_IP="192.168.178.97"" <镜像仓库地址> ovn-ic-db bash start-ic-db.sh ##例如:registry.alauda.cn:60080/acp/kube-ovn:v1.9.25 ovn-ic-db bash start-ic-db.sh -
其余两个节点命令如下:
ctr -n k8s.io run \ -d \ --env "ENABLE_OVN_LEADER_CHECK="false"" \ --net-host \ --privileged \ --mount="type=bind,src= /etc/ovn/,dst=/etc/ovn,options=rbind:rw" \ --mount="type=bind,src= /var/run/ovn,dst=/var/run/ovn,options=rbind:rw" \ --mount="type=bind,src= /var/log/ovn,dst=/var/log/ovn,options=rbind:rw" \ --env="NODE_IPS="<所有节点的 IP 地址,多个 IP 地址使用逗号分隔>"" \ ##例如:--env="NODE_IPS="192.168.178.97,192.168.181.93,192.168.177.192"" \ --env="LOCAL_IP="<当前节点的 IP 地址>"" \ ##例如:--env="LOCAL_IP="192.168.181.93"" --env="LEADER_IP="<Leader 节点的 IP 地址>"" \ ##例如:--env="LEADER_IP="192.168.178.97"" <镜像仓库地址> ovn-ic-db bash start-ic-db.sh ##例如:registry.alauda.cn:60080/acp/kube-ovn:v1.9.25 ovn-ic-db bash start-ic-db.sh
-
-
在 Global 集群部署集群互联控制器
在 global 集群的任意控制节点中,根据注释替换如下参数,并执行以下命令创建 ConfigMap 资源。
注意:为了保证操作的正确性,在 global 集群上名为 ovn-ic 的 ConfigMap 不允许修改。如有参数需要变更,请删除该 ConfigMap,重新配置正确后再应用 ConfigMap。
cat << EOF |kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: ovn-ic
namespace: cpaas-system
data:
ic-db-host: "192.168.39.22,192.168.39.24,192.168.39.37" # 集群互联控制器所在节点地址,在本例中,即部署控制器的三个节点 local IP
ic-nb-port: "6645" # 集群互联控制器 nb 端口,默认为 6645
ic-sb-port: "6646" # 集群互联控制器 sb 端口,默认为 6646
EOF加入集群互联
将一个网络模式为 Kube-OVN 的集群加入集群互联。
前提条件
集群中 创建的子网、ovn-default 和 join 子网 与集群互联组内的任意集群网段均不冲突。
操作步骤
-
在左侧导航栏中,单击 集群管理 > 集群。
-
单击待加入集群互联的 集群名称。
-
在右上角单击 操作 > 集群互联。
-
单击 加入集群互联。
-
选择集群的网关节点。
-
单击 加入。
相关操作
更新互联集群的网关节点信息
更新已加入集群互联组的集群网关节点信息。
操作步骤
-
在左侧导航栏中,单击 集群管理 > 集群。
-
单击待更新网关节点信息的 集群名称。
-
在右上角单击 操作 > 集群互联。
-
单击待更新网关节点信息的集群对应的 更新网关节点。
-
重新选择集群的网关节点。
-
单击 更新。
退出集群互联
已加入集群互联组的集群退出集群互联,退出后,将断开集群 Pod 与外部集群 Pod 的连接。
操作步骤
-
在左侧导航栏中,单击 集群管理 > 集群。
-
单击待退出集群互联的 集群名称。
-
在右上角单击 操作 > 集群互联。
-
单击待退出集群互联的集群对应的退出集群互联。
-
正确输入集群名称。
-
单击 退出。
清理集群互联垃圾
在集群没有退出集群互联的情况下直接删除集群,将会在控制器上残留一些垃圾数据,当再次使用这些节点创建集群,并加入集群互联时,会出现失败的情况。可以通过检查控制器(kube-ovn-controller)的 /var/log/ovn/ovn-ic.log 日志来查看详细的错误信息,部分错误信息如下。
transaction error: {"details":"Transaction causes multiple rows in xxxxxx"}操作步骤
-
将加入集群互联的集群 退出集群互联 。
-
下载 清理脚本 并执行相关操作。
-
使用 Containerd 工具,将脚本文件复制到集群互联控制器容器中,命令如下。
nerdctl --namespace k8s.io cp ./clean-ic-az-db.sh ovn-ic-db:/kube-ovn/ -
进入 ovn-ic-db 容器中执行
/bin/bash命令,命令如下。ctr -n k8s.io task exec -t --exec-id ovn-ic-db ovn-ic-db /bin/bash
-
-
执行清理操作。具体的清理方式有如下两种,按需选择其中一种清理方式即可。
-
使用原集群的名称执行清理操作,请使用 原集群的名称 替换如下命令中的 <cluster-name> 部分。
./clean-ic-az-db.sh <cluster-name> -
使用原集群的任意一个节点的名称执行清理操作,请使用 原集群任意一个节点的名称 替换如下命令中的 <node-name> 部分。
./clean-ic-az-db.sh <node-name>
-
卸载集群互联
注意: 步骤 1 - 步骤 3 需要在所有 已加入集群互联的业务集群 中执行 。
操作步骤
-
退出集群互联。具体的退出方式有如下两种,按需选择其中一种清理方式即可。
-
在业务集群中删除名为 ovn-ic-config 的配置字典(ConfigMap),命令如下。
kubectl -n kube-system delete cm ovn-ic-config -
通过 平台操作 退出集群互联。
-
-
进入 ovn-central 的 Leader Pod,命令如下。
kubectl -n kube-system exec -ti $(kubectl get pods -n kube-system -lovn-nb-leader=true -o custom-columns=NAME:.metadata.name --no-headers) -- /bin/bash -
清理 ts 逻辑交换机,命令如下。
ovn-nbctl ls-del ts -
登录到部署控制器的节点,删除控制器。
-
Docker 命令如下:
docker stop ovn-ic-db docker rm ovn-ic-db -
Containerd 命令如下:
ctr -n k8s.io task kill ovn-ic-db ctr -n k8s.io containers rm ovn-ic-db
-
-
删除 global 集群上名称为 ovn-ic 的配置字典(ConfigMap)。
kubectl delete cm ovn-ic -n cpaas-system
配置集群网关高可用
加入集群互联后,如需将集群网关配置为高可用,可执行如下步骤:
-
登录需要改造为高可用网关的集群上,执行如下命令,将
enable-ic字段修改为false。注意:
enable-ic字段修改为false后,集群互联将会中断,直到再次将其设置为true。kubectl edit cm ovn-ic-config -n kube-system -
修改网关节点配置,更新
gw-nodes字段,网关节点之间需用英文逗号分隔;同时需将enable-ic字段修改为true。kubectl edit cm ovn-ic-config -n kube-system # 配置示例 apiVersion: v1 data: auto-route: "true" az-name: docker enable-ic: "true" gw-nodes: 192.168.188.234,192.168.189.54 ic-db-host: 192.168.178.97 ic-nb-port: "6645" ic-sb-port: "6646" kind: ConfigMap metadata: creationTimestamp: "2023-06-13T08:01:16Z" name: ovn-ic-config namespace: kube-system resourceVersion: "99671" uid: 6163790a-ad9d-4d07-ba82-195b11244983 -
进入集群 ovn-central 的 Pod 中,执行
ovn-nbctl lrp-get-gateway-chassis {当前集群名}-ts命令验证配置是否生效。ovn-nbctl lrp-get-gateway-chassis docker-ts # 回显示例。其中,100、99 此类数值为优先级,该值越大,对应的网关节点越优先被使用。 docker-ts-71292a21-131d-492a-9f0c-0611af458950 100 docker-ts-1de7ee15-f372-4ab9-8c85-e54d61ea18f1 99