网络


Red Hat build of MicroShift 4.12

配置和管理集群网络

Red Hat OpenShift Documentation Team

摘要

本文档提供有关配置和管理 MicroShift 集群网络的说明,包括 DNS、ingress 和 Pod 网络。

第 1 章 了解网络设置

了解如何将网络自定义和默认设置应用到红帽构建的 MicroShift 部署。每个节点都包含在单个机器和单个红帽构建 MicroShift 中,因此每个部署都需要单独的配置、Pod 和设置。

集群管理员有几个选项用于公开集群内的应用程序到外部流量并确保网络连接:

  • 服务,如 NodePort
  • API 资源,如 IngressRoute

默认情况下,Kubernetes 为 pod 内运行的应用分配内部 IP 地址。Pod 及其容器之间可以有网络流量,但集群外的客户端无法直接访问容器集,除非通过一个服务(如 NodePort)公开。

1.1. 关于 OVN-Kubernetes 网络插件

OVN-Kubernetes 是红帽构建的 MicroShift 部署的默认网络解决方案。OVN-Kubernetes 是 pod 和基于 Open Virtual Network (OVN) 的服务的虚拟网络。OVN-Kubernetes Container Network Interface (CNI) 插件是集群的网络插件。使用 OVN-Kubernetes 网络插件的集群也会在节点上运行 Open vSwitch (OVS)。OVN 在节点上配置 OVS,以实施声明的网络配置。

1.1.1. 网络拓扑

OVN-Kubernetes 提供基于 overlay 的网络实现。此覆盖包括基于 OVS 的服务和 NetworkPolicy 实施。覆盖网络使用 geneve 隧道,因此 pod 最大传输单元 (MTU) 被设置为小于主机上物理接口的更小,以删除隧道标头。

OVS 作为 systemd 服务在 MicroShift 节点的红帽构建上运行。OVS RPM 软件包作为对 microshift-networking RPM 软件包的依赖项安装。安装了 microshift-networking RPM 时,OVS 会立即启动。

1.1.1.1. IP 转发

启动时,ovnkube-master 容器会自动启用主机网络 sysctl net.ipv4.ip_forward 内核参数。这需要将传入的流量转发到 CNI。例如,如果禁用了 ip_forward,则从集群外部访问 NodePort 服务会失败。

1.1.2. 网络性能优化

默认情况下,将三个性能优化应用到 OVS 服务,以最大程度降低资源消耗:

  • ovs-vswitchd.serviceovsdb-server.service 的 CPU 关联性
  • no-mlockallopenvswitch.service
  • 将处理程序和 revalidator 线程限制为 ovs-vswitchd.service

1.1.3. 网络功能

红帽构建的 MicroShift 4.12 提供的网络功能包括:

  • Kubernetes 网络策略
  • 动态节点 IP
  • 指定主机接口上的集群网络
  • 二级网关接口
  • 双堆栈

红帽构建的 MicroShift 4.12 不提供网络功能:

  • egress IP/firewall/qos: 禁用
  • 混合网络:不支持
  • IPsec: 不支持
  • 硬件卸载:不支持

本简要概述在红帽构建的 MicroShift 中介绍网络组件及其操作。microshift-networking RPM 是一个软件包,可自动拉取任何与网络相关的依赖项和 systemd 服务来初始化网络,例如 microshift-ovs-init systemd 服务。

NetworkManager
NetworkManager 需要在红帽构建的 MicroShift 节点上设置初始网关桥接。NetworkManager 和 NetworkManager-ovs RPM 软件包作为依赖项安装到 microshift-networking RPM 软件包,该软件包包含必要的配置文件。红帽构建的 MicroShift 中的 NetworkManager 使用 keyfile 插件,并在安装 microshift-networking RPM 软件包后重启。
microshift-ovs-init
microshift-ovs-init.servicemicroshift-networking RPM 软件包安装,作为依赖的 systemd 服务到 microshift.service。它负责设置 OVS 网关网桥。
OVN 容器

两个 OVN-Kubernetes 守护进程集由红帽构建的 MicroShift 渲染和应用。

  • ovnkube-master 包含 northd,nbdb,sbdbovnkube-master 容器。
  • ovnkube-node ovnkube-node 包含 OVN-Controller 容器。

    在红帽构建的 MicroShift 引导后,OVN-Kubernetes 守护进程集会在 openshift-ovn-kubernetes 命名空间中部署。

