跳转至

安装和配置选项

在一键安装中我们使用默认配置进行安装,Kube-OVN 还支持更多 自定义配置,可在安装脚本中进行配置,或者之后更改各个组件的参数来进行配置。本文档将会介绍这些自定义选项 的作用,以及如何进行配置。

内置网络设置

Kube-OVN 在安装时会配置两个内置子网:

  1. default 子网,作为 Pod 分配 IP 使用的默认子网,默认 CIDR 为 10.16.0.0/16,网关为 10.16.0.1。
  2. join 子网,作为 Node 和 Pod 之间进行网络通信的特殊子网, 默认 CIDR 为 100.64.0.0/16,网关为 100.64.0.1。

在安装时可以通过安装脚本内的配置进行更改:

POD_CIDR="10.16.0.0/16"
POD_GATEWAY="10.16.0.1"
JOIN_CIDR="100.64.0.0/16"
EXCLUDE_IPS=""

EXCLUDE_IP 可设置 POD_CIDR 不进行分配的地址范围,格式为:192.168.10.20..192.168.10.30。

需要注意 Overlay 情况下这两个网络不能和已有的主机网络和 Service CIDR 冲突。

在安装后可以对这两个网络的地址范围进行修改请参考修改默认子网和修改 Join 子网。

Service 网段配置

由于部分 kube-proxy 设置的 iptables 和路由规则会和 Kube-OVN 设置的规则产生交集,因此 Kube-OVN 需要知道 Service 的 CIDR 来正确设置对应的规则。

在安装脚本中可以通过修改:

SVC_CIDR="10.96.0.0/12"  

来进行配置。

也可以在安装后通过修改 kube-ovn-controller Deployment 的参数:

args:
- --service-cluster-ip-range=10.96.0.0/12

来进行修改。

Overlay 网卡选择

在节点存在多块网卡的情况下,Kube-OVN 默认会选择 Kubernetes Node IP 对应的网卡作为容器间跨节点通信的网卡并建立对应的隧道。

如果需要选择其他的网卡建立容器隧道,可以在安装脚本中修改:

IFACE=eth1

该选项支持以逗号分隔的正则表达式,例如 ens[a-z0-9]*,eth[a-z0-9]*。

安装后也可通过修改 kube-ovn-cni DaemonSet 的参数进行调整:

args:
- --iface=eth1

如果每台机器的网卡名均不同,且没有固定规律,可以使用节点 annotation ovn.kubernetes.io/tunnel_interface 进行每个节点的逐一配置,拥有该 annotation 节点会覆盖 iface 的配置,优先使用 annotation。

kubectl annotate node no1 ovn.kubernetes.io/tunnel_interface=ethx

如需为不同子网指定不同的封装网卡,请参考 Overlay 网络封装网卡选择。

使用 /32 地址作为隧道源

部分云平台会为主机网卡分配 /32 或 /128 地址。单独的、符合条件的全掩码地址默认会被选为隧道源;如果它与同族其他可用地址共用网卡,Kube-OVN 可能会将其视为虚拟 IP 并跳过,此时设置 HOST_TUNNEL_SRC=true 可将其纳入隧道源选择:

HOST_TUNNEL_SRC=true

使用安装脚本安装时设置 HOST_TUNNEL_SRC=true,该值会传递给节点上的 Kube-OVN daemon。使用 Helm 安装时,根据使用的 chart 设置对应字段:

# charts/kube-ovn
func:
  HOST_TUNNEL_SRC: true

# charts/kube-ovn-v2
features:
  enableHostTunnelSrc: true

两个 Helm 字段和安装脚本变量的默认值均为 false。启用后,daemon 会将符合条件的全掩码地址纳入隧道源地址选择;本机回环地址始终不会被选择。请确认每个节点上的地址可用于节点间隧道通信,并在启用后验证节点之间的 Overlay 连通性。

MTU 设置

