OVN-Kubernetes 网络插件


OpenShift Container Platform 4.19

OpenShift Container Platform 中 OVN-Kubernetes 网络插件的深度配置和故障排除

Red Hat OpenShift Documentation Team

摘要

本文档提供有关 OpenShift Container Platform 中 OVN-Kubernetes 网络插件的架构、配置和故障排除的信息。

第 1 章 关于 OVN-Kubernetes 网络插件

OpenShift Container Platform 集群在 pod 和服务网络中使用虚拟网络。

Red Hat OpenShift Networking 的一部分,OVN-Kubernetes 网络插件是 OpenShift Container Platform 的默认网络供应商。OVN-Kubernetes 基于 Open Virtual Network(OVN),它提供了一个基于 overlay 的网络实现。使用 OVN-Kubernetes 插件的集群还在每个节点上运行 Open vSwitch (OVS)。OVN 在每个节点上配置 OVS 来实现声明的网络配置。

注意

OVN-Kubernetes 是 OpenShift Container Platform 和单节点 OpenShift 部署的默认网络解决方案。

OVN-Kubernetes (来自 OVS 项目)使用许多相同的结构,如开放流规则,来决定数据包通过网络传输的方式。如需更多信息,请参阅 Open Virtual Network 网站

OVN-Kubernetes 是 OVS 的一系列守护进程,用于将虚拟网络配置转换为 OpenFlow 规则。OpenFlow 是一种用于与网络交换机和路由器通信的协议,为远程控制网络设备上的网络流量流提供了方法。这意味着网络管理员可以配置、管理和监视网络流量的流。

OVN-Kubernetes 提供了 OpenFlow 提供的更多高级功能。OVN 支持分布式虚拟路由、分布式逻辑交换机、访问控制、动态主机配置协议(DHCP)和 DNS。OVN 在逻辑流中实施分布式虚拟路由,这些路由等同于开放流。例如,如果您有一个向网络上的 DHCP 服务器发送 DHCP 请求的 pod,则请求中的逻辑流规则可帮助 OVN-Kubernetes 处理数据包。这意味着服务器可以响应网关、DNS 服务器、IP 地址和其他信息。

OVN-Kubernetes 在每个节点上运行一个守护进程。数据库和 OVN 控制器都有守护进程集,每个节点上运行的 OVN 控制器。OVN 控制器在节点上对 Open vSwitch 守护进程进行编程,以支持以下网络供应商功能:

  • 出口 IP
  • 防火墙
  • 硬件卸载
  • 混合网络
  • 互联网协议安全(IPsec)加密
  • IPv6
  • 多播。
  • 网络策略和网络策略日志
  • 路由器

1.1. OVN-Kubernetes 目的

OVN-Kubernetes 网络插件是一个开源、功能齐全的 Kubernetes CNI 插件,它使用 Open Virtual Network (OVN)来管理网络流量。OVN 是一个社区开发、与供应商无关的网络虚拟化解决方案。OVN-Kubernetes 网络插件使用以下技术:

  • OVN 管理网络流量流。
  • Kubernetes 网络策略支持和日志,包括入口和出口规则。
  • 通用网络虚拟化封装(Geneve)协议,而不是虚拟可扩展局域网(VXLAN),以在节点之间创建覆盖网络。

OVN-Kubernetes 网络插件支持以下功能:

  • 可以运行 Linux 和 Microsoft Windows 工作负载的混合集群。此环境称为混合网络
  • 将网络数据处理从主机中央处理单元(CPU)卸载到兼容的网卡和数据处理单元(DPU)。这称为硬件卸载(hardware offloading)
  • IPv4-primary 双栈网络,在裸机、VMware vSphere、IBM Power®、IBM Z® 和 Red Hat OpenStack Platform (RHOSP)平台上。
  • RHOSP 和裸机平台上的 IPv6 单堆栈网络。
  • 在裸机、VMware vSphere 或 RHOSP 平台上运行的集群的 IPv6-primary 双栈网络。
  • 出口防火墙设备和出口 IP 地址。
  • 以重定向模式运行的出口路由器设备。
  • 集群内通信的 IPsec 加密。

红帽不支持使用 OVN-Kubernetes 网络插件的以下安装后配置:

  • 配置主网络接口,包括使用 NMState Operator 为接口配置绑定。
  • 在使用 Open vSwitch (OVS)或 OVN-Kubernetes br-ex 网桥网络的网络设备上配置子接口或附加网络接口。
  • 在主网络接口上创建其他虚拟局域网(VLAN)。
  • 使用您在集群安装过程中为节点创建的主网络接口(如 eth 0 或 bond 0)来创建其他二级网络。

红帽支持以下使用 OVN-Kubernetes 网络插件的安装后配置:

  • 从基础物理接口(如 eth0.100) 创建额外的 VLAN,其中您将主网络接口配置为集群安装过程中节点的 VLAN。这是因为 Open vSwitch (OVS)网桥附加到初始 VLAN 子接口,如 eth0.100,保留基础物理接口可用于新配置。
  • 使用 localnet 拓扑网络创建额外的 OVN 二级网络需要在 NodeNetworkConfigurationPolicy (NNCP)对象中定义二级网络。创建网络后,Pod 或虚拟机(VM)可以附加到网络。这些从属网络为物理网络提供专用连接,可能或不能使用 VLAN 标记。您无法从主机没有所需设置的节点的主机网络访问这些网络,如所需的网络设置。

1.2. OVN-Kubernetes IPv6 和双栈限制

OVN-Kubernetes 网络插件有以下限制:

  • 对于为双栈网络配置的集群,IPv4 和 IPv6 流量都必须使用与默认网关相同的网络接口。

    如果不满足此要求,则 ovnkube-node 守护进程集中的主机上的容器集进入 CrashLoopBackOff 状态。

    如果您使用 oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node -o yaml 等命令显示 pod,则 status 字段具有多个有关默认网关的消息,如以下输出所示:

    I1006 16:09:50.985852   60651 helper_linux.go:73] Found default gateway interface br-ex 192.168.127.1
    I1006 16:09:50.985923   60651 helper_linux.go:73] Found default gateway interface ens4 fe80::5054:ff:febe:bcd4
    F1006 16:09:50.985939   60651 ovnkube.go:130] multiple gateway interfaces detected: br-ex ens4
    Copy to Clipboard Toggle word wrap

    唯一的解析是重新配置主机网络,以便两个 IP 系列都针对默认网关使用相同的网络接口。

  • 对于为双栈网络配置的集群,IPv4 和 IPv6 路由表必须包含默认网关。

    如果不满足此要求,则 ovnkube-node 守护进程集中的主机上的容器集进入 CrashLoopBackOff 状态。

    如果您使用 oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node -o yaml 等命令显示 pod,则 status 字段具有多个有关默认网关的消息,如以下输出所示:

    I0512 19:07:17.589083  108432 helper_linux.go:74] Found default gateway interface br-ex 192.168.123.1
    F0512 19:07:17.589141  108432 ovnkube.go:133] failed to get default gateway interface
    Copy to Clipboard Toggle word wrap

    唯一的解析是重新配置主机网络,以便两个 IP 系列都包含默认网关。

  • 如果您为集群在 MachineConfig 自定义资源(CR)的 kernelArgument 部分中将 ipv6.disable 参数设置为 1,则 OVN-Kubernetes pod 会进入 CrashLoopBackOff 状态。另外,将集群更新至 OpenShift Container Platform 的更新版本会失败,因为 Network Operator 处于 Degraded 状态。红帽不支持为集群禁用 IPv6 寻址,因此不要将 ipv6.disable 参数设置为 1

1.3. 会话关联性

会话关联性是适用于 Kubernetes Service 对象的功能。如果要确保每次连接到 <service_VIP>:<Port> 时,您可以使用 会话关联性,流量始终被加载到同一后端。如需更多信息,包括如何根据客户端的 IP 地址设置会话关联性,请参阅会话关联性

会话关联性的粘性超时

OpenShift Container Platform 的 OVN-Kubernetes 网络插件根据最后一个数据包计算来自客户端的会话的粘性超时。例如,如果您运行 curl 命令 10 次,则粘性会话计时器从第十个数据包开始,而不是第一个数据包。因此,如果客户端不断联系该服务,则会话永远不会超时。当服务没有收到 timeoutSeconds 参数所设定的时间的数据包时,超时开始。

第 2 章 OVN-Kubernetes 架构

2.1. OVN-Kubernetes 架构简介

下图显示了 OVN-Kubernetes 架构。

图 2.1. OVK-Kubernetes 架构

主要组件是:

  • Cloud Management System (CMS) - OVN 的特定平台客户端,为 OVN 集成提供 CMS 特定的插件。该插件将云管理系统的逻辑网络配置概念转换为 OVN 理解的 CMS 配置数据库中。
  • OVN 北向数据库(nbdb)容器 - 存储由 CMS 插件传递的逻辑网络配置。
  • OVN 南向数据库(sbdb)容器 - 存储每个节点上的 Open vSwitch (OVS)系统的物理和逻辑网络配置状态,包括绑定它们的表。
  • OVN 北向守护进程 (ovn-northd) - 这是 nbdb 容器和 sbdb 容器之间的中介客户端。它以传统网络概念的形式将逻辑网络配置(从 nbdb 容器)转换为 sbdb 容器中的逻辑数据路径流。ovn-northd 守护进程的容器名称为 northd,它在 ovnkube-node pod 中运行。
  • ovn-controller - 这是与 OVS 和 hypervisor 交互的 OVN 代理,适用于 sbdb 容器所需的任何信息或更新。ovn-controllersbdb 容器读取逻辑流,将它们转换为 OpenFlow 流,并将它们发送到节点的 OVS 守护进程。容器名称为 ovn-controller,它在 ovnkube-node pod 中运行。

OVN 北向数据库、北向数据库和南向数据库在集群中的每个节点上运行,大部分包含对该节点本地的和进程信息。

OVN 北向数据库具有通过云管理系统(CMS)传递到它的逻辑网络配置。OVN 北向数据库包含网络的当前状态,以逻辑端口、逻辑交换机、逻辑路由器等形式显示。ovn-northd (northd 容器) 连接到 OVN 北向数据库和 OVN 南向数据库。它以传统网络概念的形式将逻辑网络配置转换为 OVN 北向数据库中的逻辑数据路径流。

OVN 南向数据库具有网络的物理和逻辑表示,并将它们连接在一起。它包含节点的机箱信息,以及其他结构,如连接到集群中其他节点所需的远程传输交换机端口。OVN 南向数据库还包含所有逻辑流。逻辑流与每个节点上运行的 ovn-controller 进程共享,ovn-controller 将它们转换为 OpenFlow 规则到程序 Open vSwitch(OVS)。

Kubernetes control plane 节点在单独的节点上包含两个 ovnkube-control-plane pod,它为集群中的每个节点执行中央 IP 地址管理 (IPAM) 分配。在任何给定时间,只有一个 ovnkube-control-plane pod 是领导。

2.2. 列出 OVN-Kubernetes 项目中的所有资源

查找在 OVN-Kubernetes 项目中运行的资源和容器对于帮助您了解 OVN-Kubernetes 网络实施非常重要。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令,以获取 OVN-Kubernetes 项目中的所有资源、端点和 ConfigMap

    $ oc get all,ep,cm -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap

    输出示例

    Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
    NAME                                         READY   STATUS    RESTARTS       AGE
    pod/ovnkube-control-plane-65c6f55656-6d55h   2/2     Running   0              114m
    pod/ovnkube-control-plane-65c6f55656-fd7vw   2/2     Running   2 (104m ago)   114m
    pod/ovnkube-node-bcvts                       8/8     Running   0              113m
    pod/ovnkube-node-drgvv                       8/8     Running   0              113m
    pod/ovnkube-node-f2pxt                       8/8     Running   0              113m
    pod/ovnkube-node-frqsb                       8/8     Running   0              105m
    pod/ovnkube-node-lbxkk                       8/8     Running   0              105m
    pod/ovnkube-node-tt7bx                       8/8     Running   1 (102m ago)   105m
    
    NAME                                   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
    service/ovn-kubernetes-control-plane   ClusterIP   None         <none>        9108/TCP            114m
    service/ovn-kubernetes-node            ClusterIP   None         <none>        9103/TCP,9105/TCP   114m
    
    NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
    daemonset.apps/ovnkube-node   6         6         6       6            6           beta.kubernetes.io/os=linux   114m
    
    NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/ovnkube-control-plane   3/3     3            3           114m
    
    NAME                                               DESIRED   CURRENT   READY   AGE
    replicaset.apps/ovnkube-control-plane-65c6f55656   3         3         3       114m
    
    NAME                                     ENDPOINTS                                               AGE
    endpoints/ovn-kubernetes-control-plane   10.0.0.3:9108,10.0.0.4:9108,10.0.0.5:9108               114m
    endpoints/ovn-kubernetes-node            10.0.0.3:9105,10.0.0.4:9105,10.0.0.5:9105 + 9 more...   114m
    
    NAME                                 DATA   AGE
    configmap/control-plane-status       1      113m
    configmap/kube-root-ca.crt           1      114m
    configmap/openshift-service-ca.crt   1      114m
    configmap/ovn-ca                     1      114m
    configmap/ovnkube-config             1      114m
    configmap/signer-ca                  1      114m
    Copy to Clipboard Toggle word wrap

    集群中的每个节点都有一个 ovnkube-node pod。ovnkube-config 配置映射具有 OpenShift Container Platform OVN-Kubernetes 配置。

  2. 运行以下命令,列出 ovnkube-node pod 中的所有容器:

    $ oc get pods ovnkube-node-bcvts -o jsonpath='{.spec.containers[*].name}' -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap

    预期输出

    ovn-controller ovn-acl-logging kube-rbac-proxy-node kube-rbac-proxy-ovn-metrics northd nbdb sbdb ovnkube-controller
    Copy to Clipboard Toggle word wrap

    ovnkube-node pod 由几个容器组成。它负责托管北向数据库(nbdb 容器)、南向数据库(sbdb 容器)、北守护进程 (northd 容器)、ovn-controllerovnkube-controller 容器。ovnkube-controller 容器会监视 API 对象,如 pod、egress IP、命名空间、服务、端点、出口防火墙和网络策略。它还负责为该节点从可用子网池中分配 pod IP。

  3. 运行以下命令,列出 ovnkube-control-plane pod 中的所有容器:

    $ oc get pods ovnkube-control-plane-65c6f55656-6d55h -o jsonpath='{.spec.containers[*].name}' -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap

    预期输出

    kube-rbac-proxy ovnkube-cluster-manager
    Copy to Clipboard Toggle word wrap

    ovnkube-control-plane pod 有一个容器(ovnkube-cluster-manager),它驻留在每个 OpenShift Container Platform 节点上。ovnkube-cluster-manager 容器分配 pod 子网,将子网 IP 传输交换机到集群中的每个节点。kube-rbac-proxy 容器监控 ovnkube-cluster-manager 容器的指标。

2.3. 列出 OVN-Kubernetes 北向数据库内容

每个节点都由该节点上 ovnkube-node pod 中运行的 ovnkube-controller 容器控制。若要了解 OVN 逻辑网络实体,您需要检查作为容器在该节点上的 ovnkube-node pod 中运行的北向数据库,以查看您要查看的节点中的对象。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift CLI(oc)。
流程