打包

OVN-Kubernetes 清单和启动逻辑内置在 MicroShift 的红帽构建中。microshift-networking RPM 中包含的 systemd 服务和配置包括:

  • /etc/NetworkManager/conf.d/microshift-nm.conf for NetworkManager.service
  • /etc/systemd/system/ovs-vswitchd.service.d/microshift-cpuaffinity.conf for ovs-vswitchd.service
  • /etc/systemd/system/ovsdb-server.service.d/microshift-cpuaffinity.conf
  • /usr/bin/configure-ovs-microshift.sh 用于 microshift-ovs-init.service
  • /usr/bin/configure-ovs.sh 用于 microshift-ovs-init.service
  • /etc/crio/crio.conf.d/microshift-ovn.conf 用于 CRI-O 服务

1.1.5. 网桥映射

网桥映射允许提供商网络流量访问物理网络。流量离开提供商网络,到达 br-int 网桥。br-intbr-ex 之间的跳接端口允许流量遍历提供商网络和边缘网络。Kubernetes pod 通过虚拟以太网对连接到 br-int 网桥:一个虚拟以太网对端附加到 pod 命名空间,另一个端点连接到 br-int 网桥。

1.1.5.1. 主网关接口

您可以在 ovn.yaml 配置文件中将所需的主机接口名称指定为 gatewayInterface。指定的接口在 OVS 网桥 br-ex 中添加,它充当 CNI 网络的网关桥接。

1.1.5.2. 二级网关接口

您可以在 ovn.yaml 配置文件中为集群入口和出口设置一个额外的主机接口。第二个 OVS 网桥 br-ex1 中添加了额外的接口。集群 pod 流量根据目标 IP 到 br-ex1 自动路由额外的主机子网。

根据 CNI 配置创建两个或多个 OVS 网桥:

默认部署
  • ovn.yaml 配置文件中没有指定 externalGatewayInterface
  • 创建 br-exbr-int 这两个 OVS 网桥。
自定义部署
  • externalGatewayInterfaceovn.yaml 配置文件中是用户指定的。
  • 创建三个 OVS 网桥:br-exbr-ex1br-int

br-ex 网桥由 microshift-ovs-init.service 创建,或者手动创建。br-ex 网桥包含静态编程的 openflow 规则,用于区分进出主机网络 (underlay) 和 OVN 网络 (overlay) 的流量。

br-int 网桥由 ovnkube-master 容器创建。br-int 网桥包含动态编程的 openflow 规则,这些规则处理集群网络流量。

1.2. 创建 OVN-Kubernetes 配置文件

如果没有创建 OVN-Kubernetes 配置文件,红帽构建的 MicroShift 使用内置的默认 OVN-Kubernetes 值。您可以将 OVN-Kubernetes 配置文件写入 /etc/microshift/ovn.yaml。为您的配置提供了一个示例文件。

流程

  1. 要创建 ovn.yaml 文件,请运行以下命令:

    $ sudo cp /etc/microshift/ovn.yaml.default /etc/microshift/ovn.yaml
    Copy to Clipboard Toggle word wrap
  2. 要列出您创建的配置文件的内容,请运行以下命令:

    $ cat /etc/microshift/ovn.yaml.default
    Copy to Clipboard Toggle word wrap

    带有默认值的 'yaml' 配置文件示例

    ovsInit:
      disableOVSInit: false
      gatewayInterface: "" 
    1
    
      externalGatewayInterface: "" 
    2
    
    mtu: 1400
    Copy to Clipboard Toggle word wrap

    1
    默认值为空字符串,表示 "not-specified"。 CNI 网络插件会自动探测到带有默认路由的接口。
    2
    默认值为空字符串,代表 "disabled"。
  3. 要自定义配置,请使用列出您可以使用的有效值:

    Expand
    表 1.1. 支持红帽构建的 MicroShift 的可选 OVN-Kubernetes 配置
    字段类型默认值描述示例

    ovsInit.disableOVSInit

    bool

    false

    跳过在 microshift-ovs-init.service中配置 OVS 网桥 br-ex

    true 1

    ovsInit.gatewayInterface

    Alpha

    eth0

    Ingress,即 API 网关

    eth0

    ovsInit.externalGatewayInterface

    Alpha

    eth1

    Ingress 将外部流量路由到节点内的服务和 pod

    eth1

    mtu

    uint32

    1400

    用于 pod 的 MTU 值

    1300

    1. 需要 OVS 网桥。当 disableOVSInit 为 true 时,必须手动配置 OVS 网桥 br-ex

      重要

      如果更改了 ovn.yaml 文件中的 mtu 配置值,您必须重启红帽构建的 MicroShift 的主机以应用更新的设置。