由于 Overlay 封装需要占据额外的空间,Kube-OVN 在创建容器网卡时会根据选择网卡的 MTU 进行容器网卡的 MTU 调整, 默认情况下 Overlay 子网下 Pod 网卡 MTU 为主机网卡 MTU - 100,Underlay 子网下,Pod 网卡和主机网卡有相同 MTU。

如果需要调整 Overlay 子网下 MTU 的大小,可以修改 kube-ovn-cni DaemonSet 的参数:

args:
- --mtu=1333

全局流量镜像开启设置

在开启全局流量镜像的情况下,Kube-OVN 会在每个节点上创建一块 mirror0 的虚拟网卡,复制当前机器所有容器网络流量到该网卡上, 用户可以通过 tcpdump 及其他工具进行流量分析,该功能可以在安装脚本中通过下面的配置开启:

ENABLE_MIRROR=true

也可在安装后通过修改 kube-ovn-cni DaemonSet 的参数方式进行调整:

args:
- --enable-mirror=true

流量镜像的能力在默认安装中为关闭,如果需要细粒度的流量镜像或需要将流量镜像到额外的网卡请参考容器网络流量镜像。

LB 开启设置

在 Underlay 的场景中,kube-proxy 无法截获容器网络流量,因此无法实现 Service 转发的功能。在这种情况下可以通过开启 OVN 内置的 L2 LB 的能力来实现 ClusterIP 的转发能力。在无需 Service 转发能力的场景下可以通过关闭 LB 能力来获得更好的性能。需要注意的事该功能只实现了容器网络的 ClusterIP 转发能力,无法替代 kube-proxy 的全部能力,不能替代 kube-proxy。

该功能可以在安装脚本中进行配置:

ENABLE_LB=false

或者在安装后通过更改 kube-ovn-controller Deployment 的参数进行配置:

args:
- --enable-lb=false

LB 的功能在默认安装中为开启。

从 Kube-OVN v1.12.0 版本开始,在 subnet crd 定义中增加了 spec 字段 enableLb,将 Kube-OVN 的 LB 功能迁移到子网层级,可以基于不同的子网分别设置是否开启 LB 功能。kube-ovn-controller Deployment 中的 enable-lb 参数作为全局参数,控制是否创建 load-balancer 记录,子网中新增的 enableLb 参数用于控制子网是否关联 load-balancer 记录。之前版本升级到 v1.12.0 之后,子网 enableLb 参数会自动继承原有的全局开关参数取值。

NetworkPolicy 开启设置

Kube-OVN 使用 OVN 中的 ACL 来实现 NetworkPolicy,用户可以选择关闭 NetworkPolicy 功能 或者使用 Cilium Chain 的方式利用 eBPF 实现 NetworkPolicy, 在这种情况下可以关闭 Kube-OVN 的 NetworkPolicy 功能以达到控制面和数据面更好的性能。

该功能可以在安装脚本中进行配置:

ENABLE_NP=false

或者在安装后通过更改 kube-ovn-controller Deployment 的参数进行配置:

args:
- --enable-np=false

NetworkPolicy 的能力在默认安装中为开启。

EIP 和 SNAT 开启设置

默认网络下如果无需使用 EIP 和 SNAT 的能力,可以选择关闭相关功能,以减少 kube-ovn-controller 在创建和更新 网络时的检查消耗,在大规模集群环境下可以提升处理速度。

该功能可在安装脚本中进行配置:

ENABLE_EIP_SNAT=false

或者在安装后通过更改 kube-ovn-controller Deployment 的参数进行配置:

args:
- --enable-eip-snat=false

EIP 和 SNAT 的能力在默认安装中为开启。该功能的相关使用和其他可配参数请参考 EIP 和 SNAT 配置。

Load Balancer 类型 Service 支持开启设置

默认 VPC 下可通过开启该选项来支持 Load Balancer 类型 Service。该功能的相关使用和其他可配参数请参考 LoadBalancer 类型 Service。

该功能默认关闭,可在安装脚本中进行配置:

ENABLE_LB_SVC=true

或者在安装后通过更改 kube-ovn-controller Deployment 的参数进行配置:

args:
- --enable-lb-svc=true

集中式网关 ECMP 开启设置

集中式网关支持主备和 ECMP 两种高可用模式,如果需要启用 ECMP 模式, 需要更改 kube-ovn-controller Deployment 的参数进行配置:

args:
- --enable-ecmp=true 

从 Kube-OVN v1.12.0 版本开始,在 subnet crd 定义中增加了 spec 字段 enableEcmp,将集中式子网 ECMP 开关控制迁移到子网层级,可以基于不同的子网分别设置是否开启 ECMP 模式。原有的 kube-ovn-controller Deployment 中的 enable-ecmp 参数不再使用。之前版本升级到 v1.12.0 之后,子网开关会自动继承原有的全局开关参数取值。

集中式网关默认安装下为主备模式,更多网关相关内容请参考子网使用。

Kubevirt VM 固定地址开启设置

针对 Kubevirt 创建的 VM 实例,kube-ovn-controller 可以按照类似 StatefulSet Pod 的方式进行 IP 地址分配和管理。 以达到 VM 实例在生命周期内启停,升级,迁移等操作过程中地址固定不变,更符合虚拟化合用户的实际使用体验。

该功能在 1.10.6 后默认开启,若要关闭此功能,需要在 kube-ovn-controller Deployment 的启动命令中设置如下参数:

args:
- --keep-vm-ip=false

CNI 配置相关设置

Kube-OVN 默认会在 /opt/cni/bin 目录下安装 CNI 执行文件,在 /etc/cni/net.d 目录下安装 CNI 配置文件 01-kube-ovn.conflist。 如果需要更改安装位置和 CNI 配置文件的优先级,可以通过安装脚本的下列参数进行调整:

CNI_CONF_DIR="/etc/cni/net.d"
CNI_BIN_DIR="/opt/cni/bin"
CNI_CONFIG_PRIORITY="01"

或者在安装后更改 kube-ovn-cni DaemonSet 的 Volume 挂载和启动参数:

volumes:
- name: cni-conf
  hostPath:
    path: "/etc/cni/net.d"
- name: cni-bin
  hostPath:
    path:"/opt/cni/bin"
...
args:
- --cni-conf-name=01-kube-ovn.conflist

独立安装脚本默认还会安装随 Kube-OVN 镜像提供的 loopback、portmap、macvlan 和 ipvlan 等 CNI 插件。如果节点已经由其他组件提供这些插件,可以在安装时设置:

INSTALL_CNI_PLUGINS=false

设置为 false 只跳过这些捆绑插件,Kube-OVN 自身的 CNI 二进制和配置仍会安装。使用 Helm v1 时配置 cni_conf.INSTALL_CNI_PLUGINS: false;使用 Helm v2 时配置 cni.installCNIPlugins: false。

CNI 周期 recompute

kube-ovn-cni DaemonSet 中的周期性 OVN controller recompute 默认关闭。需要定期执行该操作时,可以在独立安装脚本中显式开启:

ENABLE_RECOMPUTE=true

Helm v1 和 Helm v2 分别使用以下配置:

# Helm v1
func:
  ENABLE_RECOMPUTE: true

# Helm v2
features:
  enableRecompute: true

安装后也可以在 kube-ovn-cni DaemonSet 中设置 --enable-recompute=true。开启后,daemon 每 10 分钟执行一次周期 recompute;保持默认值 false 时不会启动该周期任务,其他事件驱动的处理不受此开关影响。

隧道类型设置

Kube-OVN 默认 Overlay 的封装模式为 Geneve,如果想更换为 Vxlan 或 STT,可以通过安装脚本的下列参数进行调整:

TUNNEL_TYPE="vxlan"

或者在安装后更改 ovs-ovn DaemonSet 的环境变量:

env:
- name: TUNNEL_TYPE
  value: "vxlan"

如果需要使用 STT 隧道需要额外编译 ovs 的内核模块,请参考性能调优。

不同协议在实际使用中的区别请参考隧道协议说明。

SSL 设置

OVN NB/SB 数据库 API 和 Kube-OVN secure-serving 端点都支持 TLS。TLS 默认关闭。 安装脚本中的以下环境变量用于配置 OVN central/DB 的 TLS,不会为 secure-serving 端点设置 TLS 版本或 cipher suites:

ENABLE_SSL=true
TLS_MIN_VERSION="TLS12"
TLS_MAX_VERSION="TLS13"
TLS_CIPHER_SUITES="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_AES_128_GCM_SHA256"

TLS_MIN_VERSION 和 TLS_MAX_VERSION 支持 TLS10、TLS11、TLS12 和 TLS13。 留空时使用组件默认值。如果同时设置,最小版本必须小于或等于最大版本。选定的 协议范围会应用于 OVN NB/SB 数据库服务器。

TLS_CIPHER_SUITES 使用逗号分隔的 Go TLS cipher suite 名称。OVN DB 服务器只接受 安装脚本映射到 OpenSSL 名称的套件。支持的名称如下:

TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256

选择 cipher suites 时必须与 kube-ovn-tls Secret 中证书的密钥类型匹配。默认生成的 kube-ovn-tls 使用 RSA 证书,因此仅配置 ECDSA cipher suites 而继续使用默认 RSA 证书会导致 TLS 握手失败;如需使用 ECDSA-only suites,请先提供匹配的 ECDSA 证书和 密钥。

以下 Helm 配置会由 chart 的 componentTLSArgs 模板转换为各组件的 --tls-min-version、--tls-max-version 和 --tls-cipher-suites 参数,这些参数用于 配置 secure-serving 端点。安装脚本中的同名 TLS_* 变量不会注入这些组件参数。 仅设置这些 TLS 参数不会启用 secure-serving;必须同时设置 chart 对应的开关。 classic chart 使用 func.SECURE_SERVING,v2 chart 使用 features.enableSecureServing,而 TLS 版本和 cipher suites 仍位于 networking。

classic Helm chart 配置以下值:

func:
  SECURE_SERVING: true
networking:
  ENABLE_SSL: true
  TLS_MIN_VERSION: TLS12
  TLS_MAX_VERSION: TLS13
  TLS_CIPHER_SUITES:
    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    - TLS_AES_128_GCM_SHA256

v2 Helm chart 使用以下配置:

features:
  enableSecureServing: true
networking:
  enableSsl: true
  tlsMinVersion: TLS12
  tlsMaxVersion: TLS13
  tlsCipherSuites:
    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    - TLS_AES_128_GCM_SHA256

当 ENABLE_SSL=true(或 networking.enableSsl=true)时,Kube-OVN 使用 kube-ovn-tls Secret。该 Secret 包含 cacert、cert 和 key,并挂载到 /var/run/tls。classic Helm chart 的普通安装和 v2 Helm chart 在 Secret 不存在时会 自动创建它。仅 classic Helm chart 的 installMode: dataPlaneOnly 有特殊规则:当 networking.ENABLE_SSL=true 时,必须预先在目标命名空间创建 kube-ovn-tls,并使用 管理集群 OVN central 使用的同一 CA、证书和密钥;classic chart 模板在缺少该 Secret 时会直接失败,也不会渲染本地 Secret。v2 Helm chart 没有 installMode: dataPlaneOnly 这个值,不能将上述预置规则套用于 v2 chart。

启用 SSL 后,kube-ovn-controller 会负责维护名为 kube-ovn-tls 的 Secret。该 Secret 保持现有的 cacert、cert 和 key 数据项;如果 Secret 已经存在但没有 Kube-OVN 的证书 hash annotation,controller 会先接管它,不会因为升级立即更换证书。

