背景
Kube-OVN 是一款 CNCF 旗下的企业级云原生网络编排系统,将 SDN 的能力和云原生结合, 提供丰富的功能,极致的性能以及良好的可运维性。
基本概念
kube-ovn与ovn与k8s
kube-ovn是ovn与k8s直接的桥接,kube-ovn负责把k8s上对sdn网络定义转化为ovn的网络定义。
控制器
SDN控制器是软件定义网络(SDN)中的应用程序,负责流量控制以确保智能网络。SDN控制器是基于如OpenFlow等协议的,允许服务器告诉交换机向哪里发送数据包。
chassis(底盘)
指运行这个openvswitch的物理机(也包括一些支持openflow协议网络设备)
组件对照
本小节介绍kube-ovn与ovn组件之间的对应关系。
kube-ovn组件
|
ovn组件
|
说明
|
数量
|
---|---|---|---|
kube-ovn-controller | External Service |
把k8s的SDN定义转化为OVN的网络定义 |
至少一个 |
ovn-central | Northbound (/ˈnɔːrθbaʊnd/) DB(ovsdb-server) | 北向数据库,存储逻辑路由器、逻辑交换机、安全组等高层次抽象的对象 | 一般3个或以上 |
ovn-central | northd |
Open Virtual Network central control daemon 连接南北数据库,将高层次的网络对象转换为低层次流表规则 |
一般3个或以上 |
ovn-central | Southbound DB(ovsdb-server) | 南向数据库,存储流表规则 | 一般3个或以上 |
ovs-ovn |
OVN-Controller ovs-vswitchd ovsdb(ovsdb-server) |
与内核模块openvswitch通信,下发南向数据库OVN-Controller中的流表规则指导openvswitch转发数据包 | 每个主机节点一个 |
kube-ovn-cni | - | 实现CNI (容器网络接口)标准 | 每个主机节点一个 |
- | 内核模块openvswitch | 内核模块,把收到的数据包的特征(ip地址/mac地址/协议/端口等)匹配流表,执行流表动作,进行数据包的转发 | 内核中,每个宿主机一个 |
组件间如何连接
在本小节中将会介绍组件间时如何通信的,通过了解他们的通信方式,可以知道当出现固件间连接异常时应该如何进行排查。
我们采取自上而下的方向对组件的连接展开。
External Service(kube-ovn-controller)与Northbound DB(ovn-central)相连
以下指令在kube-ovn-controller内执行
# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:11 ? 00:00:15 ./kube-ovn-controller --ovn-nb-addr=tcp:[192.168.211.68]:6641,tcp:[192.168.211.72]:6641,tcp:[192.168.211.73]:6641 -
root 16 1 0 15:11 ? 00:00:01 ovn-nbctl --db=tcp:[192.168.211.68]:6641,tcp:[192.168.211.72]:6641,tcp:[192.168.211.73]:6641 --pidfile --detach --o
# kube-ovn-controller Golang程序
# ovn-nbctl守护进程
# 查看完成的命令行参数
# cat /proc/16/cmdline | tr '\000' ' '
ovn-nbctl --db=tcp:[192.168.211.68]:6641,tcp:[192.168.211.72]:6641,tcp:[192.168.211.73]:6641 --pidfile --detach --overwrite-pidfile
# 守护进程会生成一个unix socket
# ls -al /var/run/ovn/ovn-nbctl.16.ctl
srwxr-x--- 1 root root 0 Mar 9 15:11 /var/run/ovn/ovn-nbctl.16.ctl
kube-ovn-controller 内启动了ovn-nbctl守护进程维持了与Northbound DB的长连接,并监听在unix socket上
通过环境变量OVN_NB_DAEMON指定unix socket的路径,ovn-nbctl可以与ovn-nbctl守护进程通信,进而与Northbound DB(ovn-central)通信。
我们注意到我们为ovn-nbctl守护进程指定了所有的Northbound DB地址作为启动参数,比如tcp:[192.168.211.68]:6641,tcp:[192.168.211.72]:6641,tcp:[192.168.211.73]:6641
以下指令在ovn-central内执行
# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2022 ? 00:00:00 /bin/bash /kube-ovn/start-db.sh
root 147 1 0 2022 ? 00:00:00 ovsdb-server: monitoring pid 148 (healthy)
root 148 147 0 2022 ? 18:09:57 ovsdb-server -vconsole:off -vfile:info --log-file=/var/log/ovn/ovsdb-server-nb.log --remote=punix:/var/run/ovn/ovnn
root 163 1 0 2022 ? 00:00:00 ovsdb-server: monitoring pid 164 (healthy)
root 164 163 0 2022 ? 11:28:51 ovsdb-server -vconsole:off -vfile:info --log-file=/var/log/ovn/ovsdb-server-sb.log --remote=punix:/var/run/ovn/ovns
root 173 1 0 2022 ? 00:00:00 ovn-northd: monitoring pid 174 (healthy)
root 174 173 0 2022 ? 02:16:38 ovn-northd -vconsole:emer -vsyslog:err -vfile:info --ovnnb-db=tcp:[192.168.211.68]:6641,tcp:[192.168.211.72]:6641,t
root 178 1 0 2022 ? 04:54:45 /kube-ovn/kube-ovn-leader-checker
查询Northbound DB启动参数
# cat /proc/148/cmdline | tr '\000' ' '
ovsdb-server -vconsole:off -vfile:info --log-file=/var/log/ovn/ovsdb-server-nb.log --remote=punix:/var/run/ovn/ovnnb_db.sock --pidfile=/var/run/ovn/ovnnb_db.pid --unixctl=/var/run/ovn/ovnnb_db.ctl --detach --monitor --remote=db:OVN_Northbound,NB_Global,connections --private-key=db:OVN_Northbound,SSL,private_key --certificate=db:OVN_Northbound,SSL,certificate --ca-cert=db:OVN_Northbound,SSL,ca_cert --ssl-protocols=db:OVN_Northbound,SSL,ssl_protocols --ssl-ciphers=db:OVN_Northbound,SSL,ssl_ciphers --remote=ptcp:6641:[::] /etc/ovn/ovnnb_db.db
Northbound DB监听在tcp 6641端口
Northbound DB(ovn-central)与northd(ovn-central)与Southbound DB(ovn-central)相连
以下指令在ovn-central内执行
# Southbound DB启动参数
# cat /proc/164/cmdline | tr '\000' ' '
ovsdb-server -vconsole:off -vfile:info --log-file=/var/log/ovn/ovsdb-server-sb.log --remote=punix:/var/run/ovn/ovnsb_db.sock --pidfile=/var/run/ovn/ovnsb_db.pid --unixctl=/var/run/ovn/ovnsb_db.ctl --detach --monitor --remote=db:OVN_Southbound,SB_Global,connections --private-key=db:OVN_Southbound,SSL,private_key --certificate=db:OVN_Southbound,SSL,certificate --ca-cert=db:OVN_Southbound,SSL,ca_cert --ssl-protocols=db:OVN_Southbound,SSL,ssl_protocols --ssl-ciphers=db:OVN_Southbound,SSL,ssl_ciphers --remote=ptcp:6642:[::] /etc/ovn/ovnsb_db.db
# ovn-northd启动参数
# cat /proc/174/cmdline | tr '\000' ' '
ovn-northd -vconsole:emer -vsyslog:err -vfile:info --ovnnb-db=tcp:[192.168.211.68]:6641,tcp:[192.168.211.72]:6641,tcp:[192.168.211.73]:6641 --ovnsb-db=tcp:[192.168.211.68]:6642,tcp:[192.168.211.72]:6642,tcp:[192.168.211.73]:6642 --no-chdir --log-file=/var/log/ovn/ovn-northd.log --pidfile=/var/run/ovn/ovn-northd.pid --detach --monitor
Southbound DB监听在tcp 6642端口
ovn-northd启动时指定了所有的Southbound DB与Northbound DB的地址作为启动参数
与Southbound DB(ovn-central)与ovn-controller相连
以下指令在ovs-ovn上执行
# ps -ef |grep start-ovs
root 1624274 1624260 0 2022 ? 00:00:00 /bin/bash /kube-ovn/start-ovs.sh
查询ovs-ovn内的相关进程
# # pstree -ap 1624260
conmon,1624260 -s -c 75696997389f94e5e8c3ae5d892b21f0256248b9fea5e81fdcd3e6f3445a8633 -n k8s_openvswitch_ovs-ovn-dmv7b_kube-system_fd7e9004-b816-47d8-b000-d2983a956063_9777 -u75696997389f94e5e8c3ae5d892b21f0256248b9fea5e81
├─monitor,1628047
│ └─ovsdb-server,1628048 /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key ...
├─monitor,1628090
│ └─ovs-vswitchd,1628091 unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid ...
│ ├─{ovs-vswitchd},1628170
│ ├─{ovs-vswitchd},1628172
│ ├─{ovs-vswitchd},1628175
│ ├─{ovs-vswitchd},1628178
│ ├─{ovs-vswitchd},1628182
│ ├─{ovs-vswitchd},1628207
│ ├─{ovs-vswitchd},1628209
│ ├─{ovs-vswitchd},1628214
│ ├─{ovs-vswitchd},1628217
│ ├─{ovs-vswitchd},1628218
│ ├─{ovs-vswitchd},1628221
│ ├─{ovs-vswitchd},1628223
│ ├─{ovs-vswitchd},1628224
│ ├─{ovs-vswitchd},1628225
│ └─{ovs-vswitchd},1628227
├─monitor,1628245
│ └─ovn-controller,1628246 unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --no-chdir --log-file=/var/log/ovn/ovn-controller.log --pidfile=/var/run/ovn/ovn-controller.pid --detach --monitor
│ ├─{ovn-controller},1628247
│ ├─{ovn-controller},1628248
│ └─{ovn-controller},1628252
├─start-ovs.sh,1624274 /kube-ovn/start-ovs.sh
│ └─tail,1628250 --coreutils-prog-shebang=tail /usr/bin/tail -f /var/log/ovn/ovn-controller.log
└─{conmon},1624262
# 查看ovn-controller的启动参数
# cat /proc/1628246/cmdline | tr '\000' ' '
ovn-controller unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --no-chdir --log-file=/var/log/ovn/ovn-controller.log --pidfile=/var/run/ovn/ovn-controller.pid --detach --monitor
# 查看ovs-vswitchd启动参数
# cat /proc/1628091/cmdline | tr '\000' ' '
ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
# cat /proc/1628048/cmdline | tr '\000' ' '
ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir --log-file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach --monitor
# 错误的实践
# ovs-vsctl get open . external-ids:ovn-remote
"tcp:[10.104.59.47]:6642"
# 一个其他集群的ovn remote输出
# ovs-vsctl get open . external-ids:ovn-remote
"tcp:[192.168.211.4]:6642,tcp:[192.168.211.6]:6642,tcp:[192.168.211.7]:6642"
总结
文章分析了kube-ovn的各个组件并于ovn做了比较,然后分析了各个组件通信交互方式。