Skip to content

多集群网络

Oilbeater edited this page Sep 10, 2021 · 14 revisions

从 v1.4.0 版本开始,多个 Kubernetes 集群可以通过 Kube-OVN 进行网络打通,多个不同集群的 Pod 可以直接通过 Pod IP 直接进行通信。Kube-OVN 使用隧道封装跨集群的流量,两个集群之间只需要存在一组 IP 可达的机器即可完成容器网络的互通。

准备条件

  1. 不同集群的子网 CIDR 不能相互重叠,包括内置的 ovn-default 和 join 子网,均需在安装时配置为不重叠的网段。如果子网存在重叠,则只能打通不重叠部分的子网,并且需要参考下面的关闭子网集群互联功能,对特殊子网进行设置,或者参考纯手动互联功能。
  2. 需要存在一组机器可以被多集群通过 IP 访问,用来部署跨集群互联的控制器。
  3. 每个集群需要有一组可以通过 IP 进行跨集群互访的机器作为之后的网关节点。

自动路由使用步骤

  1. 在可以被多集群访问到的节点上部署集群互联控制器
docker run --name=ovn-ic-db -d --network=host -v /etc/ovn/:/etc/ovn -v /var/run/ovn:/var/run/ovn -v /var/log/ovn:/var/log/ovn kubeovn/kube-ovn:v1.8.0 bash start-ic-db.sh

如果是使用containerd, 则命令如下:

ctr run  -d --net-host --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"  kubeovn/kube-ovn:v1.8.0 ovn-ic-db bash start-ic-db.sh
  1. 在每个集群的 kube-system namespace 下创建 ic-config ConfigMap。根据每个集群的配置来修改下列的 yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: ovn-ic-config
  namespace: kube-system
data:
  enable-ic: "true"
  az-name: "az1"                # 集群 AZ 名,多个集群之间不能重复
  ic-db-host: "192.168.65.3"    # 集群互联控制器所在节点地址
  ic-nb-port: "6645"            # 集群互联控制器 nb 端口,默认为 6645
  ic-sb-port: "6646"            # 集群互联控制器 sb 端口,默认为 6646
  gw-nodes: "az1-gw"            # 网关节点 node 名
  auto-route: "true"            # 是否自动发布路由,设置为 false 时可以手动进行配置
  1. 检查集群互联状态
## 集群互联控制器容器内执行
[root@ic]# ovn-ic-sbctl show
availability-zone az1
    gateway deee03e0-af16-4f45-91e9-b50c3960f809
        hostname: az1-gw
        type: geneve
            ip: 192.168.42.145
        port ts-az1
            transit switch: ts
            address: ["00:00:00:50:AC:8C 169.254.100.45/24"]
availability-zone az2
    gateway e94cc831-8143-40e3-a478-90352773327b
        hostname: az2-gw
        type: geneve
            ip: 192.168.42.149
        port ts-az2
            transit switch: ts
            address: ["00:00:00:07:4A:59 169.254.100.63/24"]

## 在每个集群内执行
[root@az1 ~]# kubectl ko nbctl lr-route-list ovn-cluster
IPv4 Routes
                10.42.1.1            169.254.100.45 dst-ip (learned)
                10.42.1.3                100.64.0.2 dst-ip
                10.16.0.2                100.64.0.2 src-ip
                10.16.0.3                100.64.0.2 src-ip
                10.16.0.4                100.64.0.2 src-ip
                10.16.0.6                100.64.0.2 src-ip
             10.17.0.0/16            169.254.100.45 dst-ip (learned)
            100.65.0.0/16            169.254.100.45 dst-ip (learned)

多集群的 Pod 之间应该可以通过 IP 进行直接通信,如果通信出现问题,请检查 kube-ovn-controller 日志

关闭某个子网的集群互联

如果某个子网不想加入集群互联,可以通过修改子网的 spec 来单独设置

apiVersion: kubeovn.io/v1
kind: Subnet
metadata:
  name: no-advertise
spec:
  cidrBlock: 10.199.0.0/16
  disableInterConnection: false

手动路由使用步骤

  1. 和自动路由步骤1相同,在可以被多集群访问到的节点上部署集群互联控制器
docker run --name=ovn-ic-db -d --network=host -v /etc/ovn/:/etc/ovn -v /var/run/ovn:/var/run/ovn -v /var/log/ovn:/var/log/ovn kubeovn/kube-ovn:v1.5.2 bash start-ic-db.sh
  1. 在每个集群的 kube-system namespace 下创建 ic-config ConfigMap。根据每个集群的配置来修改下列的 yaml,注意 auto-route 字段为 false
apiVersion: v1
kind: ConfigMap
metadata:
  name: ovn-ic-config
  namespace: kube-system
data:
  enable-ic: "true"
  az-name: "az1"                # 集群 AZ 名,多个集群之间不能重复
  ic-db-host: "192.168.65.3"    # 集群互联控制器所在节点地址
  ic-nb-port: "6645"            # 集群互联控制器 nb 端口,默认为 6645
  ic-sb-port: "6646"            # 集群互联控制器 sb 端口,默认为 6646
  gw-nodes: "az1-gw"            # 网关节点 node 名
  auto-route: "false"            # 是否自动发布路由,设置为 false 时可以手动进行配置
  1. 在每个集群内获取 remote gateway 的地址
## 集群1,记录 ts logical switch 下 remote 类型端口的地址,下图为 169.254.100.31
[root@az1 ~]# kubectl ko nbctl show
switch a391d3a1-14a0-4841-9836-4bd930c447fb (ts)
    port ts-az1
        type: router
        router-port: az1-ts
    port ts-az2
        type: remote
        addresses: ["00:00:00:4B:E2:9F 169.254.100.31/24"]

## 集群2,记录 ts logical switch 下 remote 类型端口的地址,下图为 169.254.100.79
[root@az2 ~]# kubectl ko nbctl show
switch da6138b8-de81-4908-abf9-b2224ec4edf3 (ts)
    port ts-az2
        type: router
        router-port: az2-ts
    port ts-az1
        type: remote
        addresses: ["00:00:00:FB:2A:F7 169.254.100.79/24"]
  1. 在每个集群中分别添加到远端集群的路由,下一跳设置为远端端口的地址
## 集群1
kubectl ko nbctl lr-route-add ovn-cluster 10.17.0.0/24 169.254.100.31

## 集群2
kubectl ko nbctl lr-route-add ovn-cluster 10.16.0.0/24 169.254.100.79
  1. 检查集群互联状态,和自动路由步骤3相同

  2. 测试跨集群 Pod 网络连通性

Clone this wiki locally