自动检查和轮转由 KUBE_OVN_TLS_ROTATION_INTERVAL 控制,默认值为 8760h(一年),设置为 0 可以关闭自动轮转。该值是检查间隔,不是强制换证周期;只有证书有效期已经过半时才会生成并写入新证书。安装脚本可以这样设置:

ENABLE_SSL=true
KUBE_OVN_TLS_ROTATION_INTERVAL=8760h

使用 Helm 安装时,配置键取决于 Chart 版本。classic Chart(charts/kube-ovn)使用大写键:

networking:
  ENABLE_SSL: true
  KUBE_OVN_TLS_ROTATION_INTERVAL: 8760h

classic Chart 使用 installMode: dataPlaneOnly 时会强制将该间隔设为 0,因为 kube-ovn-tls 由管理集群维护并负责轮转。

v2 Chart(charts/kube-ovn-v2)使用 camel case 键:

networking:
  enableSsl: true
  kubeOvnTlsRotationInterval: 8760h

Secret 更新后,ovn-central、ovs-ovn 中的 OVN 进程以及 Kube-OVN 的 Go client 会重新加载挂载的证书文件或在下一次 TLS 握手时读取新证书。该过程不需要重启 Kube-OVN Pod;可以检查 kube-ovn-tls 的 kube-ovn.io/kube-ovn-tls-cert-hash annotation、组件日志和 Pod 的容器重启次数,确认 adoption 或轮转已经生效。

跳过 conntrack 的目的 CIDR 列表

针对部分需要绕过 conntrack 处理的目的网段(例如已通过其他方式做 NAT/会话保持的旁路流量),可在安装脚本或 kube-ovn-controller 启动参数中配置跳过列表,多个 CIDR 以逗号分隔:

SKIP_CONNTRACK_DST_CIDRS="10.10.0.0/16,fd00:10::/64"
args:
- --skip-conntrack-dst-cidrs=10.10.0.0/16,fd00:10::/64

默认为空。

启用 OVN IPSec

启用后 Kube-OVN 会通过 OVN 内置的 IPSec 能力对节点间的 Geneve/Vxlan/STT 隧道进行加密,并自动签发证书。

ENABLE_OVN_IPSEC=true

控制器与 daemon 均需要打开该开关:

args:
- --enable-ovn-ipsec=true

详细配置参考 OVN IPSec。

AdminNetworkPolicy / DNS 名称解析支持

启用 AdminNetworkPolicy(ANP/CNP)以及基于 DNS 名称的访问控制(依赖 DNSNameResolver CRD):

ENABLE_ANP=true
ENABLE_DNS_NAME_RESOLVER=true
args:
- --enable-anp=true
- --enable-dns-name-resolver=true

详细使用见基于域名的访问控制。

VPC NAT Gateway 总开关

控制是否启用 VPC NAT Gateway 相关 controller。默认开启:

ENABLE_NAT_GW=true

或在 ovn-vpc-nat-gw-config ConfigMap 中通过 enable-vpc-nat-gw 字段控制运行时开关。

ovn-northd 线程数

针对大规模集群,可调整 ovn-northd 处理线程数以加速增量计算:

OVN_NORTHD_N_THREADS=4

默认 1。需结合节点 CPU 资源评估。

NetworkPolicy 执行模式

Kube-OVN 支持 standard/lax 两种 NetworkPolicy 执行模式,可通过下列方式全局配置默认值:

NP_ENFORCEMENT=standard
args:
- --np-enforcement=standard

也可在单条 NetworkPolicy 上通过 ovn.kubernetes.io/network_policy_enforcement annotation 覆盖。详见 NetworkPolicy 支持。

VXLAN 关闭 TX checksum offload

部分网卡 VXLAN 隧道封装存在 checksum offload 兼容问题,可关闭:

SET_VXLAN_TX_OFF=true
args:
- --set-vxlan-tx-off=true

Geneve 关闭 TX checksum offload

部分网卡或内核版本在 Geneve 隧道封装时也可能存在 checksum offload 兼容问题。默认情况下,Kube-OVN 保持 Geneve TX checksum offload 不变;需要关闭时,在安装脚本中设置:

SET_GENEVE_TX_OFF=true

安装脚本会将该值传递给 kube-ovn-daemon 的 --set-geneve-tx-off 参数。也可以在已安装的 kube-ovn-cni DaemonSet 中设置:

args:
- --set-geneve-tx-off=true

使用 Helm 安装时,classic chart 和 v2 chart 分别配置以下字段:

# classic chart
func:
  SET_GENEVE_TX_OFF: true

# v2 chart
features:
  SET_GENEVE_TX_OFF: true

启用后,daemon 启动时会对 genev_sys_6081 关闭 TX checksum offload;如果节点上不存在该网卡,则跳过这一步。该设置只在启动时修改网卡:从 true 改回 false 不会自动恢复已经关闭的 offload,需要先单独恢复节点网卡,才能依赖默认的 offload 状态。SET_GENEVE_TX_OFF 与 SET_VXLAN_TX_OFF 分别控制 Geneve 和 VXLAN 网卡,互不影响。

KubeVirt 实时迁移优化

启用后控制器会针对 KubeVirt 实时迁移过程优化端口绑定切换,减少迁移瞬时丢包。默认开启:

ENABLE_LIVE_MIGRATION_OPTIMIZE=true

OVN LB 偏好本地 endpoint

启用后 OVN 内置 LoadBalancer 会偏好同节点的 endpoint,配合 externalTrafficPolicy=Local 使用:

ENABLE_OVN_LB_PREFER_LOCAL=true
args:
- --enable-ovn-lb-prefer-local=true

外部网关 ConfigMap 命名空间

集中式外部网关相关 ConfigMap(如 external-gw-config)默认在 kube-system。可通过下列参数迁移到其他命名空间:

EXTERNAL_GATEWAY_CONFIG_NS=kube-system

Non-Primary CNI 模式

在该模式下 Kube-OVN 仅作为 attachment network 提供方,不再分配 Pod 主网络 IP,主网络由其他 CNI 负责。controller 与 daemon 均需要打开此开关:

args:
- --non-primary-cni-mode=true

或通过 Helm cni_conf.NON_PRIMARY_CNI=true(chart v1)/cni.nonPrimaryCNI=true(chart v2)配置。详见 Non-Primary CNI 模式。

Controller Leader Election 时间配置

controller 使用 Kubernetes leader election。可以通过以下 duration 参数调整当前 leader 停止续租后备用 controller 接管所需的时间:

args:
- --leader-elect-lease-duration=30s
- --leader-elect-renew-deadline=20s
- --leader-elect-retry-period=6s

默认值分别为 30s、20s 和 6s。所有值都必须是正 duration。controller 会在创建 Kubernetes client 前校验这些参数的关系:

  • lease-duration 必须大于 renew-deadline。
  • renew-deadline 必须大于 retry-period 乘以 Kubernetes client-go leader election 的 jitter factor(1.2)。

可以通过安装脚本设置:

export LEADER_ELECT_LEASE_DURATION=1m
export LEADER_ELECT_RENEW_DEADLINE=40s
export LEADER_ELECT_RETRY_PERIOD=10s
bash install.sh

Helm 配置默认值为空,只有设置后 chart 才会渲染这些参数。classic chart 使用 kube-ovn-controller.leaderElection:

kube-ovn-controller:
  leaderElection:
    leaseDuration: "30s"
    renewDeadline: "20s"
    retryPeriod: "6s"

v2 chart 使用 controller.leaderElection:

controller:
  leaderElection:
    leaseDuration: "30s"
    renewDeadline: "20s"
    retryPeriod: "6s"

kube-ovn-monitor 副本数

kube-ovn-monitor 默认运行一个副本。可以通过 Helm 配置监控 Deployment 的副本数:

# classic chart
kube-ovn-monitor:
  replicas: 1

# v2 chart
monitor:
  replicas: 1