要在集群中运行 ovn nbctlsbctl 命令,您必须在相关节点上的 nbdbsbdb 容器中打开远程 shell

  1. 运行以下命令列出 pod:

    $ oc get po -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                     READY   STATUS    RESTARTS      AGE
    ovnkube-control-plane-8444dff7f9-4lh9k   2/2     Running   0             27m
    ovnkube-control-plane-8444dff7f9-5rjh9   2/2     Running   0             27m
    ovnkube-node-55xs2                       8/8     Running   0             26m
    ovnkube-node-7r84r                       8/8     Running   0             16m
    ovnkube-node-bqq8p                       8/8     Running   0             17m
    ovnkube-node-mkj4f                       8/8     Running   0             26m
    ovnkube-node-mlr8k                       8/8     Running   0             26m
    ovnkube-node-wqn2m                       8/8     Running   0             16m
    Copy to Clipboard Toggle word wrap

  2. 可选: 要使用节点信息列出 pod,请运行以下命令:

    $ oc get pods -n openshift-ovn-kubernetes -owide
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                     READY   STATUS    RESTARTS      AGE   IP           NODE                                       NOMINATED NODE   READINESS GATES
    ovnkube-control-plane-8444dff7f9-4lh9k   2/2     Running   0             27m   10.0.0.3     ci-ln-t487nnb-72292-mdcnq-master-1         <none>           <none>
    ovnkube-control-plane-8444dff7f9-5rjh9   2/2     Running   0             27m   10.0.0.4     ci-ln-t487nnb-72292-mdcnq-master-2         <none>           <none>
    ovnkube-node-55xs2                       8/8     Running   0             26m   10.0.0.4     ci-ln-t487nnb-72292-mdcnq-master-2         <none>           <none>
    ovnkube-node-7r84r                       8/8     Running   0             17m   10.0.128.3   ci-ln-t487nnb-72292-mdcnq-worker-b-wbz7z   <none>           <none>
    ovnkube-node-bqq8p                       8/8     Running   0             17m   10.0.128.2   ci-ln-t487nnb-72292-mdcnq-worker-a-lh7ms   <none>           <none>
    ovnkube-node-mkj4f                       8/8     Running   0             27m   10.0.0.5     ci-ln-t487nnb-72292-mdcnq-master-0         <none>           <none>
    ovnkube-node-mlr8k                       8/8     Running   0             27m   10.0.0.3     ci-ln-t487nnb-72292-mdcnq-master-1         <none>           <none>
    ovnkube-node-wqn2m                       8/8     Running   0             17m   10.0.128.4   ci-ln-t487nnb-72292-mdcnq-worker-c-przlm   <none>           <none>
    Copy to Clipboard Toggle word wrap

  3. 运行以下命令,进入 pod 以查看北向数据库:

    $ oc rsh -c nbdb -n openshift-ovn-kubernetes ovnkube-node-55xs2
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令以显示北向数据库中的所有对象:

    $ ovn-nbctl show
    Copy to Clipboard Toggle word wrap

    此处列出输出太长。列表中包含 NAT 规则、逻辑交换机、负载均衡器等。

    您可以使用以下可选命令缩小并专注于特定组件:

    1. 运行以下命令以显示逻辑路由器列表:

      $ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \
      -c northd -- ovn-nbctl lr-list
      Copy to Clipboard Toggle word wrap

      输出示例

      45339f4f-7d0b-41d0-b5f9-9fca9ce40ce6 (GR_ci-ln-t487nnb-72292-mdcnq-master-2)
      96a0a0f0-e7ed-4fec-8393-3195563de1b8 (ovn_cluster_router)
      Copy to Clipboard Toggle word wrap

      注意

      在这个输出中,您可以看到每个节点中存在路由器,再加上 ovn_cluster_router

    2. 运行以下命令以显示逻辑交换机列表:

      $ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \
      -c nbdb -- ovn-nbctl ls-list
      Copy to Clipboard Toggle word wrap

      输出示例

      bdd7dc3d-d848-4a74-b293-cc15128ea614 (ci-ln-t487nnb-72292-mdcnq-master-2)
      b349292d-ee03-4914-935f-1940b6cb91e5 (ext_ci-ln-t487nnb-72292-mdcnq-master-2)
      0aac0754-ea32-4e33-b086-35eeabf0a140 (join)
      992509d7-2c3f-4432-88db-c179e43592e5 (transit_switch)
      Copy to Clipboard Toggle word wrap

      注意

      在这个输出中,您可以看到每个节点的 ext 交换机以及节点名称本身和 join 开关。

    3. 运行以下命令以显示负载均衡器列表:

      $ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \
      -c nbdb -- ovn-nbctl lb-list
      Copy to Clipboard Toggle word wrap

      输出示例

      UUID                                    LB                  PROTO      VIP                     IPs
      7c84c673-ed2a-4436-9a1f-9bc5dd181eea    Service_default/    tcp        172.30.0.1:443          10.0.0.3:6443,169.254.169.2:6443,10.0.0.5:6443
      4d663fd9-ddc8-4271-b333-4c0e279e20bb    Service_default/    tcp        172.30.0.1:443          10.0.0.3:6443,10.0.0.4:6443,10.0.0.5:6443
      292eb07f-b82f-4962-868a-4f541d250bca    Service_openshif    tcp        172.30.105.247:443      10.129.0.12:8443
      034b5a7f-bb6a-45e9-8e6d-573a82dc5ee3    Service_openshif    tcp        172.30.192.38:443       10.0.0.3:10259,10.0.0.4:10259,10.0.0.5:10259
      a68bb53e-be84-48df-bd38-bdd82fcd4026    Service_openshif    tcp        172.30.161.125:8443     10.129.0.32:8443
      6cc21b3d-2c54-4c94-8ff5-d8e017269c2e    Service_openshif    tcp        172.30.3.144:443        10.129.0.22:8443
      37996ffd-7268-4862-a27f-61cd62e09c32    Service_openshif    tcp        172.30.181.107:443      10.129.0.18:8443
      81d4da3c-f811-411f-ae0c-bc6713d0861d    Service_openshif    tcp        172.30.228.23:443       10.129.0.29:8443
      ac5a4f3b-b6ba-4ceb-82d0-d84f2c41306e    Service_openshif    tcp        172.30.14.240:9443      10.129.0.36:9443
      c88979fb-1ef5-414b-90ac-43b579351ac9    Service_openshif    tcp        172.30.231.192:9001     10.128.0.5:9001,10.128.2.5:9001,10.129.0.5:9001,10.129.2.4:9001,10.130.0.3:9001,10.131.0.3:9001
      fcb0a3fb-4a77-4230-a84a-be45dce757e8    Service_openshif    tcp        172.30.189.92:443       10.130.0.17:8440
      67ef3e7b-ceb9-4bf0-8d96-b43bde4c9151    Service_openshif    tcp        172.30.67.218:443       10.129.0.9:8443
      d0032fba-7d5e-424a-af25-4ab9b5d46e81    Service_openshif    tcp        172.30.102.137:2379     10.0.0.3:2379,10.0.0.4:2379,10.0.0.5:2379
                                                                  tcp        172.30.102.137:9979     10.0.0.3:9979,10.0.0.4:9979,10.0.0.5:9979
      7361c537-3eec-4e6c-bc0c-0522d182abd4    Service_openshif    tcp        172.30.198.215:9001     10.0.0.3:9001,10.0.0.4:9001,10.0.0.5:9001,10.0.128.2:9001,10.0.128.3:9001,10.0.128.4:9001
      0296c437-1259-410b-a6fd-81c310ad0af5    Service_openshif    tcp        172.30.198.215:9001     10.0.0.3:9001,169.254.169.2:9001,10.0.0.5:9001,10.0.128.2:9001,10.0.128.3:9001,10.0.128.4:9001
      5d5679f5-45b8-479d-9f7c-08b123c688b8    Service_openshif    tcp        172.30.38.253:17698     10.128.0.52:17698,10.129.0.84:17698,10.130.0.60:17698
      2adcbab4-d1c9-447d-9573-b5dc9f2efbfa    Service_openshif    tcp        172.30.148.52:443       10.0.0.4:9202,10.0.0.5:9202
                                                                  tcp        172.30.148.52:444       10.0.0.4:9203,10.0.0.5:9203
                                                                  tcp        172.30.148.52:445       10.0.0.4:9204,10.0.0.5:9204
                                                                  tcp        172.30.148.52:446       10.0.0.4:9205,10.0.0.5:9205
      2a33a6d7-af1b-4892-87cc-326a380b809b    Service_openshif    tcp        172.30.67.219:9091      10.129.2.16:9091,10.131.0.16:9091
                                                                  tcp        172.30.67.219:9092      10.129.2.16:9092,10.131.0.16:9092
                                                                  tcp        172.30.67.219:9093      10.129.2.16:9093,10.131.0.16:9093
                                                                  tcp        172.30.67.219:9094      10.129.2.16:9094,10.131.0.16:9094
      f56f59d7-231a-4974-99b3-792e2741ec8d    Service_openshif    tcp        172.30.89.212:443       10.128.0.41:8443,10.129.0.68:8443,10.130.0.44:8443
      08c2c6d7-d217-4b96-b5d8-c80c4e258116    Service_openshif    tcp        172.30.102.137:2379     10.0.0.3:2379,169.254.169.2:2379,10.0.0.5:2379
                                                                  tcp        172.30.102.137:9979     10.0.0.3:9979,169.254.169.2:9979,10.0.0.5:9979
      60a69c56-fc6a-4de6-bd88-3f2af5ba5665    Service_openshif    tcp        172.30.10.193:443       10.129.0.25:8443
      ab1ef694-0826-4671-a22c-565fc2d282ec    Service_openshif    tcp        172.30.196.123:443      10.128.0.33:8443,10.129.0.64:8443,10.130.0.37:8443
      b1fb34d3-0944-4770-9ee3-2683e7a630e2    Service_openshif    tcp        172.30.158.93:8443      10.129.0.13:8443
      95811c11-56e2-4877-be1e-c78ccb3a82a9    Service_openshif    tcp        172.30.46.85:9001       10.130.0.16:9001
      4baba1d1-b873-4535-884c-3f6fc07a50fd    Service_openshif    tcp        172.30.28.87:443        10.129.0.26:8443
      6c2e1c90-f0ca-484e-8a8e-40e71442110a    Service_openshif    udp        172.30.0.10:53          10.128.0.13:5353,10.128.2.6:5353,10.129.0.39:5353,10.129.2.6:5353,10.130.0.11:5353,10.131.0.9:5353
      Copy to Clipboard Toggle word wrap

      注意

      在这个截断的输出中,您可以看到有许多 OVN-Kubernetes 负载均衡器。OVN-Kubernetes 中的负载均衡器是服务的表示。

  5. 运行以下命令,以显示可用于命令 ovn-nbctl 的选项:

    $ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \
    -c nbdb ovn-nbctl --help
    Copy to Clipboard Toggle word wrap

下表描述了可与 ovn-nbctl 一起使用的命令行参数,以检查北向数据库的内容。

注意

在您要查看内容的 pod 中打开一个远程 shell,然后运行 ovn-nbctl 命令。

Expand
表 2.1. 检查北向数据库内容的命令行参数
参数描述

ovn-nbctl show

从特定节点看到的北向数据库内容概述。

ovn-nbctl show <switch_or_router>

显示与指定交换机或路由器关联的详细信息。

ovn-nbctl lr-list

显示逻辑路由器。

ovn-nbctl lrp-list <router>

使用 ovn-nbctl lr-list 中的路由器信息来显示路由器端口。

ovn-nbctl lr-nat-list <router>

显示指定路由器的网络地址转换详情。

ovn-nbctl ls-list

显示逻辑交换机

ovn-nbctl lsp-list <switch>

使用 ovn-nbctl ls-list 的交换机信息来显示交换机端口。

ovn-nbctl lsp-get-type <port>

获取逻辑端口的类型。

ovn-nbctl lb-list

显示负载平衡器。

2.5. 列出 OVN-Kubernetes 南向数据库内容

每个节点都由该节点上 ovnkube-node pod 中运行的 ovnkube-controller 容器控制。若要了解 OVN 逻辑网络实体,您需要检查作为容器在该节点上的 ovnkube-node pod 中运行的北向数据库,以查看您要查看的节点中的对象。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift CLI(oc)。
流程

要在集群中运行 ovn nbctlsbctl 命令,您必须在相关节点上的 nbdbsbdb 容器中打开远程 shell

  1. 运行以下命令列出 pod:

    $ oc get po -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                     READY   STATUS    RESTARTS      AGE
    ovnkube-control-plane-8444dff7f9-4lh9k   2/2     Running   0             27m
    ovnkube-control-plane-8444dff7f9-5rjh9   2/2     Running   0             27m
    ovnkube-node-55xs2                       8/8     Running   0             26m
    ovnkube-node-7r84r                       8/8     Running   0             16m
    ovnkube-node-bqq8p                       8/8     Running   0             17m
    ovnkube-node-mkj4f                       8/8     Running   0             26m
    ovnkube-node-mlr8k                       8/8     Running   0             26m
    ovnkube-node-wqn2m                       8/8     Running   0             16m
    Copy to Clipboard Toggle word wrap

  2. 可选: 要使用节点信息列出 pod,请运行以下命令:

    $ oc get pods -n openshift-ovn-kubernetes -owide
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                     READY   STATUS    RESTARTS      AGE   IP           NODE                                       NOMINATED NODE   READINESS GATES
    ovnkube-control-plane-8444dff7f9-4lh9k   2/2     Running   0             27m   10.0.0.3     ci-ln-t487nnb-72292-mdcnq-master-1         <none>           <none>
    ovnkube-control-plane-8444dff7f9-5rjh9   2/2     Running   0             27m   10.0.0.4     ci-ln-t487nnb-72292-mdcnq-master-2         <none>           <none>
    ovnkube-node-55xs2                       8/8     Running   0             26m   10.0.0.4     ci-ln-t487nnb-72292-mdcnq-master-2         <none>           <none>
    ovnkube-node-7r84r                       8/8     Running   0             17m   10.0.128.3   ci-ln-t487nnb-72292-mdcnq-worker-b-wbz7z   <none>           <none>
    ovnkube-node-bqq8p                       8/8     Running   0             17m   10.0.128.2   ci-ln-t487nnb-72292-mdcnq-worker-a-lh7ms   <none>           <none>
    ovnkube-node-mkj4f                       8/8     Running   0             27m   10.0.0.5     ci-ln-t487nnb-72292-mdcnq-master-0         <none>           <none>
    ovnkube-node-mlr8k                       8/8     Running   0             27m   10.0.0.3     ci-ln-t487nnb-72292-mdcnq-master-1         <none>           <none>
    ovnkube-node-wqn2m                       8/8     Running   0             17m   10.0.128.4   ci-ln-t487nnb-72292-mdcnq-worker-c-przlm   <none>           <none>
    Copy to Clipboard Toggle word wrap

  3. 进入 pod 以查看南向数据库:

    $ oc rsh -c sbdb -n openshift-ovn-kubernetes ovnkube-node-55xs2
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令以显示南向数据库中的所有对象:

    $ ovn-sbctl show
    Copy to Clipboard Toggle word wrap

    输出示例

    Chassis "5db31703-35e9-413b-8cdf-69e7eecb41f7"
        hostname: ci-ln-9gp362t-72292-v2p94-worker-a-8bmwz
        Encap geneve
            ip: "10.0.128.4"
            options: {csum="true"}
        Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-worker-a-8bmwz
    Chassis "070debed-99b7-4bce-b17d-17e720b7f8bc"
        hostname: ci-ln-9gp362t-72292-v2p94-worker-b-svmp6
        Encap geneve
            ip: "10.0.128.2"
            options: {csum="true"}
        Port_Binding k8s-ci-ln-9gp362t-72292-v2p94-worker-b-svmp6
        Port_Binding rtoe-GR_ci-ln-9gp362t-72292-v2p94-worker-b-svmp6
        Port_Binding openshift-monitoring_alertmanager-main-1
        Port_Binding rtoj-GR_ci-ln-9gp362t-72292-v2p94-worker-b-svmp6
        Port_Binding etor-GR_ci-ln-9gp362t-72292-v2p94-worker-b-svmp6
        Port_Binding cr-rtos-ci-ln-9gp362t-72292-v2p94-worker-b-svmp6
        Port_Binding openshift-e2e-loki_loki-promtail-qcrcz
        Port_Binding jtor-GR_ci-ln-9gp362t-72292-v2p94-worker-b-svmp6
        Port_Binding openshift-multus_network-metrics-daemon-mkd4t
        Port_Binding openshift-ingress-canary_ingress-canary-xtvj4
        Port_Binding openshift-ingress_router-default-6c76cbc498-pvlqk
        Port_Binding openshift-dns_dns-default-zz582
        Port_Binding openshift-monitoring_thanos-querier-57585899f5-lbf4f
        Port_Binding openshift-network-diagnostics_network-check-target-tn228
        Port_Binding openshift-monitoring_prometheus-k8s-0
        Port_Binding openshift-image-registry_image-registry-68899bd877-xqxjj
    Chassis "179ba069-0af1-401c-b044-e5ba90f60fea"
        hostname: ci-ln-9gp362t-72292-v2p94-master-0
        Encap geneve
            ip: "10.0.0.5"
            options: {csum="true"}
        Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-master-0
    Chassis "68c954f2-5a76-47be-9e84-1cb13bd9dab9"
        hostname: ci-ln-9gp362t-72292-v2p94-worker-c-mjf9w
        Encap geneve
            ip: "10.0.128.3"
            options: {csum="true"}
        Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-worker-c-mjf9w
    Chassis "2de65d9e-9abf-4b6e-a51d-a1e038b4d8af"
        hostname: ci-ln-9gp362t-72292-v2p94-master-2
        Encap geneve
            ip: "10.0.0.4"
            options: {csum="true"}
        Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-master-2
    Chassis "1d371cb8-5e21-44fd-9025-c4b162cc4247"
        hostname: ci-ln-9gp362t-72292-v2p94-master-1
        Encap geneve
            ip: "10.0.0.3"
            options: {csum="true"}
        Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-master-1
    Copy to Clipboard Toggle word wrap

    此详细输出显示了附加到机箱的机箱和端口,本例中为所有路由器端口以及像主机网络一样运行的任何内容。任何 pod 使用源网络地址转换(SNAT)与更广泛的网络通信。其 IP 地址转换为运行 Pod 的节点的 IP 地址,然后发送到网络。

    除了机箱信息外,南向数据库还具有所有逻辑流,这些逻辑流随后发送到每个节点上运行的 ovn-controllerovn-controller 将逻辑流转换为开放流规则,最终程序 OpenvSwitch 以便您的 pod 可以遵循开放流规则,并使其从网络移出。

  5. 运行以下命令以 ovn-sbctl 命令显示可用的选项:

    $ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \
    -c sbdb ovn-sbctl --help
    Copy to Clipboard Toggle word wrap

下表描述了可用于 ovn-sbctl 的命令行参数,以检查南向数据库的内容。

注意

在您要查看内容的 pod 中打开一个远程 shell,然后运行 ovn-sbctl 命令。

Expand
表 2.2. 检查南向数据库内容的命令行参数
参数描述

ovn-sbctl show

从特定节点看到的南向数据库内容概述。

ovn-sbctl list Port_Binding <port>

列出特定端口的南向数据库的内容。

ovn-sbctl dump-flows

列出逻辑流。

2.7. OVN-Kubernetes 逻辑架构

OVN 是网络虚拟化解决方案。它创建逻辑交换机和路由器。这些交换机和路由器是互连的,以创建任何网络拓扑。当您运行 ovnkube-trace 时,日志级别设置为 2 或 5 时,OVN-Kubernetes 逻辑组件会被公开。下图显示了如何在 OpenShift Container Platform 中连接路由器和交换机。

图 2.2. OVN-Kubernetes 路由器和交换机组件

涉及数据包处理的关键组件有:

网关路由器
网关路由器有时称为 L3 网关路由器,通常在分布式路由器和物理网络之间使用。网关路由器(包括其逻辑补丁端口)绑定到物理位置(而非分布式)或机箱。此路由器上的跳接端口称为 ovn-southbound 数据库(ovn-sbdb)中的 l3gateway 端口。
分布式逻辑路由器
分布式逻辑路由器和其后面的逻辑交换机(虚拟机和容器附加)有效驻留在每个虚拟机监控程序上。
加入本地交换机
加入本地交换机用于连接分布式路由器和网关路由器。它可减少分布式路由器中所需的 IP 地址数量。
使用跳接端口的逻辑交换机
带有补丁端口的逻辑交换机用于虚拟化网络堆栈。它们通过隧道连接远程逻辑端口。
使用 localnet 端口的逻辑交换机
使用 localnet 端口的逻辑交换机用于将 OVN 连接到物理网络。它们通过将数据包桥接到使用 localnet 端口直接连接的物理 L2 片段来连接远程逻辑端口。
补丁端口
跳接端口代表逻辑交换机和逻辑路由器之间以及对等逻辑路由器之间的连接。单个连接在每个此类连接点上都有一对跳接端口。
l3gateway 端口
l3gateway 端口是 ovn-sbdb 中用于网关路由器中使用的逻辑补丁端口的端口绑定条目。它们称为 l3gateway 端口,而不是跳接端口,而只是这些端口绑定到机箱,就像网关路由器本身一样。
localnet 端口
桥接逻辑交换机上存在 localnet 端口,允许从每个 ovn-controller 实例连接到本地可访问的网络。这有助于从逻辑交换机对物理网络的直接连接建模。逻辑交换机只能附加一个 localnet 端口。

2.7.1. 在本地主机上安装 network-tools

在本地主机上安装 network-tools,以提供一组工具来调试 OpenShift Container Platform 集群网络问题。

流程

  1. 使用以下命令将 network-tools 存储库克隆到工作站:

    $ git clone git@github.com:openshift/network-tools.git
    Copy to Clipboard Toggle word wrap
  2. 更改到您刚才克隆的存储库的目录:

    $ cd network-tools
    Copy to Clipboard Toggle word wrap
  3. 可选:列出所有可用的命令:

    $ ./debug-scripts/network-tools -h
    Copy to Clipboard Toggle word wrap

2.7.2. 运行 network-tools

通过运行 network-tools 来获取逻辑交换机和路由器的信息。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 权限的用户身份登录集群。
  • 您已在本地主机上安装了 network-tools

