集群互联(Alpha)

支持在网络模式相同且均为 Kube-OVN 的集群之间配置集群互联,以实现集群中 Pod 的相互访问。Cluster Interconnect Controller 是 Kube-OVN 提供的扩展组件,负责收集不同集群之间的网络信息,并通过下发路由连接多个集群的网络。

前提条件

  • 不同集群的子网 CIDR 不能相互重叠。

  • 需要准备一组可由各集群的 kube-ovn-controller 通过 IP 访问的机器,用于部署跨集群互联的控制器。

  • 每个集群都需要准备一组可由该集群的 kube-ovn-controller 通过 IP 访问的机器,后续将这些机器用作跨集群互联的网关节点。

  • 此功能仅适用于默认 VPC,用户自定义 VPC 无法使用互联功能。

已构建多节点 Kube-OVN 互联控制器

有三种可用的部署方式:部署 Deployment(平台 v3.16.0 及更高版本支持)、Podman 部署和 Containerd 部署。

部署 Deployment

注意:平台 v3.16.0 及更高版本支持此部署方式。

操作步骤

  1. 在集群的一个控制平面节点上执行以下命令,从 kube-ovn-controller Pod 中获取 install-ic-server.sh 安装脚本。

    kubectl -n kube-system cp $(kubectl get pods -n kube-system -l app=kube-ovn-controller -o custom-columns=NAME:.metadata.name --no-headers | head -1):/kube-ovn/install-ic-server.sh ./install-ic-server.sh
  2. 打开当前目录中的脚本文件,并按如下方式修改参数。

    REGISTRY="kubeovn"
    VERSION=""

    修改后的参数配置如下:

    REGISTRY="<Kube-OVN image repository address>"   ## For example: REGISTRY="registry.alauda.cn:60080/acp/"
    VERSION="<Kube-OVN version>"   ## For example: VERSION="v1.9.25"
  3. 保存脚本文件,并使用以下命令执行。

    sh install-ic-server.sh

Podman 和 Containerd 部署

  1. 选择任意集群中的三个或更多节点来部署 Interconnected Controller。本例准备了三个节点。

  2. 选择任意节点作为 Leader,并根据不同的部署方式执行以下命令。

    注意:配置前,请检查 /etc 下是否存在 ovn 目录。如果不存在,请使用命令 mkdir /etc/ovn 创建该目录。

    • 容器部署命令 注意:执行命令 podman images | grep ovn 获取 Kube-OVN 镜像地址。

      • Leader 节点的命令:

        podman 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 address of the current node>" \   ## For example: -e LOCAL_IP="192.168.39.37"
        -e NODE_IPS="<IP addresses of all nodes, separated by commas>" \   ## For example: -e NODE_IPS="192.168.39.22,192.168.39.24,192.168.39.37"
        <image repository address> bash start-ic-db.sh    ## For example: 192.168.39.10:60080/acp/kube-ovn:v1.8.8 bash start-ic-db.sh
      • 其他两个节点的命令:

        podman 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 address of the current node>" \   ## For example: -e LOCAL_IP="192.168.39.24"
        -e LEADER_IP="<IP address of the Leader node>" \  ## For example: -e LEADER_IP="192.168.39.37"
        -e NODE_IPS="<IP addresses of all nodes, separated by commas>" \   ## For example: -e NODE_IPS="192.168.39.22,192.168.39.24,192.168.39.37"
        <image repository address> bash start-ic-db.sh   ## For example: 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 addresses of all nodes, separated by commas>" \   ## For example: --env="NODE_IPS="192.168.178.97,192.168.181.93,192.168.177.192""
        --env="LOCAL_IP=<IP address of the current node>" \   ## For example: --env="LOCAL_IP="192.168.178.97""
        <image repository address> ovn-ic-db bash start-ic-db.sh   ## For example: 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 addresses of all nodes, separated by commas>" \   ## For example: --env="NODE_IPS="192.168.178.97,192.168.181.93,192.168.177.192"" \
        --env="LOCAL_IP=<IP address of the current node>" \   ## For example: --env="LOCAL_IP="192.168.181.93""
        --env="LEADER_IP=<IP address of the Leader node>" \   ## For example: --env="LEADER_IP="192.168.178.97""
        <image repository address> ovn-ic-db bash start-ic-db.sh   ## For example: 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"   # Address of the node where the cluster interconnect controller is located, in this case, the local IP of the three nodes where the controller is deployed
  ic-nb-port: "6645"            # Cluster Interconnect Controller nb port, default 6645
  ic-sb-port: "6646"            # Cluster Interconnect Controller sb port, default 6646
EOF

加入集群互联

将网络模式为 Kube-OVN 的集群加入集群互联。

前提条件

集群中的已创建子网、ovn-default 和加入子网不得与集群互联组中的任何集群网段冲突。

