Kube-OVN 高级功能 | OpenStack 集成

2023-02-27 09:51:17 浏览数 (1)

" 如果你怀念 SDN 领域丰富的网络能力却在云原生领域苦苦追寻而不得,那么 Kube-OVN 将是你的最佳选择。本系列我们将逐个介绍Kube-OVN高级功能的工作原理及使用路径,帮你尽快征服容器网络难题!"

在一些情况下,用户需要使用 OpenStack 运行虚拟机,使用 Kubernetes 运行容器,并需要容器和虚机之间网络互通并处于统一控制平面下。如果 OpenStack Neutron 侧同样使用 OVN 作为底层网络控制,那么 Kube-OVN 可以使用集群互联和共享底层 OVN 两种方式打通 OpenStack 和 Kubernetes 的网络。

集群互联

该模式和使用 OVN-IC 进行多集群互联打通两个 Kubernetes 集群网络方式类似,只不过将集群两端换成 OpenStack 和 Kubernetes。

前提条件

  1. 自动互联模式下 OpenStack 和 Kubernetes 内的子网 CIDR 不能相互重叠。
  2. 需要存在一组机器可以被每个集群通过网络访问,用来部署跨集群互联的控制器。
  3. 每个集群需要有一组可以通过 IP 进行跨集群互访的机器作为之后的网关节点。
  4. 该方案只打通 Kubernetes 默认子网和 OpenStack 的选定 VPC。

部署 OVN-IC 数据库

使用下面的命令启动 OVN-IC 数据库:

代码语言:javascript复制
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.10.6 bash start-ic-db.sh

Kubernetes 侧操作

kube-systemNamespace 下创建ovn-ic-configConfigMap:

代码语言:javascript复制
apiVersion: v1kind: ConfigMapmetadata:  name: ovn-ic-config  namespace: kube-systemdata:  enable-ic: "true"  az-name: "az1"   ic-db-host: "192.168.65.3"  ic-nb-port: "6645"   ic-sb-port: "6646"  gw-nodes: "az1-gw"  auto-route: "true"
  • enable-ic: 是否开启集群互联。
  • az-name: 区分不同集群的集群名称,每个互联集群需不同。
  • ic-db-host: 部署OVN-IC数据库的节点地址。
  • ic-nb-port:OVN-IC北向数据库端口,默认为 6645。
  • ic-sb-port:OVN-IC南向数据库端口,默认为 6646。
  • gw-nodes: 集群互联中承担网关工作的节点名,逗号分隔。
  • auto-route: 是否自动对外发布和学习路由。

OpenStack 侧操作

创建和 Kubernetes 互联的逻辑路由器:

代码语言:javascript复制
# openstack router create router0# openstack router list -------------------------------------- --------- -------- ------- ---------------------------------- | ID                                   | Name    | Status | State | Project                          | -------------------------------------- --------- -------- ------- ---------------------------------- | d5b38655-249a-4192-8046-71aa4d2b4af1 | router0 | ACTIVE | UP    | 98a29ab7388347e7b5ff8bdd181ba4f9 | -------------------------------------- --------- -------- ------- ---------------------------------- 

在 OpenStack 内的 OVN 北向数据库中设置可用区名字,该名称需和其他互联集群不同:

代码语言:javascript复制
ovn-nbctl set NB_Global . name=op-az

在可访问 OVN-IC 数据库的节点启动 OVN-IC 控制器:

代码语言:javascript复制
/usr/share/ovn/scripts/ovn-ctl --ovn-ic-nb-db=tcp:192.168.65.3:6645 
  --ovn-ic-sb-db=tcp:192.168.65.3:6646 
  --ovn-northd-nb-db=unix:/run/ovn/ovnnb_db.sock 
  --ovn-northd-sb-db=unix:/run/ovn/ovnsb_db.sock 
  start_ic