流程

  1. 运行以下命令列出路由器:

    $ ./debug-scripts/network-tools ovn-db-run-command ovn-nbctl lr-list
    Copy to Clipboard Toggle word wrap

    输出示例

    944a7b53-7948-4ad2-a494-82b55eeccf87 (GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99)
    84bd4a4c-4b0b-4a47-b0cf-a2c32709fc53 (ovn_cluster_router)
    Copy to Clipboard Toggle word wrap

  2. 运行以下命令列出 localnet 端口:

    $ ./debug-scripts/network-tools ovn-db-run-command \
    ovn-sbctl find Port_Binding type=localnet
    Copy to Clipboard Toggle word wrap

    输出示例

    _uuid               : d05298f5-805b-4838-9224-1211afc2f199
    additional_chassis  : []
    additional_encap    : []
    chassis             : []
    datapath            : f3c2c959-743b-4037-854d-26627902597c
    encap               : []
    external_ids        : {}
    gateway_chassis     : []
    ha_chassis_group    : []
    logical_port        : br-ex_ci-ln-54932yb-72292-kd676-worker-c-rzj99
    mac                 : [unknown]
    mirror_rules        : []
    nat_addresses       : []
    options             : {network_name=physnet}
    parent_port         : []
    port_security       : []
    requested_additional_chassis: []
    requested_chassis   : []
    tag                 : []
    tunnel_key          : 2
    type                : localnet
    up                  : false
    virtual_parent      : []
    
    [...]
    Copy to Clipboard Toggle word wrap

  3. 运行以下命令列出 l3gateway 端口:

    $ ./debug-scripts/network-tools ovn-db-run-command \
    ovn-sbctl find Port_Binding type=l3gateway
    Copy to Clipboard Toggle word wrap

    输出示例

    _uuid               : 5207a1f3-1cf3-42f1-83e9-387bbb06b03c
    additional_chassis  : []
    additional_encap    : []
    chassis             : ca6eb600-3a10-4372-a83e-e0d957c4cd92
    datapath            : f3c2c959-743b-4037-854d-26627902597c
    encap               : []
    external_ids        : {}
    gateway_chassis     : []
    ha_chassis_group    : []
    logical_port        : etor-GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99
    mac                 : ["42:01:0a:00:80:04"]
    mirror_rules        : []
    nat_addresses       : ["42:01:0a:00:80:04 10.0.128.4"]
    options             : {l3gateway-chassis="84737c36-b383-4c83-92c5-2bd5b3c7e772", peer=rtoe-GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99}
    parent_port         : []
    port_security       : []
    requested_additional_chassis: []
    requested_chassis   : []
    tag                 : []
    tunnel_key          : 1
    type                : l3gateway
    up                  : true
    virtual_parent      : []
    
    _uuid               : 6088d647-84f2-43f2-b53f-c9d379042679
    additional_chassis  : []
    additional_encap    : []
    chassis             : ca6eb600-3a10-4372-a83e-e0d957c4cd92
    datapath            : dc9cea00-d94a-41b8-bdb0-89d42d13aa2e
    encap               : []
    external_ids        : {}
    gateway_chassis     : []
    ha_chassis_group    : []
    logical_port        : jtor-GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99
    mac                 : [router]
    mirror_rules        : []
    nat_addresses       : []
    options             : {l3gateway-chassis="84737c36-b383-4c83-92c5-2bd5b3c7e772", peer=rtoj-GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99}
    parent_port         : []
    port_security       : []
    requested_additional_chassis: []
    requested_chassis   : []
    tag                 : []
    tunnel_key          : 2
    type                : l3gateway
    up                  : true
    virtual_parent      : []
    
    [...]
    Copy to Clipboard Toggle word wrap

  4. 运行以下命令列出跳接端口:

    $ ./debug-scripts/network-tools ovn-db-run-command \
    ovn-sbctl find Port_Binding type=patch
    Copy to Clipboard Toggle word wrap

    输出示例

    _uuid               : 785fb8b6-ee5a-4792-a415-5b1cb855dac2
    additional_chassis  : []
    additional_encap    : []
    chassis             : []
    datapath            : f1ddd1cc-dc0d-43b4-90ca-12651305acec
    encap               : []
    external_ids        : {}
    gateway_chassis     : []
    ha_chassis_group    : []
    logical_port        : stor-ci-ln-54932yb-72292-kd676-worker-c-rzj99
    mac                 : [router]
    mirror_rules        : []
    nat_addresses       : ["0a:58:0a:80:02:01 10.128.2.1 is_chassis_resident(\"cr-rtos-ci-ln-54932yb-72292-kd676-worker-c-rzj99\")"]
    options             : {peer=rtos-ci-ln-54932yb-72292-kd676-worker-c-rzj99}
    parent_port         : []
    port_security       : []
    requested_additional_chassis: []
    requested_chassis   : []
    tag                 : []
    tunnel_key          : 1
    type                : patch
    up                  : false
    virtual_parent      : []
    
    _uuid               : c01ff587-21a5-40b4-8244-4cd0425e5d9a
    additional_chassis  : []
    additional_encap    : []
    chassis             : []
    datapath            : f6795586-bf92-4f84-9222-efe4ac6a7734
    encap               : []
    external_ids        : {}
    gateway_chassis     : []
    ha_chassis_group    : []
    logical_port        : rtoj-ovn_cluster_router
    mac                 : ["0a:58:64:40:00:01 100.64.0.1/16"]
    mirror_rules        : []
    nat_addresses       : []
    options             : {peer=jtor-ovn_cluster_router}
    parent_port         : []
    port_security       : []
    requested_additional_chassis: []
    requested_chassis   : []
    tag                 : []
    tunnel_key          : 1
    type                : patch
    up                  : false
    virtual_parent      : []
    [...]
    Copy to Clipboard Toggle word wrap

第 3 章 OVN-Kubernetes 故障排除

OVN-Kubernetes 具有许多内置健康检查和日志来源。按照这些部分中的说明检查集群。如果需要一个支持问题单,请参阅 支持指南来通过 must-gather 收集其他信息。仅在支持团队要求这样做时,才使用 -- gather_network_logs

ovnkube-control-planeovnkube-node pod 配置有就绪度探测的容器。

先决条件

  • 访问 OpenShift CLI(oc)。
  • 您可以使用 cluster-admin 权限访问集群。
  • 您已安装了 jq

流程

  1. 运行以下命令,查看 ovnkube-node 就绪度探测的详情:

    $ oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node \
    -o json | jq '.items[0].spec.containers[] | .name,.readinessProbe'
    Copy to Clipboard Toggle word wrap

    ovnkube-node pod 中的北向和南向数据库容器的就绪度探测会检查数据库和 ovnkube-controller 容器的健康状态。

    ovnkube-node pod 中的 ovnkube-controller 容器有一个就绪度探测来验证 OVN-Kubernetes CNI 配置文件是否存在,这代表 pod 没有运行,或者没有准备好接受配置 pod 的请求。

  2. 使用以下命令,显示命名空间的所有事件,包括探测失败:

    $ oc get events -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap
  3. 仅显示特定 pod 的事件:

    $ oc describe pod ovnkube-node-9lqfk -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap
  4. 显示集群网络 Operator 的消息和状态:

    $ oc get co/network -o json | jq '.status.conditions[]'
    Copy to Clipboard Toggle word wrap
  5. 运行以下脚本,显示 ovnkube-node pod 中每个容器的 就绪状态

    $ for p in $(oc get pods --selector app=ovnkube-node -n openshift-ovn-kubernetes \
    -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); do echo === $p ===;  \
    oc get pods -n openshift-ovn-kubernetes $p -o json | jq '.status.containerStatuses[] | .name, .ready'; \
    done
    Copy to Clipboard Toggle word wrap
    注意

    预期的是所有容器状态都报告为 true。就绪度探测失败,将状态设置为 false

3.2. 在控制台中查看 OVN-Kubernetes 警报

Alerting UI 提供有关警报及其相关警报规则和静默的详细信息。

先决条件

  • 对于您要查看指标的项目,您可以作为开发者或具有查看权限的用户访问集群。

流程 (UI)

  1. Administrator 视角中,选择 ObserveAlerting。在此视角中,Alerting UI 有三个主要页面,即 AlertsSilencesAlerting Rules 页面。
  2. 选择 ObserveAlertingAlerting Rules 来查看 OVN-Kubernetes 警报的规则。

3.3. 在 CLI 中查看 OVN-Kubernetes 警报

您可以从命令行获取有关警报及其监管警报规则和静默的信息。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 OpenShift CLI(oc)。
  • 您已安装了 jq

流程

  1. 运行以下命令,查看活动或触发警报:

    1. 运行以下命令设置警报管理器路由环境变量:

      $ ALERT_MANAGER=$(oc get route alertmanager-main -n openshift-monitoring \
      -o jsonpath='{@.spec.host}')
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,将 $ALERT_MANAGER 替换为 Alertmanager 实例的 URL,向警报管理器路由 API 发出 curl 请求:

      $ curl -s -k -H "Authorization: Bearer $(oc create token prometheus-k8s -n openshift-monitoring)" https://$ALERT_MANAGER/api/v1/alerts | jq '.data[] | "\(.labels.severity) \(.labels.alertname) \(.labels.pod) \(.labels.container) \(.labels.endpoint) \(.labels.instance)"'
      Copy to Clipboard Toggle word wrap
  2. 运行以下命令来查看警报规则:

    $ oc -n openshift-monitoring exec -c prometheus prometheus-k8s-0 -- curl -s 'http://localhost:9090/api/v1/rules' | jq '.data.groups[].rules[] | select(((.name|contains("ovn")) or (.name|contains("OVN")) or (.name|contains("Ovn")) or (.name|contains("North")) or (.name|contains("South"))) and .type=="alerting")'
    Copy to Clipboard Toggle word wrap

3.4. 使用 CLI 查看 OVN-Kubernetes 日志

您可以使用 OpenShift CLI (oc)查看 ovnkube-masterovnkube-node pod 中每个 pod 的日志。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 访问 OpenShift CLI(oc)。
  • 您已安装了 jq

流程

  1. 查看特定 pod 的日志:

    $ oc logs -f <pod_name> -c <container_name> -n <namespace>
    Copy to Clipboard Toggle word wrap

    其中:

    -f
    可选:指定输出是否遵循要写到日志中的内容。
    <pod_name>
    指定 pod 的名称。
    <container_name>
    可选:指定容器的名称。当 pod 具有多个容器时,您必须指定容器名称。
    <namespace>
    指定 pod 运行的命名空间。

    例如:

    $ oc logs ovnkube-node-5dx44 -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap
    $ oc logs -f ovnkube-node-5dx44 -c ovnkube-controller -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap

    输出的日志文件内容。

  2. 检查 ovnkube-node pod 中所有容器的最新条目:

    $ for p in $(oc get pods --selector app=ovnkube-node -n openshift-ovn-kubernetes \
    -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); \
    do echo === $p ===; for container in $(oc get pods -n openshift-ovn-kubernetes $p \
    -o json | jq -r '.status.containerStatuses[] | .name');do echo ---$container---; \
    oc logs -c $container $p -n openshift-ovn-kubernetes --tail=5; done; done
    Copy to Clipboard Toggle word wrap
  3. 使用以下命令,查看 ovnkube-node pod 中每个容器的最后 5 行:

    $ oc logs -l app=ovnkube-node -n openshift-ovn-kubernetes --all-containers --tail 5
    Copy to Clipboard Toggle word wrap

3.5. 使用 Web 控制台查看 OVN-Kubernetes 日志

您可以在 web 控制台中查看 ovnkube-masterovnkube-node pod 中每个 pod 的日志。

先决条件

  • 访问 OpenShift CLI(oc)。

流程

  1. 在 OpenShift Container Platform 控制台中,导航到 WorkloadsPods,或通过您要调查的资源导航到 pod。
  2. 从下拉菜单中选择 openshift-ovn-kubernetes 项目。
  3. 点您要调查的 pod 的名称。
  4. Logs。默认情况下,ovnkube-master 显示与 northd 容器关联的日志。
  5. 使用向下下拉菜单选择每个容器的日志。

3.5.1. 更改 OVN-Kubernetes 日志级别

OVN-Kubernetes 的默认日志级别为 4。要调试 OVN-Kubernetes,请将日志级别设置为 5。按照以下步骤增加 OVN-Kubernetes 的日志级别,以帮助您调试问题。

先决条件

  • 您可以使用 cluster-admin 权限访问集群。
  • 访问 OpenShift Container Platform web 控制台。