自定义 ovn.yaml 配置文件示例

ovsInit:
  disableOVSInit: true
  gatewayInterface: eth0
  externalGatewayInterface: eth1
mtu: 1300
Copy to Clipboard Toggle word wrap

重要

当在 ovn.yaml 配置文件中将 disableOVSInit 设置为 true 时,必须手动配置 br-ex OVS 网桥。

1.3. 重启 ovnkube-master pod

以下流程重启 ovnkube-master pod。

先决条件

  • 已安装 OpenShift CLI (oc)。
  • 使用具有 cluster-admin 角色的用户访问集群。
  • 在使用 OVN-Kubernetes 网络插件配置的基础架构上安装集群。
  • KUBECONFIG 环境变量被设置。

流程

使用以下步骤重启 ovnkube-master pod。

  1. 运行以下命令来访问远程集群:

    $ export KUBECONFIG=$PWD/kubeconfig
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令,查找您要重启的 ovnkube-master pod 的名称:

    $ pod=$(oc get pods -n openshift-ovn-kubernetes | awk -F " " '/ovnkube-master/{print $1}')
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令来删除 ovnkube-master pod:

    $ oc -n openshift-ovn-kubernetes delete pod $pod
    Copy to Clipboard Toggle word wrap
  4. 使用以下命令确认新的 ovnkube-master pod 正在运行:

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

    正在运行的 Pod 列表显示新的 ovnkube-master pod 名称和年龄。

1.4. 在 HTTP (S)代理后部署红帽构建的 MicroShift

在您要向 pod 添加基本匿名和安全措施时,请在 HTTP (S)代理后部署 MicroShift 集群的红帽构建。

在代理后面部署红帽构建的 MicroShift 时,您必须将主机操作系统配置为使用代理服务以及启动 HTTP (S)请求的所有组件。

所有特定于用户的工作负载或带有出口流量的 pod (如访问云服务)都必须配置为使用代理。红帽构建的 MicroShift 中没有内置透明代理出口流量。

1.5. 在 CRI-O 容器运行时中使用代理

要在 CRI-O 中使用 HTTP(S) 代理,您需要设置 HTTP_PROXYHTTPS_PROXY 环境变量。您还可以设置 NO_PROXY 变量,将主机列表排除在代理之外。

流程

  1. /etc/systemd/system/crio.service.d/00-proxy.conf 文件中添加以下设置:

    Environment=NO_PROXY="localhost,127.0.0.1"
    Environment=HTTP_PROXY="http://$PROXY_USER:$PROXY_PASSWORD@$PROXY_SERVER:$PROXY_PORT/"
    Environment=HTTPS_PROXY="http://$PROXY_USER:$PROXY_PASSWORD@$PROXY_SERVER:$PROXY_PORT/"
    Copy to Clipboard Toggle word wrap
  2. 重新载入配置设置:

    $ sudo systemctl daemon-reload
    Copy to Clipboard Toggle word wrap
  3. 重启 CRI-O 服务以应用设置:

    $ sudo systemctl restart crio
    Copy to Clipboard Toggle word wrap

1.6. 从正在运行的集群获取 OVS 接口的快照

快照代表 OVS 接口在特定时间点的状态和数据。

流程

  • 要查看正在运行的红帽构建的 MicroShift 集群的 OVS 接口快照,请使用以下命令:
$ sudo ovs-vsctl show
Copy to Clipboard Toggle word wrap

正在运行的集群中的 OVS 接口示例