classic chart 使用 kube-ovn-monitor.replicas,v2 chart 使用 monitor.replicas,默认值均为 1。在 OVN central 高可用部署中,可以将副本数设置为需要观测的 central 节点数,使每个节点的本地 OVN Raft 角色都能被 kube-ovn-monitor 采集。

由于该 Deployment 只会调度到符合条件的 master 节点,并使用按主机名的强制 Pod 反亲和性,副本数不要超过可调度的 master 或 central 节点数,否则多出的 Pod 会一直处于 Pending 状态。

升级时 Helm 会按照配置的副本数渲染 Deployment,不会因 chart 升级将已配置的副本数覆盖回 1。建议通过 Helm values 管理该设置,而不是只使用 kubectl scale 临时修改 Deployment。

kube-ovn-v2 Deployment 容忍度

kube-ovn-v2 Chart 为以下工作负载提供可配置的容忍度列表:

  • controller.tolerations:kube-ovn-controller,默认容忍 NoSchedule 且 operator: Exists,以及 key: CriticalAddonsOnly 且 operator: Exists。
  • central.tolerations:ovn-central,默认容忍上述两项,并额外容忍 NoExecute 且 operator: Exists。
  • monitor.tolerations:kube-ovn-monitor,默认与 controller.tolerations 相同。
  • validatingWebhook.tolerations:kube-ovn-webhook,默认仅容忍 NoSchedule 且 operator: Exists。
  • ic.tolerations:ovn-ic-controller,默认与 central.tolerations 相同。

这些字段的值会直接渲染为对应 Pod 模板的 spec.template.spec.tolerations。central.hcp.enabled 为 false 时 central 渲染为 Deployment,为 true 时渲染为 StatefulSet;ic 仅在启用 features.enableOvnInterconnections 时渲染。默认值保持与此前模板相同,因此不设置 values 时行为不变。默认的无 key 容忍会匹配所有相应 effect 的污点,包括 node.kubernetes.io/unschedulable;由于这些工作负载通常按 master 节点部署并使用主机名反亲和性,节点 drain 或 cordon 后替代 Pod 可能仍会调度回该节点。需要让组件避开 cordon 节点时,请为每个需要调整的工作负载设置带 key 的容忍度列表,例如:

controller:
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      operator: Exists
      effect: NoSchedule
    - key: node-role.kubernetes.io/master
      operator: Exists
      effect: NoSchedule
    - key: CriticalAddonsOnly
      operator: Exists

central:
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      operator: Exists
      effect: NoSchedule
    - key: node-role.kubernetes.io/master
      operator: Exists
      effect: NoSchedule
    - key: CriticalAddonsOnly
      operator: Exists

设置一个字段会替换该工作负载的整个默认列表;上例也可分别用于 monitor、validatingWebhook 和 ic,请根据集群的控制平面污点保留所需的容忍度。ovs-ovn、kube-ovn-agent、kube-ovn-pinger 和 kube-ovn-speaker 等 DaemonSet 不使用这些字段。

绑定本地 ip

kube-ovn-controller/kube-ovn-cni/kube-ovn-monitor 这些服务支持绑定本地 ip,该功能设计原因主要是因为某些场景下出于安全考虑不允许服务绑定 0.0.0.0 (比如该服务部署在某个对外网关上,外部用户可以直接通过公网 ip 并指定端口去访问到该服务),该功能默认是打开的,由安装脚本中如下参数控制:

ENABLE_BIND_LOCAL_IP=true

以 kube-ovn-monitor 为例,开启功能后会把服务绑定本地的 pod ip 如下:

# netstat -tunlp |grep kube-ovn
tcp        0      0 172.18.0.5:10661        0.0.0.0:*               LISTEN      2612/./kube-ovn-mon

安装后也可通过修改服务的 deployment 或者 daemonSet 的环境变量参数进行调整:

env:
- name: ENABLE_BIND_LOCAL_IP
  value: "false"

PDF Slack Support

评论