流程

  1. 运行以下命令,以获取 OVN-Kubernetes 项目中所有 pod 的详细信息:

    $ oc get po -o wide -n openshift-ovn-kubernetes
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                     READY   STATUS    RESTARTS       AGE    IP           NODE                                       NOMINATED NODE   READINESS GATES
    ovnkube-control-plane-65497d4548-9ptdr   2/2     Running   2 (128m ago)   147m   10.0.0.3     ci-ln-3njdr9b-72292-5nwkp-master-0         <none>           <none>
    ovnkube-control-plane-65497d4548-j6zfk   2/2     Running   0              147m   10.0.0.5     ci-ln-3njdr9b-72292-5nwkp-master-2         <none>           <none>
    ovnkube-node-5dx44                       8/8     Running   0              146m   10.0.0.3     ci-ln-3njdr9b-72292-5nwkp-master-0         <none>           <none>
    ovnkube-node-dpfn4                       8/8     Running   0              146m   10.0.0.4     ci-ln-3njdr9b-72292-5nwkp-master-1         <none>           <none>
    ovnkube-node-kwc9l                       8/8     Running   0              134m   10.0.128.2   ci-ln-3njdr9b-72292-5nwkp-worker-a-2fjcj   <none>           <none>
    ovnkube-node-mcrhl                       8/8     Running   0              134m   10.0.128.4   ci-ln-3njdr9b-72292-5nwkp-worker-c-v9x5v   <none>           <none>
    ovnkube-node-nsct4                       8/8     Running   0              146m   10.0.0.5     ci-ln-3njdr9b-72292-5nwkp-master-2         <none>           <none>
    ovnkube-node-zrj9f                       8/8     Running   0              134m   10.0.128.3   ci-ln-3njdr9b-72292-5nwkp-worker-b-v78h7   <none>           <none>
    Copy to Clipboard Toggle word wrap

  2. 创建类似以下示例的 ConfigMap 文件,并使用文件名,如 env-overrides.yaml

    ConfigMap 文件示例

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: env-overrides
      namespace: openshift-ovn-kubernetes
    data:
      ci-ln-3njdr9b-72292-5nwkp-master-0: | 
    1
    
        # This sets the log level for the ovn-kubernetes node process:
        OVN_KUBE_LOG_LEVEL=5
        # You might also/instead want to enable debug logging for ovn-controller:
        OVN_LOG_LEVEL=dbg
      ci-ln-3njdr9b-72292-5nwkp-master-2: |
        # This sets the log level for the ovn-kubernetes node process:
        OVN_KUBE_LOG_LEVEL=5
        # You might also/instead want to enable debug logging for ovn-controller:
        OVN_LOG_LEVEL=dbg
      _master: | 
    2
    
        # This sets the log level for the ovn-kubernetes master process as well as the ovn-dbchecker:
        OVN_KUBE_LOG_LEVEL=5
        # You might also/instead want to enable debug logging for northd, nbdb and sbdb on all masters:
        OVN_LOG_LEVEL=dbg
    Copy to Clipboard Toggle word wrap

    1
    指定要设置 debug 日志级别的节点名称。
    2
    指定 _master 来设置 ovnkube-master 组件的日志级别。
  3. 使用以下命令应用 ConfigMap 文件:

    $ oc apply -n openshift-ovn-kubernetes -f env-overrides.yaml
    Copy to Clipboard Toggle word wrap

    输出示例

    configmap/env-overrides.yaml created
    Copy to Clipboard Toggle word wrap

  4. 使用以下命令重启 ovnkube pod 以应用新的日志级别:

    $ oc delete pod -n openshift-ovn-kubernetes \
    --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-0 -l app=ovnkube-node
    Copy to Clipboard Toggle word wrap
    $ oc delete pod -n openshift-ovn-kubernetes \
    --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-2 -l app=ovnkube-node
    Copy to Clipboard Toggle word wrap
    $ oc delete pod -n openshift-ovn-kubernetes -l app=ovnkube-node
    Copy to Clipboard Toggle word wrap
  5. 要验证 'ConfigMap'file 是否已应用到特定 pod 的所有节点,请运行以下命令:

    $ oc logs -n openshift-ovn-kubernetes --all-containers --prefix ovnkube-node-<xxxx> | grep -E -m 10 '(Logging config:|vconsole|DBG)'
    Copy to Clipboard Toggle word wrap

    其中:

    <XXXX>

    指定上一步中 pod 的随机字符序列。

    输出示例

    [pod/ovnkube-node-2cpjc/sbdb] + exec /usr/share/ovn/scripts/ovn-ctl --no-monitor '--ovn-sb-log=-vconsole:info -vfile:off -vPATTERN:console:%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m' run_sb_ovsdb
    [pod/ovnkube-node-2cpjc/ovnkube-controller] I1012 14:39:59.984506   35767 config.go:2247] Logging config: {File: CNIFile:/var/log/ovn-kubernetes/ovn-k8s-cni-overlay.log LibovsdbFile:/var/log/ovnkube/libovsdb.log Level:5 LogFileMaxSize:100 LogFileMaxBackups:5 LogFileMaxAge:0 ACLLoggingRateLimit:20}
    [pod/ovnkube-node-2cpjc/northd] + exec ovn-northd --no-chdir -vconsole:info -vfile:off '-vPATTERN:console:%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m' --pidfile /var/run/ovn/ovn-northd.pid --n-threads=1
    [pod/ovnkube-node-2cpjc/nbdb] + exec /usr/share/ovn/scripts/ovn-ctl --no-monitor '--ovn-nb-log=-vconsole:info -vfile:off -vPATTERN:console:%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m' run_nb_ovsdb
    [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.552Z|00002|hmap|DBG|lib/shash.c:114: 1 bucket with 6+ nodes, including 1 bucket with 6 nodes (32 nodes total across 32 buckets)
    [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00003|hmap|DBG|lib/shash.c:114: 1 bucket with 6+ nodes, including 1 bucket with 6 nodes (64 nodes total across 64 buckets)
    [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00004|hmap|DBG|lib/shash.c:114: 1 bucket with 6+ nodes, including 1 bucket with 7 nodes (32 nodes total across 32 buckets)
    [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00005|reconnect|DBG|unix:/var/run/openvswitch/db.sock: entering BACKOFF
    [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00007|reconnect|DBG|unix:/var/run/openvswitch/db.sock: entering CONNECTING
    [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00008|ovsdb_cs|DBG|unix:/var/run/openvswitch/db.sock: SERVER_SCHEMA_REQUESTED -> SERVER_SCHEMA_REQUESTED at lib/ovsdb-cs.c:423
    Copy to Clipboard Toggle word wrap

  6. 可选:运行以下命令来检查 ConfigMap 文件是否已应用:

    for f in $(oc -n openshift-ovn-kubernetes get po -l 'app=ovnkube-node' --no-headers -o custom-columns=N:.metadata.name) ; do echo "---- $f ----" ; oc -n openshift-ovn-kubernetes exec -c ovnkube-controller $f --  pgrep -a -f  init-ovnkube-controller | grep -P -o '^.*loglevel\s+\d' ; done
    Copy to Clipboard Toggle word wrap

    输出示例

    ---- ovnkube-node-2dt57 ----
    60981 /usr/bin/ovnkube --init-ovnkube-controller xpst8-worker-c-vmh5n.c.openshift-qe.internal --init-node xpst8-worker-c-vmh5n.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4
    ---- ovnkube-node-4zznh ----
    178034 /usr/bin/ovnkube --init-ovnkube-controller xpst8-master-2.c.openshift-qe.internal --init-node xpst8-master-2.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4
    ---- ovnkube-node-548sx ----
    77499 /usr/bin/ovnkube --init-ovnkube-controller xpst8-worker-a-fjtnb.c.openshift-qe.internal --init-node xpst8-worker-a-fjtnb.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4
    ---- ovnkube-node-6btrf ----
    73781 /usr/bin/ovnkube --init-ovnkube-controller xpst8-worker-b-p8rww.c.openshift-qe.internal --init-node xpst8-worker-b-p8rww.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4
    ---- ovnkube-node-fkc9r ----
    130707 /usr/bin/ovnkube --init-ovnkube-controller xpst8-master-0.c.openshift-qe.internal --init-node xpst8-master-0.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 5
    ---- ovnkube-node-tk9l4 ----
    181328 /usr/bin/ovnkube --init-ovnkube-controller xpst8-master-1.c.openshift-qe.internal --init-node xpst8-master-1.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4
    Copy to Clipboard Toggle word wrap

3.6. 检查 OVN-Kubernetes pod 网络连接

在 OpenShift Container Platform 4.10 及更新的版本中,连接检查控制器会在集群中编配连接验证检查。这包括 Kubernetes API、OpenShift API 和单个节点。连接测试的结果存储在 openshift-network-diagnostics 命名空间中的 PodNetworkConnectivity 对象中。连接测试会每分钟以并行方式执行。

先决条件

  • 访问 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 角色的用户访问集群。
  • 您已安装了 jq

流程

  1. 要列出当前的 PodNetworkConnectivityCheck 对象,请输入以下命令:

    $ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics
    Copy to Clipboard Toggle word wrap
  2. 使用以下命令查看每个连接对象的最新成功:

    $ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \
    -o json | jq '.items[]| .spec.targetEndpoint,.status.successes[0]'
    Copy to Clipboard Toggle word wrap
  3. 使用以下命令查看每个连接对象的最新故障:

    $ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \
    -o json | jq '.items[]| .spec.targetEndpoint,.status.failures[0]'
    Copy to Clipboard Toggle word wrap
  4. 使用以下命令查看每个连接对象的最新中断:

    $ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \
    -o json | jq '.items[]| .spec.targetEndpoint,.status.outages[0]'
    Copy to Clipboard Toggle word wrap

    连接检查控制器也会将来自这些检查的指标记录到 Prometheus 中。

  5. 运行以下命令来查看所有指标:

    $ oc exec prometheus-k8s-0 -n openshift-monitoring -- \
    promtool query instant  http://localhost:9090 \
    '{component="openshift-network-diagnostics"}'
    Copy to Clipboard Toggle word wrap
  6. 查看源 pod 和 openshift api 服务之间的延迟,持续 5 分钟:

    $ oc exec prometheus-k8s-0 -n openshift-monitoring -- \
    promtool query instant  http://localhost:9090 \
    '{component="openshift-network-diagnostics"}'
    Copy to Clipboard Toggle word wrap
重要

使用 OVS 抽样检查 OVN-Kubernetes 网络流量只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

OVN-Kubernetes 网络流量可以通过 CLI 来查看以下网络 API 的 OVS 抽样:

  • NetworkPolicy
  • AdminNetworkPolicy
  • BaselineNetworkPolicy
  • UserDefinedNetwork 隔离
  • EgressFirewall
  • 多播 ACL。

这些网络事件的脚本可在每个 OVN-Kubernetes 节点的 /usr/bin/ovnkube-observ 路径中找到。

虽然 Network Observability Operator 和检查带有 OVS 抽样的 OVN-Kubernetes 网络流量都适合可调试,但 Network Observability Operator 旨在观察网络事件。另外,使用 CLI 检查带有 OVS 抽样的 OVN-Kubernetes 网络流量可帮助进行数据包追踪;也可以在安装 Network Observability Operator 时使用,但这不是强制要求。

管理员可以添加 --add-ovs-collect 选项来查看节点上的网络流量,或者传递额外的标志来过滤特定 pod 的结果。额外的标记可在带有 OVS 抽样标志"部分的 "OVN-Kubernetes 网络流量中找到。

使用以下步骤通过 CLI 查看 OVN-Kubernetes 网络流量。

先决条件

  • 以具有 cluster-admin 权限的用户身份登录集群。
  • 您已创建了源 pod 和目标 pod,并在它们之间运行流量。
  • 您至少创建了以下网络 API 之一: NetworkPolicyAdminNetworkPolicyBaselineNetworkPolicyUserDefinedNetwork 隔离、多播或出口防火墙。

流程

  1. 要使用 OVS 抽样功能启用 OVNObservability,请输入以下命令在名为 clusterFeatureGate CR 中启用 TechPreviewNoUpgrade 功能集:

    $ oc patch --type=merge --patch '{"spec": {"featureSet": "TechPreviewNoUpgrade"}}' featuregate/cluster
    Copy to Clipboard Toggle word wrap

    输出示例

    featuregate.config.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

  2. 输入以下命令确认启用了 OVNObservability 功能:

    $ oc get featuregate cluster -o yaml
    Copy to Clipboard Toggle word wrap

    输出示例

      featureGates:
    # ...
        enabled:
        - name: OVNObservability
    Copy to Clipboard Toggle word wrap

  3. 输入以下命令,获取命名空间中的 pod 列表,在其中创建了其中一个相关网络 API。请注意 pod 的 NODE 名称,因为以下步骤中使用它们。

    $ oc get pods -n <namespace> -o wide
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME              READY   STATUS    RESTARTS   AGE     IP            NODE                                       NOMINATED NODE   READINESS GATES
    destination-pod   1/1     Running   0          53s     10.131.0.23   ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc   <none>           <none>
    source-pod        1/1     Running   0          56s     10.131.0.22   ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc   <none>           <none>
    Copy to Clipboard Toggle word wrap

  4. 输入以下命令获取 OVN-Kubernetes pod 列表,并找到共享与上一步中的 pod 相同的 NODE 的 pod:

    $ oc get pods -n openshift-ovn-kubernetes -o wide
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME
    ...                             READY   STATUS    RESTARTS      AGE   IP           NODE                                       NOMINATED NODE
    ovnkube-node-jzn5b              8/8     Running   1 (34m ago)   37m   10.0.128.2   ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc   <none>
    ...
    Copy to Clipboard Toggle word wrap

  5. 输入以下命令在 ovnkube-node pod 中打开 bash shell:

    $ oc exec -it <pod_name> -n openshift-ovn-kubernetes -- bash
    Copy to Clipboard Toggle word wrap
  6. ovnkube-node pod 中,您可以运行 ovnkube-observ -add-ovs-collector 脚本来显示使用 OVS 收集器的网络事件。例如:

    # /usr/bin/ovnkube-observ -add-ovs-collector
    Copy to Clipboard Toggle word wrap

    输出示例

    ...
    2024/12/02 19:41:41.327584 OVN-K message: Allowed by default allow from local node policy, direction ingress
    2024/12/02 19:41:41.327593 src=10.131.0.2, dst=10.131.0.6
    
    2024/12/02 19:41:41.327692 OVN-K message: Allowed by default allow from local node policy, direction ingress
    2024/12/02 19:41:41.327715 src=10.131.0.6, dst=10.131.0.2
    ...
    Copy to Clipboard Toggle word wrap

  7. 您可以通过带有 -filter-src-ip 标志和 pod 的 IP 地址输入以下命令来根据类型(如源 pod)过滤内容。例如:

    # /usr/bin/ovnkube-observ -add-ovs-collector -filter-src-ip <pod_ip_address>
    Copy to Clipboard Toggle word wrap

    输出示例

    ...
    Found group packets, id 14
    2024/12/10 16:27:12.456473 OVN-K message: Allowed by admin network policy allow-egress-group1, direction Egress
    2024/12/10 16:27:12.456570 src=10.131.0.22, dst=10.131.0.23
    
    2024/12/10 16:27:14.484421 OVN-K message: Allowed by admin network policy allow-egress-group1, direction Egress
    2024/12/10 16:27:14.484428 src=10.131.0.22, dst=10.131.0.23
    
    2024/12/10 16:27:12.457222 OVN-K message: Allowed by network policy test:allow-ingress-from-specific-pod, direction Ingress
    2024/12/10 16:27:12.457228 src=10.131.0.22, dst=10.131.0.23
    
    2024/12/10 16:27:12.457288 OVN-K message: Allowed by network policy test:allow-ingress-from-specific-pod, direction Ingress
    2024/12/10 16:27:12.457299 src=10.131.0.22, dst=10.131.0.23
    ...
    Copy to Clipboard Toggle word wrap

    有关可以使用 /usr/bin/ovnkube-observ 传递的标记的完整列表,请参阅 "OVN-Kubernetes 网络流量带有 OVS sampling 标记"。

以下标记可用于使用 CLI 查看 OVN-Kubernetes 网络流量。在 ovnkube-node pod 中打开 bash shell 后,将这些标记附加到终端中的以下语法中:

命令语法

# /usr/bin/ovnkube-observ <flag>
Copy to Clipboard Toggle word wrap

Expand
标记描述

-h

返回可用于 usr/bin/ovnkube-observ 命令的完整列表标志。'

-add-ovs-collector

添加 OVS 收集器以启用抽样。请谨慎使用。确保其他人没有使用可观察性。

-enable-enrichment

通过 NBDB 数据丰富样本。默认值为 true

-filter-dst-ip

仅将数据包过滤到给定目标 IP。

-filter-src-ip

仅过滤来自给定源 IP 的数据包。

-log-cookie

使用 psample group_id 打印原始示例 Cookie。

-output-file

将示例写入的输出文件。

-print-full-packet

打印完整接收的数据包.为 false 时,每个示例仅打印源和目标 IP。

第 4 章 使用 ovnkube-trace 追踪 Openflow

OVN 和 OVS 流量流可以在一个名为 ovnkube-trace 的单个实用程序中模拟。ovnkube-trace 工具运行 ovn-traceovs-appctl ofproto/traceovn-detrace,并在单个输出中关联这些信息。

您可以从专用容器执行 ovnkube-trace 二进制文件。对于 OpenShift Container Platform 4.7 后的版本,您还可以将该二进制文件复制到本地主机中,并从该主机执行它。

4.1. 在本地主机上安装 ovnkube-trace

ovnkube-trace 工具跟踪在 OVN-Kubernetes 驱动的 OpenShift Container Platform 集群中点之间的任意 UDP 或 TCP 流量的数据包模拟。将 ovnkube-trace 二进制文件复制到本地主机,使其可以针对集群运行。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。

流程

  1. 使用以下命令创建 pod 变量:

    $  POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-control-plane -o name | head -1 | awk -F '/' '{print $NF}')
    Copy to Clipboard Toggle word wrap
  2. 在本地主机上运行以下命令,从 ovnkube-control-plane pod 复制二进制文件:

    $  oc cp -n openshift-ovn-kubernetes $POD:/usr/bin/ovnkube-trace -c ovnkube-cluster-manager ovnkube-trace
    Copy to Clipboard Toggle word wrap
    注意

    如果您使用 Red Hat Enterprise Linux (RHEL) 8 运行 ovnkube-trace 工具,您必须将文件 /usr/lib/rhel8/ovnkube-trace 复制到本地主机。

  3. 运行以下命令,使 ovnkube-trace 可执行:

    $  chmod +x ovnkube-trace
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令,显示 ovnkube-trace 可用的选项:

    $  ./ovnkube-trace -help
    Copy to Clipboard Toggle word wrap

    预期输出

    Usage of ./ovnkube-trace:
      -addr-family string
        	Address family (ip4 or ip6) to be used for tracing (default "ip4")
      -dst string
        	dest: destination pod name
      -dst-ip string
        	destination IP address (meant for tests to external targets)
      -dst-namespace string
        	k8s namespace of dest pod (default "default")
      -dst-port string
        	dst-port: destination port (default "80")
      -kubeconfig string
        	absolute path to the kubeconfig file
      -loglevel string
        	loglevel: klog level (default "0")
      -ovn-config-namespace string
        	namespace used by ovn-config itself
      -service string
        	service: destination service name
      -skip-detrace
        	skip ovn-detrace command
      -src string
        	src: source pod name
      -src-namespace string
        	k8s namespace of source pod (default "default")
      -tcp
        	use tcp transport protocol
      -udp
        	use udp transport protocol
    Copy to Clipboard Toggle word wrap

    支持的命令行参数是熟悉的 Kubernetes 构造,如命名空间、Pod、服务,因此您不需要查找 MAC 地址、目标节点的 IP 地址或 ICMP 类型。

    日志级别为:

    • 0 (最小输出)
    • 2 (显示 trace 命令结果的详细输出)
    • 5 (调试输出)

4.2. 运行 ovnkube-trace

运行 ovn-trace 以模拟 OVN 逻辑网络内的数据包转发。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您已在本地主机上安装了 ovnkube-trace

示例:测试 DNS 解析是否适用于部署的 pod

本例演示了如何从部署的 pod 测试 DNS 解析到集群中运行的核心 DNS pod。

流程

  1. 输入以下命令在 default 命名空间中启动 web 服务:

    $ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80
    Copy to Clipboard Toggle word wrap
  2. 列出在 openshift-dns 命名空间中运行的 pod:

    oc get pods -n openshift-dns
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                  READY   STATUS    RESTARTS   AGE
    dns-default-8s42x     2/2     Running   0          5h8m
    dns-default-mdw6r     2/2     Running   0          4h58m
    dns-default-p8t5h     2/2     Running   0          4h58m
    dns-default-rl6nk     2/2     Running   0          5h8m
    dns-default-xbgqx     2/2     Running   0          5h8m
    dns-default-zv8f6     2/2     Running   0          4h58m
    node-resolver-62jjb   1/1     Running   0          5h8m
    node-resolver-8z4cj   1/1     Running   0          4h59m
    node-resolver-bq244   1/1     Running   0          5h8m
    node-resolver-hc58n   1/1     Running   0          4h59m
    node-resolver-lm6z4   1/1     Running   0          5h8m
    node-resolver-zfx5k   1/1     Running   0          5h
    Copy to Clipboard Toggle word wrap

  3. 运行以下 ovnkube-trace 命令来验证 DNS 解析是否正常工作:

    $ ./ovnkube-trace \
      -src-namespace default \ 
    1
    
      -src web \ 
    2
    
      -dst-namespace openshift-dns \ 
    3
    
      -dst dns-default-p8t5h \ 
    4
    
      -udp -dst-port 53 \ 
    5
    
      -loglevel 0 
    6
    Copy to Clipboard Toggle word wrap
    1
    源 pod 的命名空间
    2
    源 pod 名称
    3
    目标 pod 的命名空间
    4
    目标 pod 名称
    5
    使用 udp 传输协议。端口 53 是 DNS 服务使用的端口。
    6
    将日志级别设置为 0 (0 为 minimal,5 为 debug)

    src&dst pod 在同一节点上放置时的输出示例

    ovn-trace source pod to destination pod indicates success from web to dns-default-p8t5h
    ovn-trace destination pod to source pod indicates success from dns-default-p8t5h to web
    ovs-appctl ofproto/trace source pod to destination pod indicates success from web to dns-default-p8t5h
    ovs-appctl ofproto/trace destination pod to source pod indicates success from dns-default-p8t5h to web
    ovn-detrace source pod to destination pod indicates success from web to dns-default-p8t5h
    ovn-detrace destination pod to source pod indicates success from dns-default-p8t5h to web
    Copy to Clipboard Toggle word wrap

    src&dst pod 放置到另一个节点上时的输出示例

    ovn-trace source pod to destination pod indicates success from web to dns-default-8s42x
    ovn-trace (remote) source pod to destination pod indicates success from web to dns-default-8s42x
    ovn-trace destination pod to source pod indicates success from dns-default-8s42x to web
    ovn-trace (remote) destination pod to source pod indicates success from dns-default-8s42x to web
    ovs-appctl ofproto/trace source pod to destination pod indicates success from web to dns-default-8s42x
    ovs-appctl ofproto/trace destination pod to source pod indicates success from dns-default-8s42x to web
    ovn-detrace source pod to destination pod indicates success from web to dns-default-8s42x
    ovn-detrace destination pod to source pod indicates success from dns-default-8s42x to web
    Copy to Clipboard Toggle word wrap

    ouput 表示从部署的 pod 到 DNS 端口的成功,也表示它已成功返回其他方向。因此,如果我的 Web pod 想要从核心 DNS 进行 dns 解析,则 UDP 端口 53 上支持双向流量。

例如,如果无法正常工作,并且您想要获取 ovn-traceproto/traceovn-detraceovs-appctl,以及更多故障排除类型信息,将日志级别增加到 2,然后再次运行命令,如下所示:

$ ./ovnkube-trace \
  -src-namespace default \
  -src web \
  -dst-namespace openshift-dns \
  -dst dns-default-467qw \
  -udp -dst-port 53 \
  -loglevel 2
Copy to Clipboard Toggle word wrap

这个日志级别的输出太大,无法在此处列出。在故障情况下,此命令的输出显示哪个流丢弃了该流量。例如,可以在不允许该流量的集群中配置 egress 或 ingress 网络策略。

示例:使用 debug 输出来验证配置的默认拒绝

本例演示了如何使用入口默认拒绝策略阻断流量的 debug 输出来识别。

流程

  1. 创建以下 YAML,以定义 deny-by-default 策略,以拒绝所有命名空间中的所有 pod 的入口流量。将 YAML 保存到 deny-by-default.yaml 文件中:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
      namespace: default
    spec:
      podSelector: {}
      ingress: []
    Copy to Clipboard Toggle word wrap
  2. 输入以下命令应用策略:

    $ oc apply -f deny-by-default.yaml
    Copy to Clipboard Toggle word wrap

    输出示例

    networkpolicy.networking.k8s.io/deny-by-default created
    Copy to Clipboard Toggle word wrap

  3. 输入以下命令在 default 命名空间中启动 web 服务:

    $ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令来创建 prod 命名空间:

    $ oc create namespace prod
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令来标记 prod 命名空间:

    $ oc label namespace/prod purpose=production
    Copy to Clipboard Toggle word wrap
  6. 运行以下命令,在 prod 命名空间中部署 alpine 镜像并启动 shell:

    $ oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  7. 打开另一个终端会话。
  8. 在这个新终端会话中,运行 ovn-trace 以验证在命名空间 prod 中运行的源 pod test-6459 与在 default 命名空间中的目标 pod 之间的通信失败:

    $ ./ovnkube-trace \
     -src-namespace prod \
     -src test-6459 \
     -dst-namespace default \
     -dst web \
     -tcp -dst-port 80 \
     -loglevel 0
    Copy to Clipboard Toggle word wrap

    输出示例

    ovn-trace source pod to destination pod indicates failure from test-6459 to web
    Copy to Clipboard Toggle word wrap

  9. 运行以下命令,将日志级别增加到 2 以公开失败的原因:

    $ ./ovnkube-trace \
     -src-namespace prod \
     -src test-6459 \
     -dst-namespace default \
     -dst web \
     -tcp -dst-port 80 \
     -loglevel 2
    Copy to Clipboard Toggle word wrap

    输出示例

    ...
    ------------------------------------------------
     3. ls_out_acl_hint (northd.c:7454): !ct.new && ct.est && !ct.rpl && ct_mark.blocked == 0, priority 4, uuid 12efc456
        reg0[8] = 1;
        reg0[10] = 1;
        next;
     5. ls_out_acl_action (northd.c:7835): reg8[30..31] == 0, priority 500, uuid 69372c5d
        reg8[30..31] = 1;
        next(4);
     5. ls_out_acl_action (northd.c:7835): reg8[30..31] == 1, priority 500, uuid 2fa0af89
        reg8[30..31] = 2;
        next(4);
     4. ls_out_acl_eval (northd.c:7691): reg8[30..31] == 2 && reg0[10] == 1 && (outport == @a16982411286042166782_ingressDefaultDeny), priority 2000, uuid 447d0dab
        reg8[17] = 1;
        ct_commit { ct_mark.blocked = 1; }; 
    1
    
        next;
    ...
    Copy to Clipboard Toggle word wrap

    1
    因为默认的 deny 策略被到位,所以入口流量会被阻止
  10. 创建一个策略,允许来自特定命名空间中所有 pod 的流量,其标签为 purpose=production。将 YAML 保存到 web-allow-prod.yaml 文件中:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-prod
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: web
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production
    Copy to Clipboard Toggle word wrap
  11. 输入以下命令应用策略:

    $ oc apply -f web-allow-prod.yaml
    Copy to Clipboard Toggle word wrap
  12. 输入以下命令运行 ovnkube-trace 来验证现在允许的流量:

    $ ./ovnkube-trace \
     -src-namespace prod \
     -src test-6459 \
     -dst-namespace default \
     -dst web \
     -tcp -dst-port 80 \
     -loglevel 0
    Copy to Clipboard Toggle word wrap

    预期输出

    ovn-trace source pod to destination pod indicates success from test-6459 to web
    ovn-trace destination pod to source pod indicates success from web to test-6459
    ovs-appctl ofproto/trace source pod to destination pod indicates success from test-6459 to web
    ovs-appctl ofproto/trace destination pod to source pod indicates success from web to test-6459
    ovn-detrace source pod to destination pod indicates success from test-6459 to web
    ovn-detrace destination pod to source pod indicates success from web to test-6459
    Copy to Clipboard Toggle word wrap

  13. 在在第 6 步中打开的 shell 中运行以下命令,以将 nginx 连接到 web-server:

     wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap

    预期输出

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    Copy to Clipboard Toggle word wrap

第 5 章 转换为 IPv4/IPv6 双栈网络

作为集群管理员,您可以将 IPv4 单栈集群转换为支持 IPv4 和 IPv6 地址系列的双网络集群网络。转换为双栈网络后,新的和现有 pod 启用了双栈网络。

重要

当使用需要 IPv6 的双栈网络时,您无法使用 IPv4 映射 IPv6 地址,如 ::FFFF:198.51.100.1

5.1. 转换为双栈集群网络

作为集群管理员,您可以将单堆栈集群网络转换为双栈集群网络。

重要

将集群转换为使用双栈网络后,您必须为它们重新创建任何现有 pod 以接收 IPv6 地址,因为只有新 pod 会被分配 IPv6 地址。

将单堆栈集群网络转换为双栈集群网络包括创建补丁并将其应用到集群的网络和基础架构。您可以转换为在安装程序置备的基础架构或用户置备的基础架构上运行的集群的双栈集群网络。

注意

更改 clusterNetworkserviceNetworkapiServerInternalIPsingressIP 对象的每个补丁操作都会触发重启集群。更改 MachineNetworks 对象不会导致重启集群。

安装程序置备的基础架构中,如果您需要将 API 和 Ingress 服务的 IPv6 虚拟 IP (VIP)添加到现有的双栈配置的集群中,则只需要修补基础架构,而不是集群的网络。

重要

如果您已经将集群升级到 OpenShift Container Platform 4.16 或更高版本,且您需要将单堆栈集群网络转换为双栈集群网络,则必须从 install-config.yaml 文件中为 API 和 Ingress 服务指定现有的 IPv4 machineNetwork 网络配置。此配置可确保 IPv4 流量与默认网关在同一网络接口中。

带有为 machineNetwork 网络添加 IPv4 地址块的 YAML 配置文件示例

- op: add
  path: /spec/platformSpec/baremetal/machineNetworks/- 
1

  value: 192.168.1.0/24
  # ...
Copy to Clipboard Toggle word wrap

1
确保为机器操作的 machineNetwork 网络指定地址块。您必须为机器网络选择 API 和 Ingress IP 地址。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 集群使用 OVN-Kubernetes 网络插件。
  • 集群节点具有 IPv6 地址。
  • 您已根据基础架构配置了启用了 IPv6 的路由器。

流程

  1. 要为集群和服务网络指定 IPv6 地址块,请创建一个类似以下示例的 YAML 配置补丁文件:

    - op: add
      path: /spec/clusterNetwork/-
      value: 
    1
    
        cidr: fd01::/48
        hostPrefix: 64
    - op: add
      path: /spec/serviceNetwork/-
      value: fd02::/112 
    2
    Copy to Clipboard Toggle word wrap
    1
    使用 cidrhostPrefix 参数指定对象。主机前缀必须为 64 或更高。IPv6 无类别域间路由 (CIDR) 前缀必须足够大,以适应指定的主机前缀。
    2
    指定一个带有 112 前缀的 IPv6 CIDR。Kubernetes 仅使用最低 16 位。对于前缀 112,IP 地址从 112 分配给 128 位。
  2. 在 CLI 中输入以下命令来修补集群网络配置:

    $ oc patch network.config.openshift.io cluster \
    1
    
      --type='json' --patch-file <file>.yaml
    Copy to Clipboard Toggle word wrap
    1
    其中 file 指定您创建的 YAML 文件的名称。

    输出示例

    network.config.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

  3. 在为 API 和 Ingress 服务添加了 IPv6 VIP 的安装程序置备的基础架构中,完成以下步骤:

    1. 为集群指定 API 和 Ingress 服务的 IPv6 VIP。创建类似以下示例的 YAML 配置补丁文件:

      - op: add
        path: /spec/platformSpec/baremetal/machineNetworks/- 
      1
      
        value: fd2e:6f44:5dd8::/64
      - op: add
        path: /spec/platformSpec/baremetal/apiServerInternalIPs/- 
      2
      
        value: fd2e:6f44:5dd8::4
      - op: add
        path: /spec/platformSpec/baremetal/ingressIPs/-
        value: fd2e:6f44:5dd8::5
      Copy to Clipboard Toggle word wrap
      1
      确保为机器操作的 machineNetwork 网络指定地址块。您必须为机器网络选择 API 和 Ingress IP 地址。
      2
      确保根据您的平台指定每个文件路径。该示例展示了裸机平台上的文件路径。
    2. 在 CLI 中输入以下命令来修补基础架构:

      $ oc patch infrastructure cluster \
        --type='json' --patch-file <file>.yaml
      Copy to Clipboard Toggle word wrap

      其中:

      <file>

      指定创建的 YAML 文件的名称。

      输出示例

      infrastructure/cluster patched
      Copy to Clipboard Toggle word wrap

验证

  1. 在 CLI 中输入以下命令来显示集群网络配置:

    $ oc describe network
    Copy to Clipboard Toggle word wrap
  2. 检查集群网络配置是否识别您在 YAML 文件中指定的 IPv6 地址块,以验证在网络配置中成功安装补丁。

    输出示例

    # ...
    Status:
      Cluster Network:
        Cidr:               10.128.0.0/14
        Host Prefix:        23
        Cidr:               fd01::/48
        Host Prefix:        64
      Cluster Network MTU:  1400
      Network Type:         OVNKubernetes
      Service Network:
        172.30.0.0/16
        fd02::/112
    # ...
    Copy to Clipboard Toggle word wrap

  3. 为在安装程序置备的基础架构中运行的集群完成以下附加任务:

    1. 在 CLI 中输入以下命令来显示集群基础架构配置:

      $ oc describe infrastructure
      Copy to Clipboard Toggle word wrap
    2. 检查基础架构是否识别您在 YAML 文件中指定的 IPv6 地址块,以验证在集群基础架构上安装补丁是否成功。

      输出示例

      # ...
      spec:
      # ...
        platformSpec:
          baremetal:
            apiServerInternalIPs:
            - 192.168.123.5
            - fd2e:6f44:5dd8::4
            ingressIPs:
            - 192.168.123.10
            - fd2e:6f44:5dd8::5
      status:
      # ...
        platformStatus:
          baremetal:
            apiServerInternalIP: 192.168.123.5
            apiServerInternalIPs:
            - 192.168.123.5
            - fd2e:6f44:5dd8::4
            ingressIP: 192.168.123.10
            ingressIPs:
            - 192.168.123.10
            - fd2e:6f44:5dd8::5
      # ...
      Copy to Clipboard Toggle word wrap

5.2. 转换为单堆栈集群网络

作为集群管理员,您可以将双栈集群网络转换为单堆栈集群网络。

重要

如果您最初将 IPv4 单堆栈集群网络转换为双栈集群,则只能转换回 IPv4 单堆栈集群,而不是 IPv6 单堆栈集群网络。相同限制适用于对 IPv6 单堆栈集群网络的转换(只能转换回 IPv6)。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 集群使用 OVN-Kubernetes 网络插件。
  • 集群节点具有 IPv6 地址。
  • 您已启用了双栈网络。

流程

  1. 运行以下命令来编辑 networks.config.openshift.io 自定义资源 (CR):

    $ oc edit networks.config.openshift.io
    Copy to Clipboard Toggle word wrap
  2. 删除在 "Converting to a dual-stack cluster network " 步骤中添加到 cidrhostPrefix 参数中的 IPv4 或 IPv6 配置。

第 6 章 配置 OVN-Kubernetes 内部 IP 地址子网

作为集群管理员,您可以更改 OVN-Kubernetes 网络插件用于加入和传输子网的 IP 地址范围。

6.1. 配置 OVN-Kubernetes 加入子网

您可以更改 OVN-Kubernetes 使用的 join 子网,以避免与环境中已存在的子网冲突。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 确保集群使用 OVN-Kubernetes 网络插件。

流程

  • 要更改 OVN-Kubernetes 加入子网,请输入以下命令:

    $ oc patch network.operator.openshift.io cluster --type='merge' \
      -p='{"spec":{"defaultNetwork":{"ovnKubernetesConfig":
        {"ipv4":{"internalJoinSubnet": "<join_subnet>"},
        "ipv6":{"internalJoinSubnet": "<join_subnet>"}}}}}'
    Copy to Clipboard Toggle word wrap

    其中:

    <join_subnet>
    指定 OVN-Kubernetes 内部使用的 IP 地址子网。子网必须大于集群中的节点数量,且必须足够大,以适应集群中的每个节点一个 IP 地址。此子网不能与 OpenShift Container Platform 或主机本身使用的任何其他子网重叠。IPv4 的默认值为 100.64.0.0/16,IPv6 的默认值是 fd98::/64

    输出示例

    network.operator.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

验证

  • 要确认配置处于活跃状态,请输入以下命令:

    $ oc get network.operator.openshift.io \
      -o jsonpath="{.items[0].spec.defaultNetwork}"
    Copy to Clipboard Toggle word wrap

    命令操作最多可能需要 30 分钟才能使此更改生效。

    输出示例

    {
      "ovnKubernetesConfig": {
        "ipv4": {
          "internalJoinSubnet": "100.64.1.0/16"
        },
      },
      "type": "OVNKubernetes"
    }
    Copy to Clipboard Toggle word wrap

您可以将 OVN-Kubernetes 使用的伪装子网更改为安装后操作,以避免与环境中已存在的子网冲突。

先决条件

  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 权限的用户身份登录集群。

流程

  • 更改集群的伪装子网:

    • 对于使用 IPv6 的双栈集群,请运行以下命令:

      $ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipv4":{"internalMasqueradeSubnet": "<ipv4_masquerade_subnet>"},"ipv6":{"internalMasqueradeSubnet": "<ipv6_masquerade_subnet>"}}}}}}'
      Copy to Clipboard Toggle word wrap

      其中:

      ipv4_masquerade_subnet
      指定用作 IPv4 伪装子网的 IP 地址。此范围不能与 OpenShift Container Platform 或主机本身使用的任何其他子网重叠。在早于 4.17 的 OpenShift Container Platform 版本中,IPv4 的默认值是 169.254.169.0/29,升级到 4.17 的集群维护此值。对于从版本 4.17 开始的新集群,默认值为 169.254.0.0/17
      ipv6_masquerade_subnet
      指定用作 IPv6 伪装子网的 IP 地址。此范围不能与 OpenShift Container Platform 或主机本身使用的任何其他子网重叠。IPv6 的默认值为 fd69::/125
    • 对于使用 IPv4 的集群,运行以下命令:

      $ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipv4":{"internalMasqueradeSubnet": "<ipv4_masquerade_subnet>"}}}}}}'
      Copy to Clipboard Toggle word wrap

      其中:

      ipv4_masquerade_subnet::一个 IP 地址,用作 IPv4 masquerade 子网。此范围不能与 OpenShift Container Platform 或主机本身使用的任何其他子网重叠。在早于 4.17 的 OpenShift Container Platform 版本中,IPv4 的默认值是 169.254.169.0/29,升级到 4.17 的集群维护此值。对于从版本 4.17 开始的新集群,默认值为 169.254.0.0/17

6.3. 配置 OVN-Kubernetes 传输子网

您可以更改 OVN-Kubernetes 使用的传输子网,以避免与环境中已存在的子网冲突。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 确保集群使用 OVN-Kubernetes 网络插件。

流程

  • 要更改 OVN-Kubernetes 传输子网,请输入以下命令:

    $ oc patch network.operator.openshift.io cluster --type='merge' \
      -p='{"spec":{"defaultNetwork":{"ovnKubernetesConfig":
        {"ipv4":{"internalTransitSwitchSubnet": "<transit_subnet>"},
        "ipv6":{"internalTransitSwitchSubnet": "<transit_subnet>"}}}}}'
    Copy to Clipboard Toggle word wrap

    其中:

    <transit_subnet>
    为分布式传输交换机指定一个 IP 地址子网,以启用 east-west 流量。此子网不能与 OVN-Kubernetes 或主机本身使用的任何其他子网重叠。IPv4 的默认值为 100.88.0.0/16,IPv6 的默认值是 fd97::/64

    输出示例

    network.operator.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