9d9f5ea2-9d9d-4e34-bbd2-dbac154fdc93
    Bridge br-ex
        Port enp1s0
            Interface enp1s0
                type: system
        Port br-ex
            Interface br-ex
                type: internal
        Port patch-br-ex_localhost.localdomain-to-br-int 
1

            Interface patch-br-ex_localhost.localdomain-to-br-int
                type: patch
                options: {peer=patch-br-int-to-br-ex_localhost.localdomain} 
2

    Bridge br-int
        fail_mode: secure
        datapath_type: system
        Port patch-br-int-to-br-ex_localhost.localdomain
            Interface patch-br-int-to-br-ex_localhost.localdomain
                type: patch
                options: {peer=patch-br-ex_localhost.localdomain-to-br-int}
        Port eebee1ce5568761
            Interface eebee1ce5568761 
3

        Port b47b1995ada84f4
            Interface b47b1995ada84f4 
4

        Port "3031f43d67c167f"
            Interface "3031f43d67c167f" 
5

        Port br-int
            Interface br-int
                type: internal
        Port ovn-k8s-mp0 
6

            Interface ovn-k8s-mp0
                type: internal
    ovs_version: "2.17.3"
Copy to Clipboard Toggle word wrap

1 2
patch-br-ex_localhost.localdomain-to-br-intpatch-br-int-to-br-ex_localhost.localdomain 是连接 br-exbr-int 的 OVS 补丁端口。
3 4 5
pod 接口 eebee1ce5568761b47b1995ada84f43031f43d67c167f 使用 pod 沙盒 ID 的前 15 位进行命名,并在 br-int 网桥中插入。
6
hairpin 流量的 OVS 内部端口,ovn-k8s-mp0ovnkube-master 容器创建。

1.7. 多播 DNS 协议

多播 DNS 协议 (mDNS) 允许使用在 5353/UDP 端口上公开的多播进行名称解析和服务发现。

红帽构建的 MicroShift 包括了一个嵌入式 mDNS 服务器用于部署场景,在这种情况下,无法重新配置权威 DNS 服务器,将客户端指向红帽构建的 MicroShift 上的服务。嵌入式 DNS 服务器允许红帽构建的 MicroShift 公开的 .local 域由 LAN 上的其他元素发现。

第 2 章 使用防火墙

红帽构建的 MicroShift 中不需要防火墙,但使用防火墙可以防止对红帽构建的 MicroShift API 进行不必要的访问。

2.1. 关于通过防火墙的网络流量

在使用防火墙时,您必须在 firewalld 服务运行时明确允许以下 OVN-Kubernetes 流量:

CNI pod 到 CNI pod
CNI pod 到 Host-Network pod Host-Network pod 到 Host-Network pod
CNI pod
使用 CNI 网络的 Kubernetes pod
Host-Network pod
使用主机网络的 Kubernetes pod 通过以下步骤安装和配置 firewalld 服务。
重要

红帽构建的 MicroShift pod 必须有权访问内部 CoreDNS 组件和 API 服务器。

2.2. 安装 firewalld 服务

使用以下步骤为红帽构建的 MicroShift 安装并运行 firewalld 服务。

流程

  1. 要安装 firewalld 服务,请运行以下命令:

    $ sudo dnf install -y firewalld
    Copy to Clipboard Toggle word wrap
  2. 要启动防火墙,请运行以下命令:

    $ sudo systemctl enable firewalld --now
    Copy to Clipboard Toggle word wrap

2.3. 所需的防火墙设置

在防火墙配置过程中,必须启用集群网络的 IP 地址范围。您可以使用默认值或自定义 IP 地址范围。如果您选择从默认的 10.42.0.0/16 设置自定义集群网络 IP 地址范围,还必须在防火墙配置中使用相同的自定义范围。

Expand
表 2.1. 防火墙 IP 地址设置
IP 范围防火墙规则所需的描述

10.42.0.0/16

主机网络 pod 访问其他 pod

169.254.169.1

主机网络 pod 访问红帽构建的 MicroShift API 服务器

以下是防火墙配置强制设置的命令示例:

示例命令

  • 配置主机网络 pod 对其他 pod 的访问:

    $ sudo firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
    Copy to Clipboard Toggle word wrap
  • 配置主机网络 pod 访问由主机端点支持的服务,如红帽 MicroShift API 的构建:

    $ sudo firewall-cmd --permanent --zone=trusted --add-source=169.254.169.1
    Copy to Clipboard Toggle word wrap