-ovn-ic-nb-dbovn-ic-sb-db: OVN-IC 北向数据库和南向数据库地址。-ovn-northd-nb-dbovn-northd-sb-db: 当前集群 OVN 北向数据库和南向数据地址。

配置互联网关节点:

代码语言:javascript复制
ovs-vsctl set open_vswitch . external_ids:ovn-is-interconn=true

接下来需要在 OpenStack 的 OVN 内进行操作创建逻辑拓扑。

连接 ts 互联交换机和 router0 逻辑路由器,并设置相关规则:

代码语言:javascript复制
ovn-nbctl lrp-add router0 lrp-router0-ts 00:02:ef:11:39:4f 169.254.100.73/24ovn-nbctl lsp-add ts lsp-ts-router0 -- lsp-set-addresses lsp-ts-router0 router   -- lsp-set-type lsp-ts-router0 router   -- lsp-set-options lsp-ts-router0  router-port=lrp-router0-tsovn-nbctl lrp-set-gateway-chassis lrp-router0-ts {gateway chassis} 1000ovn-nbctl set NB_Global . options:ic-route-adv=true options:ic-route-learn=true

验证已学习到 Kubernetes 路由规则:

代码语言:javascript复制
# ovn-nbctl lr-route-list router0IPv4 Routes                10.0.0.22            169.254.100.34 dst-ip (learned)             10.16.0.0/16            169.254.100.34 dst-ip (learned)

接下来可以在 router0 网络下创建虚机验证是否可以和 Kubernetes 下 Pod 互通。

共享底层 OVN

在该方案下,OpenStack 和 Kubernetes 共享使用同一个 OVN,因此可以将两者的 VPC 和 Subnet 等概念拉齐,实现更好的控制和互联。

在该模式下我们正常使用 Kube-OVN 部署 OVN,OpenStack 修改 Neutron 配置实现连接同一个 OVN 数据库。OpenStack 需使用 networking-ovn 作为 Neutron 后端实现。

Neutron 配置修改

修改 Neutron 配置文件/etc/neutron/plugins/ml2/ml2_conf.ini

代码语言:javascript复制
[ovn]
...
ovn_nb_connection = tcp:[192.168.137.176]:6641,tcp:[192.168.137.177]:6641,tcp:[192.168.137.178]:6641
ovn_sb_connection = tcp:[192.168.137.176]:6642,tcp:[192.168.137.177]:6642,tcp:[192.168.137.178]:6642
ovn_l3_scheduler = OVN_L3_SCHEDULER
  • ovn_nb_connectionovn_sb_connection: 地址需修改为 Kube-OVN 部署 ovn-central节点的地址。

修改每个节点的 OVS 配置:

代码语言:javascript复制
ovs-vsctl set open . external-ids:ovn-remote=tcp:[192.168.137.176]:6642,tcp:[192.168.137.177]:6642,tcp:[192.168.137.178]:6642
ovs-vsctl set open . external-ids:ovn-encap-type=geneve
ovs-vsctl set open . external-ids:ovn-encap-ip=192.168.137.200
  • external-ids:ovn-remote: 地址需修改为 Kube-OVN 部署ovn-central节点的地址。
  • ovn-encap-ip: 修改为当前节点的 IP 地址。

在 Kubernetes 中使用 OpenStack 内资源

接下来介绍如何在 Kubernetes 中查询 OpenStack 的网络资源并在 OpenStack 的子网中创建 Pod。

查询 OpenStack 中已有的网络资源,如下资源已经预先创建完成:

代码语言:javascript复制
# openstack router list
 -------------------------------------- --------- -------- ------- ---------------------------------- 
| ID                                   | Name    | Status | State | Project                          |
 -------------------------------------- --------- -------- ------- ---------------------------------- 
| 22040ed5-0598-4f77-bffd-e7fd4db47e93 | router0 | ACTIVE | UP    | 62381a21d569404aa236a5dd8712449c |
 -------------------------------------- --------- -------- ------- ---------------------------------- 
