-
Notifications
You must be signed in to change notification settings - Fork 450
多集群网络
Oilbeater edited this page Sep 10, 2021
·
14 revisions
从 v1.4.0 版本开始,多个 Kubernetes 集群可以通过 Kube-OVN 进行网络打通,多个不同集群的 Pod 可以直接通过 Pod IP 直接进行通信。Kube-OVN 使用隧道封装跨集群的流量,两个集群之间只需要存在一组 IP 可达的机器即可完成容器网络的互通。
- 不同集群的子网 CIDR 不能相互重叠,包括内置的 ovn-default 和 join 子网,均需在安装时配置为不重叠的网段。如果子网存在重叠,则只能打通不重叠部分的子网,并且需要参考下面的关闭子网集群互联功能,对特殊子网进行设置,或者参考纯手动互联功能。
- 需要存在一组机器可以被多集群通过 IP 访问,用来部署跨集群互联的控制器。
- 每个集群需要有一组可以通过 IP 进行跨集群互访的机器作为之后的网关节点。
- 在可以被多集群访问到的节点上部署集群互联控制器
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
- 在每个集群的 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 时可以手动进行配置
- 检查集群互联状态
## 集群互联控制器容器内执行
[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相同,在可以被多集群访问到的节点上部署集群互联控制器
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
- 在每个集群的 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 时可以手动进行配置
- 在每个集群内获取 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
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
-
检查集群互联状态,和自动路由步骤3相同
-
测试跨集群 Pod 网络连通性