验证

  • 要确认配置处于活跃状态,请输入以下命令:

    $ oc get network.operator.openshift.io \
      -o jsonpath="{.items[0].spec.defaultNetwork}"
    Copy to Clipboard Toggle word wrap

    可能需要 30 分钟才能使此更改生效。

    输出示例

    {
      "ovnKubernetesConfig": {
        "ipv4": {
          "internalTransitSwitchSubnet": "100.88.1.0/16"
        },
      },
      "type": "OVNKubernetes"
    }
    Copy to Clipboard Toggle word wrap

第 7 章 配置网关模式

作为集群管理员,您可以配置 gatewayConfig 对象来管理外部流量离开集群的方式。为此,对于本地模式将 routingViaHost spec 设置为 true,对于共享模式将 false 设置为 false。

在本地网关模式中,流量通过主机路由,因此应用于主机的路由表。在共享网关模式中,流量不会通过主机路由。相反,Open vSwitch (OVS) 流量直接将流量输出到节点 IP 接口。

7.1. 设置本地和共享网关模式

作为集群管理员,您可以使用 Cluster Network Operator 中的 gatewayConfig spec 配置网关模式。以下流程可用于将本地模式的 routingViaHost 字段设置为 true,对于共享模式,使用 false

如果需要主机网络作为与 OVN-Kubernetes 相关的流量的路由器,按照可选步骤 4 启用 IP 转发和本地网关模式。例如,将本地网关模式与 IP 转发模式相结合的可能用例包括:

  • 配置通过节点的 IP 转发所有 pod 出口流量
  • 将 OVN-Kubernetes CNI 与外部网络地址转换(NAT)设备集成
  • 将 OVN-Kubernetes CNI 配置为使用内核路由表

先决条件

  • 您以具有 admin 权限的用户身份登录。

流程

  1. 运行以下命令备份现有网络配置:

    $ oc get network.operator cluster -o yaml > network-config-backup.yaml
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,将本地网关模式的 routingViaHost 参数设置为 true

    $ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"routingViaHost": true}}}}}'
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令验证本地网关模式是否已设置:

    $ oc get networks.operator.openshift.io cluster -o yaml | grep -A 5 "gatewayConfig"
    Copy to Clipboard Toggle word wrap

    输出示例

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    # ...
    gatewayConfig:
            ipv4: {}
            ipv6: {}
            routingViaHost: true 
    1
    
          genevePort: 6081
          ipsecConfig:
    # ...
    Copy to Clipboard Toggle word wrap

    1
    true 会设置本地网关模式,值 false 会设置共享网关模式。在本地网关模式中,流量通过主机路由。在共享网关模式中,流量不会通过主机路由。
  4. 可选:运行以下命令来全局启用 IP 转发:

    $ oc patch network.operator cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}'
    Copy to Clipboard Toggle word wrap
    1. 运行以下命令,验证 ipForwarding spec 是否已设置为 Global

      $ oc get networks.operator.openshift.io cluster -o yaml | grep -A 5 "gatewayConfig"
      Copy to Clipboard Toggle word wrap

      输出示例

      apiVersion: operator.openshift.io/v1
      kind: Network
      metadata:
        name: cluster
      # ...
      gatewayConfig:
              ipForwarding: Global
              ipv4: {}
              ipv6: {}
              routingViaHost: true
            genevePort: 6081
      # ...
      Copy to Clipboard Toggle word wrap

第 8 章 在默认网络中配置外部网关

作为集群管理员,您可以在默认网络上配置外部网关。

此功能提供以下优点:

  • 根据每个命名空间对出口流量进行精细控制
  • 静态和动态外部网关 IP 地址的灵活配置
  • 支持 IPv4 和 IPv6 地址系列

8.1. 先决条件

  • 集群使用 OVN-Kubernetes 网络插件。
  • 您的基础架构配置为路由来自二级外部网关的流量。

您可以使用 k8s.ovn.org API 组中的 AdminPolicyBasedExternalRoute 自定义资源 (CR) 配置二级外部网关。CR 支持静态和动态方法来指定外部网关的 IP 地址。

AdminPolicyBasedExternalRoute CR 目标的每个命名空间不能被任何其他 AdminPolicyBasedExternalRoute CR 选择。命名空间不能有并发二级外部网关。

对策略的更改在控制器中被隔离。如果策略应用失败,对其他策略的更改不会触发其他策略的重试。策略只会重新评估,在对策略本身或与策略相关的对象(如目标命名空间、Pod 网关或命名空间从动态跃点托管它们)时应用更改可能出现的差异。

静态分配
您可以直接指定 IP 地址。
动态分配

您可以间接指定 IP 地址,带有命名空间和 pod 选择器,以及可选的网络附加定义。

  • 如果提供了网络附加定义的名称,则使用网络附加定义的外部网关 IP 地址。
  • 如果没有提供网络附加定义的名称,则使用 pod 本身的外部网关 IP 地址。但是,只有在 pod 配置为将 hostNetwork 设置为 true 时,此方法才能正常工作。

8.3. AdminPolicyBasedExternalRoute 对象配置

您可以使用以下属性来定义集群范围的 AdminPolicyBasedExternalRoute 对象。命名空间一次只能由一个 AdminPolicyBasedExternalRoute CR 选择。

Expand
表 8.1. AdminPolicyBasedExternalRoute 对象
字段类型描述

metadata.name

string

指定 AdminPolicyBasedExternalRoute 对象的名称。