2.4. 使用可选端口设置

红帽构建的 MicroShift 防火墙服务允许可选端口设置。

流程

  • 要在防火墙配置中添加自定义端口,请使用以下命令语法:

    $ sudo firewall-cmd --permanent --zone=public --add-port=<port number>/<port protocol>
    Copy to Clipboard Toggle word wrap
    Expand
    表 2.2. 可选端口
    端口协议描述

    80

    TCP

    用于通过 OpenShift Container Platform 路由器提供应用程序的 HTTP 端口。

    443

    TCP

    用于通过 OpenShift Container Platform 路由器提供应用程序的 HTTPS 端口。

    5353

    UDP

    mDNS 服务以响应 OpenShift Container Platform 路由 mDNS 主机。

    30000-32767

    TCP

    为 NodePort 服务保留的端口范围;可用于公开 LAN 上的应用程序。

    30000-32767

    UDP

    为 NodePort 服务保留的端口范围;可用于公开 LAN 上的应用程序。

    6443

    TCP

    用于红帽构建的 MicroShift API 的 HTTPS API 端口。

以下是需要对防火墙进行外部访问到在 MicroShift 的红帽构建上运行的服务的命令示例,如 API 服务器的端口 6443,例如通过路由器公开的应用程序的端口 80 和 443。

示例命令

  • 为红帽构建的 MicroShift API 服务器配置端口:

    $ sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp
    Copy to Clipboard Toggle word wrap
  • 为通过路由器公开的应用程序配置端口:

    $ sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
    Copy to Clipboard Toggle word wrap
    $ sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
    Copy to Clipboard Toggle word wrap

2.5. 允许通过防火墙的网络流量

您可以通过首先使用默认或自定义值配置 IP 地址范围来允许网络流量通过防火墙,然后通过插入 DNS 服务器来通过网络网关允许来自 pod 的内部流量。

流程

设置默认值或自定义 IP 地址范围。设置 IP 地址范围后,允许通过网络网关从 pod 的内部流量。

  1. 设置 IP 地址范围:

    1. 要使用默认值配置 IP 地址范围,请运行以下命令:

      $ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
      Copy to Clipboard Toggle word wrap
    2. 另外,您可以通过运行以下命令来使用自定义值配置 IP 地址范围:

      $ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=<custom IP range>
      Copy to Clipboard Toggle word wrap
  2. 要允许 pod 通过网络网关的内部流量,请运行以下命令:

    $ sudo firewall-offline-cmd --permanent --zone=trusted --add-source=169.254.169.1
    Copy to Clipboard Toggle word wrap

2.5.1. 应用防火墙设置

要应用防火墙设置,请使用以下步骤步骤:

流程

完成通过防火墙进行网络访问后,运行以下命令重启防火墙并应用设置:

$ sudo firewall-cmd --reload
Copy to Clipboard Toggle word wrap

2.6. 验证防火墙设置

重启防火墙后,您可以通过列出设置来验证设置。

流程

  • 要验证在默认公共区(如端口相关的规则)中添加的规则,请运行以下命令:

    $ sudo firewall-cmd --list-all
    Copy to Clipboard Toggle word wrap
  • 要验证在可信区(如 IP-range 相关规则)中添加的规则,请运行以下命令:

    $ sudo firewall-cmd --zone=trusted --list-all
    Copy to Clipboard Toggle word wrap

2.7. 已知的防火墙问题

  • 为了避免使用防火墙重新加载或重启来破坏流量流,请在启动 MicroShift 的红帽构建前执行防火墙命令。红帽构建的 MicroShift 中的 CNI 驱动程序将 iptable 规则用于某些流量流,如使用 NodePort 服务的用户。iptable 规则由 CNI 驱动程序生成和插入,但在防火墙重新加载或重启时会被删除。缺少 iptable 规则会破坏流量流。如果需要在 MicroShift 的红帽构建后执行 firewall 命令,请手动重启 openshift-ovn-kubernetes 命名空间中的 ovnkube-master pod,以重置由 CNI 驱动程序控制的规则。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat 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 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

© 2026 Red Hat