集群互联(Alpha)

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

前提条件

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

  • 需要有一组能够被各集群的 kube-ovn-controller 通过 IP 访问的机器,用于部署跨集群互联的控制器。

  • 每个集群都需要存在一组可被 kube-ovn-controller 通过 IP 访问的机器,后续将用作网关节点。

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

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

提供三种部署方式:Deploy 部署(平台 v3.16.0 及更高版本支持)、Podman 部署和 Containerd 部署。

Deploy 部署

注意:平台 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. 选择任意集群中的 三个或以上节点 来部署互联控制器。以下示例准备了三个节点。

  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 和 join 子网不能与集群互联组中的任何集群网段冲突。

操作步骤

  1. 在左侧导航栏中,单击 Clusters > Cluster of clusters

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

  3. 在右上角,单击 Options > Cluster Interconnect

  4. 单击 Join the cluster interconnect

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

  6. 单击 Join

相关操作

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

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

操作步骤

  1. 在左侧导航栏中,单击 Clusters > Cluster of clusters

  2. 单击需要更新网关节点信息的 Cluster name

  3. 在右上角,单击 Operations > Cluster Interconnect

  4. 对需要更新网关节点信息的集群,单击 Update Gateway Node

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

  6. 单击 Update

退出集群互联

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

操作步骤

  1. 在左侧导航栏中,单击 Clusters > Cluster of clusters

  2. 单击要下线的 cluster 名称。

  3. 在右上角,单击 Options > Cluster Interconnect

  4. 单击要退出的集群对应的 Exit cluster interconnection

  5. 正确输入集群名称。

  6. 单击 Exit

清理互联集群残留

当集群在未退出互联集群的情况下被删除时,控制器上可能会残留部分数据。当再次使用这些节点创建集群并加入互联集群时,可能会失败。你可以在控制器(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