spec.from

string

指定路由策略应用到的命名空间选择器。外部流量只支持 namespaceSelector。例如:

from:
  namespaceSelector:
    matchLabels:
      kubernetes.io/metadata.name: novxlan-externalgw-ecmp-4059
Copy to Clipboard Toggle word wrap

命名空间只能由一个 AdminPolicyBasedExternalRoute CR 为目标。如果命名空间由多个 AdminPolicyBasedExternalRoute CR 选择,则第二个和后续 CR 中针对同一命名空间会出现一个 failed 错误状态。要应用更新,您必须将策略本身或相关的对象更改为策略,如目标命名空间、Pod 网关或命名空间,以便从动态跃点托管它们,以便策略重新评估并要应用您的更改。

spec.nextHops

object

指定数据包转发到的目的地。需要是 staticdynamic 中的一个或这两个。您必须至少定义一个下一个跃点。

Expand
表 8.2. nextHops 对象
字段类型描述

static

数组

指定静态 IP 地址的数组。

dynamic

数组

指定与配置了网络附加定义的 pod 对应的 pod 选择器,用作外部网关目标。

Expand
表 8.3. nextHops.static 对象
字段类型描述

ip

string

指定下一个目的地跃点的 IPv4 或 IPv6 地址。

bfdEnabled

布尔值

可选:指定网络是否支持 Bi-Directional Forwarding Detection (BFD)。默认值为 false

Expand
表 8.4. nextHops.dynamic 对象
字段类型描述

podSelector

string

指定一个 [set-based](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#set-based-requirement)标签选择器来过滤与此网络配置匹配的命名空间中的 pod。

namespaceSelector

string

指定一个 set-based 选择器,用于过滤 podSelector 应用到的命名空间。必须为此字段指定一个值。

bfdEnabled

布尔值

可选:指定网络是否支持 Bi-Directional Forwarding Detection (BFD)。默认值为 false

networkAttachmentName

string

可选:指定网络附加定义的名称。名称必须与与 pod 关联的逻辑网络列表匹配。如果没有指定此字段,则使用 pod 的主机网络。但是,pod 必须配置为主机网络 pod,才能使用主机网络。

8.3.1. 二级外部网关配置示例

在以下示例中,AdminPolicyBasedExternalRoute 对象使用 kubernetes.io/metadata.name: novxlan-externalgw-ecmp-4059 标签在命名空间中将两个静态 IP 地址配置为 pod 的外部网关。

apiVersion: k8s.ovn.org/v1
kind: AdminPolicyBasedExternalRoute
metadata:
  name: default-route-policy
spec:
  from:
    namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: novxlan-externalgw-ecmp-4059
  nextHops:
    static:
    - ip: "172.18.0.8"
    - ip: "172.18.0.9"
Copy to Clipboard Toggle word wrap

在以下示例中,AdminPolicyBasedExternalRoute 对象配置一个动态外部网关。用于外部网关的 IP 地址派生自与所选 pod 关联的额外网络附加。

apiVersion: k8s.ovn.org/v1
kind: AdminPolicyBasedExternalRoute
metadata:
  name: shadow-traffic-policy
spec:
  from:
    namespaceSelector:
      matchLabels:
        externalTraffic: ""
  nextHops:
    dynamic:
    - podSelector:
        matchLabels:
          gatewayPod: ""
      namespaceSelector:
        matchLabels:
          shadowTraffic: ""
      networkAttachmentName: shadow-gateway
    - podSelector:
        matchLabels:
          gigabyteGW: ""
      namespaceSelector:
        matchLabels:
          gatewayNamespace: ""
      networkAttachmentName: gateway
Copy to Clipboard Toggle word wrap

在以下示例中,AdminPolicyBasedExternalRoute 对象同时配置静态和动态外部网关。

apiVersion: k8s.ovn.org/v1
kind: AdminPolicyBasedExternalRoute
metadata:
  name: multi-hop-policy
spec:
  from:
    namespaceSelector:
      matchLabels:
        trafficType: "egress"
  nextHops:
    static:
    - ip: "172.18.0.8"
    - ip: "172.18.0.9"
    dynamic:
    - podSelector:
        matchLabels:
          gatewayPod: ""
      namespaceSelector:
        matchLabels:
          egressTraffic: ""
      networkAttachmentName: gigabyte
Copy to Clipboard Toggle word wrap

8.4. 配置二级外部网关

您可以为集群中的命名空间在默认网络中配置外部网关。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。

流程

  1. 创建包含 AdminPolicyBasedExternalRoute 对象的 YAML 文件。
  2. 要创建基于 admin 策略的外部路由,请输入以下命令:

    $ oc create -f <file>.yaml
    Copy to Clipboard Toggle word wrap

    其中:

    <file>
    指定您在上一步中创建的 YAML 文件的名称。

    输出示例

    adminpolicybasedexternalroute.k8s.ovn.org/default-route-policy created
    Copy to Clipboard Toggle word wrap

  3. 要确认已创建了基于 admin 策略的外部路由,请输入以下命令:

    $ oc describe apbexternalroute <name> | tail -n 6
    Copy to Clipboard Toggle word wrap

    其中:

    <name>
    指定 AdminPolicyBasedExternalRoute 对象的名称。

    输出示例

    Status:
      Last Transition Time:  2023-04-24T15:09:01Z
      Messages:
      Configured external gateway IPs: 172.18.0.8
      Status:  Success
    Events:  <none>
    Copy to Clipboard Toggle word wrap

8.5. 其他资源

第 9 章 配置出口 IP 地址

作为集群管理员,您可以配置 OVN-Kubernetes Container Network Interface (CNI) 网络插件,为命名空间分配一个或多个出口 IP 地址,或分配给命名空间中的特定 pod。

9.1. 出口 IP 地址架构设计和实施

OpenShift Container Platform 出口 IP 地址功能可确保来自一个或多个命名空间中的一个或多个 pod 的流量具有集群网络之外的服务具有一致的源 IP 地址。

例如,您可能有一个 pod 定期查询托管在集群外服务器上的数据库。要强制对服务器进行访问要求,将数据包过滤设备配置为只允许来自特定 IP 地址的流量。为确保您可以可靠地允许从该特定 pod 访问服务器,您可以为向服务器发出请求的 pod 配置特定的出口 IP 地址。

分配给命名空间的出口 IP 地址与用来向特定目的地发送流量的出口路由器不同。

在一些集群配置中,应用程序 Pod 和入口路由器 pod 在同一个节点上运行。如果您在这种情况下为应用程序项目配置出口 IP 地址,当您向应用程序项目发送请求时,不会使用 IP 地址。

重要

不能在任何 Linux 网络配置文件中配置出口 IP 地址,比如 ifcfg-eth0

9.1.1. 平台支持

下表概述了对不同平台中的出口 IP 地址功能的支持:

Expand
平台支持

裸机

VMware vSphere

Red Hat OpenStack Platform(RHOSP)

Amazon Web Services (AWS)

Google Cloud Platform (GCP)

Microsoft Azure

IBM Z® 和 IBM® LinuxONE

IBM Z® and IBM® LinuxONE for Red Hat Enterprise Linux (RHEL) KVM

IBM Power®

Nutanix

重要

在 Amazon Web Services(AWS)上置备的集群中不支持使用 EgressIP 功能将出口 IP 地址分配给 control plane 节点。(BZ#2039656)。

9.1.2. 公共云平台注意事项

通常,公共云提供商对出口 IP 施加一个限制。这意味着,对于公共云基础架构上置备的集群,每个节点都有可分配 IP 地址的限制。如下公式描述了每个节点的可分配 IP 地址或 IP 容量 上限:

IP capacity = public cloud default capacity - sum(current IP assignments)
Copy to Clipboard Toggle word wrap

虽然 Egress IP 功能管理每个节点的 IP 地址容量,但在部署中计划这个约束非常重要。例如,如果公共云提供商将 IP 地址容量限制为每个节点 10 个 IP 地址,并且您有 8 个节点,则可分配的 IP 地址总数仅为 80。为了获得更高的 IP 地址容量,您需要分配额外的节点。例如,如果您需要 150 个可分配的 IP 地址,则需要分配 7 个节点。

要确认公共云环境中任何节点的 IP 容量和子网,您可以输入 oc get node <node_name> -o yaml 命令。cloud.network.openshift.io/egress-ipconfig 注解包括节点的容量和子网信息。

注解值是一个带有单个对象的数组,其中包含为主网络接口提供以下信息的字段:

  • interface :指定 AWS 和 Azure 上的接口 ID,以及 GCP 上的接口名称。
  • ifaddr :为一个或多个 IP 地址系列指定子网掩码。
  • capacity :指定节点的 IP 地址容量。在 AWS 上,IP 地址容量为每个 IP 地址系列提供。在 Azure 和 GCP 上,IP 地址容量同时包括 IPv4 和 IPv6 地址。

为节点之间的流量自动附加和分离出口 IP 地址。这允许命名空间中许多 pod 的流量在集群外的位置上具有一致的源 IP 地址。这也支持 OpenShift SDN 和 OVN-Kubernetes,这是 OpenShift Container Platform 4.19 中的 Red Hat OpenShift Networking 中的默认网络插件。

注意

RHOSP 出口 IP 地址功能会创建一个名为 egressip-<IP address> 的 neutron 保留端口。使用与 OpenShift Container Platform 集群安装相同的 RHOSP 用户,您可以为此保留端口分配一个浮动 IP 地址,以便为出口流量具有可预测的 SNAT 地址。当 RHOSP 网络上的出口 IP 地址从一个节点移到另一个节点时,因为节点故障转移(例如,neutron 保留端口会被删除并重新创建)。这意味着浮动 IP 关联丢失,您需要手动将浮动 IP 地址重新分配给新的保留端口。

注意

当 RHOSP 集群管理员为保留端口分配一个浮动 IP 时,OpenShift Container Platform 无法删除保留端口。CloudPrivateIPConfig 对象无法执行删除和移动操作,直到 RHOSP 集群管理员从保留端口取消分配浮动 IP。

以下示例演示了来自多个公共云提供商上节点的注解。注解被缩进以便于阅读。

AWS 上的 cloud.network.openshift.io/egress-ipconfig 注解示例

cloud.network.openshift.io/egress-ipconfig: [
  {
    "interface":"eni-078d267045138e436",
    "ifaddr":{"ipv4":"10.0.128.0/18"},
    "capacity":{"ipv4":14,"ipv6":15}
  }
]
Copy to Clipboard Toggle word wrap

GCP 上的 cloud.network.openshift.io/egress-ipconfig 注解示例

cloud.network.openshift.io/egress-ipconfig: [
  {
    "interface":"nic0",
    "ifaddr":{"ipv4":"10.0.128.0/18"},
    "capacity":{"ip":14}
  }
]
Copy to Clipboard Toggle word wrap

以下小节描述了支持公共云环境的 IP 地址容量,用于容量计算。

9.1.2.1. Amazon Web Services(AWS)IP 地址容量限制

在 AWS 上,IP 地址分配的限制取决于配置的实例类型。如需更多信息,请参阅 每个实例类型的每个网络接口的 IP 地址

9.1.2.2. Google Cloud Platform(GCP)IP 地址容量限制

在 GCP 中,网络模型通过 IP 地址别名而不是 IP 地址分配来实施额外的节点 IP 地址。但是,IP 地址容量直接映射到 IP 别名容量。

IP 别名分配存在以下容量限制:

  • 每个节点,IPv4 和 IPv6 的最大 IP 别名数为 100 个。
  • 对于每个 VPC,IP 别名的最大数量没有被指定,但 OpenShift Container Platform 可扩展性测试显示最大为 15,000 个。

如需更多信息,请参阅 Per instance 配额和 Alias IP 范围概述

9.1.2.3. Microsoft Azure IP 地址容量限制

在 Azure 上,IP 地址分配有以下容量限制:

  • 对于每个 NIC,对于 IPv4 和 IPv6,可分配 IP 地址的最大数量为 256。
  • 对于每个虚拟网络,分配的 IP 地址的最大数量不能超过 65,536。

如需更多信息,请参阅网络限制

在 OpenShift Container Platform 中,出口 IP 为管理员提供了一种控制网络流量的方法。Egress IP 可以和 br-ex Open vSwitch (OVS) 网桥接口,以及启用了 IP 连接的任何物理接口一起使用。

您可以运行以下命令来检查网络接口类型:

$ ip -details link show
Copy to Clipboard Toggle word wrap

主网络接口被分配一个节点 IP 地址,该地址还包含子网掩码。此节点 IP 地址的信息可以通过检查 k8s.ovn.org/node-primary-ifaddr 注解从集群中的每个节点检索。在 IPv4 集群中,此注解类似以下示例:"k8s.ovn.org/node-primary-ifaddr: {"ipv4":"192.168.111.23/24"}"

如果出口 IP 不在主网络接口子网的子网中,您可以在不是主网络接口类型的另一个 Linux 网络接口中使用出口 IP。这样一来,OpenShift Container Platform 管理员提供了对网络方面的更高级别控制,如路由、寻址、分段和安全策略。此功能允许用户选择通过特定网络接口路由工作负载流量,如流量分段或满足特殊要求。

如果出口 IP 不在主网络接口的子网中,如果节点上存在另一个网络接口,则可能会出现为出口流量选择另一个网络接口。

您可以通过检查 k8s.ovn.org/host-cidrs Kubernetes 节点注解来确定其他哪些网络接口可能支持出口 IP。此注释包含为主网络接口找到的地址和子网掩码。它还包含其他网络接口地址和子网掩码信息。这些地址和子网掩码分配给使用最长前缀匹配路由机制的网络接口,以确定哪个网络接口支持出口 IP。

注意

OVN-Kubernetes 提供了一种机制来控制和直接从特定命名空间和 pod 出站网络流量。这样可确保它通过特定的网络接口和特定的出口 IP 地址退出集群。

为不是主网络接口的网络接口分配出口 IP 的要求

对于希望出口 IP 和流量通过不是主网络接口的特定接口路由的用户,必须满足以下条件:

  • OpenShift Container Platform 安装在裸机集群中。此功能在云或 hypervisor 环境中被禁用。
  • 您的 OpenShift Container Platform pod 没有配置为 host-networked
  • 如果删除了网络接口,或者 IP 地址和子网掩码允许删除在接口上托管的出口 IP,则会重新配置出口 IP。因此,egress IP 可以分配给另一个节点和接口。
  • 如果您在辅助网络接口卡(NIC)上使用 Egress IP 地址,则必须使用 Node Tuning Operator 在二级 NIC 上启用 IP 转发。

9.1.4. 将出口 IP 分配给 pod

要将一个或多个出口 IP 分配给命名空间中的命名空间或特定 pod,必须满足以下条件:

  • 集群中至少有一个节点必须具有 k8s.ovn.org/egress-assignable: "" 标签。
  • 存在一个 EgressIP 对象定义一个或多个出口 IP 地址,用作从命名空间中离开集群的流量的源 IP 地址。
重要

如果您在为出口 IP 分配标记集群中的任何节点之前创建 EgressIP 对象,OpenShift Container Platform 可能会将每个出口 IP 地址分配给第一个节点,并使用 k8s.ovn.org/egress-assignable: "" 标签。

要确保出口 IP 地址在集群中的不同节点广泛分发,请在创建任何 EgressIP 对象前,始终将标签应用到您想托管出口 IP 地址的节点。

9.1.5. 将出口 IP 分配给节点

在创建 EgressIP 对象时,以下条件适用于标记为 k8s.ovn.org/egress-assignable: "" 标签的节点:

  • 每次不会将出口 IP 地址分配给多个节点。
  • 出口 IP 地址可在可以托管出口 IP 地址的可用节点之间平衡。
  • 如果 EgressIP 对象中的 spec.EgressIPs 数组指定了多个 IP 地址,则适用以下条件:

    • 任何节点都不会托管超过一个指定的 IP 地址。
    • 流量在给定命名空间的指定 IP 地址之间大致相等。
  • 如果节点不可用,则会自动重新分配给它的所有出口 IP 地址,但符合前面描述的条件。

当 Pod 与多个 EgressIP 对象的选择器匹配时,无法保证在 EgressIP 对象中指定的出口 IP 地址被分配为 pod 的出口 IP 地址。

另外,如果 EgressIP 对象指定了多个出口 IP 地址,则无法保证可以使用哪些出口 IP 地址。例如,如果 pod 与带有两个出口 IP 地址 (10.10.20.110.10.20.2) 的 EgressIP 对象的选择器匹配,其中任何一个都可以用于每个 TCP 连接或 UDP 对话。

9.1.6. 出口 IP 地址配置架构图

下图显示了出口 IP 地址配置。图中描述了,在一个集群的三个节点上运行的两个不同命名空间中的四个 pod。节点从主机网络上的 192.168.126.0/18 CIDR 块中分配 IP 地址。

Node 1 和 Node 3 都标记为 k8s.ovn.org/egress-assignable: "",因此可用于分配出口 IP 地址。

图中的横线描述了 pod1、pod2 和 pod 3 的流量流,通过 pod 网络来从 Node 1 和 Node 3 出口集群。当外部服务从示例 EgressIP 对象选择的任何 pod 接收流量时,源 IP 地址为 192.168.126.10192.168.126.102。这两个节点之间流量大致平衡。

图中的以下资源被详细描述:

命名空间对象

命名空间在以下清单中定义:

命名空间对象

apiVersion: v1
kind: Namespace
metadata:
  name: namespace1
  labels:
    env: prod
---
apiVersion: v1
kind: Namespace
metadata:
  name: namespace2
  labels:
    env: prod
Copy to Clipboard Toggle word wrap

EgressIP 对象

以下 EgressIP 对象描述了一个配置,该配置选择将 env 标签设置为 prod 的任意命名空间中的所有 pod。所选 pod 的出口 IP 地址为 192.168.126.10192.168.126.102

EgressIP 对象

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: egressips-prod
spec:
  egressIPs:
  - 192.168.126.10
  - 192.168.126.102
  namespaceSelector:
    matchLabels:
      env: prod
status:
  items:
  - node: node1
    egressIP: 192.168.126.10
  - node: node3
    egressIP: 192.168.126.102
Copy to Clipboard Toggle word wrap

对于上例中的配置,OpenShift Container Platform 会为可用节点分配两个出口 IP 地址。status 字段显示是否以及在哪里分配了出口 IP 地址。

9.2. EgressIP 对象

以下 YAML 描述了 EgressIP 对象的 API。对象有效的范围为集群,它不是在命名空间中创建的。

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: <name> 
1

spec:
  egressIPs: 
2

  - <ip_address>
  namespaceSelector: 
3

    ...
  podSelector: 
4

    ...
Copy to Clipboard Toggle word wrap
1
EgressIPs 对象的名称。
2
包括一个或多个 IP 地址的数组。
3
出口 IP 地址与其关联的一个或多个命名空间选择器将。
4
可选:指定命名空间中的 pod 的一个或多个选择器,以将出口 IP 地址与其关联。通过使用这些选择器,可以选择命名空间中的 pod 子集。

以下 YAML 描述了命名空间选择器的小节:

命名空间选择器小节

namespaceSelector: 
1

  matchLabels:
    <label_name>: <label_value>
Copy to Clipboard Toggle word wrap

1
命名空间的一个或多个匹配规则。如果提供多个匹配规则,则会选择所有匹配的命名空间。

以下 YAML 描述了 pod 选择器的可选小节:

Pod 选择器片段

podSelector: 
1

  matchLabels:
    <label_name>: <label_value>
Copy to Clipboard Toggle word wrap

1
可选:与指定 namespaceSelector 规则匹配的命名空间中 pod 的一个或多个匹配规则。如果指定,则仅选择匹配的 pod。命名空间中的其他 Pod 不会被选择。

在以下示例中,EgressIP 对象将 192.168.126.11192.168.126.102 出口 IP 地址与将 app 标签设置为 web 的 pod 关联,并位于将 env 标签设置为 prod 的命名空间中:

EgressIP 对象示例

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: egress-group1
spec:
  egressIPs:
  - 192.168.126.11
  - 192.168.126.102
  podSelector:
    matchLabels:
      app: web
  namespaceSelector:
    matchLabels:
      env: prod
Copy to Clipboard Toggle word wrap

在以下示例中,EgressIP 对象将 192.168.127.30192.168.127.40 出口 IP 地址与任何没有将 environment 标签设置为 development 的 pod 相关联:

EgressIP 对象示例

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: egress-group2
spec:
  egressIPs:
  - 192.168.127.30
  - 192.168.127.40
  namespaceSelector:
    matchExpressions:
    - key: environment
      operator: NotIn
      values:
      - development
Copy to Clipboard Toggle word wrap

9.3. egressIPConfig 对象

作为出口 IP 的功能,reachabilityTotalTimeoutSeconds 参数配置 EgressIP 节点可访问性检查总超时时间(以秒为单位)。如果在这个超时时间内无法访问 EgressIP 节点,则会声明该节点。

您可以在配置文件中为 egressIPConfig 对象设置 reachabilityTotalTimeoutSeconds 的值。设置较大的值可能会导致 EgressIP 实现对节点更改做出反应的速度较慢。对于有问题的 EgressIP 节点,这个实现的反应会较慢。

如果您从 egressIPConfig 对象中省略了 reachabilityTotalTimeoutSeconds 参数,则平台会选择一个合理的默认值,这可能会随时间变化。当前的默认值为 1 秒。0 代表禁用 EgressIP 节点的访问性检查。

以下 egressIPConfig 对象描述了将 reachabilityTotalTimeoutSeconds 从默认的 1 秒探测改为 5 秒探测:

apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  defaultNetwork:
    ovnKubernetesConfig:
      egressIPConfig: 
1

        reachabilityTotalTimeoutSeconds: 5 
2

      gatewayConfig:
        routingViaHost: false
      genevePort: 6081
Copy to Clipboard Toggle word wrap
1
egressIPConfig 包含 EgressIP 对象选项的配置。通过更改这些配置,您可以扩展 EgressIP 对象。
2
reachabilityTotalTimeoutSeconds 的值接受从 060 的整数值。0 代表禁用 egressIP 节点的访问性检查。将 1 的值设置为 60 对应于探测向节点发送可达性检查的超时时间(以秒为单位)。

9.4. 标记节点以托管出口 IP 地址

您可以将 k8s.ovn.org/egress-assignable="" 标签应用到集群中的节点,以便 OpenShift Container Platform 可以为该节点分配一个或多个出口 IP 地址。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以集群管理员身份登录集群。

流程

  • 要标记节点,使其可以托管一个或多个出口 IP 地址,请输入以下命令:

    $ oc label nodes <node_name> k8s.ovn.org/egress-assignable="" 
    1
    Copy to Clipboard Toggle word wrap
    1
    要标记的节点的名称。
    提示

    您还可以应用以下 YAML 将标签添加到节点:

    apiVersion: v1
    kind: Node
    metadata:
      labels:
        k8s.ovn.org/egress-assignable: ""
      name: <node_name>
    Copy to Clipboard Toggle word wrap

9.5. 后续步骤

第 10 章 分配出口 IP 地址

作为集群管理员,您可以为从一个命名空间中,或从一个命名空间内的特定 pod 中离开集群的网络流量分配一个出口 IP 地址。

10.1. 为一个命名空间分配出口 IP 地址

您可以将一个或多个出口 IP 地址分配给一个命名空间,或分配给命名空间中的特定 pod。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以集群管理员身份登录集群。
  • 至少配置一个节点来托管出口 IP 地址。

流程

  1. 创建 EgressIP 对象:

    1. 创建一个 <egressips_name>.yaml 文件,其中 <egressips_name> 是对象的名称。
    2. 在您创建的文件中,定义一个 EgressIP 对象,如下例所示:

      apiVersion: k8s.ovn.org/v1
      kind: EgressIP
      metadata:
        name: egress-project1
      spec:
        egressIPs:
        - 192.168.127.10
        - 192.168.127.11
        namespaceSelector:
          matchLabels:
            env: qa
      Copy to Clipboard Toggle word wrap
  2. 运行以下命令来创建对象。

    $ oc apply -f <egressips_name>.yaml 
    1
    Copy to Clipboard Toggle word wrap
    1
    <egressips_name> 替换为对象的名称。

    输出示例

    egressips.k8s.ovn.org/<egressips_name> created
    Copy to Clipboard Toggle word wrap

  3. 可选:保存 <egressips_name>.yaml 文件,以便稍后进行修改。
  4. 为需要出口 IP 地址的命名空间添加标签。要在第 1 步中定义的 EgressIP 对象的命名空间中添加标签,请运行以下命令:

    $ oc label ns <namespace> env=qa 
    1
    Copy to Clipboard Toggle word wrap
    1
    <namespace> 替换为需要出口 IP 地址的命名空间。

验证

  • 要显示集群中所有正在使用的出口 IP,请输入以下命令:

    $ oc get egressip -o yaml
    Copy to Clipboard Toggle word wrap
    注意

    无论配置了多少个出口 IP 地址,oc get egressip 只返回一个出口 IP 地址。这并不是程序错误,它是 Kubernetes 的一个限制。作为临时解决方案,您可以传递 -o yaml-o json 标志来返回所有正在使用的出口 IP 地址。

    输出示例

    # ...
    spec:
      egressIPs:
      - 192.168.127.10
      - 192.168.127.11
    # ...
    Copy to Clipboard Toggle word wrap

第 11 章 配置出口服务

作为集群管理员,您可以使用 egress 服务为负载均衡器服务后面的 pod 配置出口流量。

重要

出口服务只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

您可以使用以下方法使用 EgressService 自定义资源(CR)管理出口流量:

  • 将负载均衡器服务 IP 地址分配为负载均衡器服务后面的 pod 的源 IP 地址。

    将负载均衡器 IP 地址分配在这个上下文中的源 IP 地址对于显示单个出口和入口点很有用。例如,在某些情况下,与负载均衡器服务后面的应用程序通信的外部系统可能会预期应用程序的源和目标 IP 地址相同。

    注意

    当您将负载均衡器服务 IP 地址分配给服务后面的 pod 的出口流量时,OVN-Kubernetes 会将入口和出口点限制为单一节点。这限制了 MetalLB 通常提供的流量的负载均衡。

  • 将负载均衡器后面的 pod 的出口流量分配给与默认节点网络不同的网络。

    这可用于将负载均衡器后面的应用程序的出口流量分配给与默认网络不同的网络。通常,不同的网络通过使用与网络接口关联的 VRF 实例来实施。

11.1. 出口服务自定义资源

EgressService 自定义资源中定义出口服务的配置。以下 YAML 描述了配置出口服务的字段:

apiVersion: k8s.ovn.org/v1
kind: EgressService
metadata:
  name: <egress_service_name> 
1

  namespace: <namespace> 
2

spec:
  sourceIPBy: <egress_traffic_ip> 
3

  nodeSelector: 
4

    matchLabels:
      node-role.kubernetes.io/<role>: ""
  network: <egress_traffic_network> 
5
Copy to Clipboard Toggle word wrap
1
指定出口服务的名称。EgressService 资源的名称必须与您要修改的负载均衡器服务的名称匹配。
2
指定出口服务的命名空间。EgressService 的命名空间必须与您要修改的负载均衡器服务的命名空间匹配。egress 服务是命名空间范围的。
3
为服务后面的 pod 指定出口流量的源 IP 地址。有效值为 LoadBalancerIPNetwork。使用 LoadBalancerIP 值将 LoadBalancer 服务入口 IP 地址分配为出口流量的源 IP 地址。指定 Network 将网络接口 IP 地址分配为出口流量的源 IP 地址。
4
可选: 如果您将 LoadBalancerIP 值用于 sourceIPBy 规格,则单一节点处理 LoadBalancer 服务流量。使用 nodeSelector 字段来限制哪些节点可以被分配。当选择节点来处理服务流量时,OVN-Kubernetes 以以下格式标记节点:egress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""。如果没有指定 nodeSelector 字段,任何节点都可以管理 LoadBalancer 服务流量。
5
可选:指定出口流量的路由表 ID。确保值与 NodeNetworkConfigurationPolicy 资源中定义的 route-table-id ID 匹配。如果没有 network 规格,egress 服务将使用默认主机网络。

出口服务规格示例

apiVersion: k8s.ovn.org/v1
kind: EgressService
metadata:
  name: test-egress-service
  namespace: test-namespace
spec:
  sourceIPBy: "LoadBalancerIP"
  nodeSelector:
    matchLabels:
      vrf: "true"
  network: "2"
Copy to Clipboard Toggle word wrap

11.2. 部署出口服务

您可以部署出口服务,以管理 LoadBalancer 服务后面的 pod 的出口流量。

以下示例将出口流量配置为具有与 LoadBalancer 服务的入口 IP 地址相同的源 IP 地址。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。
  • 已配置了 MetalLB BGPPeer 资源。

流程

  1. 为服务创建一个带有所需 IP 的 IPAddressPool CR:

    1. 创建一个文件,如 ip-addr-pool.yaml,其内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        name: example-pool
        namespace: metallb-system
      spec:
        addresses:
        - 172.19.0.100/32
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,为 IP 地址池应用配置:

      $ oc apply -f ip-addr-pool.yaml
      Copy to Clipboard Toggle word wrap
  2. 创建 ServiceEgressService CR:

    1. 创建一个文件,如 service-egress-service.yaml,其内容类似以下示例:

      apiVersion: v1
      kind: Service
      metadata:
        name: example-service
        namespace: example-namespace
        annotations:
          metallb.io/address-pool: example-pool 
      1
      
      spec:
        selector:
          app: example
        ports:
          - name: http
            protocol: TCP
            port: 8080
            targetPort: 8080
        type: LoadBalancer
      ---
      apiVersion: k8s.ovn.org/v1
      kind: EgressService
      metadata:
        name: example-service
        namespace: example-namespace
      spec:
        sourceIPBy: "LoadBalancerIP" 
      2
      
        nodeSelector: 
      3
      
          matchLabels:
            node-role.kubernetes.io/worker: ""
      Copy to Clipboard Toggle word wrap
      1
      LoadBalancer 服务使用 MetalLB 从 example-pool IP 地址池分配的 IP 地址。
      2
      本例使用 LoadBalancerIP 值来分配 LoadBalancer 服务的入口 IP 地址,作为出口流量的源 IP 地址。
      3
      当您指定 LoadBalancerIP 值时,单个节点处理 LoadBalancer 服务的流量。在本例中,只能选择具有 worker 标签的节点来处理流量。当选择节点时,OVN-Kubernetes 会以 egress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: "" 格式标记节点。
      注意

      如果使用 sourceIPBy: "LoadBalancerIP" 设置,您必须在 BGPAdvertisement 自定义资源(CR) 中指定 load-balancer 节点。

    2. 运行以下命令,为服务和出口服务应用配置:

      $ oc apply -f service-egress-service.yaml
      Copy to Clipboard Toggle word wrap
  3. 创建 BGPAdvertisement CR 来公告服务:

    1. 创建一个文件,如 service-bgp-advertisement.yaml,其内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: example-bgp-adv
        namespace: metallb-system
      spec:
        ipAddressPools:
        - example-pool
        nodeSelectors:
        - matchLabels:
            egress-service.k8s.ovn.org/example-namespace-example-service: "" 
      1
      Copy to Clipboard Toggle word wrap
      1
      在本例中,EgressService CR 将出口流量的源 IP 地址配置为使用负载均衡器服务 IP 地址。因此,您必须指定负载均衡器节点返回流量,以便为来自 pod 的流量使用相同的返回路径。

验证

  1. 运行以下命令,验证您可以访问 MetalLB 服务后运行的 pod 的应用程序端点:

    $ curl <external_ip_address>:<port_number> 
    1
    Copy to Clipboard Toggle word wrap
    1
    更新外部 IP 地址和端口号,以适合您的应用程序端点。
  2. 如果您将 LoadBalancer 服务的入口 IP 地址分配为出口流量的源 IP 地址,请使用 tcpdump 等工具分析外部客户端接收的数据包来验证此配置。

第 12 章 使用出口路由器 pod 的注意事项

12.1. 关于出口路由器 pod

OpenShift Container Platform 出口路由器(egress router ) pod 使用一个来自专用的私有源 IP 地址,将网络流量重定向到指定的远程服务器。出口路由器 pod 可以将网络流量发送到设置为仅允许从特定 IP 地址访问的服务器。

注意

出口路由器 pod 并不适用于所有外向的连接。创建大量出口路由器 pod 可能会超过您的网络硬件的限制。例如,为每个项目或应用程序创建出口路由器 pod 可能会导致,在转换为使用软件来进行 MAC 地址过滤前超过了网络接口可以处理的本地 MAC 地址的数量。

重要

出口路由器镜像与 Amazon AWS、Azure Cloud 或其他不支持第 2 层操作的云平台不兼容,因为它们与 macvlan 流量不兼容。

12.1.1. 出口路由器模式

重定向模式中,出口路由器 Pod 配置 iptables 规则,将流量从其自身 IP 地址重定向到一个或多个目标 IP 地址。需要使用保留源 IP 地址的客户端 pod 必须配置为访问出口路由器的服务,而不是直接连接到目标 IP。您可以使用 curl 命令从应用程序 pod 访问目标服务和端口。例如:

$ curl <router_service_IP> <port>
Copy to Clipboard Toggle word wrap
注意

egress router CNI 插件只支持重定向模式。egress router CNI 插件不支持 HTTP 代理模式或 DNS 代理模式。

12.1.2. 出口路由器 pod 的实现

出口路由器实施使用出口路由器 Container Network Interface(CNI)插件。该插件将二级网络接口添加到 pod。

出口路由器是一个带有两个网络接口的 pod。例如,pod 可以具有 eth0net1 网络接口。eth0 接口位于集群网络中,pod 将继续将接口用于与集群相关的普通网络流量。net1 接口位于第二个网络中,它拥有那个网络的 IP 地址和网关。OpenShift Container Platform 集群中的其他 pod 可以访问出口路由器服务,服务使 pod 可以访问外部服务。出口路由器作为 pod 和外部系统间的桥接。

离开出口路由器的流量会通过一个节点退出,但数据包带有来自路由器 pod 的 net1 接口的 MAC 地址。

添加出口路由器自定义资源时,Cluster Network Operator 会创建以下对象:

  • pod 的 net1 二级网络接口的网络附加定义。
  • 出口路由器的部署。

如果您删除了一个出口路由器自定义资源,Operator 会删除上列表中与出口路由器关联的两个对象。

12.1.3. 部署注意事项

出口路由器 pod 会为节点的主网络接口添加额外的 IP 地址和 MAC 地址。因此,您可能需要配置虚拟机监控程序或云供应商来允许额外的地址。

Red Hat OpenStack Platform (RHOSP)

如果在 RHOSP 上部署 OpenShift Container Platform,则必须允许来自 OpenStack 环境上的出口路由器 Pod 的 IP 和 MAC 地址的流量。如果您不允许流量,则通信会失败

$ openstack port set --allowed-address \
  ip_address=<ip_address>,mac_address=<mac_address> <neutron_port_uuid>
Copy to Clipboard Toggle word wrap
VMware vSphere
如果您使用 VMware vSphere,请参阅 VMware 文档来保护 vSphere 标准交换机。通过从 vSphere Web 客户端中选择主机虚拟交换机来查看并更改 VMware vSphere 默认设置。

具体来说,请确保启用了以下功能:

12.1.4. 故障切换配置

为了避免停机,Cluster Network Operator 会将出口路由器 pod 部署为部署资源。部署名称为 egress-router-cni-deployment。与部署对应的 pod 具有 app=egress-router-cni 标签。

要为部署创建新服务,请使用 oc expose deployment/egress-router-cni-deployment --port <port_number> 命令或创建类似以下示例的文件:

apiVersion: v1
kind: Service
metadata:
  name: app-egress
spec:
  ports:
  - name: tcp-8080
    protocol: TCP
    port: 8080
  - name: tcp-8443
    protocol: TCP
    port: 8443
  - name: udp-80
    protocol: UDP
    port: 80
  type: ClusterIP
  selector:
    app: egress-router-cni
Copy to Clipboard Toggle word wrap

第 13 章 以重定向模式部署出口路由器 pod

作为集群管理员,您可以部署出口路由器 Pod,将流量重新指向来自保留源 IP 地址的指定目标 IP 地址。

出口路由器实施使用出口路由器 Container Network Interface(CNI)插件。

13.1. 出口路由器自定义资源

在出口路由器自定义资源中定义出口路由器 pod 的配置。以下 YAML 描述了以重定向模式配置出口路由器的字段:

apiVersion: network.operator.openshift.io/v1
kind: EgressRouter
metadata:
  name: <egress_router_name>
  namespace: <namespace>  
1

spec:
  addresses: [  
2

    {
      ip: "<egress_router>",  
3

      gateway: "<egress_gateway>"  
4

    }
  ]
  mode: Redirect
  redirect: {
    redirectRules: [  
5

      {
        destinationIP: "<egress_destination>",
        port: <egress_router_port>,
        targetPort: <target_port>,  
6

        protocol: <network_protocol>  
7

      },
      ...
    ],
    fallbackIP: "<egress_destination>" 
8

  }
Copy to Clipboard Toggle word wrap
1
可选: namespace 字段指定要在其中创建出口路由器的命名空间。如果您没有在文件或命令行中指定值,则会使用 default 命名空间。
2
address 字段指定要在第二个网络接口上配置的 IP 地址。
3
ip 字段指定节点用于出口路由器 pod 的物理网络中保留源 IP 地址和子网掩码。使用 CIDR 表示法指定 IP 地址和网络掩码。
4
gateway 字段指定网络网关的 IP 地址。
5
可选: redirectRules 字段指定出口目的地 IP 地址、出口路由器端口和协议的组合。到指定端口和协议中的出口路由器的传入连接路由到目标 IP 地址。
6
可选: targetPort 字段指定目标 IP 地址上的网络端口。如果没有指定此字段,流量将路由到它到达的同一网络端口。
7
protocol 字段支持 TCP、UDP 或 SCTP。
8
可选: fallbackIP 字段指定目标 IP 地址。如果没有指定任何重定向规则,出口路由器会将所有流量发送到这个回退 IP 地址。如果您指定了重定向规则,则出口路由器将任何与规则中定义的网络端口的连接发送到这个回退 IP 地址。如果没有指定此字段,出口路由器会拒绝与规则中没有定义的网络端口的连接。

出口路由器规格示例

apiVersion: network.operator.openshift.io/v1
kind: EgressRouter
metadata:
  name: egress-router-redirect
spec:
  networkInterface: {
    macvlan: {
      mode: "Bridge"
    }
  }
  addresses: [
    {
      ip: "192.168.12.99/24",
      gateway: "192.168.12.1"
    }
  ]
  mode: Redirect
  redirect: {
    redirectRules: [
      {
        destinationIP: "10.0.0.99",
        port: 80,
        protocol: UDP
      },
      {
        destinationIP: "203.0.113.26",
        port: 8080,
        targetPort: 80,
        protocol: TCP
      },
      {
        destinationIP: "203.0.113.27",
        port: 8443,
        targetPort: 443,
        protocol: TCP
      }
    ]
  }
Copy to Clipboard Toggle word wrap

13.2. 以重定向模式部署出口路由器

您可以部署出口路由器,将其自身保留源 IP 地址的流量重定向到一个或多个目标 IP 地址。

添加出口路由器后,需要使用保留源 IP 地址的客户端 pod 必须修改为连接到出口路由器,而不是直接连接到目标 IP。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建出口路由器定义。
  2. 为确保其他 pod 可以找到出口路由器 pod 的 IP 地址,请创建一个使用出口路由器的服务,如下例所示:

    apiVersion: v1
    kind: Service
    metadata:
      name: egress-1
    spec:
      ports:
      - name: web-app
        protocol: TCP
        port: 8080
      type: ClusterIP
      selector:
        app: egress-router-cni 
    1
    Copy to Clipboard Toggle word wrap
    1
    指定出口路由器的标签。显示的值由 Cluster Network Operator 添加,且不可配置。

    创建服务后,您的 Pod 可以连接到该服务。出口路由器 pod 将流量重定向到目标 IP 地址中对应的端口。连接来自保留的源 IP 地址。

验证

要验证 Cluster Network Operator 是否启动了出口路由器,请完成以下步骤:

  1. 查看 Operator 为出口路由器创建的网络附加定义:

    $ oc get network-attachment-definition egress-router-cni-nad
    Copy to Clipboard Toggle word wrap

    网络附加定义的名称不可配置。

    输出示例

    NAME                    AGE
    egress-router-cni-nad   18m
    Copy to Clipboard Toggle word wrap

  2. 查看出口路由器 pod 的部署:

    $ oc get deployment egress-router-cni-deployment
    Copy to Clipboard Toggle word wrap

    部署的名称不可配置。

    输出示例

    NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
    egress-router-cni-deployment   1/1     1            1           18m
    Copy to Clipboard Toggle word wrap

  3. 查看出口路由器 pod 的状态:

    $ oc get pods -l app=egress-router-cni
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                            READY   STATUS    RESTARTS   AGE
    egress-router-cni-deployment-575465c75c-qkq6m   1/1     Running   0          18m
    Copy to Clipboard Toggle word wrap

  4. 查看出口路由器 pod 的日志和路由表。
  1. 获取出口路由器 pod 的节点名称:

    $ POD_NODENAME=$(oc get pod -l app=egress-router-cni -o jsonpath="{.items[0].spec.nodeName}")
    Copy to Clipboard Toggle word wrap
  2. 在目标节点上进入一个 debug 会话。此步骤被实例化为一个名为 <node_name>-debug 的 debug pod:

    $ oc debug node/$POD_NODENAME
    Copy to Clipboard Toggle word wrap
  3. /host 设为 debug shell 中的根目录。debug pod 在 pod 中的 /host 中挂载主机 的 root 文件系统。将根目录改为 /host,您可以从主机的可执行路径中运行二进制文件:

    # chroot /host
    Copy to Clipboard Toggle word wrap
  4. chroot 环境控制台中显示出口路由器日志:

    # cat /tmp/egress-router-log
    Copy to Clipboard Toggle word wrap

    输出示例

    2021-04-26T12:27:20Z [debug] Called CNI ADD
    2021-04-26T12:27:20Z [debug] Gateway: 192.168.12.1
    2021-04-26T12:27:20Z [debug] IP Source Addresses: [192.168.12.99/24]
    2021-04-26T12:27:20Z [debug] IP Destinations: [80 UDP 10.0.0.99/30 8080 TCP 203.0.113.26/30 80 8443 TCP 203.0.113.27/30 443]
    2021-04-26T12:27:20Z [debug] Created macvlan interface
    2021-04-26T12:27:20Z [debug] Renamed macvlan to "net1"
    2021-04-26T12:27:20Z [debug] Adding route to gateway 192.168.12.1 on macvlan interface
    2021-04-26T12:27:20Z [debug] deleted default route {Ifindex: 3 Dst: <nil> Src: <nil> Gw: 10.128.10.1 Flags: [] Table: 254}
    2021-04-26T12:27:20Z [debug] Added new default route with gateway 192.168.12.1
    2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p UDP --dport 80 -j DNAT --to-destination 10.0.0.99
    2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p TCP --dport 8080 -j DNAT --to-destination 203.0.113.26:80
    2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p TCP --dport 8443 -j DNAT --to-destination 203.0.113.27:443
    2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat -o net1 -j SNAT --to-source 192.168.12.99
    Copy to Clipboard Toggle word wrap

    当您启动出口路由器时,通过创建 EgressRouter 对象来启动出口路由器时,日志文件位置和日志记录级别不可配置,如下所述。

  5. chroot 环境控制台中获取容器 ID:

    # crictl ps --name egress-router-cni-pod | awk '{print $1}'
    Copy to Clipboard Toggle word wrap

    输出示例

    CONTAINER
    bac9fae69ddb6
    Copy to Clipboard Toggle word wrap

  6. 确定容器的进程 ID。在本例中,容器 ID 是 bac9fae69ddb6

    # crictl inspect -o yaml bac9fae69ddb6 | grep 'pid:' | awk '{print $2}'
    Copy to Clipboard Toggle word wrap

    输出示例

    68857
    Copy to Clipboard Toggle word wrap

  7. 输入容器的网络命名空间:

    # nsenter -n -t 68857
    Copy to Clipboard Toggle word wrap
  8. 显示路由表:

    # ip route
    Copy to Clipboard Toggle word wrap

    在以下示例输出中,net1 网络接口是默认路由。集群网络的流量使用 eth0 网络接口。192.168.12.0/24 网络的流量使用 net1 网络接口,并来自保留源 IP 地址 192.168.12.99。pod 将所有其他流量路由到网关的 IP 地址 192.168.12.1。不显示服务网络的路由。

    输出示例

    default via 192.168.12.1 dev net1
    10.128.10.0/23 dev eth0 proto kernel scope link src 10.128.10.18
    192.168.12.0/24 dev net1 proto kernel scope link src 192.168.12.99
    192.168.12.1 dev net1
    Copy to Clipboard Toggle word wrap

第 14 章 为项目启用多播

14.1. 关于多播

通过使用 IP 多播,数据可同时广播到许多 IP 地址。

重要
  • 目前,多播最适用于低带宽协调或服务发现。它不是一个高带宽解决方案。
  • 默认情况下,网络策略会影响命名空间中的所有连接。但是,多播不受网络策略的影响。如果在与网络策略相同的命名空间中启用了多播,则始终允许多播,即使有一个 deny-all 网络策略。在启用网络策略前,集群管理员应考虑对多播的影响。

默认情况下,OpenShift Container Platform pod 之间多播流量被禁用。如果使用 OVN-Kubernetes 网络插件,可以根据每个项目启用多播。

14.2. 启用 pod 间多播

您可以为项目启用 pod 间多播。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 您必须作为 cluster-admin 角色用户登录集群。

流程

  • 运行以下命令,为项目启用多播。使用您要启用多播的项目的名称替换 <namespace>

    $ oc annotate namespace <namespace> \
        k8s.ovn.org/multicast-enabled=true
    Copy to Clipboard Toggle word wrap
    提示

    您还可以应用以下 YAML 来添加注解:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: <namespace>
      annotations:
        k8s.ovn.org/multicast-enabled: "true"
    Copy to Clipboard Toggle word wrap

验证

要验证项目是否启用了多播,请完成以下步骤:

  1. 将您的当前项目更改为启用多播的项目。使用项目名替换 <project>

    $ oc project <project>
    Copy to Clipboard Toggle word wrap
  2. 创建 pod 以作为多播接收器:

    $ cat <<EOF| oc create -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: mlistener
      labels:
        app: multicast-verify
    spec:
      containers:
        - name: mlistener
          image: registry.access.redhat.com/ubi9
          command: ["/bin/sh", "-c"]
          args:
            ["dnf -y install socat hostname && sleep inf"]
          ports:
            - containerPort: 30102
              name: mlistener
              protocol: UDP
    EOF
    Copy to Clipboard Toggle word wrap
  3. 创建 pod 以作为多播发送器:

    $ cat <<EOF| oc create -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: msender
      labels:
        app: multicast-verify
    spec:
      containers:
        - name: msender
          image: registry.access.redhat.com/ubi9
          command: ["/bin/sh", "-c"]
          args:
            ["dnf -y install socat && sleep inf"]
    EOF
    Copy to Clipboard Toggle word wrap
  4. 在新的终端窗口或选项卡中,启动多播监听程序。

    1. 获得 Pod 的 IP 地址:

      $ POD_IP=$(oc get pods mlistener -o jsonpath='{.status.podIP}')
      Copy to Clipboard Toggle word wrap
    2. 输入以下命令启动多播监听程序:

      $ oc exec mlistener -i -t -- \
          socat UDP4-RECVFROM:30102,ip-add-membership=224.1.0.1:$POD_IP,fork EXEC:hostname
      Copy to Clipboard Toggle word wrap
  5. 启动多播传输。

    1. 获取 pod 网络 IP 地址范围:

      $ CIDR=$(oc get Network.config.openshift.io cluster \
          -o jsonpath='{.status.clusterNetwork[0].cidr}')
      Copy to Clipboard Toggle word wrap
    2. 要发送多播信息,请输入以下命令:

      $ oc exec msender -i -t -- \
          /bin/bash -c "echo | socat STDIO UDP4-DATAGRAM:224.1.0.1:30102,range=$CIDR,ip-multicast-ttl=64"
      Copy to Clipboard Toggle word wrap

      如果多播正在工作,则上一个命令会返回以下输出:

      mlistener
      Copy to Clipboard Toggle word wrap

第 15 章 为项目禁用多播

15.1. 禁用 pod 间多播

您可以为项目禁用 pod 间多播。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 您必须作为 cluster-admin 角色用户登录集群。

流程

  • 运行以下命令来禁用多播:

    $ oc annotate namespace <namespace> \ 
    1
    
        k8s.ovn.org/multicast-enabled-
    Copy to Clipboard Toggle word wrap
    1
    您要禁用多播的项目的 namespace
    提示

    您还可以应用以下 YAML 来删除注解:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: <namespace>
      annotations:
        k8s.ovn.org/multicast-enabled: null
    Copy to Clipboard Toggle word wrap

第 16 章 跟踪网络流

作为集群管理员,您可以从集群中收集有关 pod 网络流的信息,以帮助以下区域:

  • 监控 pod 网络上的入口和出口流量。
  • 对性能问题进行故障排除。
  • 为容量规划和安全审计收集数据。

当您启用网络流的集合时,只会收集与流量相关的元数据。例如,不会收集实际的数据包数据,而是只收集协议、源地址、目标地址、端口号、字节数和其他数据包级别的信息。

数据采用以下一种或多种记录格式收集:

  • NetFlow
  • sFlow
  • IPFIX

当您使用一个或多个收集器 IP 地址和端口号配置 Cluster Network Operator(CNO)时,Operator 会在每个节点上配置 Open vSwitch(OVS),以将网络流记录发送到每个收集器。

您可以将 Operator 配置为将记录发送到多种类型的网络流收集器。例如,您可以将记录发送到 NetFlow 收集器,并将记录发送到 sFlow 收集器。

当 OVS 向收集器发送数据时,每种类型的收集器接收相同的记录。例如,如果您配置两个 NetFlow 收集器,节点上的 OVS 会将相同的记录发送到两个收集器。如果您还配置了两个 sFlow 收集器,则两个 sFlow 收集器将接收相同的记录。但是,每个收集器类型都具有唯一的记录格式。

收集网络流数据并将记录发送到收集器会影响性能。节点处理数据包的速度较慢。如果性能影响太大,您可以删除收集器的目的地,以禁用收集网络流数据并恢复性能。

注意

启用网络流收集器可能会影响集群网络的整体性能。

16.1. 用于跟踪网络流的网络对象配置

下表显示了在 Cluster Network Operator(CNO)中配置网络流收集器的字段:

Expand
表 16.1. 网络流配置
字段类型描述

metadata.name

字符串

CNO 对象的名称。这个名称始终是 集群

spec.exportNetworkFlows

object

一个或多个 netFlowsFlowipfix.

spec.exportNetworkFlows.netFlow.collectors

数组

最多 10 个收集器的 IP 地址和网络端口对列表。

spec.exportNetworkFlows.sFlow.collectors

数组

最多 10 个收集器的 IP 地址和网络端口对列表。

spec.exportNetworkFlows.ipfix.collectors

数组

最多 10 个收集器的 IP 地址和网络端口对列表。

将以下清单应用到 CNO 后,Operator 会在集群中的每个节点上配置 Open vSwitch(OVS),将网络流记录发送到侦听 192.168.1.99:2056 的 NetFlow 收集器。

跟踪网络流的配置示例

apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  exportNetworkFlows:
    netFlow:
      collectors:
        - 192.168.1.99:2056
Copy to Clipboard Toggle word wrap

16.2. 为网络流收集器添加目的地

作为集群管理器,您可以将 Cluster Network Operator(CNO)配置为发送有关 pod 网络的网络流元数据到网络流收集器。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。
  • 您有一个网络流收集器,知道它所侦听的 IP 地址和端口。

流程

  1. 创建补丁文件,用于指定网络流收集器类型以及收集器的 IP 地址和端口信息:

    spec:
      exportNetworkFlows:
        netFlow:
          collectors:
            - 192.168.1.99:2056
    Copy to Clipboard Toggle word wrap
  2. 使用网络流收集器配置 CNO:

    $ oc patch network.operator cluster --type merge -p "$(cat <file_name>.yaml)"
    Copy to Clipboard Toggle word wrap

    输出示例

    network.operator.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

验证

通常情况不需要进行验证。您可以运行以下命令,确认每个节点上的 Open vSwitch(OVS)已配置为将网络流记录发送到一个或多个收集器。

  1. 查看 Operator 配置,确认配置了 exportNetworkFlows 字段:

    $ oc get network.operator cluster -o jsonpath="{.spec.exportNetworkFlows}"
    Copy to Clipboard Toggle word wrap

    输出示例

    {"netFlow":{"collectors":["192.168.1.99:2056"]}}
    Copy to Clipboard Toggle word wrap

  2. 查看每个节点中的 OVS 网络流配置:

    $ for pod in $(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node -o jsonpath='{range@.items[*]}{.metadata.name}{"\n"}{end}');
      do ;
        echo;
        echo $pod;
        oc -n openshift-ovn-kubernetes exec -c ovnkube-controller $pod \
          -- bash -c 'for type in ipfix sflow netflow ; do ovs-vsctl find $type ; done';
    done
    Copy to Clipboard Toggle word wrap

    输出示例

    ovnkube-node-xrn4p
    _uuid               : a4d2aaca-5023-4f3d-9400-7275f92611f9
    active_timeout      : 60
    add_id_to_interface : false
    engine_id           : []
    engine_type         : []
    external_ids        : {}
    targets             : ["192.168.1.99:2056"]
    
    ovnkube-node-z4vq9
    _uuid               : 61d02fdb-9228-4993-8ff5-b27f01a29bd6
    active_timeout      : 60
    add_id_to_interface : false
    engine_id           : []
    engine_type         : []
    external_ids        : {}
    targets             : ["192.168.1.99:2056"]-
    
    ...
    Copy to Clipboard Toggle word wrap

16.3. 删除网络流收集器的所有目的地

作为集群管理员,您可以配置 Cluster Network Operator(CNO)来停止将网络流元数据发送到网络流收集器。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用具有 cluster-admin 权限的用户登陆到集群。

流程

  1. 删除所有网络流收集器:

    $ oc patch network.operator cluster --type='json' \
        -p='[{"op":"remove", "path":"/spec/exportNetworkFlows"}]'
    Copy to Clipboard Toggle word wrap

    输出示例

    network.operator.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

第 17 章 配置混合联网

作为集群管理员,您可以配置 Red Hat OpenShift Networking OVN-Kubernetes 网络插件,以允许 Linux 和 Windows 节点分别托管 Linux 和 Windows 工作负载。

17.1. 使用 OVN-Kubernetes 配置混合网络

您可以将集群配置为使用 OVN-Kubernetes 网络插件的混合网络。这允许支持不同节点网络配置的混合集群。

注意

此配置是在同一集群中同时运行 Linux 和 Windows 节点所必需的。

先决条件

  • 安装 OpenShift CLI (oc) 。
  • 以具有 cluster-admin 权限的用户身份登录集群。
  • 确保集群使用 OVN-Kubernetes 网络插件。

流程

  1. 要配置 OVN-Kubernetes 混合网络覆盖,请输入以下命令:

    $ oc patch networks.operator.openshift.io cluster --type=merge \
      -p '{
        "spec":{
          "defaultNetwork":{
            "ovnKubernetesConfig":{
              "hybridOverlayConfig":{
                "hybridClusterNetwork":[
                  {
                    "cidr": "<cidr>",
                    "hostPrefix": <prefix>
                  }
                ],
                "hybridOverlayVXLANPort": <overlay_port>
              }
            }
          }
        }
      }'
    Copy to Clipboard Toggle word wrap

    其中:

    cidr
    指定用于额外覆盖网络上节点的 CIDR 配置。这个 CIDR 不能与集群网络 CIDR 重叠。
    hostPrefix
    指定要分配给每个节点的子网前缀长度。例如,如果 hostPrefix 设为 23,则每个节点从 given cidr 中分配 a /23 子网,这样就能有 510(2^(32 - 23)- 2)个 pod IP 地址。如果需要从外部网络访问节点,请配置负载均衡器和路由器来管理流量。
    hybridOverlayVXLANPort

    为额外覆盖网络指定自定义 VXLAN 端口。这是在 vSphere 上安装的集群中运行 Windows 节点所需要的,且不得为任何其他云供应商配置。自定义端口可以是除默认 4789 端口外的任何打开的端口。有关此要求的更多信息,请参阅 Microsoft 文档中的 主机间的 Pod 到 pod 的连接性

    注意

    Windows Server Long-Term Servicing Channel(LTSC):Windows Server 2019 在带有自定义 hybridOverlayVXLANPort 值的集群中不被支持,因为这个 Windows server 版本不支持选择使用自定义的 VXLAN 端口。

    输出示例

    network.operator.openshift.io/cluster patched
    Copy to Clipboard Toggle word wrap

  2. 要确认配置是活跃的,请输入以下命令。应用更新可能需要几分钟。

    $ oc get network.operator.openshift.io -o jsonpath="{.items[0].spec.defaultNetwork.ovnKubernetesConfig}"
    Copy to Clipboard Toggle word wrap

Legal Notice

Copyright © 2025 Red Hat

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat