集群互联(Alpha)

支持配置网络模式相同为 Kube-OVN 的集群之间的集群互联,使集群内的 Pod 能够相互访问。集群互联控制器是 Kube-OVN 提供的扩展组件,负责收集不同集群间的网络信息,并通过下发路由实现多个集群网络的互联。

目录

前提条件

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

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

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

  • 该功能仅支持默认 VPC,用户自定义 VPC 无法使用互联功能。

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

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

Deploy 部署

注意:该部署方式支持平台 v3.16.0 及以上版本。

操作步骤

  1. 在集群主节点执行以下命令获取 install-ic-server.sh 安装脚本。

    wget https://github.com/kubeovn/kube-ovn/blob/release-1.12/dist/images/install-ic-server.sh
  2. 打开当前目录下的脚本文件,按如下修改参数。

    REGISTRY="kubeovn"
    VERSION=""

    修改后的参数配置如下:

    REGISTRY="<Kube-OVN 镜像仓库地址>"   ## 例如:REGISTRY="registry.alauda.cn:60080/acp/"
    VERSION="<Kube-OVN 版本>"   ## 例如:VERSION="v1.9.25"
  3. 保存脚本文件后,执行以下命令运行脚本。

    sh install-ic-server.sh

Docker 和 Containerd 部署

  1. 选择任意集群中的 三个及以上节点 部署互联控制器。此处以准备三台节点为例。

  2. 任选一台节点作为 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 地址,逗号分隔>" \   ## 例如:-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 地址,逗号分隔>" \   ## 例如:-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 地址,逗号分隔>" \   ## 例如:--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 地址,逗号分隔>" \   ## 例如:--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 并正确重新配置后再应用。

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"   # 集群互联控制器所在节点地址,此处为控制器部署的三台节点的本地 IP
  ic-nb-port: "6645"            # 集群互联控制器 nb 端口,默认 6645
  ic-sb-port: "6646"            # 集群互联控制器 sb 端口,默认 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 中执行清理脚本,任选其一:

    方法一:在 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>

    方法二:在 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. 登录控制器部署节点,删除控制器。

    • 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
  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
    
    # 配置示例
    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
  3. 进入集群 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