操作步骤

  1. 在左侧导航栏中,单击集群 > 集群的集群。

  2. 单击要加入集群互联的集群名称。

  3. 在右上角单击选项 > 集群互联。

  4. 单击加入集群互联。

  5. 为集群选择一个网关节点。

  6. 单击加入。

相关操作

更新互联集群的网关节点信息

更新已加入集群互联组的集群网关节点信息。

操作步骤

  1. 在左侧导航栏中,单击集群 > 集群的集群。

  2. 单击要更新网关节点信息的集群名称。

  3. 在右上角单击操作 > 集群互联。

  4. 对于要更新网关节点信息的集群,单击更新网关节点。

  5. 重新为集群选择网关节点。

  6. 单击更新。

退出集群互联

已加入集群互联组的集群退出集群互联。退出后,该集群的 Pod 将与外部集群的 Pod 断开连接。

操作步骤

  1. 在左侧导航栏中,单击集群 > 集群的集群。

  2. 单击要停用的集群名称。

  3. 在右上角单击选项 > 集群互联。

  4. 对于要退出的集群,单击退出集群互联。

  5. 正确输入集群名称。

  6. 单击退出。

清理互联集群残留

如果删除集群时未退出集群互联,控制器上可能会残留一些数据。当您尝试使用这些节点再次创建集群并加入集群互联时,可能会失败。您可以在控制器(kube-ovn-controller)的 /var/log/ovn/ovn-ic.log 日志中查看详细的错误信息。部分错误消息可能包括:

transaction error: {"details":"Transaction causes multiple rows in xxxxxx"}

操作步骤

  1. 对要加入的集群退出互联集群。

  2. 在容器或 Pod 中执行清理脚本。

    您可以直接在 ovn-ic-db 容器或 ovn-ic-controller Pod 中执行清理脚本。请选择以下任一方法:

    方法 1:在 ovn-ic-db 容器中执行

    • 进入 ovn-ic-db 容器,并使用以下命令执行清理操作。

      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>

    方法 2:在 ovn-ic-controller Pod 中执行

    • 进入 ovn-ic-controller Pod,并使用以下命令执行清理操作。

      kubectl -n kube-system exec -ti $(kubectl get pods -n kube-system -l app=ovn-ic-controller -o custom-columns=NAME:.metadata.name --no-headers) -- /bin/bash

      然后执行以下任一清理命令:

      • 使用原始集群的名称执行清理操作。将 <cluster-name> 替换为原始集群的名称:

        ./clean-ic-az-db.sh <cluster-name>
      • 使用原始集群中任意节点的名称执行清理操作。将 <node-name> 替换为原始集群中任意节点的名称:

        ./clean-ic-az-db.sh <node-name>

卸载互联集群

注意:步骤 1 至步骤 3需要在所有已加入互联集群的业务集群上执行。

操作步骤

  1. 退出互联集群。具体有两种退出方法, 请根据需要选择其中一种。

    • 删除业务集群中名为 ovn-ic-config 的 ConfigMap。使用以下命令。

      kubectl -n kube-system delete cm ovn-ic-config
    • 通过平台操作退出互联集群。

  2. 使用以下命令进入 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
  3. 使用以下命令清理 ts 逻辑交换机。

    ovn-nbctl ls-del ts
  4. 登录部署控制器的节点并删除控制器。

    • Podman 命令:

      podman stop ovn-ic-db
      podman rm ovn-ic-db
    • Containerd 命令:

      ctr -n k8s.io task kill ovn-ic-db
      ctr -n k8s.io containers rm ovn-ic-db
  5. 使用以下命令删除 global 集群中名为 ovn-ic 的 ConfigMap。

    kubectl delete cm ovn-ic -n cpaas-system

配置集群网关高可用

加入集群互联后,如需将集群网关配置为高可用,请执行以下步骤:

  1. 登录需要转换为高可用网关的集群,并执行以下命令,将 enable-ic 字段更改为 false。

    注意:将 enable-ic 字段更改为 false 会中断集群互联,直到再次将其设置为 true。

    kubectl edit cm ovn-ic-config -n kube-system
  2. 更新 gw-nodes 字段来修改网关节点配置,并使用英文逗号分隔网关节点;同时将 enable-ic 字段更改为 true。

    kubectl edit cm ovn-ic-config -n kube-system
    
    # Configuration example
    apiVersion: v1
    data:
      auto-route: "true"
      az-name: az1
      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
  3. 进入集群 ovn-central 中的 Pod,并执行 ovn-nbctl lrp-get-gateway-chassis {current cluster name}-ts 命令,验证配置是否已生效。

    ovn-nbctl lrp-get-gateway-chassis az1-ts
    
    # Return to the display example. In this case, the values of 100 and 99 are the priority, and the larger the value, the higher the priority of the corresponding gateway node to be used.
    az1-ts-71292a21-131d-492a-9f0c-0611af458950 100
    az1-ts-1de7ee15-f372-4ab9-8c85-e54d61ea18f1 99