# openstack network list
 -------------------------------------- ---------- -------------------------------------- 
| ID                                   | Name     | Subnets                              |
 -------------------------------------- ---------- -------------------------------------- 
| cd59e36a-37db-4c27-b709-d35379a7920f | provider | 01d73d9f-fdaa-426c-9b60-aa34abbfacae |
 -------------------------------------- ---------- -------------------------------------- 
# openstack subnet list
 -------------------------------------- ------------- -------------------------------------- ---------------- 
| ID                                   | Name        | Network                              | Subnet         |
 -------------------------------------- ------------- -------------------------------------- ---------------- 
| 01d73d9f-fdaa-426c-9b60-aa34abbfacae | provider-v4 | cd59e36a-37db-4c27-b709-d35379a7920f | 192.168.1.0/24 |
 -------------------------------------- ------------- -------------------------------------- ---------------- 
# openstack server list
 -------------------------------------- ------------------- -------- ----------------------- -------- -------- 
| ID                                   | Name              | Status | Networks              | Image  | Flavor |
 -------------------------------------- ------------------- -------- ----------------------- -------- -------- 
| 8433d622-a8d6-41a7-8b31-49abfd64f639 | provider-instance | ACTIVE | provider=192.168.1.61 | ubuntu | m1     |
 -------------------------------------- ------------------- -------- ----------------------- -------- -------- 

在 Kubernetes 侧,查询 VPC 资源:

代码语言:javascript复制
# kubectl get vpc
NAME                                           STANDBY   SUBNETS
neutron-22040ed5-0598-4f77-bffd-e7fd4db47e93   true      ["neutron-cd59e36a-37db-4c27-b709-d35379a7920f"]
ovn-cluster                                    true      ["join","ovn-default"]

neutron-22040ed5-0598-4f77-bffd-e7fd4db47e93 为从 OpenStack 同步过来的 VPC 资源。

接下来可以按照 Kube-OVN 原生的 VPC 和 Subnet 操作创建 Pod 并运行。

VPC, Subnet 绑定 Namespacenet2,并创建 Pod:

代码语言:javascript复制
apiVersion: v1
kind: Namespace
metadata:
  name: net2
---
apiVersion: kubeovn.io/v1
kind: Vpc
metadata:
  creationTimestamp: "2021-06-20T13:34:11Z"
  generation: 2
  labels:
    ovn.kubernetes.io/vpc_external: "true"
  name: neutron-22040ed5-0598-4f77-bffd-e7fd4db47e93
  resourceVersion: "583728"
  uid: 18d4c654-f511-4def-a3a0-a6434d237c1e
spec:
  namespaces:
  - net2
---
kind: Subnet
apiVersion: kubeovn.io/v1
metadata:
  name: net2
spec:
  vpc: neutron-22040ed5-0598-4f77-bffd-e7fd4db47e93
  namespaces:
    - net2
  cidrBlock: 12.0.1.0/24
  natOutgoing: false
---
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
  namespace: net2
spec:
  containers:
    - image: kubeovn/kube-ovn:v1.8.0
      command:
        - "sleep"
        - "604800"
      imagePullPolicy: IfNotPresent
      name: ubuntu
  restartPolicy: Always

更多功能介绍,请见Kube-OVN 最新中文文档:https://kubeovn.github.io/docs/v1.10.x/


关于Kube-OVN

Kube-OVN 是一款由灵雀云自主研发的企业级云原生 Kubernetes 容器网络编排系统,它通过将 OpenStack 领域成熟的网络功能平移到 Kubernetes,极大增强了 Kubernetes 容器网络的安全性、可运维性、管理性和性能,为 Kubernetes 生态的落地带来了独特的价值。

2021年初,Kube-OVN成为全球范围内首个被CNCF纳入托管的开源CNI网络项目,也是中国容器公司首次将独立设计研发的项目成功贡献进入CNCF基金会,同时,它也是木兰社区旗下的明星项目之一。

0 人点赞