文章目录
- 介绍
- ovn架构
- kube-ovn架构
- kube-ovn数据流向
- 软件版本及注意事项
- 高可用部署安装
- kube-ovn运维
- 查看Pod日志
- 组件监控
- kubectl ko插件
- 网络相关
介绍
kube-ovn是基于ovn开发的。https://man7.org/linux/man-pages/man7/ovn-architecture.7.html
ovn架构
组件说明:
OVN/CMS Plugin:操作北向数据库的一个组件,对应kube-ovn中的kube-ovn-controller组件;
OVN Northbound DB:重要的组件,里边存储逻辑数据,例如logical switches,routers, ACL等;
ovn-northd:类似于一个集中控制器,把上层notrh DB的数据翻译成下层south DB里边;
OVN Southbound DB:南向数据库,存储数据分三类
- 1.物理网络数据,例如主机地址、tunnel封装格式。数据来自于底层ovn-controller组件向上发送的
- 2.逻辑网络数据,报文如何在逻辑网络里转发。数据来自于北向数据库
- 3.物理网络与逻辑网络绑定的关系,例如逻辑端口关联到哪个主机。
数据平面:每个主机运行3个组件,ovn-controller/ovs-vswitchd/ovsdb-server
ovn-controller:是ovn的agent,运行在每台节点,北向会把物理网络数据写到south DB,南向会把south DB的数据转换成openflow配到本地ovsdb table,实现报文转发;
ovs-vswitchd:是ovs的核心组件,和datapath的内核模块一起实现ovs基于流的数据交换,与ovn-controller通信;
ovsdb:通过ovsdb协议与ovsdb server通信,使用Netlink和内核模块通信;
kube-ovn架构
组件说明:
Cluster Router:
Node Switch:
ns Switch:每个namespace绑定一个switch
每台节点上有eth0、ovn0挂载Node Switch(主机网络与容器网络互通使用)——》连接到ClusterRouter
控制平面:
- Deployment kube-ovn-controller,基于go实现的控制器,监听容器创建删除事件等
- Deployment ovn-central,ovn控制平面组件,打包成docker镜像运行
数据平面:
- Daemonset kube-ovn-cni,运行在每台节点,cni插件,用于pod做ip分配管理
- Daemonset ovs-ovn,是ovn官方组件,运行南向组件(ovn-controller、ovs-vswitchd、ovsdb-server)
协作的网络组件:
- kube-proxy 本地node port访问使用;
- coredns 服务发现、域名解析;
kube-ovn数据流向
kube-ovn数据流向:
主机上参与的设备
- eth0 主机网卡
- genev_sys_6081 ovn生产的tunnel设备,overylay模型,各个节点通信依赖tunnel,
- genev协议,加速数据包转发效率
- ovn0 eth0的veth,挂载在ovs bri-int网桥
三种场景:
-
Pod <——>Pod同主机/跨主机
○ 同主机通信:通过ovs的bridge int网桥做的二层转发
○ 跨主机:先通过pod网卡发送到genev_sys_6081设备做genev封装——》发往eth0——》发往对端eth0网卡,然后genev_sys_6081解封装,然后发到对端pod -
Pod——>Service IP
○ Pod转发到pod,service IP对应ovn的loadbancer,虚拟IP还是会转发到pod -
Pod <——>Host主机 host/其他外部地址
○ host是集群里的一台节点,通过策略路由,默认出主机的口,有一个分布式网关,Pod访问非集群网络及非主机IP的时候,从pod所在主机的ovn0网卡走主机默认路由出去。如果是集中式网关,会走向特定主机路由
软件版本及注意事项
● Kubernetes >= 1.16
● Docker >= 1.12.6, Containerd >= 1.3.4
● 操作系统: CentOS 7/8, Ubuntu 16.04/18.04/20.04
● 其他 Linux 发行版,需要检查一下内核模块是否存在 geneve, openvswitch, ip_tables, iptable_nat
● Kernel 启动需要开启 ipv6, 如果 kernel 启动参数包含 ipv6.disable=1 需要将其设置为 0
● Kube-Proxy 正常工作,Kube-OVN 可以通过 SVC IP 访问到 Apiserver
● 确认 kubelet 配置参数开启了 CNI,并且配置在标准路径下, kubelet 启动时包含了如下参数 --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d
● 确认未安装其他网络插件,或者其他网络插件已经被清除,检查 /etc/cni/net.d/ 路径下无其他网络插件配置文件。如果之前安装过其他网络插件建议删除后重启机器清理残留网络资源。
Kube-OVN 所使用的的主机端口,需要防火墙放开:
组件 | 端口 | 用途 |
---|---|---|
ovn-central | 6641/tcp, 6642/tcp, 6643/tcp, 6644/tcp | ovn-db 和 raft server |
ovs-ovn | Geneve 6081/udp, STT 7471/tcp, Vxlan 4789/udp | 隧道端口 |
kube-ovn-controller | 10660/tcp | 监控 |
kube-ovn-daemon | 10665/tcp | 监控 |
kube-ovn-monitor | 10661/tcp | 监控 |
kube-ovn-controller.yaml
containers:
- args:
- --default-cidr=10.199.0.0/16
- --default-exclude-ips=
- --node-switch-cidr=100.64.0.0/16 #主机和容器通信使用
- --network-type=geneve
- --default-interface-name=
- --default-vlan-id=100
kube-ovn-cni.yaml
containers:
- args:
- --enable-mirror=false
- --encap-checksum=true
- --service-cluster-ip-range=10.96.0.0/12
- --iface=eth0
- --network-type=geneve
- --default-interface-name=
高可用部署安装
https://github.com/kubeovn/kube-ovn/wiki/%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85
kube-ovn运维
kube-ovn-pinger:DaemonSet管理,节点间周期性检查联通性
● Pod——Pod
● Pod——Host
● Pod——ApiServer
● Pod——DNS
查看Pod日志
~]# kubectl logs -f kube-ovn-pinger-sz8s5 -nkube-system --tail 20
组件监控
https://github.com/kubeovn/kube-ovn/tree/master/dist/monitoring
kubectl ko插件
[root@VM-2-29-centos ~]# kubectl ko
kubectl ko {subcommand} [option...]
Available Subcommands:
[nb|sb] [status|kick|backup|dbstatus|restore] ovn-db operations show cluster status, kick stale server, backup database, get db consistency status or restore ovn nb db when met 'inconsistent data' error
nbctl [ovn-nbctl options ...] invoke ovn-nbctl
sbctl [ovn-sbctl options ...] invoke ovn-sbctl
vsctl {nodeName} [ovs-vsctl options ...] invoke ovs-vsctl on the specified node
ofctl {nodeName} [ovs-ofctl options ...] invoke ovs-ofctl on the specified node
dpctl {nodeName} [ovs-dpctl options ...] invoke ovs-dpctl on the specified node
appctl {nodeName} [ovs-appctl options ...] invoke ovs-appctl on the specified node
tcpdump {namespace/podname} [tcpdump options ...] capture pod traffic
trace {namespace/podname} {target ip address} {icmp|tcp|udp} [target tcp or udp port] trace ovn microflow of specific packet
diagnose {all|node} [nodename] diagnose connectivity of all nodes or a specific node
reload restart all kube-ovn components
kubectl ko nbctl
~]# kubectl ko nbctl show #查看逻辑交换机,路由器,Pod IP
~]# kubectl ko nbctl ls-lb-list ovn-default #查看ovn中LB vip映射
ACL检查:
~]# kubectl ko nbctl acl-list ovn-default
~]# kubectl ko nbctl list port group #查看networkpolicy
~]# kubectl ko nbctl --type=port-group acl-list oneportgroup
~]# kubectl ko nbctl list address_set
策略路由转发检查
~]# kubectl ko nbctl lr-route-list ovn-cluster
IPv4 Routes
10.0.2.29 100.64.0.3 dst-ip #主机地址——》ovn0网卡
10.0.2.31 100.64.0.4 dst-ip
10.0.2.42 100.64.0.2 dst-ip
10.0.2.49 100.64.0.5 dst-ip
kubectl ko sbctl
~]# kubectl ko sbctl show #查看各主机端口绑定的关系
~]# kubectl ko sbctl lflow-list #查看流表
kubectl ko vsctl
~]# kubectl ko vsctl 10.0.2.29 show #查看特定主机上端口绑定及tunnel信息
kubectl ko tcpdump
对Kube-ovn容器网络的任意Pod进行抓包
~]# kubectl ko tcpdump kube-system/coredns-d84bc975c-xd9mf
kubectl ko trace
对Logical flow的trace
~]# kubectl ko trace kube-system/coredns-d84bc975c-r8qps {target ip address}{icmp|tcp|udp}[target tcp or udp port]
示例:~]# kubectl ko trace default/nginx-deployment-98cfc48cc-kknrg 8.8.8.8 icmp
kubectl ko diagnose #对集群或者特定节点做一次快速巡检
~]# kubectl ko diagnose all
网络相关
~]# iperf3 -c 192.168.35.108 -p 5001 -b 10M -t 3600 -i 2 -P 1
参数说明:
-c : 服务端的ip地址
-p : 端口号
-b : 每一次发送的数据大小
-t : 总的发送时间(单位:秒)
-i : 发送数据的时间间隔(单位:秒)
-P : 表示线程个数,不指定则默认单线程
补发于2022-07-04