OCP4.6正式支持Kubernetes OVN。
OVN最开始是从OpenStack中发展起来的,OVN也是红帽绝对主导的一个开源项目。OVN相当于给OVS做了一个控制平面。
OVN的架构如下:
后来,OVN技术向K8S做了迁移,形成了OVN-Kubernetes开源项目(https://github.com/ovn-org/ovn-kubernetes)。
OVN-Kubernetes的 CNI实现以下功能:
使用OVN来管理网络流量。OVN是社区开发的,与供应商无关的网络虚拟化解决方案。
实现Kubernetes网络策略支持,包括入口和出口规则。
使用Geneve(通用网络虚拟化封装)协议而不是VXLAN在节点之间创建overlay网络。
OpenShift 4.6默认支持两种网络模式:OpenShift SDN和OVN-Kubernetes。下表总结了两种模式当前功能支持:
上图中OVN不支持的egress router的功能,本身在OCP4中也基本不用了。所以说,OVN可以覆盖生产上对OpenShift SDN方面的需求。
OCP4.6安装后,默认SDN还是OVS,可以用如下方式迁移到OVN:
首先备份现有OVS的配置,输入以下命令:
[root@lb.weixinyucluster ~]# oc get Network.config.openshift.io cluster -o yaml > cluster-openshift-sdn.yaml
启用迁移,通过如下命令修改Cluster Network Operator 配置对象上设置注释:
[root@lb.weixinyucluster ~]# oc annotate Network.operator.openshift.io cluster \
> 'networkoperator.openshift.io/network-migration'=""
network.operator.openshift.io/cluster annotated
更改默认的CNI网络提供商,输入以下命令:
[root@lb.weixinyucluster ~]# oc patch Network.config.openshift.io cluster \
> --type='merge' --patch '{ "spec": { "networkType": "OVNKubernetes" } }'
network.config.openshift.io/cluster patched
要确认迁移已禁用OpenShift SDN默认的CNI网络提供程序并删除了所有OpenShift SDN Pod,openshift-sdn中的pod会自动删除:
[root@lb.weixinyucluster ~]# oc get pod -n openshift-sdn
No resources found in openshift-sdn namespace.
集群中的节点重新引导后,请确认迁移成功,如下命令行输出必须为OVNKubernetes:
[root@lb.weixinyucluster ~]# oc get network.config/cluster -o jsonpath='{.status.networkType}{"\n"}'
OVNKubernetes
确认没有error状态的pod:
[root@lb.weixinyucluster ~]# oc get pods --all-namespaces -o wide --sort-by='{.spec.nodeName}' |grep -i error
从“Cluster Network Operator”配置对象中删除迁移注释,输入以下命令:
[root@lb.weixinyucluster ~]# oc annotate Network.operator.openshift.io cluster \
> networkoperator.openshift.io/network-migration-
network.operator.openshift.io/cluster annotated
删除openshift-sdn ns:
oc delete namespace openshift-sdn
查看OVN组件:
我从上图看出,OVN结构分为三部分:ovnkube-master(运行在三个master上)、ovnkube-node(运行在所有OCP节点上)、ovs-node(运行在所有OCP节点上)。OVN的组件是以daemonset.apps的方式部署的:
我们对比OVN的架构图,OCP中:ovnkube-master pod就是CMS、ovnkube-node pod(运行在所有OCP节点上)就是下图中的ovs-controller、ovs-node pod(运行在所有OCP节点上)就是下图中的ovs-vswitched: