当前位置: 首页 > 工具软件 > Kube-OVN > 使用案例 >

kube-ovn网络插件

施翰学
2023-12-01

一. kube-ovn介绍

  • kube-ovn作为企业级的k8s网络插件,使用时geneve协议,防火墙需要放行6981 UDP端口
  • kube-ovn有两种underlayoverlay
  • 可以给k8s不同namespace创建不同的subnet(子网),当然也有一个默认的子网,比如kube-system可以用默认的子网

二. 安装

1. 主要插件安装

参考

安装

# 如果安装了其他网络插件,先卸载掉,具体删除方法删除daemonset和cni配置文件
# 然后安装kube-ovn
# 第一步,给所有节点打标签
kubectl label node k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02 k8s-node03 k8skube-ovn/role=master

# k8s版本低于1.6需要将节点ip在ovn-ha.yaml文件中进行修改
# 将以下标签添加到将托管 OVN 数据库和 OVN 控制平面的节点:

kubectl label node <Node on which to deploy OVN DB> kube-ovn/role=master

# 安装 Kube-OVN 相关的 CRD:

kubectl apply -f https://raw.githubusercontent.com/alauda/kube-ovn/release-1.8/yamls/crd.yaml

# 获取 ovn.yaml 并将$addresses文件替换为将托管 OVN 数据库和 OVN 控制平面的节点的 IP 地址:

curl -O https://raw.githubusercontent.com/alauda/kube-ovn/release-1.8/yamls/ovn.yaml

sed -i 's/\$addresses/<Node IP>/g' ovn.yml

# 安装原生 OVS 和 OVN 组件:

kubectl apply -f ovn.yaml

# 安装 Kube-OVN 控制器和 CNI 插件:

kubectl apply -f https://raw.githubusercontent.com/alauda/kube-ovn/release-1.8/yamls/kube-ovn.yaml

三. 子网及其他关键词

1. subnet

  • 对应OVN中的Logical Switch(虚拟交换机),提供一组IP的相关管理功能
  • 子网可以跨节点,支持IP漂移
  • subnet可以和Namespace绑定,提供Namespace级别的网络控制(CIDR, Gateway, NAT, ACL)
    • CIDR英文Classless InterDomain Routing,意思是无类别域际路由选择
      • k8s中的flannel网络插件就是会给每个node节点分配一个CIDR,也就是CIDR是和node节点一一绑定的,也就是IP是没办法跨节点一一迁移的
      • 但是在使用kube-ovn网络插件,我们的节点是可以跨节点的,他的subnet是分散在所有节点上的,IP也可以在任意节点上进行漂移,因为subnet是和namespace绑定的
    • 可以提供namespace级别的网络控制,比如
      • 网络范围
      • CIDR
      • subnet的配置
      • NAT的配置
      • ACL的配置
  • 不同namespace最好和一个subnet绑定

2. IP

  • 对应OVN中的Logical Switch Port(虚拟交换机的接口)
    • 可以把容器和IP进行一一绑定
  • 展示IP, 主机, Pod, 子网之间的对应关系,供运维和监控使用

3. 内置子网

  • 安装kube-ovn的时候会内置一个subnet,名字叫ovn-default
  • 默认子网会给没有绑定子网的namespace提供一个默认的subnet

4. join子网

  • 安装kube-ovn后有一个join子网,他的作用是宿主机和pod连接用的网络
  • 在每个宿主机上会增加一个ovn0的虚拟网卡,这个网卡是接入join子网的

5. router

  • 会有一个cluster router,会连接所有的subnet

四. 创建子网

1. 查看subnet

# 可以看到一个join,一个ovn-default子网,可以看到有哪些namespace使用子网,以及可以用的ip还有多少
kubectl get subnet

2. 查看所有容器的ip

  • 可以看到容器对应的IP,子网信息,MAC,node信息
kubectl get ip

3. 创建子网关键字

(1). protocol

  • 创建子网的时候,设置子网的网络协议
  • 网络协议有IPv4和IPv6,默认是IPv4
  • 支持同一集群内两种不同协议,不支持两种协议之间的互通

(2). cidrBlock

  • 创建子网的时候设置子网可以用的ip范围
  • 不能和其他子网重叠
  • 不支持CIDR修改

(3). exclude_ips

  • 创建子网的时候设置子网CIDR内保留ip,不会被自动分配
    • 可以填单个IP,也可以填一个IP范围
  • 可以被固定IP分配使用
  • 支持单个IP和IP范围

(4). gateway

  • 创建子网设置虚拟网关地址,默认为CIDR内第一个IP

(5). namespace

  • 子网关联namespace列表

(6). 子网网关配置

  • 子网网关有两种,一种是分布式网关,一种是集中式网关

(1). 分布式网关 (distributed)

  • 创建子网的时候默认是分布式的网关

  • 每个节点作为当前节点上pod访问外网的物理网关

  • 通过ovn的策略路由将出网流量经本机ovn0网卡进入宿主机

  • 通过宿主机的路由策略转发数据包

(2). 集中式网关 (centralized)

  • 推荐使用集中式网关

  • 特定节点作为当前子网pod出网的物理网关

  • 需要在子网中中配置nodeName,指定出网节点

  • 可配置多个出网节点,支持主备模式高可用

(7). NAT类型

  • 启用NAT
    • 容器访问外网使用主机IP进行SNAT
    • 分布式网关下为pod所在主机IP,集中式网关下为网关节点IP
  • 禁用NAT
    • pod IP直接对外暴露
    • 外部网络需要有对应路由将子网网段吓一跳指向当前集群机器
    • 推荐使用集中式网关,并将外部路由下一条指向网关节点

4. 案例配置清单

apiversion kubeovn.io/v1
kind: Subnet
metadata:
  name: subnet1
spec:
  protocol: IPv4
# 是否为默认的subnet
  default: false
  cidrBlock: 10.5.0.0/16
# 不会被分配的IP
  excludeIps:
  - 10.5.0.1..10.5.0.10
  - 10.5.0.11
# 网关,不设置也可以,会默认以第一个ip为网关
  gateway: 10.5.0.1
# 哪一个namespace使用这个subnet
  namespace:
  - wutong
# 如果是集中式网关类型,就需要指定一个节点作为出网节点,可以配置多个,分布式网关类型就不需要配置
  gatewayNode: ""
# 网关类型
  gatewayType: distributed
  natOutgoing: true
  private: false
  • 查看子网信息
# 查看创建的子网信息
kubectl ko nbctl list logical_switch

# 查看虚拟路由器的路由规则,如果是src-ip就是SNAT,如果是dst-ip,就是DNAT
# 比如10.5.0.12的下一条是100.64.0.4,使用的是SNAT,就是源地址转换
kubectl ko nbctl lr-route-list ovn-cluster
IPv4 Routes
             192.168.16.44           100.64.0.2 dst-ip
                 10.5.0.12           100.64.0.4 src-ip      

5. 注意事项

1. cidr问题

参考官网

  • 解决controller-manager报错1 event.go:291] "Event occurred" object="worker-2" kind="Node" apiVersion="v1" type="Normal" reason="CIDRNotAvailable" message="Node worker-2 status is now: CIDRNotAvailable"
# 修改controller-manager 的yaml文件,因为kube-ovn是统一分配pod ip的,会有多个子网,不需要指定pod的IP网段,禁用参数
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
--allocate-node-cidrs false 
 类似资料: