This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.网络
配置和管理集群网络
摘要
第 1 章 了解网络 复制链接链接已复制到粘贴板!
集群管理员有几个选项用于公开集群内的应用程序到外部流量并确保网络连接:
- 服务类型,如节点端口或负载均衡器
-
API 资源,如
Ingress和Route
默认情况下,Kubernetes 为 pod 内运行的应用分配内部 IP 地址。Pod 及其容器可以网络,但集群外的客户端无法访问网络。当您将应用公开给外部流量时,为每个容器集指定自己的 IP 地址意味着 pod 在端口分配、网络、命名、服务发现、负载平衡、应用配置和迁移方面可被视为物理主机或虚拟机。
一些云平台提供侦听 169.254.169.254 IP 地址的元数据 API,它是 IPv4 169.254.0.0/16 CIDR 块中的 连接内部 IP 地址。
此 CIDR 块无法从 pod 网络访问。需要访问这些 IP 地址的 Pod 必须通过将 pod spec 中的 spec.hostnetwork 字段设置为 true 来获得主机网络访问。
如果允许 pod 主机网络访问,则将授予 pod 对底层网络基础架构的访问权限。
1.1. OpenShift Container Platform DNS 复制链接链接已复制到粘贴板!
如果您运行多个服务,比如使用多个 pod 的前端和后端服务,则要为用户名和服务 IP 等创建环境变量,使前端 pod 可以跟后端服务通信。如果删除并重新创建服务,可以为该服务分配一个新的 IP 地址,而且需要重新创建前端 pod 来获取服务 IP 环境变量的更新值。另外,必须在任何前端 pod 之前创建后端服务,以确保正确生成服务 IP,并将它作为环境变量提供给前端 pod。
因此,OpenShift Container Platform 具有一个内置 DNS,以便服务 DNS 以及服务 IP/端口能够访问这些服务。
1.2. OpenShift Container Platform Ingress Operator 复制链接链接已复制到粘贴板!
在创建 OpenShift Container Platform 集群时,在集群中运行的 Pod 和服务会各自分配自己的 IP 地址。IP 地址可供附近运行的其他容器集和服务访问,但外部客户端无法访问这些 IP 地址。Ingress Operator 实现 IngressController API,是负责启用对 OpenShift Container Platform 集群服务的外部访问的组件。
Ingress Operator 通过部署和管理一个或多个基于 HAProxy 的 Ingress Controller 来处理路由,使外部客户端可以访问您的服务。您可以通过指定 OpenShift Container Platform Route 和 Kubernetes Ingress 资源,来使用 Ingress Operator 路由流量。Ingress Controller 中的配置(如定义 endpointPublishingStrategy 类型和内部负载平衡)提供了发布 Ingress Controller 端点的方法。
1.2.1. 路由和 Ingress 的比较 复制链接链接已复制到粘贴板!
OpenShift Container Platform 中的 Kubernetes Ingress 资源通过作为集群内 pod 运行的共享路由器服务来实现 Ingress Controller。管理 Ingress 流量的最常见方法是使用 Ingress Controller。您可以像任何其他常规 pod 一样扩展和复制此 pod。此路由器服务基于 HAProxy,后者是一个开源负载均衡器解决方案。
OpenShift Container Platform 路由为集群中的服务提供入口流量。路由提供了标准 Kubernetes Ingress Controller 可能不支持的高级功能,如 TLS 重新加密、TLS 直通和为蓝绿部署分割流量。
入口流量通过路由访问集群中的服务。路由和入口是处理入口流量的主要资源。Ingress 提供类似于路由的功能,如接受外部请求并根据路由委派它们。但是,对于 Ingress,您只能允许某些类型的连接:HTTP/2、HTTPS 和服务器名称识别(SNI),以及 TLS(证书)。在 OpenShift Container Platform 中,生成路由以满足 Ingress 资源指定的条件。
1.3. OpenShift Container Platform 网络的常见术语表 复制链接链接已复制到粘贴板!
该术语表定义了在网络内容中使用的常用术语。
- 身份验证
- 为了控制对 OpenShift Container Platform 集群的访问,集群管理员可以配置用户身份验证,并确保只有批准的用户访问集群。要与 OpenShift Container Platform 集群交互,您必须对 OpenShift Container Platform API 进行身份验证。您可以通过在您对 OpenShift Container Platform API 的请求中提供 OAuth 访问令牌或 X.509 客户端证书来进行身份验证。
- AWS Load Balancer Operator
-
AWS Load Balancer (ALB) Operator 部署和管理
aws-load-balancer-controller的实例。 - Cluster Network Operator
- Cluster Network Operator(CNO)在 OpenShift Container Platform 集群中部署和管理集群网络组件。这包括在安装过程中为集群选择的 Container Network Interface(CNI)默认网络供应商插件部署。
- 配置映射
-
配置映射提供将配置数据注入 pod 的方法。您可以在类型为
ConfigMap的卷中引用存储在配置映射中的数据。在 pod 中运行的应用程序可以使用这个数据。 - 自定义资源 (CR)
- CR 是 Kubernetes API 的扩展。您可以创建自定义资源。
- DNS
- 集群 DNS 是一个 DNS 服务器,它为 Kubernetes 服务提供 DNS 记录。由 Kubernetes 启动的容器会在其 DNS 搜索中自动包含此 DNS 服务器。
- DNS Operator
- DNS Operator 部署并管理 CoreDNS,以便为 pod 提供名称解析服务。这会在 OpenShift Container Platform 中启用基于 DNS 的 Kubernetes 服务发现。
- 部署
- 维护应用程序生命周期的 Kubernetes 资源对象。
- domain
- Domain(域)是 Ingress Controller 提供的 DNS 名称。
- egress
- 通过来自 pod 的网络出站流量进行外部数据共享的过程。
- 外部 DNS Operator
- External DNS Operator 部署并管理 ExternalDNS,以便为从外部 DNS 供应商到 OpenShift Container Platform 的服务和路由提供名称解析。
- 基于 HTTP 的路由
- 基于 HTTP 的路由是一个不受保护的路由,它使用基本的 HTTP 路由协议,并在未安全的应用程序端口上公开服务。
- 入口
- OpenShift Container Platform 中的 Kubernetes Ingress 资源通过作为集群内 pod 运行的共享路由器服务来实现 Ingress Controller。
- Ingress Controller
- Ingress Operator 管理 Ingress Controller。使用 Ingress Controller 是允许从外部访问 OpenShift Container Platform 集群的最常用方法。
- 安装程序置备的基础架构
- 安装程序部署并配置运行集群的基础架构。
- kubelet
- 在集群的每个节点上运行的一个主节点代理,以确保容器在 pod 中运行。
- Kubernetes NMState Operator
- Kubernetes NMState Operator 提供了一个 Kubernetes API,用于使用 NMState 在 OpenShift Container Platform 集群的节点上执行状态驱动的网络配置。
- kube-proxy
- kube-proxy 是一个代理服务,在每个节点上运行,有助于为外部主机提供服务。它有助于将请求转发到正确的容器,并且能够执行原语负载平衡。
- 负载均衡器
- OpenShift Container Platform 使用负载均衡器从集群外部与集群中运行的服务进行通信。
- MetalLB Operator
-
作为集群管理员,您可以将 MetalLB Operator 添加到集群中,以便在将
LoadBalancer类型服务添加到集群中时,MetalLB 可为该服务添加外部 IP 地址。 - multicast
- 通过使用 IP 多播,数据可同时广播到许多 IP 地址。
- 命名空间
- 命名空间隔离所有进程可见的特定系统资源。在一个命名空间中,只有属于该命名空间的进程才能看到这些资源。
- networking
- OpenShift Container Platform 集群的网络信息。
- node
- OpenShift Container Platform 集群中的 worker 机器。节点是虚拟机 (VM) 或物理计算机。
- OpenShift Container Platform Ingress Operator
-
Ingress Operator 实现
IngressControllerAPI,是负责启用对 OpenShift Container Platform 服务的外部访问的组件。 - pod
- 一个或多个带有共享资源(如卷和 IP 地址)的容器,在 OpenShift Container Platform 集群中运行。pod 是定义、部署和管理的最小计算单元。
- PTP Operator
-
PTP Operator 会创建和管理
linuxptp服务。 - route
- OpenShift Container Platform 路由为集群中的服务提供入口流量。路由提供了标准 Kubernetes Ingress Controller 可能不支持的高级功能,如 TLS 重新加密、TLS 直通和为蓝绿部署分割流量。
- 扩展
- 增加或减少资源容量。
- service
- 在一组 pod 上公开正在运行的应用程序。
- 单根 I/O 虚拟化 (SR-IOV) Network Operator
- Single Root I/O Virtualization(SR-IOV)Network Operator 管理集群中的 SR-IOV 网络设备和网络附加。
- 软件定义型网络 (SDN)
- OpenShift Container Platform 使用软件定义网络 (SDN) 方法来提供一个统一的集群网络,它允许 OpenShift Container Platform 集群中的不同 pod 相互间进行通信。
- 流控制传输协议 (SCTP)
- SCTP 是基于信息的可靠协议,可在 IP 网络之上运行。
- taint
- 污点和容限可确保将 pod 调度到适当的节点上。您可以在节点上应用一个或多个污点。
- 容限 (tolerations)
- 您可以将容限应用到 pod。容限 (toleration) 允许调度程序调度具有匹配污点的 pod。
- Web 控制台
- 用于管理 OpenShift Container Platform 的用户界面(UI)。
第 2 章 访问主机 复制链接链接已复制到粘贴板!
了解如何创建堡垒主机来访问 OpenShift Container Platform 实例,以及使用安全 shell (SSH) 访问 control plane 节点。
2.1. 访问安装程序置备的基础架构集群中 Amazon Web Services 上的主机 复制链接链接已复制到粘贴板!
OpenShift Container Platform 安装程序不会为任何置备 OpenShift Container Platform 集群的 Amazon Elastic Compute Cloud (Amazon EC2) 实例创建公共 IP 地址。为了可以 SSH 到 OpenShift Container Platform 主机,您必须按照以下步骤操作。
流程
-
创建一个安全组,允许 SSH 访问由
openshift-install命令创建的虚拟私有云 (VPC) 。 - 在安装程序创建的某个公共子网中创建 Amazon EC2 实例。
将公共 IP 地址与您创建的 Amazon EC2 实例相关联。
与 OpenShift Container Platform 安装不同,您应该将您创建的 Amazon EC2 实例与 SSH 密钥对关联。这与您为这个实例选择的操作系统无关,因为它只是一个 SSH 堡垒将互联网桥接到 OpenShift Container Platform 集群的 VPC。它与您使用的 Amazon Machine Image (AMI) 相关。例如,在 Red Hat Enterprise Linux CoreOS(RHCOS) 中,您可以像安装程序一样通过 Ignition 提供密钥。
一旦置备了 Amazon EC2 实例并可以 SSH 到它,您必须添加与 OpenShift Container Platform 安装关联的 SSH 密钥。这个密钥可以与堡垒实例的密钥不同,也可以相同。
注意直接通过 SSH 访问仅建议在灾难恢复时使用。当 Kubernetes API 正常工作时,应该使用特权 Pod。
-
运行
oc get nodes,查看输出结果,然后选择一个 master 节点。主机名类似于ip-10-0-1-163.ec2.internal。 从您手动部署到 Amazon EC2 的堡垒 SSH 主机中,SSH 部署到该 control plane 主机。确定您使用了在安装过程中指定的相同的 SSH 密钥:
ssh -i <ssh-key-path> core@<master-hostname>
$ ssh -i <ssh-key-path> core@<master-hostname>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 3 章 网络 Operator 概述 复制链接链接已复制到粘贴板!
OpenShift Container Platform 支持多种类型的网络 Operator。您可以使用这些网络 Operator 管理集群网络。
3.1. Cluster Network Operator 复制链接链接已复制到粘贴板!
Cluster Network Operator(CNO)在 OpenShift Container Platform 集群中部署和管理集群网络组件。这包括在安装过程中为集群选择的 Container Network Interface(CNI)默认网络供应商插件部署。如需更多信息,请参阅 OpenShift Container Platform 中的 Cluster Network Operator。
3.2. DNS Operator 复制链接链接已复制到粘贴板!
DNS Operator 部署并管理 CoreDNS,以便为 pod 提供名称解析服务。这会在 OpenShift Container Platform 中启用基于 DNS 的 Kubernetes 服务发现。如需更多信息,请参阅 OpenShift Container Platform 中的 DNS Operator。
3.3. Ingress Operator 复制链接链接已复制到粘贴板!
创建 OpenShift Container Platform 集群时,集群中运行的 pod 和服务将为每个分配的 IP 地址。IP 地址可以被其他 pod 和服务访问,但外部客户端无法访问。Ingress Operator 实现 Ingress Controller API,并负责启用对 OpenShift Container Platform 集群服务的外部访问。如需更多信息,请参阅 OpenShift Container Platform 中的 Ingress Operator。
3.4. 外部 DNS Operator 复制链接链接已复制到粘贴板!
External DNS Operator 部署并管理 ExternalDNS,以便为从外部 DNS 供应商到 OpenShift Container Platform 的服务和路由提供名称解析。如需更多信息,请参阅了解外部 DNS Operator。
3.5. Network Observability Operator 复制链接链接已复制到粘贴板!
Network Observability Operator 是一个可选 Operator,它允许集群管理员观察 OpenShift Container Platform 集群的网络流量。Network Observability Operator 使用 eBPF 技术创建网络流。然后,OpenShift Container Platform 信息会增强网络流,并存储在 Loki 中。您可以在 OpenShift Container Platform 控制台中查看和分析所存储的 netflow 信息,以进一步洞察和故障排除。如需更多信息,请参阅关于 Network Observability Operator。
Cluster Network Operator(CNO)在 OpenShift Container Platform 集群上部署和管理集群网络组件,包括在安装过程中为集群选择的 Container Network Interface(CNI)默认网络供应商插件。
4.1. Cluster Network Operator 复制链接链接已复制到粘贴板!
Cluster Network Operator 从 operator.openshift.io API 组实现 network API。Operator 通过使用守护进程集,部署 OpenShift SDN 默认 Container Network Interface(CNI)网络供应商插件,或部署您在集群安装过程中选择的默认网络供应商插件。
流程
Cluster Network Operator 在安装过程中被部署为一个 Kubernetes 部署。
运行以下命令,以查看部署状态:
oc get -n openshift-network-operator deployment/network-operator
$ oc get -n openshift-network-operator deployment/network-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE network-operator 1/1 1 1 56m
NAME READY UP-TO-DATE AVAILABLE AGE network-operator 1/1 1 1 56mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,以查看 Cluster Network Operator 的状态:
oc get clusteroperator/network
$ oc get clusteroperator/networkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE network 4.5.4 True False False 50m
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE network 4.5.4 True False False 50mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下字段提供有关 Operator 状态的信息:
AVAILABLE、Progressing和DEGRADED。当 Cluster Network Operator 报告可用状态条件时,AVAILABLE字段为True。
4.2. 查看集群网络配置 复制链接链接已复制到粘贴板!
每个 OpenShift Container Platform 新安装都有一个名为 cluster 的 network.config 对象。
4.3. 查看 Cluster Network Operator 状态 复制链接链接已复制到粘贴板!
您可以使用 oc describe 命令来检查状态并查看 Cluster Network Operator 的详情。
流程
运行以下命令,以查看 Cluster Network Operator 的状态:
oc describe clusteroperators/network
$ oc describe clusteroperators/networkCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4. 查看 Cluster Network Operator 日志 复制链接链接已复制到粘贴板!
您可以使用 oc logs 命令来查看 Cluster Network Operator 日志。
流程
运行以下命令,以查看 Cluster Network Operator 的日志:
oc logs --namespace=openshift-network-operator deployment/network-operator
$ oc logs --namespace=openshift-network-operator deployment/network-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5. Cluster Network Operator 配置 复制链接链接已复制到粘贴板!
集群网络的配置作为 Cluster Network Operator(CNO)配置的一部分指定,并存储在名为 cluster 的自定义资源(CR)对象中。CR 指定 operator.openshift.io API 组中的 Network API 的字段。
CNO 配置在集群安装过程中从 Network. config.openshift.io API 组中的 Network API 继承以下字段,且这些字段无法更改:
clusterNetwork- 从中分配 Pod IP 地址的 IP 地址池。
serviceNetwork- 服务的 IP 地址池.
defaultNetwork.type- 集群网络供应商,如 OpenShift SDN 或 OVN-Kubernetes。
在集群安装后,您无法修改上一节中列出的字段。
您可以通过在名为 cluster 的 CNO 对象中设置 defaultNetwork 对象的字段来为集群指定集群网络供应商配置。
4.5.1. Cluster Network Operator 配置对象 复制链接链接已复制到粘贴板!
下表中描述了 Cluster Network Operator(CNO)的字段:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CNO 对象的名称。这个名称始终是 |
|
|
| 用于指定从哪些 IP 地址块分配 Pod IP 地址以及集群中每个节点的子网前缀长度的列表。例如:
此值是只读的,在集群安装过程中从名为 |
|
|
| 服务的 IP 地址块。OpenShift SDN 和 OVN-Kubernetes Container Network Interface(CNI)网络供应商只支持服务网络的一个 IP 地址块。例如: spec: serviceNetwork: - 172.30.0.0/14
此值是只读的,在集群安装过程中从名为 |
|
|
| 为集群网络配置 Container Network Interface(CNI)集群网络供应商。 |
|
|
| 此对象的字段指定 kube-proxy 配置。如果您使用 OVN-Kubernetes 集群网络供应商,则 kube-proxy 配置无效。 |
defaultNetwork 对象配置
下表列出了 defaultNetwork 对象的值:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
注意 OpenShift Container Platform 默认使用 OpenShift SDN Container Network Interface(CNI)集群网络供应商。 |
|
|
| 此对象仅对 OpenShift SDN 集群网络供应商有效。 |
|
|
| 此对象仅对 OVN-Kubernetes 集群网络供应商有效。 |
OpenShift SDN CNI 集群网络供应商的配置
下表描述了 OpenShift SDN Container Network Interface(CNI)集群网络供应商的配置字段。
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| OpenShift SDN 的网络隔离模式。 |
|
|
| VXLAN 覆盖网络的最大传输单元(MTU)。这个值通常是自动配置的。 |
|
|
|
用于所有 VXLAN 数据包的端口。默认值为 |
您只能在集群安装过程中更改集群网络供应商的配置。
OpenShift SDN 配置示例
OVN-Kubernetes CNI 集群网络供应商的配置
下表描述了 OVN-Kubernetes CNI 集群网络供应商的配置字段。
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| Geneve(通用网络虚拟化封装)覆盖网络的最大传输单元(MTU)。这个值通常是自动配置的。 |
|
|
| Geneve 覆盖网络的 UDP 端口。 |
|
|
| 如果存在该字段,则会为集群启用 IPsec。 |
|
|
| 指定用于自定义网络策略审计日志的配置对象。如果未设置,则使用默认的审计日志设置。 |
|
|
| 可选:指定一个配置对象来自定义如何将出口流量发送到节点网关。 注意 在迁移出口流量时,工作负载和服务流量会受到一定影响,直到 Cluster Network Operator (CNO) 成功推出更改。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
| 整数 |
每个节点每秒生成一次的消息数量上限。默认值为每秒 |
|
| 整数 |
审计日志的最大大小,以字节为单位。默认值为 |
|
| 字符串 | 以下附加审计日志目标之一:
|
|
| 字符串 |
syslog 工具,如 as |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
将此字段设置为
此字段与 Open vSwitch 硬件卸载功能有交互。如果将此字段设置为 |
您只能在集群安装过程中更改集群网络供应商的配置,但 gatewayConfig 字段可作为安装后活动在运行时更改。
启用 IPSec 的 OVN-Kubernetes 配置示例
kubeProxyConfig object configuration
kubeProxyConfig 对象的值在下表中定义:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
注意
由于 OpenShift Container Platform 4.3 及更高版本中引进了性能改进,不再需要调整 |
|
|
|
刷新 kubeProxyConfig:
proxyArguments:
iptables-min-sync-period:
- 0s
|
4.5.2. Cluster Network Operator 配置示例 复制链接链接已复制到粘贴板!
以下示例中指定了完整的 CNO 配置:
Cluster Network Operator 对象示例
第 5 章 OpenShift Container Platform 中的 DNS Operator 复制链接链接已复制到粘贴板!
DNS Operator 部署并管理 CoreDNS,以为 pod 提供名称解析服务。它在 OpenShift Container Platform 中启用了基于 DNS 的 Kubernetes 服务发现。
5.1. DNS Operator 复制链接链接已复制到粘贴板!
DNS Operator 从 operator.openshift.io API 组实现 dns API。Operator 使用守护进程集部署 CoreDNS,为守护进程集创建一个服务,并将 kubelet 配置为指示 pod 使用 CoreDNS 服务 IP 地址进行名称解析。
流程
在安装过程中使用 Deployment 对象部署 DNS Operator。
使用
oc get命令查看部署状态:oc get -n openshift-dns-operator deployment/dns-operator
$ oc get -n openshift-dns-operator deployment/dns-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE dns-operator 1/1 1 1 23h
NAME READY UP-TO-DATE AVAILABLE AGE dns-operator 1/1 1 1 23hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc get命令来查看 DNS Operator 的状态:oc get clusteroperator/dns
$ oc get clusteroperator/dnsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE dns 4.1.0-0.11 True False False 92m
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE dns 4.1.0-0.11 True False False 92mCopy to Clipboard Copied! Toggle word wrap Toggle overflow AVAILABLE、PROGRESSING和DEGRADED提供了有关 Operator 状态的信息。当 CoreDNS 守护进程中至少有 1 个 pod 被设置为Available状态时,AVAILABLE为True。
5.2. 更改 DNS Operator managementState 复制链接链接已复制到粘贴板!
DNS 管理 CoreDNS 组件,为集群中的 pod 和服务提供名称解析服务。默认情况下,DNS Operator 的 managementState 设置为 Managed,这意味着 DNS Operator 会主动管理其资源。您可以将其更改为 Unmanaged,这意味着 DNS Operator 不管理其资源。
以下是更改 DNS Operator managementState 的用例:
-
您是一个开发者,希望测试配置更改来查看它是否解决了 CoreDNS 中的问题。您可以通过将
managementState设置为Unmanaged来停止 DNS Operator 覆盖更改。 -
您是一个集群管理员,报告了 CoreDNS 的问题,但在解决这个问题前需要应用一个临时解决方案。您可以将 DNS Operator 的
managementState字段设置为Unmanaged以应用临时解决方案。
流程
修改
managementStateDNS Operator:oc patch dns.operator.openshift.io default --type merge --patch '{"spec":{"managementState":"Unmanaged"}}'oc patch dns.operator.openshift.io default --type merge --patch '{"spec":{"managementState":"Unmanaged"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.3. 控制 DNS pod 放置 复制链接链接已复制到粘贴板!
DNS Operator 有两个守护进程集:一个用于 CoreDNS,另一个用于管理 /etc/hosts 文件。/etc/hosts 的守护进程集必须在每个节点主机上运行,以便为集群镜像 registry 添加条目来支持拉取镜像。安全策略可以禁止节点对之间的通信,这会阻止 CoreDNS 的守护进程集在每个节点上运行。
作为集群管理员,您可以使用自定义节点选择器将 CoreDNS 的守护进程集配置为在某些节点上运行或不运行。
先决条件
-
已安装
ocCLI。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
要防止某些节点间的通信,请配置
spec.nodePlacement.nodeSelectorAPI 字段:修改名为
default的 DNS Operator 对象:oc edit dns.operator/default
$ oc edit dns.operator/defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 指定在
spec.nodePlacement.nodeSelectorAPI 字段中只包含 control plane 节点的节点选择器:spec: nodePlacement: nodeSelector: node-role.kubernetes.io/worker: ""spec: nodePlacement: nodeSelector: node-role.kubernetes.io/worker: ""Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要允许 CoreDNS 的守护进程集在节点上运行,请配置污点和容限:
修改名为
default的 DNS Operator 对象:oc edit dns.operator/default
$ oc edit dns.operator/defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为污点指定污点键和一个容忍度:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果污点是
dns-only,它可以无限期地被容许。您可以省略tolerationSeconds。
5.4. 查看默认 DNS 复制链接链接已复制到粘贴板!
每个 OpenShift Container Platform 新安装都有一个名为 default 的 dns.operator。
流程
使用
oc describe命令来查看默认dns:oc describe dns.operator/default
$ oc describe dns.operator/defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要查找集群的服务 CIDR,使用
oc get命令:oc get networks.config/cluster -o jsonpath='{$.status.serviceNetwork}'$ oc get networks.config/cluster -o jsonpath='{$.status.serviceNetwork}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
输出示例
[172.30.0.0/16]
[172.30.0.0/16]
5.5. 使用 DNS 转发 复制链接链接已复制到粘贴板!
您可以使用以下方法使用 DNS 转发来覆盖 /etc/resolv.conf 文件中的默认转发配置:
- 为每个区指定名称服务器。如果转发区是 OpenShift Container Platform 管理的 Ingress 域,那么上游名称服务器必须为域授权。
- 提供上游 DNS 服务器列表。
- 更改默认转发策略。
默认域的 DNS 转发配置可以同时在 /etc/resolv.conf 文件和上游 DNS 服务器中指定默认服务器。
流程
修改名为
default的 DNS Operator 对象:oc edit dns.operator/default
$ oc edit dns.operator/defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 发出上一命令后,Operator 会根据
Server创建并更新名为dns-default的配置映射,并带有额外的服务器配置块。如果任何服务器都没有与查询匹配的区域,则名称解析会返回上游 DNS 服务器。配置 DNS 转发
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 必须符合
rfc6335服务名称语法。 - 2
- 必须符合
rfc1123服务名称语法中的子域的定义。集群域cluster.local是对zones字段的无效子域。 - 3
- 定义用于选择上游解析器的策略。默认值为
Random。您还可以使用RoundRobin, 和Sequential值。 - 4
- 每个
forwardPlugin最多允许 15 个upstreams。 - 5
- 可选。您可以使用它来覆盖默认策略,并将 DNS 解析转发到默认域的指定 DNS 解析器(上游解析器)。如果没有提供任何上游解析器,DNS 名称查询将进入
/etc/resolv.conf中的服务器。 - 6
- 决定选择上游服务器进行查询的顺序。您可以指定这些值之一:
Random、RoundRobin或Sequential。默认值为Sequential。 - 7
- 可选。您可以使用它提供上游解析器。
- 8
- 您可以指定
上游的两种类型 -SystemResolvConf和Network。SystemResolvConf将上游配置为使用/etc/resolv.conf和Network定义一个Networkresolver。您可以指定其中一个或两者都指定。 - 9
- 如果指定类型是
Network,则必须提供 IP 地址。address字段必须是有效的 IPv4 或 IPv6 地址。 - 10
- 如果指定类型是
Network,您可以选择性地提供端口。port字段必须是1到65535之间的值。如果您没有为上游指定端口,则会尝试默认端口 853。
可选:在高度监管的环境中工作时,您可能需要在将请求转发到上游解析器时保护 DNS 流量,以便您可以确保额外的 DNS 流量和数据隐私。集群管理员可以配置传输层安全(TLS)来转发 DNS 查询。
使用 TLS 配置 DNS 转发
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 必须符合
rfc6335服务名称语法。 - 2
- 必须符合
rfc1123服务名称语法中的子域的定义。集群域cluster.local是对zones字段的无效子域。集群域cluster.local不是zones中的一个有效的subdomain。 - 3
- 在为转发 DNS 查询配置 TLS 时,将
transport字段设置为具有值TLS。默认情况下,CoreDNS 缓存在 10 秒内转发连接。如果没有请求,CoreDNS 将为该 10 秒打开 TCP 连接。对于大型集群,请确保您的 DNS 服务器知道可能有多个新的连接来保存打开,因为您可以在每个节点上启动连接。相应地设置 DNS 层次结构以避免性能问题。 - 4
- 当为转发 DNS 查询配置 TLS 时,这是用作服务器名称的一部分(SNI)的强制服务器名称来验证上游 TLS 服务器证书。
- 5
- 定义用于选择上游解析器的策略。默认值为
Random。您还可以使用RoundRobin, 和Sequential值。 - 6
- 必需。您可以使用它提供上游解析器。每个
forwardPlugin条目最多允许 15 个upstreams条目。 - 7
- 可选。您可以使用它来覆盖默认策略,并将 DNS 解析转发到默认域的指定 DNS 解析器(上游解析器)。如果没有提供任何上游解析器,DNS 名称查询将进入
/etc/resolv.conf中的服务器。 - 8
网络类型表示,该上游解析器应该独立于/etc/resolv.conf中列出的上游解析器单独处理转发请求。在使用 TLS 时,只允许网络类型,且您必须提供 IP 地址。- 9
address字段必须是有效的 IPv4 或 IPv6 地址。- 10
- 您可以选择提供端口。
port必须是1到65535之间的值。如果您没有为上游指定端口,则会尝试默认端口 853。
注意如果
servers未定义或无效,则配置映射只包括默认服务器。
验证
查看配置映射:
oc get configmap/dns-default -n openshift-dns -o yaml
$ oc get configmap/dns-default -n openshift-dns -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 基于以上 DNS 示例的 DNS ConfigMap 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 对
forwardPlugin的更改会触发 CoreDNS 守护进程集的滚动更新。
5.6. DNS Operator 状态 复制链接链接已复制到粘贴板!
您可以使用 oc describe 命令来检查状态并查看 DNS Operator 的详情。
流程
查看 DNS Operator 的状态:
oc describe clusteroperators/dns
$ oc describe clusteroperators/dns
5.7. DNS Operator 日志 复制链接链接已复制到粘贴板!
您可以使用 oc logs 命令来查看 DNS Operator 日志。
流程
查看 DNS Operator 的日志:
oc logs -n openshift-dns-operator deployment/dns-operator -c dns-operator
$ oc logs -n openshift-dns-operator deployment/dns-operator -c dns-operator
5.8. 设置 CoreDNS 日志级别 复制链接链接已复制到粘贴板!
您可以配置 CoreDNS 日志级别来确定日志记录错误信息中的详情量。CoreDNS 日志级别的有效值为 Normal、Debug 和 Trace。默认 logLevel 为 Normal。
错误插件会始终被启用。以下 logLevel 设置会报告不同的错误响应:
-
logLevel:Normal启用 "errors" 类:log . { class error }. -
loglevel:Debug启用 "denial" 类:log . { class denial error }。 -
logLevel:Trace启用 "all" 类:log . { class all }.
流程
要将
logLevel设置为Debug,输入以下命令:oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Debug"}}' --type=merge$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Debug"}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要将
logLevel设置为Trace,输入以下命令:oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Trace"}}' --type=merge$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"logLevel":"Trace"}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要确保设置了所需的日志级别,请检查配置映射:
oc get configmap/dns-default -n openshift-dns -o yaml
$ oc get configmap/dns-default -n openshift-dns -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.9. 设置 CoreDNS Operator 的日志级别 复制链接链接已复制到粘贴板!
集群管理员可以配置 Operator 日志级别来更快地跟踪 OpenShift DNS 问题。operatorLogLevel 的有效值为 Normal、Debug 和 Trace。Trace 具有更详细的信息。默认 operatorlogLevel 为 Normal。问题有七个日志记录级别: Trace、debug、info、warning、Error、Fatal 和 Panic。设置了日志级别后,具有该严重性级别或以上级别的所有内容都会记录为日志条目。
-
operatorLogLevel: "Normal"设置logrus.SetLogLevel("Info")。 -
operatorLogLevel: "Debug"设置logrus.SetLogLevel("Debug")。 -
operatorLogLevel: "Trace"设置logrus.SetLogLevel("Trace")。
流程
要将
operatorLogLevel设置为Debug,请输入以下命令:oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Debug"}}' --type=merge$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Debug"}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要将
operatorLogLevel设置为Trace,请输入以下命令:oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Trace"}}' --type=merge$ oc patch dnses.operator.openshift.io/default -p '{"spec":{"operatorLogLevel":"Trace"}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 6 章 OpenShift Container Platform 中的 Ingress Operator 复制链接链接已复制到粘贴板!
6.1. OpenShift Container Platform Ingress Operator 复制链接链接已复制到粘贴板!
在创建 OpenShift Container Platform 集群时,在集群中运行的 Pod 和服务会各自分配自己的 IP 地址。IP 地址可供附近运行的其他容器集和服务访问,但外部客户端无法访问这些 IP 地址。Ingress Operator 实现 IngressController API,是负责启用对 OpenShift Container Platform 集群服务的外部访问的组件。
Ingress Operator 通过部署和管理一个或多个基于 HAProxy 的 Ingress Controller 来处理路由,使外部客户端可以访问您的服务。您可以通过指定 OpenShift Container Platform Route 和 Kubernetes Ingress 资源,来使用 Ingress Operator 路由流量。Ingress Controller 中的配置(如定义 endpointPublishingStrategy 类型和内部负载平衡)提供了发布 Ingress Controller 端点的方法。
6.2. Ingress 配置资产 复制链接链接已复制到粘贴板!
安装程序在 config.openshift.io API 组中生成带有 Ingress 资源的资产,cluster-ingress-02-config.yml。
Ingress 资源的 YAML 定义
安装程序将这个资产保存在 manifests/ 目录下的 cluster-ingress-02-config.yml 文件中。此 Ingress 资源定义 Ingress 的集群范围配置。此 Ingress 配置的用法如下所示:
- Ingress Operator 使用集群 Ingress 配置中的域,作为默认 Ingress Controller 的域。
-
OpenShift API Server Operator 使用集群 Ingress 配置中的域。在为未指定显式主机的
Route资源生成默认主机时,还会使用此域。
6.3. Ingress Controller 配置参数 复制链接链接已复制到粘贴板!
ingresscontrollers.operator.openshift.io 资源提供了以下配置参数。
| 参数 | 描述 |
|---|---|
|
|
如果为空,默认值为 |
|
|
|
|
|
如果没有设置,则默认值基于
对于大多数平台,可以更新
|
|
|
secret 必须包含以下密钥和数据:*
如果没有设置,则自动生成和使用通配符证书。该证书对 Ingress Controller 的 内部证书(无论是生成的证书还是用户指定的证书)自动与 OpenShift Container Platform 内置的 OAuth 服务器集成。 |
|
|
|
|
|
|
|
|
如果没有设置,则使用默认值。 注意
|
|
|
如果没有设置,则默认值基于
当使用
Ingress Controller 的最低 TLS 版本是 注意
加密器和配置的安全配置集的最小 TLS 版本反映在 重要
Ingress Operator 将 |
|
|
|
|
|
|
|
|
|
|
|
通过为
默认情况下,策略设置为
通过设置 这些调整仅应用于明文、边缘终止和重新加密路由,且仅在使用 HTTP/1 时有效。
对于请求标头,这些调整仅适用于具有 |
|
|
|
|
|
|
|
|
对于您要捕获的任何 Cookie,以下参数必须位于
例如: httpCaptureCookies:
- matchType: Exact
maxLength: 128
name: MYCOOKIE
|
|
|
|
|
|
|
|
|
|
|
|
这些连接来自负载均衡器健康探测或 Web 浏览器规范连接(预连接),可以安全地忽略。但是,这些请求可能是由网络错误造成的,因此将此字段设置为 |
所有参数都是可选的。
6.3.1. Ingress Controller TLS 安全配置集 复制链接链接已复制到粘贴板!
TLS 安全配置文件为服务器提供了一种方式,以规范连接的客户端在连接服务器时可以使用哪些密码。
6.3.1.1. 了解 TLS 安全配置集 复制链接链接已复制到粘贴板!
您可以使用 TLS(Transport Layer Security)安全配置集来定义各种 OpenShift Container Platform 组件需要哪些 TLS 密码。OpenShift Container Platform TLS 安全配置集基于 Mozilla 推荐的配置。
您可以为每个组件指定以下 TLS 安全配置集之一:
| profile | 描述 |
|---|---|
|
| 此配置集用于旧的客户端或库。该配置集基于旧的向后兼容性建议配置。
注意 对于 Ingress Controller,最小 TLS 版本从 1.0 转换为 1.1。 |
|
| 这个配置集是大多数客户端的建议配置。它是 Ingress Controller、kubelet 和 control plane 的默认 TLS 安全配置集。该配置集基于 Intermediate 兼容性推荐的配置。
|
|
| 此配置集主要用于不需要向后兼容的现代客户端。这个配置集基于 Modern 兼容性推荐的配置。
|
|
| 此配置集允许您定义要使用的 TLS 版本和密码。 警告
使用 |
当使用预定义的配置集类型时,有效的配置集配置可能会在发行版本之间有所改变。例如,使用在版本 X.Y.Z 中部署的 Intermediate 配置集指定了一个规格,升级到版本 X.Y.Z+1 可能会导致应用新的配置集配置,从而导致推出部署。
6.3.1.2. 为 Ingress Controller 配置 TLS 安全配置集 复制链接链接已复制到粘贴板!
要为 Ingress Controller 配置 TLS 安全配置集,请编辑 IngressController 自定义资源(CR)来指定预定义或自定义 TLS 安全配置集。如果没有配置 TLS 安全配置集,则默认值基于为 API 服务器设置的 TLS 安全配置集。
配置 Old TLS 安全配置集的 IngressController CR 示例
TLS 安全配置集定义 Ingress Controller 的 TLS 连接的最低 TLS 版本和 TLS 密码。
您可以在 Status.Tls Profile 和 Spec.Tls Security Profile 下看到 IngressController 自定义资源(CR)中配置的 TLS 安全配置集的密码和最小 TLS 版本。对于 Custom TLS 安全配置集,这两个参数下列出了特定的密码和最低 TLS 版本。
HAProxy Ingress Controller 镜像支持 TLS 1.3 和 Modern 配置集。
Ingress Operator 还会将 Old 或 Custom 配置集的 TLS 1.0 转换为 1.1。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。
流程
编辑
openshift-ingress-operator项目中的IngressControllerCR,以配置 TLS 安全配置集:oc edit IngressController default -n openshift-ingress-operator
$ oc edit IngressController default -n openshift-ingress-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
spec.tlsSecurityProfile字段:Custom配置集的IngressControllerCR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存文件以使改变生效。
验证
验证
IngressControllerCR 中是否设置了配置集:oc describe IngressController default -n openshift-ingress-operator
$ oc describe IngressController default -n openshift-ingress-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.1.3. 配置 mutual TLS 身份验证 复制链接链接已复制到粘贴板!
您可以通过设置 spec.clientTLS 值,将 Ingress Controller 配置为启用 mutual TLS (mTLS) 身份验证。clientTLS 值将 Ingress Controller 配置为验证客户端证书。此配置包括设置 clientCA 值,这是对配置映射的引用。配置映射包含 PEM 编码的 CA 证书捆绑包,用于验证客户端的证书。另外,您还可以配置证书主题过滤器列表。
如果 clientCA 值指定了 X509v3 证书撤销列表 (CRL) 分发点,Ingress Operator 会下载并管理基于每个提供的证书中指定的 HTTP URI X509v3 CRL 分发点的 CRL 配置映射。Ingress Controller 在 mTLS/TLS 协商过程中使用此配置映射。不提供有效证书的请求将被拒绝。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 - 您有一个 PEM 编码的 CA 证书捆绑包。
如果您的 CA 捆绑包引用 CRL 发布点,还必须将最终用户或叶证书包含在客户端 CA 捆绑包中。此证书必须在
CRL 分发点下包含 HTTP URI,如 RFC 5280 所述。例如:Issuer: C=US, O=Example Inc, CN=Example Global G2 TLS RSA SHA256 2020 CA1 Subject: SOME SIGNED CERT X509v3 CRL Distribution Points: Full Name: URI:http://crl.example.com/example.crlIssuer: C=US, O=Example Inc, CN=Example Global G2 TLS RSA SHA256 2020 CA1 Subject: SOME SIGNED CERT X509v3 CRL Distribution Points: Full Name: URI:http://crl.example.com/example.crlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
在
openshift-config命名空间中,从 CA 捆绑包创建配置映射:oc create configmap \ router-ca-certs-default \ --from-file=ca-bundle.pem=client-ca.crt \ -n openshift-config
$ oc create configmap \ router-ca-certs-default \ --from-file=ca-bundle.pem=client-ca.crt \1 -n openshift-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 配置映射数据键必须是
ca-bundle.pem,数据值必须是 PEM 格式的 CA 证书。
编辑
openshift-ingress-operator项目中的IngressController资源:oc edit IngressController default -n openshift-ingress-operator
$ oc edit IngressController default -n openshift-ingress-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
spec.clientTLS字段和子字段来配置 mutual TLS:指定过滤模式的
clientTLS配置集的IngressControllerCR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.4. 查看默认的 Ingress Controller 复制链接链接已复制到粘贴板!
Ingress Operator 是 OpenShift Container Platform 的一个核心功能,开箱即用。
每个 OpenShift Container Platform 新安装都有一个名为 default 的 ingresscontroller。它可以通过额外的 Ingress Controller 来补充。如果删除了默认的 ingresscontroller,Ingress Operator 会在一分钟内自动重新创建。
流程
查看默认的 Ingress Controller:
oc describe --namespace=openshift-ingress-operator ingresscontroller/default
$ oc describe --namespace=openshift-ingress-operator ingresscontroller/defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.5. 查看 Ingress Operator 状态 复制链接链接已复制到粘贴板!
您可以查看并检查 Ingress Operator 的状态。
流程
查看您的 Ingress Operator 状态:
oc describe clusteroperators/ingress
$ oc describe clusteroperators/ingressCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.6. 查看 Ingress Controller 日志 复制链接链接已复制到粘贴板!
您可以查看 Ingress Controller 日志。
流程
查看 Ingress Controller 日志:
oc logs --namespace=openshift-ingress-operator deployments/ingress-operator -c <container_name>
$ oc logs --namespace=openshift-ingress-operator deployments/ingress-operator -c <container_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.7. 查看 Ingress Controller 状态 复制链接链接已复制到粘贴板!
您可以查看特定 Ingress Controller 的状态。
流程
查看 Ingress Controller 的状态:
oc describe --namespace=openshift-ingress-operator ingresscontroller/<name>
$ oc describe --namespace=openshift-ingress-operator ingresscontroller/<name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8. 配置 Ingress Controller 复制链接链接已复制到粘贴板!
6.8.1. 设置自定义默认证书 复制链接链接已复制到粘贴板!
作为管理员,您可以通过创建 Secret 资源并编辑 IngressController 自定义资源 (CR),将 Ingress Controller 配置为使用自定义证书。
先决条件
- 您必须在 PEM 编码文件中有一个证书/密钥对,其中该证书由可信证书认证机构签名,或者由您在一个自定义 PKI 中配置的私有可信证书认证机构签名。
您的证书满足以下要求:
- 该证书对入口域有效。
-
证书使用
subjectAltName扩展来指定通配符域,如*.apps.ocp4.example.com。
您必须有一个
IngressControllerCR。您可以使用默认值:oc --namespace openshift-ingress-operator get ingresscontrollers
$ oc --namespace openshift-ingress-operator get ingresscontrollersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME AGE default 10m
NAME AGE default 10mCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如果您有中间证书,则必须将其包含在包含自定义默认证书的 secret 的 tls.crt 文件中。指定证书时指定的顺序是相关的; 在任意服务器证书后列出您的中间证书。
流程
以下步骤假定自定义证书和密钥对位于当前工作目录下的 tls.crt 和 tls.key 文件中。替换 tls.crt 和 tls.key 的实际路径名。在创建 Secret 资源并在 IngressController CR 中引用它时,您也可以将 custom-certs-default 替换成另一名称。
此操作会导致使用滚动部署策略重新部署 Ingress Controller。
使用
tls.crt和tls.key文件,创建在openshift-ingress命名空间中包含自定义证书的 Secret 资源。oc --namespace openshift-ingress create secret tls custom-certs-default --cert=tls.crt --key=tls.key
$ oc --namespace openshift-ingress create secret tls custom-certs-default --cert=tls.crt --key=tls.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更新 IngressController CR,以引用新的证书 Secret:
oc patch --type=merge --namespace openshift-ingress-operator ingresscontrollers/default \ --patch '{"spec":{"defaultCertificate":{"name":"custom-certs-default"}}}'$ oc patch --type=merge --namespace openshift-ingress-operator ingresscontrollers/default \ --patch '{"spec":{"defaultCertificate":{"name":"custom-certs-default"}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证更新是否已生效:
echo Q |\ openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts 2>/dev/null |\ openssl x509 -noout -subject -issuer -enddate
$ echo Q |\ openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts 2>/dev/null |\ openssl x509 -noout -subject -issuer -enddateCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<domain>- 指定集群的基域名。
输出示例
subject=C = US, ST = NC, L = Raleigh, O = RH, OU = OCP4, CN = *.apps.example.com issuer=C = US, ST = NC, L = Raleigh, O = RH, OU = OCP4, CN = example.com notAfter=May 10 08:32:45 2022 GM
subject=C = US, ST = NC, L = Raleigh, O = RH, OU = OCP4, CN = *.apps.example.com issuer=C = US, ST = NC, L = Raleigh, O = RH, OU = OCP4, CN = example.com notAfter=May 10 08:32:45 2022 GMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来设置自定义默认证书:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 证书 Secret 名称应该与用来更新 CR 的值匹配。
修改了 IngressController CR 后,Ingress Operator 将更新 Ingress Controller 的部署以使用自定义证书。
6.8.2. 删除自定义默认证书 复制链接链接已复制到粘贴板!
作为管理员,您可以删除配置了 Ingress Controller 的自定义证书。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。 - 您之前为 Ingress Controller 配置了自定义默认证书。
流程
要删除自定义证书并恢复 OpenShift Container Platform 附带的证书,请输入以下命令:
oc patch -n openshift-ingress-operator ingresscontrollers/default \ --type json -p $'- op: remove\n path: /spec/defaultCertificate'
$ oc patch -n openshift-ingress-operator ingresscontrollers/default \ --type json -p $'- op: remove\n path: /spec/defaultCertificate'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 集群协调新证书配置时可能会有延迟。
验证
要确认原始集群证书已被恢复,请输入以下命令:
echo Q | \ openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts 2>/dev/null | \ openssl x509 -noout -subject -issuer -enddate
$ echo Q | \ openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts 2>/dev/null | \ openssl x509 -noout -subject -issuer -enddateCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<domain>- 指定集群的基域名。
输出示例
subject=CN = *.apps.<domain> issuer=CN = ingress-operator@1620633373 notAfter=May 10 10:44:36 2023 GMT
subject=CN = *.apps.<domain> issuer=CN = ingress-operator@1620633373 notAfter=May 10 10:44:36 2023 GMTCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.3. 扩展 Ingress Controller 复制链接链接已复制到粘贴板!
手动扩展 Ingress Controller 以满足路由性能或可用性要求,如提高吞吐量的要求。oc 命令用于扩展 IngressController 资源。以下流程提供了扩展默认 IngressController 的示例。
扩展不是立刻就可以完成的操作,因为它需要时间来创建所需的副本数。
流程
查看默认
IngressController的当前可用副本数:oc get -n openshift-ingress-operator ingresscontrollers/default -o jsonpath='{$.status.availableReplicas}'$ oc get -n openshift-ingress-operator ingresscontrollers/default -o jsonpath='{$.status.availableReplicas}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
2
2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc patch命令,将默认IngressController扩展至所需的副本数。以下示例将默认IngressController扩展至 3 个副本:oc patch -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"replicas": 3}}' --type=merge$ oc patch -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"replicas": 3}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ingresscontroller.operator.openshift.io/default patched
ingresscontroller.operator.openshift.io/default patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证默认
IngressController是否已扩展至您指定的副本数:oc get -n openshift-ingress-operator ingresscontrollers/default -o jsonpath='{$.status.availableReplicas}'$ oc get -n openshift-ingress-operator ingresscontrollers/default -o jsonpath='{$.status.availableReplicas}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
3
3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 将 Ingress Controller 扩展为三个副本:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果需要不同数量的副本,请更改
replicas值。
6.8.4. 配置 Ingress 访问日志 复制链接链接已复制到粘贴板!
您可以配置 Ingress Controller 以启用访问日志。如果您的集群没有接收许多流量,那么您可以将日志记录到 sidecar。如果您的集群接收大量流量,为了避免超出日志记录堆栈的容量,或与 OpenShift Container Platform 之外的日志记录基础架构集成,您可以将日志转发到自定义 syslog 端点。您还可以指定访问日志的格式。
当不存在 Syslog 日志记录基础架构时,容器日志记录可用于在低流量集群中启用访问日志,或者在诊断 Ingress Controller 时进行简短使用。
对于访问日志可能会超过 OpenShift Logging 堆栈容量的高流量集群,或需要任何日志记录解决方案与现有 Syslog 日志记录基础架构集成的环境,则需要 syslog。Syslog 用例可能会相互重叠。
先决条件
-
以具有
cluster-admin特权的用户身份登录。
流程
配置 Ingress 访问日志到 sidecar。
要配置 Ingress 访问日志记录,您必须使用
spec.logging.access.destination指定一个目的地。要将日志记录指定到 sidecar 容器,您必须指定Containerspec.logging.access.destination.type。以下示例是将日志记录到Container目的地的 Ingress Controller 定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当将 Ingress Controller 配置为日志记录到 sidecar 时,Operator 会在 Ingress Controller Pod 中创建一个名为
logs的容器:oc -n openshift-ingress logs deployment.apps/router-default -c logs
$ oc -n openshift-ingress logs deployment.apps/router-default -c logsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
2020-05-11T19:11:50.135710+00:00 router-default-57dfc6cd95-bpmk6 router-default-57dfc6cd95-bpmk6 haproxy[108]: 174.19.21.82:39654 [11/May/2020:19:11:50.133] public be_http:hello-openshift:hello-openshift/pod:hello-openshift:hello-openshift:10.128.2.12:8080 0/0/1/0/1 200 142 - - --NI 1/1/0/0/0 0/0 "GET / HTTP/1.1"
2020-05-11T19:11:50.135710+00:00 router-default-57dfc6cd95-bpmk6 router-default-57dfc6cd95-bpmk6 haproxy[108]: 174.19.21.82:39654 [11/May/2020:19:11:50.133] public be_http:hello-openshift:hello-openshift/pod:hello-openshift:hello-openshift:10.128.2.12:8080 0/0/1/0/1 200 142 - - --NI 1/1/0/0/0 0/0 "GET / HTTP/1.1"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
配置 Ingress 访问日志记录到 Syslog 端点。
要配置 Ingress 访问日志记录,您必须使用
spec.logging.access.destination指定一个目的地。要将日志记录指定到 Syslog 端点目的地,您必须为spec.logging.access.destination.type指定Syslog。如果目的地类型是Syslog,则必须使用spec.logging.access.destination.syslog.endpoint指定一个目的地端点,并可使用spec.logging.access.destination.syslog.facility指定一个工具。以下示例是将日志记录到Syslog目的地的 Ingress Controller 定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意Syslog目的地端口必须是 UDP。
使用特定的日志格式配置 Ingress 访问日志。
您可以指定
spec.logging.access.httpLogFormat来自定义日志格式。以下示例是一个 Ingress Controller 定义,它将日志记录到 IP 地址为 1.2.3.4、端口为 10514 的syslog端点:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
禁用 Ingress 访问日志。
要禁用 Ingress 访问日志,请保留
spec.logging或spec.logging.access为空:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.5. 设置 Ingress Controller 线程数 复制链接链接已复制到粘贴板!
集群管理员可设置线程数,以增加集群可以处理的入站的连接量。您可以修补现有的 Ingress Controller 来增加线程量。
先决条件
- 以下假设您已创建了 Ingress Controller。
流程
更新 Ingress Controller 以增加线程数量:
oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"threadCount": 8}}}'$ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"threadCount": 8}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果您的节点有能力运行大量资源,您可以使用与预期节点容量匹配的标签配置
spec.nodePlacement.nodeSelector,并将spec.tuningOptions.threadCount配置为一个适当的高值。
6.8.6. 配置 Ingress Controller 以使用内部负载均衡器 复制链接链接已复制到粘贴板!
当在云平台上创建 Ingress Controller 时,Ingress Controller 默认由一个公共云负载均衡器发布。作为管理员,您可以创建一个使用内部云负载均衡器的 Ingress Controller。
如果云供应商是 Microsoft Azure,则必须至少有一个指向节点的公共负载均衡器。如果不这样做,所有节点都将丢失到互联网的出站连接。
如果要更改 IngressController 的 scope,您可以在创建自定义资源(CR)后更改 .spec.endpointPublishingStrategy.loadBalancer.scope 参数。
图 6.1. LoadBalancer 图表
上图显示了与 OpenShift Container Platform Ingress LoadBalancerService 端点发布策略相关的以下概念:
- 您可以使用 OpenShift Ingress Controller Load Balancer 在外部使用云供应商负载均衡器或内部加载负载。
- 您可以使用负载均衡器的单个 IP 地址以及更熟悉的端口,如 8080 和 4200,如图形中所述的集群所示。
- 来自外部负载均衡器的流量定向到 pod,并由负载均衡器管理,如下节点的实例中所述。有关实现详情请查看 Kubernetes 服务文档 。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
在名为
<name>-ingress-controller.yaml的文件中创建IngressController自定义资源 (CR) ,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,创建上一步中定义的 Ingress Controller:
oc create -f <name>-ingress-controller.yaml
$ oc create -f <name>-ingress-controller.yaml1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<name>替换为IngressController对象的名称。
可选:通过运行以下命令确认创建了 Ingress Controller:
oc --all-namespaces=true get ingresscontrollers
$ oc --all-namespaces=true get ingresscontrollersCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.7. 在 GCP 上为 Ingress Controller 配置全局访问 复制链接链接已复制到粘贴板!
在带有一个内部负载均衡器的 GCP 上创建的 Ingress Controller 会为服务生成一个内部 IP 地址。集群管理员可指定全局访问选项,该选项可启用同一 VPC 网络内任何区域中的客户端作为负载均衡器,以访问集群上运行的工作负载。
如需更多信息,请参阅 GCP 文档以了解全局访问。
先决条件
- 您已在 GCP 基础架构上部署了 OpenShift Container Platform 集群。
- 已将 Ingress Controller 配置为使用内部负载均衡器。
-
已安装 OpenShift CLI(
oc)。
流程
配置 Ingress Controller 资源,以允许全局访问。
注意您还可以创建 Ingress Controller 并指定全局访问选项。
配置 Ingress Controller 资源:
oc -n openshift-ingress-operator edit ingresscontroller/default
$ oc -n openshift-ingress-operator edit ingresscontroller/defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑 YAML 文件:
clientAccess配置为Global的示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
gcp.clientAccess设置为Global。
- 保存文件以使改变生效。
运行以下命令,以验证该服务是否允许全局访问:
oc -n openshift-ingress edit svc/router-default -o yaml
$ oc -n openshift-ingress edit svc/router-default -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示,全局访问已为带有注解
networking.gke.io/internal-load-balancer-allow-global-access的 GCP 启用。
6.8.8. 设置 Ingress Controller 健康检查间隔 复制链接链接已复制到粘贴板!
集群管理员可以设置健康检查间隔,以定义路由器在两个连续健康检查之间等待的时间。这个值会作为所有路由的默认值进行全局应用。默认值为 5 秒。
先决条件
- 以下假设您已创建了 Ingress Controller。
流程
更新 Ingress Controller,以更改后端健康检查之间的间隔:
oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"healthCheckInterval": "8s"}}}'$ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"healthCheckInterval": "8s"}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意要覆盖单个路由的
healthCheckInterval,请使用路由注解router.openshift.io/haproxy.health.check.interval
6.8.9. 将集群的默认 Ingress Controller 配置为内部 复制链接链接已复制到粘贴板!
您可以通过删除并重新它来将默认 Ingress Controller 配置为内部。
如果云供应商是 Microsoft Azure,则必须至少有一个指向节点的公共负载均衡器。如果不这样做,所有节点都将丢失到互联网的出站连接。
如果要更改 IngressController 的 scope,您可以在创建自定义资源(CR)后更改 .spec.endpointPublishingStrategy.loadBalancer.scope 参数。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
通过删除并重新创建集群,将
默认Ingress Controller 配置为内部。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.10. 配置路由准入策略 复制链接链接已复制到粘贴板!
管理员和应用程序开发人员可在多个命名空间中运行具有相同域名的应用程序。这是针对多个团队开发的、在同一个主机名上公开的微服务的机构。
只有在命名空间间有信任的集群才会启用跨命名空间之间的声明,否则恶意用户可能会接管主机名。因此,默认的准入策略不允许在命名空间间声明主机名。
先决条件
- 必须具有集群管理员权限。
流程
使用以下命令编辑
ingresscontroller资源变量的.spec.routeAdmission 字段:oc -n openshift-ingress-operator patch ingresscontroller/default --patch '{"spec":{"routeAdmission":{"namespaceOwnership":"InterNamespaceAllowed"}}}' --type=merge$ oc -n openshift-ingress-operator patch ingresscontroller/default --patch '{"spec":{"routeAdmission":{"namespaceOwnership":"InterNamespaceAllowed"}}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress 控制器配置参数
spec: routeAdmission: namespaceOwnership: InterNamespaceAllowed ...spec: routeAdmission: namespaceOwnership: InterNamespaceAllowed ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来配置路由准入策略:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.11. 使用通配符路由 复制链接链接已复制到粘贴板!
HAProxy Ingress Controller 支持通配符路由。Ingress Operator 使用 wildcardPolicy 来配置 Ingress Controller 的 ROUTER_ALLOW_WILDCARD_ROUTES 环境变量。
Ingress Controller 的默认行为是接受采用 None 通配符策略的路由,该策略与现有 IngressController 资源向后兼容。
流程
配置通配符策略。
使用以下命令来编辑
IngressController资源:oc edit IngressController
$ oc edit IngressControllerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
spec下,将wildcardPolicy字段设置为 WildcardsDisallowed或WildcardsAllowed:spec: routeAdmission: wildcardPolicy: WildcardsDisallowed # or WildcardsAllowedspec: routeAdmission: wildcardPolicy: WildcardsDisallowed # or WildcardsAllowedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.12. 使用 X-Forwarded 标头 复制链接链接已复制到粘贴板!
您可以将 HAProxy Ingress Controller 配置为指定如何处理 HTTP 标头的策略,其中包括 Forwarded 和 X-Forwarded-For。Ingress Operator 使用 HTTPHeaders 字段配置 Ingress Controller 的 ROUTER_SET_FORWARDED_HEADERS 环境变量。
流程
为 Ingress Controller 配置
HTTPHeaders字段。使用以下命令来编辑
IngressController资源:oc edit IngressController
$ oc edit IngressControllerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
spec下,将HTTPHeaders策略字段设置为Append、Replace、IfNone或Never:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用案例示例
作为集群管理员,您可以:
配置将
X-Forwarded-For标头注入每个请求的外部代理,然后将其转发到 Ingress Controller。要将 Ingress Controller 配置为通过未修改的标头传递,您需要指定
never策略。然后,Ingress Controller 不会设置标头,应用程序只接收外部代理提供的标头。将 Ingress Controller 配置为通过未修改的外部代理在外部集群请求上设置
X-Forwarded-For标头。要将 Ingress Controller 配置为在不通过外部代理的内部集群请求上设置
X-Forwarded-For标头,请指定if-none策略。如果 HTTP 请求已经通过外部代理设置了标头,则 Ingress Controller 会保留它。如果缺少标头,因为请求没有通过代理,Ingress Controller 会添加标头。
作为应用程序开发人员,您可以:
配置特定于应用程序的外部代理来注入
X-Forwarded-For标头。要配置 Ingress Controller,以便在不影响其他路由策略的情况下将标头传递到应用程序的路由,请在应用程序的路由上添加注解
haproxy.router.openshift.io/set-forwarded-headers: if-none或haproxy.router.openshift.io/set-forwarded-headers: never。注意您可以根据每个路由设置
haproxy.router.openshift.io/set-forwarded-headers注解,独立于 Ingress Controller 的全局设置值。
6.8.13. 启用 HTTP/2 入口连接 复制链接链接已复制到粘贴板!
您可以在 HAProxy 中启用透明端到端的 HTTP/2 连接。此功能使应用程序所有者利用 HTTP/2 协议功能,包括单一连接、标头压缩、二 进制流等等。
您可以为单独的 Ingress Controller 或整个集群启用 HTTP/2 连接。
要在从客户端到 HAProxy 的连接中启用 HTTP/2,路由必须指定一个自定义证书。使用默认证书的路由无法使用 HTTP/2。这一限制是避免连接并发问题(如客户端为使用相同证书的不同路由重新使用连接)所必需的。
从 HAProxy 到应用程序 pod 的连接只能将 HTTP/2 用于 re-encrypt 路由,而不适用于 edge-terminated 或 insecure 路由。存在这个限制的原因是,在与后端协商使用 HTTP/2 时,HAProxy 要使用 ALPN(Application-Level Protocol Negotiation),它是一个 TLS 的扩展。这意味着,端到端的 HTTP/2 适用于 passthrough 和 re-encrypt 路由,而不适用于 nsecure 或 edge-terminated 路由。
使用带有重新加密路由的 WebSockets,并在 Ingress Controller 上启用 HTTP/2 需要 WebSocket 支持 HTTP/2。通过 HTTP/2 的 websocket 是 HAProxy 2.4 的 Websocket 功能,目前在 OpenShift Container Platform 中不支持它。
对于非 passthrough 路由,Ingress Controller 会独立于客户端的连接来协商它与应用程序的连接。这意味着,客户端可以连接到 Ingress Controller 并协商 HTTP/1.1,Ingress Controller 可连接到应用程序,协商 HTTP/2 并使用 HTTP/2 连接将客户端 HTTP/1.1 连接转发请求。如果客户端随后试图将其连接从 HTTP/1.1 升级到 WebSocket 协议,这会导致问题。因为 Ingress Controller 无法将 WebSocket 转发到 HTTP/2,也无法将其 HTTP/2 的连接升级到 WebSocket。因此,如果您有一个应用程序旨在接受 WebSocket 连接,则必须允许使用 HTTP/2 协议,或者其它客户端将无法升级到 WebSocket 协议。
流程
在单一 Ingress Controller 上启用 HTTP/2。
要在 Ingress Controller 上启用 HTTP/2,请输入
oc annotate命令:oc -n openshift-ingress-operator annotate ingresscontrollers/<ingresscontroller_name> ingress.operator.openshift.io/default-enable-http2=true
$ oc -n openshift-ingress-operator annotate ingresscontrollers/<ingresscontroller_name> ingress.operator.openshift.io/default-enable-http2=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<ingresscontroller_name>替换为要注解的 Ingress Controller 的名称。
在整个集群中启用 HTTP/2。
要为整个集群启用 HTTP/2,请输入
oc annotate命令:oc annotate ingresses.config/cluster ingress.operator.openshift.io/default-enable-http2=true
$ oc annotate ingresses.config/cluster ingress.operator.openshift.io/default-enable-http2=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来添加注解:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.14. 为 Ingress Controller 配置 PROXY 协议 复制链接链接已复制到粘贴板!
当 Ingress Controller 使用 HostNetwork 或 NodePortService 端点发布策略类型时,集群管理员可配置 PROXY 协议。PROXY 协议使负载均衡器能够为 Ingress Controller 接收的连接保留原始客户端地址。原始客户端地址可用于记录、过滤和注入 HTTP 标头。在默认配置中,Ingress Controller 接收的连接只包含与负载均衡器关联的源地址。
云部署不支持此功能。具有这个限制的原因是,当 OpenShift Container Platform 在云平台中运行时,IngressController 指定应使用服务负载均衡器,Ingress Operator 会配置负载均衡器服务,并根据保留源地址的平台要求启用 PROXY 协议。
您必须将 OpenShift Container Platform 和外部负载均衡器配置为使用 PROXY 协议或使用 TCP。
在使用 Keepalived Ingress VIP 的非云平台上带有安装程序置备的集群的默认 Ingress Controller 不支持 PROXY 协议。
先决条件
- 已创建一个 Ingress Controller。
流程
编辑 Ingress Controller 资源:
oc -n openshift-ingress-operator edit ingresscontroller/default
$ oc -n openshift-ingress-operator edit ingresscontroller/defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置 PROXY 配置:
如果您的 Ingress Controller 使用 hostNetwork 端点发布策略类型,将
spec.endpointPublishingStrategy.hostNetwork.protocol子字段设置为PROXY:hostNetwork配置为PROXY的示例spec: endpointPublishingStrategy: hostNetwork: protocol: PROXY type: HostNetworkspec: endpointPublishingStrategy: hostNetwork: protocol: PROXY type: HostNetworkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的 Ingress Controller 使用 NodePortService 端点发布策略类型,将
spec.endpointPublishingStrategy.nodePort.protocol子字段设置为PROXY:nodePort配置为PROXY示例spec: endpointPublishingStrategy: nodePort: protocol: PROXY type: NodePortServicespec: endpointPublishingStrategy: nodePort: protocol: PROXY type: NodePortServiceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.15. 使用 appsDomain 选项指定备选集群域 复制链接链接已复制到粘贴板!
作为集群管理员,您可以通过配置 appsDomain 字段来为用户创建的路由指定默认集群域替代内容。appsDomain 字段是 OpenShift Container Platform 使用的可选域,而不是默认值,它在 domain 字段中指定。如果您指定了其它域,它会覆盖为新路由确定默认主机的目的。
例如,您可以将您公司的 DNS 域用作集群中运行的应用程序的路由和入口的默认域。
先决条件
- 已部署 OpenShift Container Platform 集群。
-
已安装
oc命令行界面。
流程
通过为用户创建的路由指定备选默认域来配置
appsDomain字段。编辑 ingress
集群资源 :oc edit ingresses.config/cluster -o yaml
$ oc edit ingresses.config/cluster -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑 YAML 文件:
示例
appsDomain配置为test.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow
通过公开路由并验证路由域更改,验证现有路由是否包含
appsDomain字段中指定的域名:注意在公开路由前,等待
openshift-apiserver完成滚动更新。公开路由:
oc expose service hello-openshift route.route.openshift.io/hello-openshift exposed
$ oc expose service hello-openshift route.route.openshift.io/hello-openshift exposedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例:
oc get routes NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD hello-openshift hello_openshift-<my_project>.test.example.com hello-openshift 8080-tcp None
$ oc get routes NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD hello-openshift hello_openshift-<my_project>.test.example.com hello-openshift 8080-tcp NoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.16. 转换 HTTP 标头的大小写 复制链接链接已复制到粘贴板!
默认情况下,HAProxy 2.2 使用小写的 HTTP 标头名称,例如,会将 Host: xyz.com 更改为 host: xyz.com。如果旧应用程序对 HTTP 标头名称中使用大小写敏感,请使用 Ingress Controller spec.httpHeaders.headerNameCaseAdjustments API 字段进行调整来适应旧的应用程序,直到它们被改变。
由于 OpenShift Container Platform 包含 HAProxy 2.2,因此请确保在升级前使用 spec.httpHeaders.headerNameCaseAdjustments 添加必要的配置。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。
流程
作为集群管理员,您可以使用 oc patch 命令,或设置 Ingress Controller YAML 文件中的 HeaderNameCaseAdjustments 字段来转换 HTTP 标头的大小写。
使用
oc patch命令设置一个 HTTP 标头的大小写情况。输入
oc patch命令将 HTTPhost标头改为Host:oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"httpHeaders":{"headerNameCaseAdjustments":["Host"]}}}'$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"httpHeaders":{"headerNameCaseAdjustments":["Host"]}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注解应用程序的路由:
oc annotate routes/my-application haproxy.router.openshift.io/h1-adjust-case=true
$ oc annotate routes/my-application haproxy.router.openshift.io/h1-adjust-case=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 然后,Ingress Controller 会根据指定调整
host请求标头。
通过配置 Ingress Controller YAML 文件,使用
HeaderNameCaseAdjustments字段指定调整。以下 Ingress Controller YAML 示例将 HTTP/1 请求的
host标头调整为Host,以便可以适当地注解路由:Ingress Controller YAML 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下示例路由中,使用
haproxy.router.openshift.io/h1-adjust-case注解启用对 HTTP 响应标头名称的大小写调整:路由 YAML 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
haproxy.router.openshift.io/h1-adjust-case设置为 true。
6.8.17. 使用路由器压缩 复制链接链接已复制到粘贴板!
您可以将 HAProxy Ingress Controller 配置为为特定 MIME 类型全局指定路由器压缩。您可以使用 mimeTypes 变量定义压缩应用到的 MIME 类型的格式。类型包括:application, image, message, multipart, text, video, 或带有一个 "X-" 前缀的自定义类型。要查看 MIME 类型和子类型的完整表示法,请参阅 RFC1341。
为压缩分配的内存可能会影响最大连接。此外,对大型缓冲区的压缩可能导致延迟,如非常复杂的正则表达式或较长的正则表达式列表。
并非所有 MIME 类型从压缩中受益,但 HAProxy 仍然使用资源在指示时尝试压缩。通常而言,文本格式(如 html、css 和 js)与压缩格式获益,但已经压缩的格式(如图像、音频和视频)可能会因为需要压缩操作而无法获得太多的好处。
流程
为 Ingress Controller 配置
httpCompression字段。使用以下命令来编辑
IngressController资源:oc edit -n openshift-ingress-operator ingresscontrollers/default
$ oc edit -n openshift-ingress-operator ingresscontrollers/defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
spec下,将httpCompression策略字段设置为mimeTypes,并指定应该应用压缩的 MIME 类型列表:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.18. 公开路由器指标 复制链接链接已复制到粘贴板!
您可以在默认统计端口 1936 上以 Prometheus 格式公开 HAProxy 路由器指标。外部指标收集和聚合系统(如 Prometheus)可以访问 HAProxy 路由器指标。您可以在浏览器中以 HTML 的形式和以逗号分隔的值 (CSV) 格式查看 HAProxy 路由器指标。
先决条件
- 您已将防火墙配置为访问默认统计数据端口 1936。
流程
运行以下命令来获取路由器 pod 名称:
oc get pods -n openshift-ingress
$ oc get pods -n openshift-ingressCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE router-default-76bfffb66c-46qwp 1/1 Running 0 11h
NAME READY STATUS RESTARTS AGE router-default-76bfffb66c-46qwp 1/1 Running 0 11hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 获取路由器的用户名和密码,路由器 Pod 存储在
/var/lib/haproxy/conf/metrics-auth/statsUsername和/var/lib/haproxy/conf/metrics-auth/statsPassword文件中:运行以下命令来获取用户名:
oc rsh <router_pod_name> cat metrics-auth/statsUsername
$ oc rsh <router_pod_name> cat metrics-auth/statsUsernameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来获取密码:
oc rsh <router_pod_name> cat metrics-auth/statsPassword
$ oc rsh <router_pod_name> cat metrics-auth/statsPasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令,获取路由器 IP 和指标证书:
oc describe pod <router_pod>
$ oc describe pod <router_pod>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,以 Prometheus 格式获取原始统计信息:
curl -u <user>:<password> http://<router_IP>:<stats_port>/metrics
$ curl -u <user>:<password> http://<router_IP>:<stats_port>/metricsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来安全地访问指标:
curl -u user:password https://<router_IP>:<stats_port>/metrics -k
$ curl -u user:password https://<router_IP>:<stats_port>/metrics -kCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,访问默认的 stats 端口 1936:
curl -u <user>:<password> http://<router_IP>:<stats_port>/metrics
$ curl -u <user>:<password> http://<router_IP>:<stats_port>/metricsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例 6.1. 输出示例
… # HELP haproxy_backend_connections_total Total number of connections. # TYPE haproxy_backend_connections_total gauge haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route"} 0 haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route-alt"} 0 haproxy_backend_connections_total{backend="http",namespace="default",route="hello-route01"} 0 … # HELP haproxy_exporter_server_threshold Number of servers tracked and the current threshold value. # TYPE haproxy_exporter_server_threshold gauge haproxy_exporter_server_threshold{type="current"} 11 haproxy_exporter_server_threshold{type="limit"} 500 … # HELP haproxy_frontend_bytes_in_total Current total of incoming bytes. # TYPE haproxy_frontend_bytes_in_total gauge haproxy_frontend_bytes_in_total{frontend="fe_no_sni"} 0 haproxy_frontend_bytes_in_total{frontend="fe_sni"} 0 haproxy_frontend_bytes_in_total{frontend="public"} 119070 … # HELP haproxy_server_bytes_in_total Current total of incoming bytes. # TYPE haproxy_server_bytes_in_total gauge haproxy_server_bytes_in_total{namespace="",pod="",route="",server="fe_no_sni",service=""} 0 haproxy_server_bytes_in_total{namespace="",pod="",route="",server="fe_sni",service=""} 0 haproxy_server_bytes_in_total{namespace="default",pod="docker-registry-5-nk5fz",route="docker-registry",server="10.130.0.89:5000",service="docker-registry"} 0 haproxy_server_bytes_in_total{namespace="default",pod="hello-rc-vkjqx",route="hello-route",server="10.130.0.90:8080",service="hello-svc-1"} 0 …
通过在浏览器中输入以下 URL 来启动 stats 窗口:
http://<user>:<password>@<router_IP>:<stats_port>
http://<user>:<password>@<router_IP>:<stats_port>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:通过在浏览器中输入以下 URL 来获取 CSV 格式的统计信息:
http://<user>:<password>@<router_ip>:1936/metrics;csv
http://<user>:<password>@<router_ip>:1936/metrics;csvCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.19. 自定义 HAProxy 错误代码响应页面 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为 503、404 或两个错误页面指定自定义错误代码响应页面。当应用 Pod 没有运行时,HAProxy 路由器会提供一个 503 错误页面,如果请求的 URL 不存在,则 HAProxy 路由器会提供 404 错误页面。例如,如果您自定义 503 错误代码响应页面,则应用 Pod 未运行时会提供页面,并且 HAProxy 路由器为不正确的路由或不存在的路由提供默认的 404 错误代码 HTTP 响应页面。
自定义错误代码响应页面在配置映射中指定,然后修补至 Ingress Controller。配置映射键有两个可用的文件名,如下所示:error-page-503.http 和 error-page-404.http。
自定义 HTTP 错误代码响应页面必须遵循 HAProxy HTTP 错误页面配置指南。以下是默认 OpenShift Container Platform HAProxy 路由器 http 503 错误代码响应页面的示例。您可以使用默认内容作为模板来创建自己的自定义页面。
默认情况下,当应用没有运行或者路由不正确或不存在时,HAProxy 路由器仅提供一个 503 错误页面。此默认行为与 OpenShift Container Platform 4.8 及更早版本中的行为相同。如果没有提供用于自定义 HTTP 错误代码响应的配置映射,且您使用的是自定义 HTTP 错误代码响应页面,路由器会提供默认的 404 或 503 错误代码响应页面。
如果您使用 OpenShift Container Platform 默认 503 错误代码页面作为自定义的模板,文件中的标头需要编辑器而不是使用 CRLF 行结尾。
流程
在
openshift-config命名空间中创建一个名为my-custom-error-code-pages的配置映射:oc -n openshift-config create configmap my-custom-error-code-pages \ --from-file=error-page-503.http \ --from-file=error-page-404.http
$ oc -n openshift-config create configmap my-custom-error-code-pages \ --from-file=error-page-503.http \ --from-file=error-page-404.httpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要如果没有为自定义错误代码响应页面指定正确的格式,则会出现路由器 pod 中断。要解决此中断,您必须删除或更正配置映射并删除受影响的路由器 pod,以便使用正确的信息重新创建它们。
对 Ingress Controller 进行补丁以根据名称引用
my-custom-error-code-pages配置映射:oc patch -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"httpErrorCodePages":{"name":"my-custom-error-code-pages"}}}' --type=merge$ oc patch -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"httpErrorCodePages":{"name":"my-custom-error-code-pages"}}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress Operator 将
my-custom-error-code-pages配置映射从openshift-config命名空间复制到openshift-ingress命名空间。Operator 根据openshift-ingress命名空间中的模式<your_ingresscontroller_name>-errorpages命名配置映射。显示副本:
oc get cm default-errorpages -n openshift-ingress
$ oc get cm default-errorpages -n openshift-ingressCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME DATA AGE default-errorpages 2 25s
NAME DATA AGE default-errorpages 2 25s1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 配置映射名称示例为
default-errorpages,因为defaultIngress Controller 自定义资源 (CR) 已被修补。
确认包含自定义错误响应页面的配置映射挂载到路由器卷中,其中配置映射键是具有自定义 HTTP 错误代码响应的文件名:
对于 503 自定义 HTTP 自定义错误代码响应:
oc -n openshift-ingress rsh <router_pod> cat /var/lib/haproxy/conf/error_code_pages/error-page-503.http
$ oc -n openshift-ingress rsh <router_pod> cat /var/lib/haproxy/conf/error_code_pages/error-page-503.httpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于 404 自定义 HTTP 自定义错误代码响应:
oc -n openshift-ingress rsh <router_pod> cat /var/lib/haproxy/conf/error_code_pages/error-page-404.http
$ oc -n openshift-ingress rsh <router_pod> cat /var/lib/haproxy/conf/error_code_pages/error-page-404.httpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证自定义错误代码 HTTP 响应:
创建测试项目和应用程序:
oc new-project test-ingress
$ oc new-project test-ingressCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc new-app django-psql-example
$ oc new-app django-psql-exampleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于 503 自定义 http 错误代码响应:
- 停止应用的所有容器集。
运行以下 curl 命令或在浏览器中访问路由主机名:
curl -vk <route_hostname>
$ curl -vk <route_hostname>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
对于 404 自定义 http 错误代码响应:
- 访问不存在的路由或路由不正确。
运行以下 curl 命令或在浏览器中访问路由主机名:
curl -vk <route_hostname>
$ curl -vk <route_hostname>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
检查
haproxy.config文件中的errorfile属性是否正确:oc -n openshift-ingress rsh <router> cat /var/lib/haproxy/conf/haproxy.config | grep errorfile
$ oc -n openshift-ingress rsh <router> cat /var/lib/haproxy/conf/haproxy.config | grep errorfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.20. 设置 Ingress Controller 最大连接数 复制链接链接已复制到粘贴板!
集群管理员可以设置 OpenShift 路由器部署的最大同时连接数。您可以修补现有的 Ingress Controller 来提高最大连接数。
先决条件
- 以下假设您已创建了 Ingress Controller
流程
更新 Ingress Controller,以更改 HAProxy 的最大连接数:
oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"maxConnections": 7500}}}'$ oc -n openshift-ingress-operator patch ingresscontroller/default --type=merge -p '{"spec":{"tuningOptions": {"maxConnections": 7500}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告如果您设置了大于当前操作系统的
spec.tuningOptions.maxConnections值,则 HAProxy 进程不会启动。有关这个参数的更多信息,请参阅"Ingress Controller 配置参数"部分中的表。
第 7 章 OpenShift Container Platform 中的 Ingress 分片 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,Ingress Controller 可以服务所有路由,也可以提供路由的子集。默认情况下,Ingress Controller 提供集群中任何命名空间中创建的任何路由。您可以在集群中添加额外的 Ingress Controller,以通过创建 分片来优化路由,这些分片是基于所选特征的路由子集。要将路由标记为分片的成员,请使用 route 或 namespace metadata 字段中的标签。Ingress Controller 使用选择器 (也称为 选择表达式 )从要提供服务的整个路由池中选择路由子集。
当您希望在多个 Ingress Controller 之间负载平衡传入的流量时,当您要隔离到特定 Ingress Controller 的流量或下一部分中描述的各种其他原因时,Ingress 分片很有用。
默认情况下,每个路由都使用集群的默认域。但是,可以将路由配置为使用路由器的域。如需更多信息,请参阅为 Ingress Controller 创建路由。
7.1. Ingress Controller 分片 复制链接链接已复制到粘贴板!
您可以通过向路由、命名空间或两者添加标签,使用 Ingress 分片(也称为路由器分片)在多个路由器之间分发一组路由。Ingress Controller 使用一组对应的选择器来只接受具有指定标签的路由。每个 Ingress 分片都由使用给定选择表达式过滤的路由组成。
Ingress Controller 是网络流量进入集群的主要机制,因此对它们的需求可能非常大。作为集群管理员,您可以对路由进行分片,以达到以下目的:
- 在 Ingress Controller 或路由器与一些路由之间实现平衡,由此加快对变更的响应。
- 分配特定的路由,使其具有不同于其它路由的可靠性保证。
- 允许特定的 Ingress Controller 定义不同的策略。
- 只允许特定的路由使用其他功能。
- 在不同的地址上公开不同的路由,例如使内部和外部用户能够看到不同的路由。
- 在蓝绿部署期间,将流量从应用的一个版本转移到另一个版本。
当 Ingress Controller 被分片时,一个给定路由被接受到组中的零个或多个 Ingress Controller。路由的状态描述了 Ingress Controller 是否已接受它。只有 Ingress Controller 对其分片是唯一的时,才会接受路由。
Ingress Controller 可以使用三个分片方法:
- 仅将命名空间选择器添加到 Ingress Controller,以便命名空间中带有与命名空间选择器匹配的标签的所有路由都位于 Ingress shard 中。
- 只向 Ingress Controller 添加路由选择器,因此所有与路由选择器匹配的标签的路由都位于 Ingress 分片中。
- 将命名空间选择器和路由选择器添加到 Ingress Controller 中,以便使用与命名空间选择器匹配的路由选择器匹配的标签的路由位于 Ingress shard 中。
使用分片,您可以在多个 Ingress Controller 上分发路由子集。这些子集可以是非重叠的,也称为 传统 分片,或是重叠的,也称为 overlapped 分片。
7.1.1. 传统分片示例 复制链接链接已复制到粘贴板!
Ingress Controller finops-router 使用标签选择器 spec.namespaceSelector.matchLabels.name 设置为 finance 和 ops :
finops-router 的 YAML 定义示例
第二个 Ingress Controller dev-router 配置有标签选择器 spec.namespaceSelector.matchLabels.name 设置为 dev :
dev-router 的 YAML 定义示例
如果所有应用程序路由都位于单独的命名空间中,每个命名空间都分别使用 name:finance、name:ops 和 name:dev 标记,此配置会在两个 Ingress Controller 之间有效分发您的路由。不应处理用于控制台、身份验证和其他目的的 OpenShift Container Platform 路由。
在上面的场景中,分片成为分区的一种特殊情况,没有重叠的子集。路由在路由器分片之间划分。
默认 Ingress Controller 继续提供所有路由,除非 namespaceSelector 或 routeSelector 字段包含用于排除的路由。有关如何从默认 Ingress Controller 中排除路由的更多信息,请参阅这个 红帽知识库解决方案 和"分片默认 Ingress Controller"。
7.1.2. 重叠的分片示例 复制链接链接已复制到粘贴板!
除了上例中的 finops-router 和 dev-router 外,您也具有 devops-router,它被配置为标签选择器 spec.namespaceSelector.matchLabels.name,设置为 dev 和 ops :
devops-router 的 YAML 定义示例
标签为 name:dev 和 name:ops 的命名空间中的路由现在由两个不同的 Ingress Controller 服务。使用这个配置,您有重叠的路由子集。
通过重叠的路由子集,您可以创建更复杂的路由规则。例如,您可以在向 devops-router 发送较低优先级的流量时,将优先级更高的流量放入专用的 finops-router。
7.1.3. 分片默认 Ingress Controller 复制链接链接已复制到粘贴板!
创建新的 Ingress shard 后,可能会接受到默认 Ingress Controller 接受的新 Ingress 分片的路由。这是因为默认 Ingress Controller 没有选择器,并默认接受所有路由。
您可以使用命名空间选择器或路由选择器来限制 Ingress Controller 使用特定标签提供路由。以下流程限制默认 Ingress Controller,使用命名空间选择器为新分片的 finance、ops 和 dev 提供。这为 Ingress 分片增加了额外的隔离。
您必须在同一 Ingress Controller 上保留所有 OpenShift Container Platform 管理路由。因此,避免在排除这些基本路由的默认 Ingress Controller 中添加额外的选择器。
先决条件
-
已安装 OpenShift CLI(
oc)。 - 您以项目管理员身份登录。
流程
运行以下命令来修改默认 Ingress Controller:
oc edit ingresscontroller -n openshift-ingress-operator default
$ oc edit ingresscontroller -n openshift-ingress-operator defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑 Ingress Controller 以包含一个
namespaceSelector,它排除了任何finance、ops和dev标签的路由:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
默认 Ingress Controller 不再提供标记为 name:finance、name:ops 和 name:dev 的命名空间。
7.1.4. Ingress 分片和 DNS 复制链接链接已复制到粘贴板!
集群管理员负责为项目中的每个路由器生成单独的 DNS 条目。路由器不会将未知路由转发到另一个路由器。
考虑以下示例:
-
路由器 A 驻留在主机 192.168.0.5 上,并且具有
*.foo.com的路由。 -
路由器 B 驻留在主机 192.168.1.9 上,并且具有
*.example.com的路由。
单独的 DNS 条目必须将 *.foo.com 解析为托管 Router A 和 *.example.com 的节点到托管路由器 B 的节点:
-
*.foo.com A IN 192.168.0.5 -
*.example.com A IN 192.168.1.9
7.1.5. 通过路由标签(label)配置 Ingress Controller 分片 复制链接链接已复制到粘贴板!
使用路由标签进行 Ingress Controller 分片,意味着 Ingress Controller 提供由路由选择器选择的任意命名空间中的所有路由。
图 7.1. 使用路由标签进行 Ingress 分片
在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。
流程
编辑
router-internal.yaml文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定 Ingress Controller 使用的域。此域必须与默认 Ingress Controller 域不同。
应用 Ingress Controller
router-internal.yaml文件:oc apply -f router-internal.yaml
# oc apply -f router-internal.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress Controller 选择具有
type: sharded标签的任意命名空间中的路由。使用
router-internal.yaml中配置的域创建新路由:oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
$ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.netCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.1.6. 使用命名空间标签配置 Ingress Controller 分片 复制链接链接已复制到粘贴板!
使用命名空间标签进行 Ingress Controller 分片,意味着 Ingress Controller 提供由命名空间选择器选择的任意命名空间中的所有路由。
图 7.2. 使用命名空间标签进行 Ingress 分片
在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。
流程
编辑
router-internal.yaml文件:cat router-internal.yaml
# cat router-internal.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定 Ingress Controller 使用的域。此域必须与默认 Ingress Controller 域不同。
应用 Ingress Controller
router-internal.yaml文件:oc apply -f router-internal.yaml
# oc apply -f router-internal.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Ingress Controller 选择由命名空间选择器选择的具有
type: sharded标签的任意命名空间中的路由。使用
router-internal.yaml中配置的域创建新路由:oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net
$ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.netCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2. 为 Ingress Controller 分片创建路由 复制链接链接已复制到粘贴板!
通过使用路由,您可以通过 URL 托管应用程序。在这种情况下,主机名没有被设置,路由会使用子域。当您指定子域时,会自动使用公开路由的 Ingress Controller 域。对于由多个 Ingress Controller 公开路由的情况,路由由多个 URL 托管。
以下流程描述了如何为 Ingress Controller 分片创建路由,使用 hello-openshift 应用程序作为示例。
在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。
先决条件
-
已安装 OpenShift CLI(
oc)。 - 您以项目管理员身份登录。
- 您有一个 web 应用来公开端口,以及侦听端口流量的 HTTP 或 TLS 端点。
- 您已为分片配置了 Ingress Controller。
流程
运行以下命令,创建一个名为
hello-openshift的项目:oc new-project hello-openshift
$ oc new-project hello-openshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在项目中创建 pod:
oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json
$ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,创建名为
hello-openshift的服务:oc expose pod/hello-openshift
$ oc expose pod/hello-openshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
hello-openshift-route.yaml的路由定义:为分片创建的路由的 YAML 定义:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过运行以下命令,使用
hello-openshift-route.yaml创建到hello-openshift应用程序的路由:oc -n hello-openshift create -f hello-openshift-route.yaml
$ oc -n hello-openshift create -f hello-openshift-route.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用以下命令获取路由的状态:
oc -n hello-openshift get routes/hello-openshift-edge -o yaml
$ oc -n hello-openshift get routes/hello-openshift-edge -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 生成的
Route资源应类似以下示例:输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其它资源
第 8 章 配置 Ingress Controller 端点发布策略 复制链接链接已复制到粘贴板!
8.1. Ingress Controller 端点发布策略 复制链接链接已复制到粘贴板!
NodePortService 端点发布策略
NodePortService 端点发布策略使用 Kubernetes NodePort 服务发布 Ingress Controller。
在这个配置中,Ingress Controller 部署使用容器网络。创建了一个 NodePortService 来发布部署。特定的节点端口由 OpenShift Container Platform 动态分配; 但是,为了支持静态端口分配,您会保留对受管 NodePortService 的节点端口字段的更改 。
图 8.1. NodePortService 图表
上图显示了与 OpenShift Container Platform Ingress NodePort 端点发布策略相关的以下概念:
- 集群中的所有可用节点均有自己的外部可访问 IP 地址。集群中运行的服务绑定到所有节点的唯一 NodePort。
-
当客户端连接到停机的节点时,例如,通过连接图形中的
10.0.128.4IP 地址,节点端口将客户端直接连接到运行该服务的可用节点。在这种情况下,不需要负载平衡。如图形中所显,10.0.128.4地址已不可用,必须使用另一个 IP 地址。
Ingress Operator 忽略对服务的 .spec.ports[].nodePort 字段的任何更新。
默认情况下,端口会自动分配,您可以访问集成的端口分配。但是,有时需要静态分配端口来与现有基础架构集成,这些基础架构可能无法根据动态端口进行重新配置。要实现与静态节点端口的集成,您可以直接更新受管服务资源。
如需有关 daemonset 的更多信息,请参阅关于 NodePort 的 Kubernetes 服务文档。
HostNetwork 端点发布策略
HostNetwork 端点发布策略会在部署 Ingress Controller 的节点端口上发布 Ingress Controller。
带有 HostNetwork 端点发布策略的 Ingress Controller 每个节点只能有一个 pod 副本。如果您想要 n 个副本,则必须至少使用可调度这些副本的 n 个节点。因为每个 Pod 副本都会通过调度的节点主机上的端口 80 和 443 进行请求,所以如果同一节点上的其他 pod 使用这些端口,则无法将副本调度到该节点。
8.1.1. 将 Ingress Controller 端点发布范围配置为 Internal 复制链接链接已复制到粘贴板!
当集群管理员在没有指定集群为私有的情况下安装新集群时,将默认 Ingress Controller 创建,并将 scope 设置为 External。集群管理员可以将 External 范围的 Ingress Controller 更改为 Internal。
先决条件
-
已安装
ocCLI。
流程
要将
External范围的 Ingress Controller 更改为Internal,请输入以下命令:oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要检查 Ingress Controller 的状态,请输入以下命令:
oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
$ oc -n openshift-ingress-operator get ingresscontrollers/default -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Progressing状态条件指示您必须执行进一步的操作。例如,状态条件可以通过输入以下命令来指示需要删除该服务:oc -n openshift-ingress delete services/router-default
$ oc -n openshift-ingress delete services/router-defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果删除了该服务,Ingress Operator 会重新创建为
Internal。
8.1.2. 配置 Ingress Controller 端点发布范围到外部 复制链接链接已复制到粘贴板!
当集群管理员在没有指定集群为私有的情况下安装新集群时,将默认 Ingress Controller 创建,并将 scope 设置为 External。
Ingress Controller 的范围可以在安装过程中或之后配置为 Internal,集群管理员可以将 内部 Ingress Controller 更改为 External。
在某些平台上,需要删除并重新创建服务。
更改范围可能会导致 Ingress 流量中断,这可能会持续几分钟。这适用于需要删除和重新创建服务的平台,因为流程可能会导致 OpenShift Container Platform 取消置备现有服务负载均衡器、置备一个新服务负载均衡器并更新 DNS。
先决条件
-
已安装
ocCLI。
流程
要将
内部范围的 Ingress Controller 更改为外部,请输入以下命令:oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'$ oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要检查 Ingress Controller 的状态,请输入以下命令:
oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
$ oc -n openshift-ingress-operator get ingresscontrollers/default -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Progressing状态条件指示您必须执行进一步的操作。例如,状态条件可以通过输入以下命令来指示需要删除该服务:oc -n openshift-ingress delete services/router-default
$ oc -n openshift-ingress delete services/router-defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果删除了该服务,Ingress Operator 会重新创建为
External。
第 9 章 验证到端点的连接 复制链接链接已复制到粘贴板!
Cluster Network Operator(CNO)运行一个控制器(连接检查控制器),用于在集群的资源间执行连接健康检查。通过查看健康检查的结果,您可以诊断连接问题或解决网络连接问题,将其作为您要调查的问题的原因。
9.1. 执行连接健康检查 复制链接链接已复制到粘贴板!
要验证集群资源是否可以访问,请向以下集群 API 服务的每个服务都有一个 TCP 连接:
- Kubernetes API 服务器服务
- Kubernetes API 服务器端点
- OpenShift API 服务器服务
- OpenShift API 服务器端点
- 负载均衡器
要验证服务和服务端点是否可在集群中的每个节点上访问,请对以下每个目标都进行 TCP 连接:
- 健康检查目标服务
- 健康检查目标端点
9.2. 连接健康检查实现 复制链接链接已复制到粘贴板!
在集群中,连接检查控制器或编配连接验证检查。连接测试的结果存储在 openshift-network-diagnostics 命名空间中的 PodNetworkConnectivity 对象中。连接测试会每分钟以并行方式执行。
Cluster Network Operator(CNO)将几个资源部署到集群,以发送和接收连接性健康检查:
- 健康检查源
-
此程序部署在一个由
Deployment对象管理的单个 pod 副本集中。程序会消耗PodNetworkConnectivity对象,并连接到每个对象中指定的spec.targetEndpoint。 - 健康检查目标
- pod 作为集群中每个节点上的守护进程集的一部分部署。pod 侦听入站健康检查。在每个节点上存在这个 pod 可以测试到每个节点的连接。
9.3. PodNetworkConnectivityCheck 对象字段 复制链接链接已复制到粘贴板!
PodNetworkConnectivityCheck 对象字段在下表中描述。
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
对象的名称,其格式如下:
|
|
|
|
与对象关联的命名空间。此值始终为 |
|
|
|
连接检查来源于的 pod 的名称,如 |
|
|
|
连接检查的目标,如 |
|
|
| 要使用的 TLS 证书配置。 |
|
|
| 使用的 TLS 证书的名称(若有)。默认值为空字符串。 |
|
|
| 代表连接测试条件和最近连接发生和失败的日志的对象。 |
|
|
| 连接检查以及任何之前的状态的最新状态。 |
|
|
| 连接测试日志不会失败。 |
|
|
| 涵盖任何中断的时间连接测试日志。 |
|
|
| 成功尝试的连接测试日志。 |
下表描述了 status.conditions 阵列中对象的字段:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 连接条件从一个状态转换到另一个状态的时间。 |
|
|
| 有关最后一次转换的详情(人类可读的格式)。 |
|
|
| 有关最后一次转换的详情(机器可读的格式)。 |
|
|
| 条件的状态。 |
|
|
| 条件的类型。 |
下表描述了 status.conditions 阵列中对象的字段:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 连接失败时的时间戳。 |
|
|
| 连接日志条目,包括与成功关闭相关的日志条目。 |
|
|
| 以人类可读格式显示停机详情概述。 |
|
|
| 第一次检测到连接失败时的时间戳。 |
|
|
| 连接日志条目,包括原始失败。 |
连接日志字段
下表中描述了连接日志条目的字段。该对象用于以下字段:
-
status.failures[] -
status.successes[] -
status.outages[].startLogs[] -
status.outages[].endLogs[]
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 记录操作的持续时间。 |
|
|
| 以人类可读格式提供的状态信息。 |
|
|
|
以可读格式提供状态的原因。这个值是 |
|
|
| 指明日志条目是否成功或失败。 |
|
|
| 连接检查的开始时间。 |
9.4. 验证端点的网络连接 复制链接链接已复制到粘贴板!
作为集群管理员,您可以验证端点的连接性,如 API 服务器、负载均衡器、服务或 Pod。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin角色的用户访问集群。
流程
要列出当前的
PodNetworkConnectivityCheck对象,请输入以下命令:oc get podnetworkconnectivitycheck -n openshift-network-diagnostics
$ oc get podnetworkconnectivitycheck -n openshift-network-diagnosticsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看连接测试日志:
- 在上一命令的输出中,标识您要查看连接日志的端点。
要查看对象,请输入以下命令:
oc get podnetworkconnectivitycheck <name> \ -n openshift-network-diagnostics -o yaml
$ oc get podnetworkconnectivitycheck <name> \ -n openshift-network-diagnostics -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这里的
<name>指定PodNetworkConnectivityCheck对象的名称。输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 10 章 更改集群网络的 MTU 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在集群安装后更改集群网络的 MTU。这一更改具有破坏性,因为必须重启集群节点才能完成 MTU 更改。您只能为使用 OVN-Kubernetes 或 OpenShift SDN 集群网络供应商的集群更改 MTU。
10.1. 关于集群 MTU 复制链接链接已复制到粘贴板!
在安装集群网络的最大传输单元(MTU)期间,会根据集群中节点的主网络接口的 MTU 自动检测到。您通常不需要覆盖检测到的 MTU。
您可能希望因为以下原因更改集群网络的 MTU:
- 集群安装过程中检测到的 MTU 不正确
- 集群基础架构现在需要不同的 MTU,如添加需要不同 MTU 的节点来获得最佳性能
您只能针对 OVN-Kubernetes 和 OpenShift SDN 集群网络供应商更改集群 MTU。
10.1.1. 服务中断注意事项 复制链接链接已复制到粘贴板!
当您为集群启动 MTU 更改时,以下效果可能会影响服务可用性:
- 至少需要两个滚动重启才能完成迁移到新的 MTU。在此过程中,一些节点在重启时不可用。
- 部署到集群的特定应用程序带有较短的超时间隔,超过绝对 TCP 超时间隔可能会在 MTU 更改过程中造成中断。
10.1.2. MTU 值选择 复制链接链接已复制到粘贴板!
在规划 MTU 迁移时,需要考虑两个相关但不同的 MTU 值。
- Hardware MTU :此 MTU 值根据您的网络基础架构的具体设置。
Cluster network MTU :此 MTU 值始终小于您的硬件 MTU,以考虑集群网络覆盖开销。具体开销由集群网络供应商决定:
-
OVN-Kubernetes:
100字节 -
OpenShift SDN:
50字节
-
OVN-Kubernetes:
如果您的集群为不同的节点需要不同的 MTU 值,则必须从集群中任何节点所使用的最低 MTU 值中减去集群网络供应商的开销值。例如,如果集群中的某些节点的 MTU 为 9001,而某些节点的 MTU 为 1500,则必须将此值设置为 1400。
10.1.3. 迁移过程如何工作 复制链接链接已复制到粘贴板!
下表对迁移过程进行了概述,它分为操作中的用户发起的步骤,以及在响应过程中迁移过程要执行的操作。
| 用户发起的步骤 | OpenShift Container Platform 活动 |
|---|---|
| 在 Cluster Network Operator 配置中设置以下值:
| Cluster Network Operator(CNO) :确认每个字段都设置为有效的值。
如果提供的值有效,CNO 会生成一个新的临时配置,它将集群网络集的 MTU 设置为 Machine Config Operator(MCO) :执行集群中每个节点的滚动重启。 |
| 重新配置集群中节点的主网络接口 MTU。您可以使用各种方法完成此操作,包括:
| N/A |
|
在集群网络供应商的 CNO 配置中设置 | Machine Config Operator(MCO) :使用新的 MTU 配置执行集群中每个节点的滚动重启。 |
10.2. 更改集群 MTU 复制链接链接已复制到粘贴板!
作为集群管理员,您可以更改集群的最大传输单元(MTU)。当 MTU 更新推出时,集群中的迁移具有破坏性且节点可能会临时不可用。
以下流程描述了如何使用机器配置、DHCP 或 ISO 更改集群 MTU。如果使用 DHCP 或 ISO 方法,则必须在安装集群后保留的配置工件来完成此流程。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 已为集群识别目标 MTU。正确的 MTU 因集群使用的集群网络供应商而异:
-
OVN-Kubernetes: 集群 MTU 必须设置为比集群中的最低硬件 MTU 值小
100。 -
OpenShift SDN :集群 MTU 必须设置为比集群中的最低硬件 MTU 值小
50。
-
OVN-Kubernetes: 集群 MTU 必须设置为比集群中的最低硬件 MTU 值小
流程
要增加或减少集群网络的 MTU,请完成以下步骤。
要获得集群网络的当前 MTU,请输入以下命令:
oc describe network.config cluster
$ oc describe network.config clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为硬件 MTU 准备配置:
如果您的硬件 MTU 通过 DHCP 指定,请使用以下 dnsmasq 配置更新 DHCP 配置:
dhcp-option-force=26,<mtu>
dhcp-option-force=26,<mtu>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<mtu>- 指定要公告的 DHCP 服务器的硬件 MTU。
- 如果使用 PXE 的内核命令行指定硬件 MTU,请相应地更新该配置。
如果在 NetworkManager 连接配置中指定了硬件 MTU,请完成以下步骤。如果没有使用 DHCP、内核命令行或某种其他方法显式指定网络配置,则此方法是 OpenShift Container Platform 的默认方法。集群节点必须全部使用相同的底层网络配置,才能使以下过程未经修改地工作。
查找主网络接口:
如果使用 OpenShift SDN 集群网络供应商,请输入以下命令:
oc debug node/<node_name> -- chroot /host ip route list match 0.0.0.0/0 | awk '{print $5 }'$ oc debug node/<node_name> -- chroot /host ip route list match 0.0.0.0/0 | awk '{print $5 }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<node_name>- 指定集群中的节点的名称。
如果使用 OVN-Kubernetes 集群网络供应商,请输入以下命令:
oc debug node/<node_name> -- chroot /host nmcli -g connection.interface-name c show ovs-if-phys0
$ oc debug node/<node_name> -- chroot /host nmcli -g connection.interface-name c show ovs-if-phys0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<node_name>- 指定集群中的节点的名称。
在
<interface>-mtu.conf文件中创建以下 NetworkManager 配置:NetworkManager 连接配置示例
[connection-<interface>-mtu] match-device=interface-name:<interface> ethernet.mtu=<mtu>
[connection-<interface>-mtu] match-device=interface-name:<interface> ethernet.mtu=<mtu>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<mtu>- 指定新的硬件 MTU 值。
<interface>- 指定主网络接口名称。
创建两个
MachineConfig对象,一个用于 control plane 节点,另一个用于集群中的 worker 节点:在
control-plane-interface.bu文件中创建以下 Butane 配置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
worker-interface.bu文件中创建以下 Butane 配置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,从 Butane 配置创建
MachineConfig对象:for manifest in control-plane-interface worker-interface; do butane --files-dir . $manifest.bu > $manifest.yaml done$ for manifest in control-plane-interface worker-interface; do butane --files-dir . $manifest.bu > $manifest.yaml doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow
要开始 MTU 迁移,请输入以下命令指定迁移配置。Machine Config Operator 在集群中执行节点的滚动重启,以准备 MTU 更改。
oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": { "mtu": { "network": { "from": <overlay_from>, "to": <overlay_to> } , "machine": { "to" : <machine_to> } } } } }'$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": { "mtu": { "network": { "from": <overlay_from>, "to": <overlay_to> } , "machine": { "to" : <machine_to> } } } } }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<overlay_from>- 指定当前的集群网络 MTU 值。
<overlay_to>-
指定集群网络的目标 MTU。这个值相对于
<machine_to>,对于 OVN-Kubernetes,值必须小100,OpenShift SDN 必须小50。 <machine_to>- 指定底层主机网络上的主网络接口的 MTU。
增加集群 MTU 的示例
oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 9000 } , "machine": { "to" : 9100} } } } }'$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 9000 } , "machine": { "to" : 9100} } } } }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当 MCO 更新每个机器配置池中的机器时,它会逐一重启每个节点。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:
oc get mcp
$ oc get mcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 成功更新的节点具有以下状态:
UPDATED=true、UPDATING=false、DEGRADED=false。注意默认情况下,MCO 会一次在一个池中更新一个机器,从而导致迁移总时间随着集群大小的增加而增加。
确认主机上新机器配置的状态:
要列出机器配置状态和应用的机器配置名称,请输入以下命令:
oc describe node | egrep "hostname|machineconfig"
$ oc describe node | egrep "hostname|machineconfig"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
kubernetes.io/hostname=master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/reason: machineconfiguration.openshift.io/state: Done
kubernetes.io/hostname=master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/reason: machineconfiguration.openshift.io/state: DoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证以下语句是否正确:
-
machineconfiguration.openshift.io/state字段的值为Done。 -
machineconfiguration.openshift.io/currentConfig字段的值等于machineconfiguration.openshift.io/desiredConfig字段的值。
-
要确认机器配置正确,请输入以下命令:
oc get machineconfig <config_name> -o yaml | grep ExecStart
$ oc get machineconfig <config_name> -o yaml | grep ExecStartCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这里的
<config_name>是machineconfiguration.openshift.io/currentConfig字段中机器配置的名称。机器配置必须包括以下对 systemd 配置的更新:
ExecStart=/usr/local/bin/mtu-migration.sh
ExecStart=/usr/local/bin/mtu-migration.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
更新底层网络接口 MTU 值:
如果您要使用 NetworkManager 连接配置指定新 MTU,请输入以下命令。MachineConfig Operator 会自动执行集群中节点的滚动重启。
for manifest in control-plane-interface worker-interface; do oc create -f $manifest.yaml done$ for manifest in control-plane-interface worker-interface; do oc create -f $manifest.yaml doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您要使用 DHCP 服务器选项或内核命令行和 PXE 指定新 MTU,请对基础架构进行必要的更改。
当 MCO 更新每个机器配置池中的机器时,它会逐一重启每个节点。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:
oc get mcp
$ oc get mcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 成功更新的节点具有以下状态:
UPDATED=true、UPDATING=false、DEGRADED=false。注意默认情况下,MCO 会一次在一个池中更新一个机器,从而导致迁移总时间随着集群大小的增加而增加。
确认主机上新机器配置的状态:
要列出机器配置状态和应用的机器配置名称,请输入以下命令:
oc describe node | egrep "hostname|machineconfig"
$ oc describe node | egrep "hostname|machineconfig"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
kubernetes.io/hostname=master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/reason: machineconfiguration.openshift.io/state: Done
kubernetes.io/hostname=master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b machineconfiguration.openshift.io/reason: machineconfiguration.openshift.io/state: DoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证以下语句是否正确:
-
machineconfiguration.openshift.io/state字段的值为Done。 -
machineconfiguration.openshift.io/currentConfig字段的值等于machineconfiguration.openshift.io/desiredConfig字段的值。
-
要确认机器配置正确,请输入以下命令:
oc get machineconfig <config_name> -o yaml | grep path:
$ oc get machineconfig <config_name> -o yaml | grep path:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这里的
<config_name>是machineconfiguration.openshift.io/currentConfig字段中机器配置的名称。如果成功部署机器配置,则前面的输出包含
/etc/NetworkManager/system-connections/<connection_name>文件路径。机器配置不得包含
ExecStart=/usr/local/bin/mtu-migration.sh行。
要完成 MTU 迁移,请输入以下命令之一:
如果使用 OVN-Kubernetes 集群网络供应商:
oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<mtu>-
指定您使用
<overlay_to>指定的新集群网络 MTU。
如果使用 OpenShift SDN 集群网络供应商:
oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "openshiftSDNConfig": { "mtu": <mtu> }}}}'$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "openshiftSDNConfig": { "mtu": <mtu> }}}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<mtu>-
指定您使用
<overlay_to>指定的新集群网络 MTU。
最终调整 MTU 迁移后,每个 MCP 节点会逐个重启。您必须等到所有节点都已更新。输入以下命令检查机器配置池状态:
oc get mcp
$ oc get mcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 成功更新的节点具有以下状态:
UPDATED=true、UPDATING=false、DEGRADED=false。
验证
您可以验证集群中的节点是否使用上一步中指定的 MTU。
要获得集群网络的当前 MTU,请输入以下命令:
oc describe network.config cluster
$ oc describe network.config clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 获取节点的主网络接口的当前 MTU。
要列出集群中的节点,请输入以下命令:
oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要获取节点上主网络接口的当前 MTU 设置,请输入以下命令:
oc debug node/<node> -- chroot /host ip address show <interface>
$ oc debug node/<node> -- chroot /host ip address show <interface>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<node>- 指定上一步中的输出节点。
<interface>- 指定节点的主网络接口名称。
输出示例
ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8051
ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8051Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 11 章 配置节点端口服务范围 复制链接链接已复制到粘贴板!
作为集群管理员,您可以扩展可用的节点端口范围。如果您的集群使用大量节点端口,可能需要增加可用端口的数量。
默认端口范围为 30000-32767。您永远不会缩小端口范围,即使您首先将其扩展超过默认范围。
11.1. 先决条件 复制链接链接已复制到粘贴板!
-
集群基础架构必须允许访问您在扩展范围内指定的端口。例如,如果您将节点端口范围扩展到
30000-32900,防火墙或数据包过滤配置必须允许32768-32900端口范围。
11.2. 扩展节点端口范围 复制链接链接已复制到粘贴板!
您可以扩展集群的节点端口范围。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
要扩展节点端口范围,请输入以下命令。将
<port>替换为新范围内的最大端口号码。oc patch network.config.openshift.io cluster --type=merge -p \ '{ "spec": { "serviceNodePortRange": "30000-<port>" } }'$ oc patch network.config.openshift.io cluster --type=merge -p \ '{ "spec": { "serviceNodePortRange": "30000-<port>" } }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来更新节点端口范围:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
network.config.openshift.io/cluster patched
network.config.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要确认配置是活跃的,请输入以下命令。应用更新可能需要几分钟。
oc get configmaps -n openshift-kube-apiserver config \ -o jsonpath="{.data['config\.yaml']}" | \ grep -Eo '"service-node-port-range":["[[:digit:]]+-[[:digit:]]+"]'$ oc get configmaps -n openshift-kube-apiserver config \ -o jsonpath="{.data['config\.yaml']}" | \ grep -Eo '"service-node-port-range":["[[:digit:]]+-[[:digit:]]+"]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
"service-node-port-range":["30000-33000"]
"service-node-port-range":["30000-33000"]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 12 章 配置 IP 故障转移 复制链接链接已复制到粘贴板!
本节论述了为 OpenShift Container Platform 集群上的 pod 和服务配置 IP 故障转移。
IP 故障转移(IP failover)在一组节点上管理一个虚拟 IP(VIP)地址池。集合中的每个 VIP 都由从集合中选择的节点提供服务。只要单个节点可用,就会提供 VIP。无法将 VIP 显式分发到节点上,因此可能存在没有 VIP 的节点和其他具有多个 VIP 的节点。如果只有一个节点,则所有 VIP 都在其中。
VIP 必须可以从集群外部路由。
IP 故障转移会监控每个 VIP 上的端口,以确定该端口能否在节点上访问。如果端口无法访问,则不会向节点分配 VIP。如果端口设为 0,则会禁止此检查。检查脚本执行所需的测试。
IP 故障转移使用 Keepalived 在一组主机上托管一组外部访问的 VIP 地址。在一个时间点上,每个 VIP 仅由一个主机提供服务。Keepalived 使用虚拟路由器冗余协议(VRRP)决定在主机集合中使用哪个主机提供 VIP 服务。如果主机不可用,或者 Keepalived 正在监视的服务没有响应,则 VIP 会切换到主机集中的另外一个主机。这意味着只要主机可用,便始终可以提供 VIP 服务。
当运行 Keepalived 的节点通过检查脚本时,该节点上的 VIP 可以根据其优先级和当前 master 的优先级以及抢占策略决定进入 master 状态。
集群管理员可以通过 OPENSHIFT_HA_NOTIFY_SCRIPT 变量提供一个脚本,每当节点上的 VIP 的状态发生变化时会调用此脚本。keepalived 在为 VIP 提供服务时为 master 状态;当另一个节点提供 VIP 服务时,状态为 backup;当检查脚本失败时,状态为 fault。每当状态更改时,notify 脚本都会被调用,并显示新的状态。
您可以在 OpenShift Container Platform 上创建 IP 故障转移部署配置。IP 故障转移部署配置指定 VIP 地址的集合,以及服务它们的一组节点。一个集群可以具有多个 IP 故障转移部署配置,各自管理自己的一组唯一的 VIP 地址。IP 故障转移配置中的每个节点运行 IP 故障转移 pod,此 pod 运行 Keepalived。
使用 VIP 访问带有主机网络的 pod 时,应用程序 pod 在运行 IP 故障转移 pod 的所有节点上运行。这可让任何 IP 故障转移节点成为主节点,并在需要时为 VIP 服务。如果应用程序 pod 没有在所有具有 IP 故障转移功能的节点上运行,有些 IP 故障转移节点不会为 VIP 服务,或者某些应用 pod 都不会接收任何流量。对 IP 故障转移和应用容器集使用相同的选择器和复制数,以避免这种不匹配。
在使用 VIP 访问服务时,任何节点都可以位于节点的 IP 故障转移集中,因为无论应用容器集在哪里运行,该服务都可以在所有节点上访问。任何 IP 故障转移节点可以随时变成主节点。服务可以使用外部 IP 和服务端口,或者可以使用 NodePort。
在服务定义中使用外部 IP 时,VIP 被设置为外部 IP,IP 故障转移监控端口则设为服务端口。在使用节点端口时,该端口在集群的每个节点上打开,服务则从当前服务于 VIP 的任何节点对流量进行负载平衡。在这种情况下,IP 故障转移监控端口在服务定义中设置为 NodePort。
设置 NodePort 是一个特权操作。
即使一个服务 VIP 具有高可用性,但性能仍会受到影响。keepalived 确保每个 VIP 都由配置中的某个节点提供服务,即使其他节点没有,也可以在同一节点上出现多个 VIP。当 IP 故障转移在同一节点上放置多个 VIP 时,在一组 VIP 间进行外部负载平衡的策略可能会被破解。
当使用 ingressIP 时,您可以将 IP 故障切换设置为与 ingressIP 范围相同的 VIP 范围。您还可以禁用监控端口。在本例中,所有 VIP 都出现在集群的同一节点上。任何用户都可以使用 ingressIP 设置服务,并使其具有高可用性。
集群中最多有 254 个 VIP。
12.1. IP 故障转移环境变量 复制链接链接已复制到粘贴板!
下表包含用于配置 IP 故障转移的变量。
| 变量名称 | default | 描述 |
|---|---|---|
|
|
|
IP 故障转移 pod 会尝试在每个虚拟 IP(VIP)上打开到此端口的 TCP 连接。如果建立连接,则服务将被视为正在运行。如果此端口设为 |
|
|
IP 故障转移用于发送虚拟路由器冗余协议 (VRRP) 流量的接口名称。默认值为 | |
|
|
|
要创建的副本数。这必须与 IP 故障转移部署配置中的 |
|
|
要复制的 IP 地址范围列表。必须提供.例如, | |
|
|
|
用于设置虚拟路由器 ID 的偏移值。使用不同的偏移值可以在同一集群中存在多个 IP 故障转移配置。默认偏移值为 |
|
|
为 VRRP 创建的组数量。如果没有设置,则会为通过 | |
|
| 输入 |
iptables 链的名称,用于自动添加允许 VRRP 流量的 |
|
| 定期运行的脚本的 pod 文件系统中的完整路径名称,以验证应用是否正在运行。 | |
|
|
| 检查脚本运行的期间(以秒为单位)。 |
|
| 当状态发生变化时运行的脚本的 pod 文件系统的完整路径名称。 | |
|
|
|
处理新的具有更高优先级主机的策略。 |
12.2. 配置 IP 故障转移 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在整个集群中或在其中的一部分节点(由标签选项器定义)中配置 IP 故障转移。您还可以在集群中配置多个 IP 故障转移部署配置,每个配置都独立于其他配置。
IP 故障转移部署配置确保故障转移 pod 在符合限制或使用的标签的每个节点上运行。
此 pod 运行 Keepalived,它可以监控端点,并在第一个节点无法访问服务或端点时使用 Virtual Router Redundancy Protocol(VRRP)从一个节点切换到另一个节点的虚拟 IP(VIP)。
对于生产环境,设置一个选择器(selector),用于选择至少两个节点,并设置与所选节点数量相等的副本。
先决条件
-
使用具有
cluster-admin权限的用户登陆到集群。 - 已创建一个 pull secret。
流程
创建 IP 故障转移服务帐户:
oc create sa ipfailover
$ oc create sa ipfailoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为
hostNetwork更新安全性上下文约束(SCC):oc adm policy add-scc-to-user privileged -z ipfailover oc adm policy add-scc-to-user hostnetwork -z ipfailover
$ oc adm policy add-scc-to-user privileged -z ipfailover $ oc adm policy add-scc-to-user hostnetwork -z ipfailoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建部署 YAML 文件来配置 IP 故障转移:
IP 故障转移配置的部署 YAML 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- IP 故障转移部署的名称。
- 2
- 要复制的 IP 地址范围列表。必须提供.例如,
1.2.3.4-6,1.2.3.9。 - 3
- 为 VRRP 创建的组数量。如果没有设置,则会为通过
OPENSHIFT_HA_VIP_GROUPS变量指定的每个虚拟 IP 范围创建一个组。 - 4
- IP 故障切换用于发送 VRRP 流量的接口名称。默认情况下使用
eth0。 - 5
- IP 故障转移 pod 会尝试在每个 VIP 上打开到此端口的 TCP 连接。如果建立连接,则服务将被视为正在运行。如果此端口设为
0,则测试会始终通过。默认值为80。 - 6
- 用于设置虚拟路由器 ID 的偏移值。使用不同的偏移值可以在同一集群中存在多个 IP 故障转移配置。默认偏移值为
0,允许的范围是0到255。 - 7
- 要创建的副本数。这必须与 IP 故障转移部署配置中的
spec.replicas值匹配。默认值为2。 - 8
iptables链的名称,用于自动添加允许 VRRP 流量的iptables规则。如果没有设置值,则不会添加iptables规则。如果链不存在,则不会创建链,Keepalived 在单播模式下运行。默认为INPUT。- 9
- 当状态发生变化时运行的脚本的 pod 文件系统的完整路径名称。
- 10
- 定期运行的脚本的 pod 文件系统中的完整路径名称,以验证应用是否正在运行。
- 11
- 处理新的具有更高优先级主机的策略。默认值为
preempt_delay 300,这会导致,在有一个较低优先级的 master 提供 VIP 时,Keepalived 实例在 5 分钟后会接管 VIP。 - 12
- 检查脚本运行的期间(以秒为单位)。默认值为
2。 - 13
- 在创建部署之前创建 pull secret,否则您将在创建部署时收到错误。
12.3. 关于虚拟 IP 地址 复制链接链接已复制到粘贴板!
keepalived 管理一组虚拟 IP 地址(VIP)。管理员必须确保所有这些地址:
- 可在集群外部配置的主机上访问。
- 不可用于集群中的任何其他目的。
每个节点上的 keepalived 确定所需服务是否在运行。如果是,则支持 VIP,Keepalived 参与协商来确定哪个节点服务 VIP。对于要参与的节点,服务必须侦听 VIP 上的观察端口,或者必须禁用检查。
集合中的每个 VIP 最终都可能由不同的节点提供。
12.4. 配置检查和通知脚本 复制链接链接已复制到粘贴板!
keepalived 通过定期运行可选用户提供的检查脚本来监控应用的健康状况。例如,该脚本可以通过发出请求并验证响应来测试 Web 服务器。
不提供检查脚本时,将运行一个简单的默认脚本来测试 TCP 连接。当监控端口为 0 时,禁止此默认测试。
每个 IP 故障转移 pod 管理一个 Keepalived 守护进程,在运行 pod 的节点上管理一个或多个虚拟 IP(VIP)。Keepalived 守护进程为该节点保留每个 VIP 的状态。特定节点上的特定 VIP 可能处于 master、backup 或 fault 状态。
当处于 master 状态的节点上的 VIP 的检查脚本失败时,该节点上的 VIP 将进入 fault 状态,这会触发重新协商。在重新协商过程中,节点上没有处于 fault 状态的所有 VIP 都参与决定哪个节点接管 VIP。最后,VIP 在某些节点上进入 master 状态,VIP 则在其他节点上保持 backup 状态。
当具有 backup 状态的 VIP 的节点失败时,该节点上的 VIP 将进入 fault 状态。当检查脚本再次通过了对 fault 状态的节点上的 VIP 检查时,该节点上的 VIP 将退出 fault 状态,并协商来进入 master 状态。然后,该节点上的 VIP 可能会进入 master 或 backup 状态。
作为集群管理员,您可以提供一个可选的 notify 脚本,该脚本会在状态发生变化时调用。keepalived 将以下三个参数传递给脚本:
-
$1-group或instance -
$2-group或instance的名称 -
$3- 新状态:master、backup或fault
检查和通知在 IP 故障转移容器集中运行的脚本,并使用容器集文件系统,而不是主机文件系统。但是,IP 故障转移 pod 使主机文件系统在 /hosts 挂载路径下可用。在配置检查或通知脚本时,您必须提供脚本的完整路径。提供脚本的建议方法是使用配置映射。
检查和通知脚本的完整路径名称添加到 Keepalived 配置文件 _/etc/keepalived/keepalived.conf 中,该文件会在 Keepalived 每次启动时加载。脚本可以通过配置映射添加到 pod,如下所示。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
创建所需脚本并创建一个配置映射来容纳它。脚本没有输入参数,并且必须返回
0(OK)和1(fail)。检查脚本,
mycheckscript.sh:#!/bin/bash # Whatever tests are needed # E.g., send request and verify response exit 0#!/bin/bash # Whatever tests are needed # E.g., send request and verify response exit 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建配置映射:
oc create configmap mycustomcheck --from-file=mycheckscript.sh
$ oc create configmap mycustomcheck --from-file=mycheckscript.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将脚本添加到容器集。挂载的配置映射文件的
defaultMode必须能够使用oc命令或编辑部署配置来运行。值通常为0755、493(十进制):oc set env deploy/ipfailover-keepalived \ OPENSHIFT_HA_CHECK_SCRIPT=/etc/keepalive/mycheckscript.sh$ oc set env deploy/ipfailover-keepalived \ OPENSHIFT_HA_CHECK_SCRIPT=/etc/keepalive/mycheckscript.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc set volume deploy/ipfailover-keepalived --add --overwrite \ --name=config-volume \ --mount-path=/etc/keepalive \ --source='{"configMap": { "name": "mycustomcheck", "defaultMode": 493}}'$ oc set volume deploy/ipfailover-keepalived --add --overwrite \ --name=config-volume \ --mount-path=/etc/keepalive \ --source='{"configMap": { "name": "mycustomcheck", "defaultMode": 493}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意oc set env命令对空格敏感。=符号的两侧不能有空格。提示您还可以编辑
ipfailover-keepalived部署配置:oc edit deploy ipfailover-keepalived
$ oc edit deploy ipfailover-keepalivedCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保存更改并退出编辑器。这会重启
ipfailover-keepalived。
12.5. 配置 VRRP 抢占 复制链接链接已复制到粘贴板!
当一个节点上的虚拟 IP(VIP)因为通过了检查脚本的检查而脱离 fault 状态时,如果其优先级低于当前处于 master 状态的节点上的 VIP,则节点上的 VIP 将进入 backup 状态。但是,如果脱离 fault 状态的节点上的 VIP 具有更高的优先级,则抢占策略会决定其在集群中的角色。
nopreempt 策略不会将 master 从主机上的较低优先级 VIP 移到主机上的优先级更高的 VIP。当使用默认的 preempt_delay 300 时,Keepalived 会等待指定的 300 秒,并将 master 移到主机上的优先级更高的 VIP。
先决条件
-
已安装 OpenShift CLI(
oc)。
流程
要指定抢占,输入
oc edit deploy ipfailover-keepalived以编辑路由器部署配置:oc edit deploy ipfailover-keepalived
$ oc edit deploy ipfailover-keepalivedCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 设置
OPENSHIFT_HA_PREEMPTION值:-
preempt_delay 300:Keepalived 会等待指定的 300 秒,并将master移到主机上的优先级更高的 VIP。这是默认值。 -
nopreempt:不会将master从主机上的较低优先级 VIP 移到主机上的优先级更高的 VIP。
-
12.6. 关于 VRRP ID 偏移 复制链接链接已复制到粘贴板!
每个 IP 转移 pod 由 IP 故障转移部署配置管理,每个节点 1 个 pod,以一个 Keepalived 守护进程运行。配置更多 IP 故障转移部署配置后,会创建更多 pod,更多的守护进程加入常见的虚拟路由器冗余协议(VRRP)协商。此协商由所有 Keepalived 守护进程完成,它决定了哪些节点服务是哪个虚拟 IP(VIP)。
Keepalived 内部为每个 VIP 分配一个唯一的 vrrp-id。协商使用这一组 vrrp-ids,在做出决策时,胜出的 vrrp-id 对应的 VIP 将在胜出的节点上服务。
因此,对于 IP 故障转移部署配置中定义的每个 VIP,IP 故障转移 pod 必须分配对应的 vrrp-id。这可以从 OPENSHIFT_HA_VRRP_ID_OFFSET 开始,并按顺序将 vrrp-ids 分配到 VIP 列表来实现。vrrp-ids 的值可在 1..255 之间。
当存在多个 IP 故障转移部署配置时,您必须指定 OPENSHIFT_HA_VRRP_ID_OFFSET,以便在部署配置中增加 VIP 的数量,并且没有 vrrp-id 范围重叠。
12.7. 为超过 254 地址配置 IP 故障转移 复制链接链接已复制到粘贴板!
IP 故障转移管理有 254 个组虚拟 IP(VIP)地址的限制。默认情况下,OpenShift Container Platform 会为每个组分配一个 IP 地址。您可以使用 OPENSHIFT_HA_VIP_GROUPS 变量进行更改,使得每个组中有多个 IP 地址,并在配置 IP 故障转移时定义每个虚拟路由器冗余协议(VRRP)实例可用的 VIP 组数量。
在 VRRP 故障转移事件中,对 VIP 进行分组会为每个 VRRP 创建更广泛的 VIP 分配范围,并在集群中的所有主机都能够从本地访问服务时很有用。例如,当服务通过 ExternalIP 公开时。
使用故障转移的一个规则是,请勿将路由等服务限制到一个特定的主机。相反,服务应复制到每一主机上,以便在 IP 故障转移时,不必在新主机上重新创建服务。
如果使用 OpenShift Container Platform 健康检查,IP 故障转移和组的性质意味着不会检查组中的所有实例。因此,必须使用 Kubernetes 健康检查来确保服务处于活动状态。
先决条件
-
使用具有
cluster-admin权限的用户登陆到集群。
流程
要更改分配给每个组的 IP 地址数量,请更改
OPENSHIFT_HA_VIP_GROUPS变量的值,例如:IP 故障转换配置的
DeploymentYAML 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果在有七个 VIP 的环境中将
OPENSHIFT_HA_VIP_GROUPS设置为3,它会创建三个组,将三个 VIP 分配到第一个组,为剩余的两个组各分配两个 VIP。
如果 OPENSHIFT_HA_VIP_GROUPS 设置的组数量少于设置为故障的 IP 地址数量,则组包含多个 IP 地址,且所有地址都作为一个单元移动。
12.8. ingressIP 的高可用性 复制链接链接已复制到粘贴板!
在非云集群中,可以将 IP 故障转移和 ingressIP 合并到服务。其结果是,为使用 ingressIP 创建服务的用户提供了高可用性服务。
方法是指定一个 ingressIPNetworkCIDR 范围,然后在创建 ipfailover 配置时使用相同的范围。
由于 IP 故障转移最多可支持整个集群的 255 个 VIP,所以 ingressIPNetworkCIDR 需要为 /24 或更小。
12.9. 删除 IP 故障切换 复制链接链接已复制到粘贴板!
在初始配置 IP 故障切换时,集群中的 worker 节点会使用 iptables 规则修改,该规则明确允许 Keepalived 在 224.0.0.18 上多播数据包。由于对节点的更改,移除 IP 故障切换需要运行一个作业来删除 iptables 规则并删除 Keepalived 使用的虚拟 IP 地址。
流程
可选:识别并删除存储为配置映射的任何检查和通知脚本:
确定任何用于 IP 故障切换的 pod 是否使用配置映射作为卷:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Namespace: default Pod: keepalived-worker-59df45db9c-2x9mn Volumes that use config maps: volume: config-volume configMap: mycustomcheck
Namespace: default Pod: keepalived-worker-59df45db9c-2x9mn Volumes that use config maps: volume: config-volume configMap: mycustomcheckCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果上一步提供了用作卷的配置映射的名称,请删除配置映射:
oc delete configmap <configmap_name>
$ oc delete configmap <configmap_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
为 IP 故障切换识别现有部署:
oc get deployment -l ipfailover
$ oc get deployment -l ipfailoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE default ipfailover 2/2 2 2 105d
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE default ipfailover 2/2 2 2 105dCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除部署:
oc delete deployment <ipfailover_deployment_name>
$ oc delete deployment <ipfailover_deployment_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除
ipfailover服务帐户:oc delete sa ipfailover
$ oc delete sa ipfailoverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行一个作业,该作业会删除最初配置 IP 故障切换时添加的 IP 表规则:
创建一个文件,如
remove-ipfailover-job.yaml,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow <.> 为集群中配置 IP 故障切换的每个节点运行作业,并每次替换主机名。
运行作业:
oc create -f remove-ipfailover-job.yaml
$ oc create -f remove-ipfailover-job.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
job.batch/remove-ipfailover-2h8dm created
job.batch/remove-ipfailover-2h8dm createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认作业删除了 IP 故障切换的初始配置。
oc logs job/remove-ipfailover-2h8dm
$ oc logs job/remove-ipfailover-2h8dmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
remove-failover.sh: OpenShift IP Failover service terminating. - Removing ip_vs module ... - Cleaning up ... - Releasing VIPs (interface eth0) ...
remove-failover.sh: OpenShift IP Failover service terminating. - Removing ip_vs module ... - Cleaning up ... - Releasing VIPs (interface eth0) ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 13 章 配置接口级别网络 sysctl 复制链接链接已复制到粘贴板!
在 Linux 中,管理员可通过 sysctl 在运行时修改内核参数。您可以使用调优 Container Network Interface(CNI)元插件修改接口级网络 sysctl。tuning CNI meta 插件在一个链中运行,主 CNI 插件如下所示。
主 CNI 插件分配接口,并在运行时传递至 tuning CNI meta 插件。您可以使用调优 CNI 元插件在网络命名空间中更改一些 sysctl 和几个接口属性(promiscuous 模式、all-multicast 模式、MTU 和 MAC 地址)。在 tuning CNI meta 插件配置中,接口名称由 IFNAME 令牌表示,并替换为运行时接口的实际名称。
在 OpenShift Container Platform 中,tuned CNI meta 插件只支持更改接口级网络 sysctl。
13.1. 配置调优 CNI 复制链接链接已复制到粘贴板!
以下流程将调整 CNI 配置为更改接口级网络 net.ipv4.conf.IFNAME.accept_redirects sysctl。这个示例启用接受和发送 ICMP 重定向的数据包。
流程
使用以下内容创建网络附加定义,如
tuning-example.yaml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示 yaml 文件示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用 yaml:
oc apply -f tuning-example.yaml
$ oc apply -f tuning-example.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
networkattachmentdefinition.k8.cni.cncf.io/tuningnad created
networkattachmentdefinition.k8.cni.cncf.io/tuningnad createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用类似以下示例的网络附加定义,创建示例
pod.yaml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定配置的
NetworkAttachmentDefinition的名称。 - 2
runAsUser控制使用哪个用户 ID 运行容器。- 3
runAsGroup控制容器使用哪个主要组 ID。- 4
allowPrivilegeEscalation决定 pod 是否请求允许特权升级。如果未指定,则默认为 true。这个布尔值直接控制在容器进程中是否设置了no_new_privs标志。- 5
capabilities允许特权操作,而不提供完整的 root 访问权限。此策略可确保从 pod 中丢弃了所有功能。- 6
runAsNonRoot: true要求容器使用 0 以外的任何 UID 运行。- 7
RuntimeDefault为 pod 或容器工作负载启用默认的 seccomp 配置集。
运行以下命令来应用 yaml:
oc apply -f examplepod.yaml
$ oc apply -f examplepod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 pod 是否已创建:
oc get pod
$ oc get podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47s
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令登录到 pod:
oc rsh tunepod
$ oc rsh tunepodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证配置的 sysctl 标记的值。例如,通过运行以下命令查找
net.ipv4.conf.net1.accept_redirects的值:sysctl net.ipv4.conf.net1.accept_redirects
sh-4.4# sysctl net.ipv4.conf.net1.accept_redirectsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出
net.ipv4.conf.net1.accept_redirects = 1
net.ipv4.conf.net1.accept_redirects = 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 14 章 在裸机集群中使用流控制传输协议 (SCTP) 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用集群中的流控制传输协议 (SCTP)。
14.1. 支持 OpenShift Container Platform 上的流控制传输协议 (SCTP) 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在集群中的主机上启用 SCTP。在 Red Hat Enterprise Linux CoreOS (RHCOS) 上,SCTP 模块被默认禁用。
SCTP 是基于信息的可靠协议,可在 IP 网络之上运行。
启用后,您可以使用 SCTP 作为带有 pod、服务和网络策略的协议。Service 对象必须通过将 type 参数设置为 ClusterIP 或 NodePort 值来定义。
14.1.1. 使用 SCTP 协议的示例配置 复制链接链接已复制到粘贴板!
您可以通过将 pod 或服务对象中的 protocol 参数设置为 SCTP 来将 pod 或服务配置为使用 SCTP。
在以下示例中,pod 被配置为使用 SCTP:
在以下示例中,服务被配置为使用 SCTP:
在以下示例中,NetworkPolicy 对象配置为对来自具有特定标签的任何 pod 的端口 80 应用 SCTP 网络流量:
14.2. 启用流控制传输协议 (SCTP) 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在集群中的 worker 节点上加载并启用列入黑名单的 SCTP 内核模块。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin角色的用户访问集群。
流程
创建名为
load-sctp-module.yaml的文件,其包含以下 YAML 定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
MachineConfig对象:oc create -f load-sctp-module.yaml
$ oc create -f load-sctp-module.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要在 MachineConfig Operator 应用配置更改时监测节点的状态,请使用以下命令。当节点状态变为
Ready时,则代表配置更新已被应用。oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
14.3. 验证流控制传输协议 (SCTP) 已启用 复制链接链接已复制到粘贴板!
您可以通过创建一个 pod 以及侦听 SCTP 流量的应用程序,将其与服务关联,然后连接到公开的服务,来验证 SCTP 是否在集群中工作。
先决条件
-
从集群访问互联网来安装
nc软件包。 -
安装 OpenShift CLI (
oc) 。 -
使用具有
cluster-admin角色的用户访问集群。
流程
创建 pod 启动 SCTP 侦听程序:
创建名为
sctp-server.yaml的文件,该文件使用以下 YAML 定义 pod:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建 pod:
oc create -f sctp-server.yaml
$ oc create -f sctp-server.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
为 SCTP 侦听程序 pod 创建服务。
创建名为
sctp-service.yaml的文件,该文件使用以下 YAML 定义服务:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要创建服务,请输入以下命令:
oc create -f sctp-service.yaml
$ oc create -f sctp-service.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
为 SCTP 客户端创建 pod。
使用以下 YAML 创建名为
sctp-client.yaml的文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
Pod对象:oc apply -f sctp-client.yaml
$ oc apply -f sctp-client.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
在服务器中运行 SCTP 侦听程序。
要连接到服务器 pod,请输入以下命令:
oc rsh sctpserver
$ oc rsh sctpserverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要启动 SCTP 侦听程序,请输入以下命令:
nc -l 30102 --sctp
$ nc -l 30102 --sctpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
连接到服务器上的 SCTP 侦听程序。
- 在终端程序里打开一个新的终端窗口或标签页。
获取
sctpservice服务的 IP 地址。使用以下命令:oc get services sctpservice -o go-template='{{.spec.clusterIP}}{{"\n"}}'$ oc get services sctpservice -o go-template='{{.spec.clusterIP}}{{"\n"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要连接到客户端 pod,请输入以下命令:
oc rsh sctpclient
$ oc rsh sctpclientCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要启动 SCTP 客户端,请输入以下命令。将
<cluster_IP>替换为sctpservice服务的集群 IP 地址。nc <cluster_IP> 30102 --sctp
# nc <cluster_IP> 30102 --sctpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 15 章 使用 PTP 硬件 复制链接链接已复制到粘贴板!
您可以配置 linuxptp 服务,并在 OpenShift Container Platform 集群节点中使用具有 PTP 功能的硬件。
15.1. 关于 PTP 硬件 复制链接链接已复制到粘贴板!
您可以通过部署 PTP Operator,使用 OpenShift Container Platform 控制台或 OpenShift CLI(oc)安装 PTP。PTP Operator 会创建和管理 linuxptp 服务,并提供以下功能:
- 在集群中发现具有 PTP 功能的设备。
-
管理
linuxptp服务的配置。 -
PTP 时钟事件通知会使用 PTP Operator
cloud-event-proxysidecar 会对应用程序的性能和可靠性造成负面影响。
PTP Operator 只适用于仅在裸机基础架构上置备的集群上具有 PTP 功能的设备。
15.2. 关于 PTP 复制链接链接已复制到粘贴板!
精度时间协议(PTP)用于同步网络中的时钟。与硬件支持一起使用时,PTP 能够达到微秒级的准确性,比网络时间协议 (NTP) 更加准确。
linuxptp 软件包包括用于时钟同步的 ptp4l 和 phc2sys 程序。ptp4l 实现 PTP 边界时钟和普通时钟。ptp4l 将 PTP 硬件时钟与硬件时间戳同步,并将系统时钟与源时钟与软件时间戳同步。phc2sys 用于硬件时间戳,将系统时钟与网络接口控制器 (NIC) 上的 PTP 硬件时钟同步。
15.2.1. PTP 域的元素 复制链接链接已复制到粘贴板!
PTP 用于将网络中连接的多个节点与每个节点的时钟同步。PTP 同步时钟以源目标层次结构进行组织。层次结构由最佳 master 时钟 (BMC) 算法自动创建和更新,该算法在每个时钟上运行。目标时钟与源时钟同步,目标时钟本身也可以是其他下游时钟的源。以下时钟类型可以包含在配置中:
- Grandmaster 时钟
- grandmaster 时钟向网络上的其他时钟提供标准时间信息并确保准确和稳定的同步。它写入时间戳并响应来自其他时钟的时间间隔。Grandmaster 时钟可同步到全球位置系统(GPS)时间源。
- Ordinary 时钟
- Ordinary(普通)时钟具有一个端口连接,可根据其在网络中的位置扮演源或目标时钟的角色。普通时钟可以读取和写入时间戳。
- Boundary 时钟
- Boundary(边界)时钟在两个或更多个通信路径中具有端口,并且可以是指向其他目标时钟的源和目标。边界时钟作为上游目标时钟工作。目标时钟接收计时消息,针对延迟进行调整,然后创建一个新的源时间信号来传递网络。边界时钟生成一个新的计时数据包,它仍然与源时钟正确同步,并可减少直接报告到源时钟的连接设备数量。
15.2.2. PTP 优于 NTP 的优点 复制链接链接已复制到粘贴板!
PTP 与 NTP 相比有一个主要优势,即各种网络接口控制器 (NIC) 和网络交换机中存在的硬件支持。特殊硬件允许 PTP 考虑消息传输的延迟,并提高时间同步的准确性。为了获得最佳准确性,建议启用 PTP 时钟间的所有网络组件。
基于硬件的 PTP 提供最佳准确性,因为 NIC 可以在准确发送和接收时对 PTP 数据包进行时间戳。这与基于软件的 PTP 进行比较,这需要操作系统对 PTP 数据包进行额外的处理。
在启用 PTP 前,请确保为所需节点禁用 NTP。您可以使用 MachineConfig 自定义资源禁用 chrony 时间服务 (chronyd)。如需更多信息,请参阅禁用 chrony 时间服务。
15.2.3. 使用带有双 NIC 硬件的 PTP 复制链接链接已复制到粘贴板!
OpenShift Container Platform 支持单和双 NIC 硬件来保证集群中 PTP 时间。
对于提供中等范围的 5G 电信网络,每个虚拟分布式单元(vDU)需要连接到 6 个无线电单元(RU)。要使这些连接,每个 vDU 主机都需要 2 个 NIC 被配置为边界时钟。
双 NIC 硬件允许您将每个 NIC 连接到相同的上游领导时钟,并将每个 NIC 的 ptp4l 实例连接给下游时钟。
15.3. 使用 CLI 安装 PTP Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 CLI 安装 Operator。
先决条件
- 在裸机中安装有支持 PTP 硬件的节点的集群。
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
为 PTP Operator 创建命名空间。
将以下 YAML 保存到
ptp-namespace.yaml文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
NamespaceCR:oc create -f ptp-namespace.yaml
$ oc create -f ptp-namespace.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
为 PTP Operator 创建 Operator 组。
在
ptp-operatorgroup.yaml文件中保存以下 YAML:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
OperatorGroupCR:oc create -f ptp-operatorgroup.yaml
$ oc create -f ptp-operatorgroup.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
订阅 PTP Operator。
将以下 YAML 保存到
ptp-sub.yaml文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
SubscriptionCR:oc create -f ptp-sub.yaml
$ oc create -f ptp-sub.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
要验证是否已安装 Operator,请输入以下命令:
oc get csv -n openshift-ptp -o custom-columns=Name:.metadata.name,Phase:.status.phase
$ oc get csv -n openshift-ptp -o custom-columns=Name:.metadata.name,Phase:.status.phaseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Name Phase 4.12.0-202301261535 Succeeded
Name Phase 4.12.0-202301261535 SucceededCopy to Clipboard Copied! Toggle word wrap Toggle overflow
15.4. 使用 Web 控制台安装 PTP Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 Web 控制台安装 PTP Operator。
如上一节所述,您必须创建命名空间和 operator 组。
流程
使用 OpenShift Container Platform Web 控制台安装 PTP Operator:
- 在 OpenShift Container Platform Web 控制台中,点击 Operators → OperatorHub。
- 从可用的 Operator 列表中选择 PTP Operator,然后点 Install。
- 在 Install Operator 页面中,在 A specific namespace on the cluster 下选择 openshift-ptp。然后点击 Install。
可选:验证是否成功安装了 PTP Operator:
- 切换到 Operators → Installed Operators 页面。
确保 openshift-ptp 项目中列出的 PTP Operator 的 Status 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
- 进入 Operators → Installed Operators 页面,检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。
-
进入 Workloads → Pods 页面,检查
openshift-ptp项目中 pod 的日志。
15.5. 配置 PTP 设备 复制链接链接已复制到粘贴板!
PTP Operator 将 NodePtpDevice.ptp.openshift.io 自定义资源定义(CRD)添加到 OpenShift Container Platform。
安装后,PTP Operator 会在每个节点中搜索具有 PTP 功能的网络设备。它为提供兼容 PTP 的网络设备的每个节点创建并更新 NodePtpDevice 自定义资源(CR)对象。
15.5.1. 在集群中发现具有 PTP 功能网络设备 复制链接链接已复制到粘贴板!
要返回集群中具有 PTP 功能网络设备的完整列表,请运行以下命令:
oc get NodePtpDevice -n openshift-ptp -o yaml
$ oc get NodePtpDevice -n openshift-ptp -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.5.2. 将 linuxptp 服务配置为 grandmaster 时钟 复制链接链接已复制到粘贴板!
您可以通过创建一个配置主机 NIC 的 PtpConfig 自定义资源 (CR) 将 linuxptp 服务 (ptp4l、phc2sys、ts2phc) 配置为 grandmaster 时钟。
ts2phc 工具允许您将系统时钟与 PTP grandmaster 时钟同步,以便节点可以将精度时钟信号流传输到下游 PTP 普通时钟和边界时钟。
使用 PtpConfig CR 示例,将 linuxptp 服务配置为特定硬件和环境的 grandmaster 时钟。这个示例 CR 没有配置 PTP 快速事件。要配置 PTP 快速事件,请为 ptp4lOpts、ptp4lConf 和 ptpClockThreshold 设置适当的值。ptpClockThreshold 仅在启用事件时使用。如需更多信息,请参阅"配置 PTP 快速事件通知发布程序"。
先决条件
- 在裸机集群主机上安装 Intel Westport Channel 网络接口。
-
安装 OpenShift CLI (
oc) 。 -
以具有
cluster-admin特权的用户身份登录。 - 安装 PTP Operator。
流程
创建
PtpConfig资源。例如:将以下 YAML 保存到
grandmaster-clock-ptp-config.yaml文件中:PTP grandmaster 时钟配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建 CR:
oc create -f grandmaster-clock-ptp-config.yaml
$ oc create -f grandmaster-clock-ptp-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查
PtpConfig配置集是否已应用到节点。运行以下命令,获取
openshift-ptp命名空间中的 pod 列表:oc get pods -n openshift-ptp -o wide
$ oc get pods -n openshift-ptp -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-74m2g 3/3 Running 3 4d15h 10.16.230.7 compute-1.example.com ptp-operator-5f4f48d7c-x7zkf 1/1 Running 1 4d15h 10.128.1.145 compute-1.example.com
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-74m2g 3/3 Running 3 4d15h 10.16.230.7 compute-1.example.com ptp-operator-5f4f48d7c-x7zkf 1/1 Running 1 4d15h 10.128.1.145 compute-1.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查配置集是否正确。检查与
PtpConfig配置集中指定的节点对应的linuxptp守护进程的日志。运行以下命令:oc logs linuxptp-daemon-74m2g -n openshift-ptp -c linuxptp-daemon-container
$ oc logs linuxptp-daemon-74m2g -n openshift-ptp -c linuxptp-daemon-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.5.3. 将 linuxptp 服务配置为常规时钟 复制链接链接已复制到粘贴板!
您可以通过创建 PtpConfig 自定义资源(CR)对象将 linuxptp 服务(ptp4l、phc2sys)配置为常规时钟。
使用 PtpConfig CR 示例,将 linuxptp 服务配置为特定硬件和环境的普通时钟。这个示例 CR 没有配置 PTP 快速事件。要配置 PTP 快速事件,请为 ptp4lOpts、ptp4lConf 和 ptpClockThreshold 设置适当的值。只有在启用事件时才需要 ptpClockThreshold。如需更多信息,请参阅"配置 PTP 快速事件通知发布程序"。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 安装 PTP Operator。
流程
创建以下
PtpConfigCR,然后在ordinary-clock-ptp-config.yaml文件中保存 YAML。PTP 普通时钟配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 15.1. PTP 普通时钟 CR 配置选项 自定义资源字段 描述 namePtpConfigCR 的名称。配置集指定包括一个或多个
profile的数组。每个配置集的名称都需要是唯一的。interface指定
ptp4l服务要使用的网络接口,如ens787f1。ptp4lOpts为
ptp4l服务指定系统配置选项,例如-2来选择 IEEE 802.3 网络传输。该选项不应包含网络接口名称-i <interface>和服务配置文件-f /etc/ptp4l.conf,因为网络接口名称和服务配置文件会被自动附加。附加--summary_interval -4来对此接口使用 PTP 快速事件。phc2sysOpts为
phc2sys服务指定系统配置选项。如果此字段为空,PTP Operator 不会启动phc2sys服务。对于 Intel Columbiaville 800 Series NIC,将phc2sysOpts选项设置为-a -r -m -n 24 -N 8 -R 16.-m将消息输出到stdout。linuxptp-daemonDaemonSet解析日志并生成 Prometheus 指标。ptp4lConf指定一个字符串,其中包含要替换默认的
/etc/ptp4l.conf文件的配置。要使用默认配置,请将字段留空。tx_timestamp_timeout对于 Intel Columbiaville 800 系列 NIC,将
tx_timestamp_timeout设置为50。boundary_clock_jbod对于 Intel Columbiaville 800 系列 NIC,将
boundary_clock_jbod设置为0。ptpSchedulingPolicyptp4l和phc2sys进程的调度策略。默认值为SCHED_OTHER。在支持 FIFO 调度的系统上使用SCHED_FIFO。ptpSchedulingPriority当
ptpSchedulingPolicy设置为SCHED_FIFO时,用于为ptp4l和phc2sys进程设置 FIFO 优先级的整数值(1 到 65)。当ptpSchedulingPolicy设置为SCHED_OTHER时,不使用ptpSchedulingPriority字段。ptpClockThreshold可选。如果没有
ptpClockThreshold,用于ptpClockThreshold字段的默认值。ptpClockThreshold配置在触发 PTP 时间前,PTP master 时钟已断开连接的时长。holdOverTimeout是在 PTP master clock 断开连接时,PTP 时钟事件状态更改为FREERUN前的时间值(以秒为单位)。maxOffsetThreshold和minOffsetThreshold设置以纳秒为单位,它们与CLOCK_REALTIME(phc2sys) 或 master 偏移 (ptp4l) 的值进行比较。当ptp4l或phc2sys偏移值超出这个范围时,PTP 时钟状态被设置为FREERUN。当偏移值在这个范围内时,PTP 时钟状态被设置为LOCKED。建议指定包括一个或多个
recommend对象的数组,该数组定义了如何将配置集应用到节点的规则。.recommend.profile指定在
profile部分定义的.recommend.profile对象名称。.recommend.priority对于普通时钟,将
.recommend.priority设置为0。.recommend.match使用
nodeLabel或nodeName值指定.recommend.match规则。.recommend.match.nodeLabel通过
oc get nodes --show-labels命令,使用来自节点对象的node.Labels的key设置nodeLabel。例如,node-role.kubernetes.io/worker。.recommend.match.nodeName使用
oc get nodes命令,将nodeName设置为来自节点对象的node.Name值。例如,compute-1.example.com。运行以下命令来创建
PtpConfigCR:oc create -f ordinary-clock-ptp-config.yaml
$ oc create -f ordinary-clock-ptp-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查
PtpConfig配置集是否已应用到节点。运行以下命令,获取
openshift-ptp命名空间中的 pod 列表:oc get pods -n openshift-ptp -o wide
$ oc get pods -n openshift-ptp -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.com
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查配置集是否正确。检查与
PtpConfig配置集中指定的节点对应的linuxptp守护进程的日志。运行以下命令:oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-container
$ oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.5.4. 将 linuxptp 服务配置为边界时钟 复制链接链接已复制到粘贴板!
您可以通过创建 PtpConfig 自定义资源(CR)对象将 linuxptp 服务(ptp4l、phc2sys)配置为边界时钟。
使用 PtpConfig CR 示例,将 linuxptp 服务配置为特定硬件和环境的边界时钟。这个示例 CR 没有配置 PTP 快速事件。要配置 PTP 快速事件,请为 ptp4lOpts、ptp4lConf 和 ptpClockThreshold 设置适当的值。ptpClockThreshold 仅在启用事件时使用。如需更多信息,请参阅"配置 PTP 快速事件通知发布程序"。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 安装 PTP Operator。
流程
创建以下
PtpConfigCR,然后在boundaries-clock-ptp-config.yaml文件中保存 YAML。PTP 边界时钟配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 15.2. PTP 边界时钟 CR 配置选项 自定义资源字段 描述 namePtpConfigCR 的名称。配置集指定包括一个或多个
profile的数组。name指定唯一标识配置集对象的配置集对象的名称。
ptp4lOpts为
ptp4l服务指定系统配置选项。该选项不应包含网络接口名称-i <interface>和服务配置文件-f /etc/ptp4l.conf,因为网络接口名称和服务配置文件会被自动附加。ptp4lConf指定启动
ptp4l作为边界时钟所需的配置。例如,ens1f0同步来自 Pumaster 时钟,ens1f3同步连接的设备。<interface_1>接收同步时钟的接口。
<interface_2>发送同步时钟的接口。
tx_timestamp_timeout对于 Intel Columbiaville 800 系列 NIC,将
tx_timestamp_timeout设置为50。boundary_clock_jbod对于 Intel Columbiaville 800 系列 NIC,请确保
boundary_clock_jbod设置为0。对于 Intel Fortville X710 系列 NIC,请确保boundary_clock_jbod设置为1。phc2sysOpts为
phc2sys服务指定系统配置选项。如果此字段为空,PTP Operator 不会启动phc2sys服务。ptpSchedulingPolicyptp4l 和 phc2sys 进程的调度策略。默认值为
SCHED_OTHER。在支持 FIFO 调度的系统上使用SCHED_FIFO。ptpSchedulingPriority当
ptpSchedulingPolicy设置为SCHED_FIFO时,用于为ptp4l和phc2sys进程设置 FIFO 优先级的整数值(1 到 65)。当ptpSchedulingPolicy设置为SCHED_OTHER时,不使用ptpSchedulingPriority字段。ptpClockThreshold可选。如果没有
ptpClockThreshold,用于ptpClockThreshold字段的默认值。ptpClockThreshold配置在触发 PTP 时间前,PTP master 时钟已断开连接的时长。holdOverTimeout是在 PTP master clock 断开连接时,PTP 时钟事件状态更改为FREERUN前的时间值(以秒为单位)。maxOffsetThreshold和minOffsetThreshold设置以纳秒为单位,它们与CLOCK_REALTIME(phc2sys) 或 master 偏移 (ptp4l) 的值进行比较。当ptp4l或phc2sys偏移值超出这个范围时,PTP 时钟状态被设置为FREERUN。当偏移值在这个范围内时,PTP 时钟状态被设置为LOCKED。建议指定包括一个或多个
recommend对象的数组,该数组定义了如何将配置集应用到节点的规则。.recommend.profile指定在
profile部分定义的.recommend.profile对象名称。.recommend.priority使用
0到99之间的一个整数值指定priority。大数值的优先级较低,因此优先级99低于优先级10。如果节点可以根据match字段中定义的规则与多个配置集匹配,则优先级较高的配置集会应用到该节点。.recommend.match使用
nodeLabel或nodeName值指定.recommend.match规则。.recommend.match.nodeLabel通过
oc get nodes --show-labels命令,使用来自节点对象的node.Labels的key设置nodeLabel。例如,node-role.kubernetes.io/worker。.recommend.match.nodeName使用
oc get nodes命令,将nodeName设置为来自节点对象的node.Name值。例如,compute-1.example.com。运行以下命令来创建 CR:
oc create -f boundary-clock-ptp-config.yaml
$ oc create -f boundary-clock-ptp-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查
PtpConfig配置集是否已应用到节点。运行以下命令,获取
openshift-ptp命名空间中的 pod 列表:oc get pods -n openshift-ptp -o wide
$ oc get pods -n openshift-ptp -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.com
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-4xkbb 1/1 Running 0 43m 10.1.196.24 compute-0.example.com linuxptp-daemon-tdspf 1/1 Running 0 43m 10.1.196.25 compute-1.example.com ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-plane-1.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查配置集是否正确。检查与
PtpConfig配置集中指定的节点对应的linuxptp守护进程的日志。运行以下命令:oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-container
$ oc logs linuxptp-daemon-4xkbb -n openshift-ptp -c linuxptp-daemon-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.5.5. 将 linuxptp 服务配置为双 NIC 硬件边界时钟 复制链接链接已复制到粘贴板!
使用配置为边界时钟的双 NIC 的精确时间协议(PTP)硬件只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
您可以通过为每个 NIC 创建一个 PtpConfig 自定义资源(CR)对象,将 linuxptp 服务(ptp4l、phc2sys)配置为双 NIC 硬件的边界时钟。
双 NIC 硬件允许您将每个 NIC 连接到相同的上游领导时钟,并将每个 NIC 的 ptp4l 实例连接给下游时钟。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 安装 PTP Operator。
流程
创建两个单独的
PtpConfigCR,每个 NIC 使用 "Configuring linuxptp 服务作为边界时钟"中的引用 CR,作为每个 CR 的基础。例如:创建
boundary-clock-ptp-config-nic1.yaml,为phc2sysOpts指定值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
boundary-clock-ptp-config-nic2.yaml,删除phc2sysOpts字段,以完全禁用第二个 NIC 的phc2sys服务:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 在第二个 NIC上 指定所需的接口来启动
ptp4l作为一个边境时钟。
注意您必须从第二个
PtpConfigCR 中完全删除phc2sysOpts字段,以禁用第二个 NIC 上的phc2sys服务。
运行以下命令来创建双 NIC
PtpConfigCR:创建 CR 来为第一个 NIC 配置 PTP:
oc create -f boundary-clock-ptp-config-nic1.yaml
$ oc create -f boundary-clock-ptp-config-nic1.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 CR 来为第二个 NIC 配置 PTP:
oc create -f boundary-clock-ptp-config-nic2.yaml
$ oc create -f boundary-clock-ptp-config-nic2.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查 PTP Operator 是否为两个 NIC 应用了
PtpConfigCR。检查与安装了双 NIC 硬件的节点对应的linuxptp守护进程的日志。例如,运行以下命令:oc logs linuxptp-daemon-cvgr6 -n openshift-ptp -c linuxptp-daemon-container
$ oc logs linuxptp-daemon-cvgr6 -n openshift-ptp -c linuxptp-daemon-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ptp4l[80828.335]: [ptp4l.1.config] master offset 5 s2 freq -5727 path delay 519 ptp4l[80828.343]: [ptp4l.0.config] master offset -5 s2 freq -10607 path delay 533 phc2sys[80828.390]: [ptp4l.0.config] CLOCK_REALTIME phc offset 1 s2 freq -87239 delay 539
ptp4l[80828.335]: [ptp4l.1.config] master offset 5 s2 freq -5727 path delay 519 ptp4l[80828.343]: [ptp4l.0.config] master offset -5 s2 freq -10607 path delay 533 phc2sys[80828.390]: [ptp4l.0.config] CLOCK_REALTIME phc offset 1 s2 freq -87239 delay 539Copy to Clipboard Copied! Toggle word wrap Toggle overflow
下表描述了您必须对引用 PTP 配置进行的更改,以便使用 Intel Columbiaville E800 系列 NIC 作为普通时钟。在应用到集群的 PtpConfig 自定义资源(CR)中进行更改。
| PTP 配置 | 推荐的设置 |
|---|---|
|
|
|
|
|
|
|
|
|
对于 phc2sysOpts,-m 会将信息输出到 stdout。linuxptp-daemon DaemonSet 解析日志并生成 Prometheus 指标。
15.5.7. 为 PTP 硬件配置 FIFO 优先级调度 复制链接链接已复制到粘贴板!
在需要低延迟性能的电信或其他部署配置中,PTP 守护进程线程在受限制的 CPU 占用空间以及剩余的基础架构组件一起运行。默认情况下,PTP 线程使用 SCHED_OTHER 策略运行。在高负载下,这些线程可能没有获得无错操作所需的调度延迟。
要缓解潜在的调度延迟错误,您可以将 PTP Operator linuxptp 服务配置为允许线程使用 SCHED_FIFO 策略运行。如果为 PtpConfig CR 设置了 SCHED_FIFO,则 ptp4l 和 phc2sys 将在 chrt 的父容器中运行,且由 PtpConfig CR 的 ptpSchedulingPriority 字段设置。
设置 ptpSchedulingPolicy 是可选的,只有在遇到延迟错误时才需要。
流程
编辑
PtpConfigCR 配置集:oc edit PtpConfig -n openshift-ptp
$ oc edit PtpConfig -n openshift-ptpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更改
ptpSchedulingPolicy和ptpSchedulingPriority字段:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
保存并退出,以将更改应用到
PtpConfigCR。
验证
获取
linuxptp-daemonpod 的名称以及应用PtpConfigCR 的对应节点:oc get pods -n openshift-ptp -o wide
$ oc get pods -n openshift-ptp -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-gmv2n 3/3 Running 0 1d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-lgm55 3/3 Running 0 1d17h 10.1.196.25 compute-1.example.com ptp-operator-3r4dcvf7f4-zndk7 1/1 Running 0 1d7h 10.129.0.61 control-plane-1.example.com
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-gmv2n 3/3 Running 0 1d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-lgm55 3/3 Running 0 1d17h 10.1.196.25 compute-1.example.com ptp-operator-3r4dcvf7f4-zndk7 1/1 Running 0 1d7h 10.129.0.61 control-plane-1.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
ptp4l进程是否使用更新的chrtFIFO 运行:oc -n openshift-ptp logs linuxptp-daemon-lgm55 -c linuxptp-daemon-container|grep chrt
$ oc -n openshift-ptp logs linuxptp-daemon-lgm55 -c linuxptp-daemon-container|grep chrtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
I1216 19:24:57.091872 1600715 daemon.go:285] /bin/chrt -f 65 /usr/sbin/ptp4l -f /var/run/ptp4l.0.config -2 --summary_interval -4 -m
I1216 19:24:57.091872 1600715 daemon.go:285] /bin/chrt -f 65 /usr/sbin/ptp4l -f /var/run/ptp4l.0.config -2 --summary_interval -4 -mCopy to Clipboard Copied! Toggle word wrap Toggle overflow
15.6. 常见 PTP Operator 故障排除 复制链接链接已复制到粘贴板!
通过执行以下步骤排除 PTP Operator 中的常见问题。
先决条件
-
安装 OpenShift Container Platform CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 使用支持 PTP 的主机在裸机集群中安装 PTP Operator。
流程
检查集群中为配置的节点成功部署了 Operator 和操作对象。
oc get pods -n openshift-ptp -o wide
$ oc get pods -n openshift-ptp -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-lmvgn 3/3 Running 0 4d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-qhfg7 3/3 Running 0 4d17h 10.1.196.25 compute-1.example.com ptp-operator-6b8dcbf7f4-zndk7 1/1 Running 0 5d7h 10.129.0.61 control-plane-1.example.com
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-lmvgn 3/3 Running 0 4d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-qhfg7 3/3 Running 0 4d17h 10.1.196.25 compute-1.example.com ptp-operator-6b8dcbf7f4-zndk7 1/1 Running 0 5d7h 10.129.0.61 control-plane-1.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意当启用 PTP fast 事件总线时,就绪的
linuxptp-daemonpod 的数量是3/3。如果没有启用 PTP fast 事件总线,则会显示2/2。检查集群中是否已找到支持的硬件。
oc -n openshift-ptp get nodeptpdevices.ptp.openshift.io
$ oc -n openshift-ptp get nodeptpdevices.ptp.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查节点的可用 PTP 网络接口:
oc -n openshift-ptp get nodeptpdevices.ptp.openshift.io <node_name> -o yaml
$ oc -n openshift-ptp get nodeptpdevices.ptp.openshift.io <node_name> -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <node_name>
指定您要查询的节点,例如
compute-0.example.com。输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
通过访问对应节点的
linuxptp-daemonpod,检查 PTP 接口是否已与主时钟成功同步。运行以下命令来获取
linuxptp-daemonpod 的名称以及您要排除故障的对应节点:oc get pods -n openshift-ptp -o wide
$ oc get pods -n openshift-ptp -o wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-lmvgn 3/3 Running 0 4d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-qhfg7 3/3 Running 0 4d17h 10.1.196.25 compute-1.example.com ptp-operator-6b8dcbf7f4-zndk7 1/1 Running 0 5d7h 10.129.0.61 control-plane-1.example.com
NAME READY STATUS RESTARTS AGE IP NODE linuxptp-daemon-lmvgn 3/3 Running 0 4d17h 10.1.196.24 compute-0.example.com linuxptp-daemon-qhfg7 3/3 Running 0 4d17h 10.1.196.25 compute-1.example.com ptp-operator-6b8dcbf7f4-zndk7 1/1 Running 0 5d7h 10.129.0.61 control-plane-1.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在远程 shell 到所需的
linuxptp-daemon容器:oc rsh -n openshift-ptp -c linuxptp-daemon-container <linux_daemon_container>
$ oc rsh -n openshift-ptp -c linuxptp-daemon-container <linux_daemon_container>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <linux_daemon_container>
-
您要诊断的容器,如
linuxptp-daemon-lmvgn。
在与
linuxptp-daemon容器的远程 shell 连接中,使用 PTP Management Client (pmc) 工具诊断网络接口。运行以下pmc命令,以检查 PTP 设备的同步状态,如ptp4l。pmc -u -f /var/run/ptp4l.0.config -b 0 'GET PORT_DATA_SET'
# pmc -u -f /var/run/ptp4l.0.config -b 0 'GET PORT_DATA_SET'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当节点成功同步到主时钟时的输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.6.1. 收集精确时间协议 (PTP) Operator 数据 复制链接链接已复制到粘贴板!
您可以使用 oc adm must-gather CLI 命令来收集有关集群的信息,包括与精确时间协议 (PTP) Operator 关联的功能和对象。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。 - 已安装 PTP Operator。
流程
要使用
must-gather来收集 PTP Operator 数据,您必须指定 PTP Operatormust-gather镜像。oc adm must-gather --image=registry.redhat.io/openshift4/ptp-must-gather-rhel8:v4.11
$ oc adm must-gather --image=registry.redhat.io/openshift4/ptp-must-gather-rhel8:v4.11Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.7. PTP 硬件快速事件通知框架 复制链接链接已复制到粘贴板!
15.7.1. 关于 PTP 和时钟同步错误事件 复制链接链接已复制到粘贴板!
虚拟 RAN 等云原生应用需要访问对整个网络运行至关重要的硬件计时事件通知。快速事件通知是有关即将到来和实时安全时间协议 (PTP) 时钟同步事件的早期警告信号。PTP 时钟同步错误可能会对低延迟应用程序的性能和可靠性造成负面影响,例如:在一个分布式单元 (DU) 中运行的 vRAN 应用程序。
丢失 PTP 同步是 RAN 网络的一个关键错误。如果在节点上丢失同步,则可能会关闭无线广播,并且网络 Over the Air (OTA) 流量可能会转移到无线网络中的另一个节点。快速事件通知允许集群节点与 DU 中运行的 vRAN 应用程序通信 PTP 时钟同步状态,从而缓解工作负载错误。
事件通知可用于在同一 DU 节点上运行的 RAN 应用。发布/订阅 REST API 将事件通知传递到消息传递总线。发布/订阅消息传递或发布/订阅消息传递是服务通信架构的异步服务,通过服务通信架构,所有订阅者会立即收到发布到某一主题的消息。
OpenShift Container Platform 中的 PTP Operator 为支持 PTP 的每个网络接口生成快速事件通知。通过高级消息队列协议 (AMQP) 消息总线,可使用 cloud-event-proxy sidecar 容器提供这些事件。AMQP 消息总线由 AMQ Interconnect Operator 提供。
PTP 快速事件通知可用于配置为使用 PTP 普通时钟或 PTP 边界时钟。
15.7.2. 关于 PTP 快速事件通知框架 复制链接链接已复制到粘贴板!
您可以将分布式单元 (DU) 应用程序订阅到 Precision Time Protocol (PTP) 快速事件通知,这些通知由 OpenShift Container Platform 使用 PTP Operator 和 cloud-event-proxy sidecar 容器生成。您可以通过在 ptpOperatorConfig 自定义资源(CR)中将 enableEventPublisher 字段设置为 true 来启用 cloud-event-proxy sidecar 容器,并指定 Advanced Message Queue Protocol(AMQP) transportHost 地址。PTP fast 事件使用 AMQ Interconnect Operator 提供的 AMQP 事件通知总线。AMQ Interconnect 是 Red Hat AMQ 的一个组件,它是在支持 AMQP 的端点之间提供灵活的消息路由的消息传递路由器。以下是 PTP 快速事件框架的概述:
图 15.1. PTP 快速事件概述
cloud-event-proxy sidecar 容器可以在不使用主应用程序的任何资源的情况下访问与主 vRAN 应用程序相同的资源,且无显著延迟。
快速事件通知框架使用 REST API 进行通信,并且基于 O-RAN REST API 规范。框架由发布者、订户和 AMQ 消息传递总线组成,以处理发布者和订阅者应用程序之间的通信。cloud-event-proxy sidecar 是一个在 pod 中运行的实用程序容器,它与 DU 节点上的主 DU 应用程序容器松散耦合。它提供了一个事件发布框架,允许您订阅 DU 应用程序来发布的 PTP 事件。
DU 应用程序以 sidecar 模式运行 cloud-event-proxy 容器,以订阅 PTP 事件。以下工作流描述了 DU 应用程序如何使用 PTP 快速事件:
-
DU 应用程序请求一个订阅:DU 将 API 请求发送到
cloud-event-proxysidecar 以创建 PTP 事件订阅。cloud-event-proxysidecar 创建一个订阅资源。 -
cloud-event-proxy sidecar 创建订阅: 事件资源由
cloud-event-proxysidecar 保留。cloud-event-proxysidecar 容器发送带有 ID 和 URL 位置的确认,以访问存储的订阅资源。sidecar 为订阅中指定的资源创建一个 AMQ 消息传递监听程序协议。 -
DU 应用程序接收 PTP 事件通知 :
cloud-event-proxysidecar 容器侦听资源限定器中指定的地址。DU 事件消费者处理消息并将其传递到订阅中指定的返回 URL。 -
cloud-event-proxy sidecar 验证 PTP 事件并将其发布到 DU 应用程序:
cloud-event-proxysidecar 接收事件,解封云事件对象以检索数据,并获取返回 URL 以将事件发回到 DU 消费者应用程序。 - DU 应用程序使用 PTP 事件: DU 应用程序事件消费者接收和处理 PTP 事件。
15.7.3. 安装 AMQ 消息传递总线 复制链接链接已复制到粘贴板!
要在节点上的发布程序与订阅者之间传递 PTP 快速事件通知,您必须安装和配置 AMQ 消息传递总线,以便在节点上本地运行。您可以通过安装 AMQ Interconnect Operator 来在集群中使用。
先决条件
-
安装 OpenShift Container Platform CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
-
将 AMQ Interconnect Operator 安装到其自己的
amq-interconnect命名空间。请参阅添加 Red Hat Integration - AMQ Interconnect Operator。
验证
检查 AMQ Interconnect Operator 是否可用,且所需的 pod 是否正在运行:
oc get pods -n amq-interconnect
$ oc get pods -n amq-interconnectCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE amq-interconnect-645db76c76-k8ghs 1/1 Running 0 23h interconnect-operator-5cb5fc7cc-4v7qm 1/1 Running 0 23h
NAME READY STATUS RESTARTS AGE amq-interconnect-645db76c76-k8ghs 1/1 Running 0 23h interconnect-operator-5cb5fc7cc-4v7qm 1/1 Running 0 23hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查所需的
linuxptp-daemonPTP 事件制作者 pod 是否在openshift-ptp命名空间中运行。oc get pods -n openshift-ptp
$ oc get pods -n openshift-ptpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE linuxptp-daemon-2t78p 3/3 Running 0 12h linuxptp-daemon-k8n88 3/3 Running 0 12h
NAME READY STATUS RESTARTS AGE linuxptp-daemon-2t78p 3/3 Running 0 12h linuxptp-daemon-k8n88 3/3 Running 0 12hCopy to Clipboard Copied! Toggle word wrap Toggle overflow
15.7.4. 配置 PTP 快速事件通知发布程序 复制链接链接已复制到粘贴板!
要为集群中的网络接口启动使用 PTP fast 事件通知,您必须在 PTP Operator PtpOperatorConfig 自定义资源 (CR) 中启用快速事件发布程序,并在您创建的 PtpConfig CR 中配置 ptpClockThreshold 值。
先决条件
-
安装 OpenShift Container Platform CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 安装 PTP Operator 和 AMQ Interconnect Operator。
流程
修改默认 PTP Operator 配置以启用 PTP 快速事件。
在
ptp-operatorconfig.yaml文件中保存以下 YAML:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新
PtpOperatorConfigCR:oc apply -f ptp-operatorconfig.yaml
$ oc apply -f ptp-operatorconfig.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
为 PTP 启用接口创建
PtpConfig自定义资源(CR),并设置ptpClockThreshold和ptp4lOpts所需的值。以下 YAML 演示了您必须在PtpConfigCR 中设置的必要值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 附加
--summary_interval -4以使用 PTP 快速事件。 - 2
- 所需的
phc2sysOpts值。-m将消息输出到stdout。linuxptp-daemonDaemonSet解析日志并生成 Prometheus 指标。 - 3
- 指定包含配置来替换默认 /etc/ptp4l.conf 文件的字符串。要使用默认配置,请将字段留空。
- 4
- 可选。如果
ptpClockThreshold小节不存在,则默认值用于ptpClockThreshold字段。小节显示默认的ptpClockThreshold值。ptpClockThreshold值配置 PTP master 时钟在触发 PTP 事件前的时长。holdOverTimeout是在 PTP master clock 断开连接时,PTP 时钟事件状态更改为FREERUN前的时间值(以秒为单位)。maxOffsetThreshold和minOffsetThreshold设置以纳秒为单位,它们与CLOCK_REALTIME(phc2sys) 或 master 偏移 (ptp4l) 的值进行比较。当ptp4l或phc2sys偏移值超出这个范围时,PTP 时钟状态被设置为FREERUN。当偏移值在这个范围内时,PTP 时钟状态被设置为LOCKED。
15.7.5. 将 DU 应用程序订阅到 PTP 事件 REST API 参考 复制链接链接已复制到粘贴板!
使用 PTP 事件通知 REST API 将分布式单元(DU)应用程序订阅到父节点上生成的 PTP 事件。
使用资源地址 /cluster/node/<node_name>/ptp 将应用程序订阅到 PTP 事件,其中 <node_name> 是运行 DU 应用程序的集群节点。
在单独的 DU 应用程序 pod 中部署 cloud-event-consumer DU 应用程序容器和 cloud-event-proxy sidecar 容器。cloud-event-consumer DU 应用程序订阅应用程序 Pod 中的 cloud-event-proxy 容器。
使用以下 API 端点,将 cloud-event-consumer DU 应用程序订阅到 PTP 事件,这些事件由 cloud-event-proxy 容器发布,位于 DU 应用程序 pod 中的 http://localhost:8089/api/ocloudNotifications/v1/:
/api/ocloudNotifications/v1/subscriptions-
POST:创建新订阅 -
GET:删除订阅列表
-
/api/ocloudNotifications/v1/subscriptions/<subscription_id>-
GET:返回指定订阅 ID 的详情
-
/api/ocloudNotifications/v1/health-
GET:返回ocloudNotificationsAPI 的健康状况
-
api/ocloudNotifications/v1/publishers-
GET:为集群节点返回数组os-clock-sync-state、ptp-clock-class-change和lock-state消息
-
/api/ocloudnotifications/v1/<resource_address>/CurrentState-
GET:返回以下事件类型的当前状态:os-clock-sync-state、ptp-clock-class-change或lock-state事件
-
9089 是在应用程序 Pod 中部署的 cloud-event-consumer 容器的默认端口。您可以根据需要为 DU 应用程序配置不同的端口。
15.7.5.1. api/ocloudNotifications/v1/subscriptions 复制链接链接已复制到粘贴板!
HTTP 方法
GET api/ocloudNotifications/v1/subscriptions
描述
返回订阅列表。如果订阅存在,则返回 200 OK 状态代码以及订阅列表。
API 响应示例
HTTP 方法
POST api/ocloudNotifications/v1/subscriptions
描述
创建新订阅。如果订阅成功创建,或者已存在,则返回 201 Created 状态代码。
| 参数 | 类型 |
|---|---|
| subscription | data |
有效负载示例
{
"uriLocation": "http://localhost:8089/api/ocloudNotifications/v1/subscriptions",
"resource": "/cluster/node/compute-1.example.com/ptp"
}
{
"uriLocation": "http://localhost:8089/api/ocloudNotifications/v1/subscriptions",
"resource": "/cluster/node/compute-1.example.com/ptp"
}
15.7.5.2. api/ocloudNotifications/v1/subscriptions/ 复制链接链接已复制到粘贴板!
HTTP 方法
GET api/ocloudNotifications/v1/subscriptions/<subscription_id>
描述
返回 ID 为 <subscription_id> 的订阅详情
| 参数 | 类型 |
|---|---|
|
| string |
API 响应示例
15.7.5.3. api/ocloudNotifications/v1/health/ 复制链接链接已复制到粘贴板!
HTTP 方法
GET api/ocloudNotifications/v1/health/
描述
返回 ocloudNotifications REST API 的健康状况。
API 响应示例
OK
OK
15.7.5.4. api/ocloudNotifications/v1/publishers 复制链接链接已复制到粘贴板!
HTTP 方法
GET api/ocloudNotifications/v1/publishers
描述
返回集群节点的 os-clock-sync-state、ptp-clock-class-change 和 lock-state 详情的数组。当相关的设备状态改变时,系统会生成通知。
-
os-clock-sync-state通知描述了主机操作系统时钟同步状态。可以是LOCKED或FREERUN状态。 -
ptp-clock-class-change通知描述了 PTP 时钟类的当前状态。 -
lock-state通知描述了 PTP 设备锁定状态的当前状态。可以处于LOCKED、HOLDOVER或FREERUN状态。
API 响应示例
您可以在 cloud-event-proxy 容器的日志中找到 os-clock-sync-state、ptp-clock-class-change 和 lock-state 事件。例如:
oc logs -f linuxptp-daemon-cvgr6 -n openshift-ptp -c cloud-event-proxy
$ oc logs -f linuxptp-daemon-cvgr6 -n openshift-ptp -c cloud-event-proxy
os-clock-sync-state 事件示例
ptp-clock-class-change 事件示例
lock-state 事件示例
15.7.5.5. /api/ocloudnotifications/v1//CurrentState 复制链接链接已复制到粘贴板!
HTTP 方法
GET api/ocloudNotifications/v1/cluster/node/<node_name>/sync/ptp-status/lock-state/CurrentState
GET api/ocloudNotifications/v1/cluster/node/<node_name>/sync/sync-status/os-clock-sync-state/CurrentState
GET api/ocloudNotifications/v1/cluster/node/<node_name>/sync/ptp-status/ptp-clock-class-change/CurrentState
描述
配置 CurrentState API 端点,以返回 os-clock-sync-state、ptp-clock-class-change 或 lock-state 事件的当前状态。
-
os-clock-sync-state通知描述了主机操作系统时钟同步状态。可以是LOCKED或FREERUN状态。 -
ptp-clock-class-change通知描述了 PTP 时钟类的当前状态。 -
lock-state通知描述了 PTP 设备锁定状态的当前状态。可以处于LOCKED、HOLDOVER或FREERUN状态。
| 参数 | 类型 |
|---|---|
|
| string |
lock-state API 响应示例
os-clock-sync-state API 响应示例
ptp-clock-class-change API 响应示例
15.7.6. 使用 CLI 监控 PTP 快速事件指标 复制链接链接已复制到粘贴板!
您可以使用 oc CLI 直接从 cloud-event-proxy 容器监控快速事件总线指标。
OpenShift Container Platform Web 控制台中还提供了 PTP fast 事件通知指标。
先决条件
-
安装 OpenShift Container Platform CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 安装和配置 PTP Operator。
流程
获取活跃的
linuxptp-daemonpod 列表。oc get pods -n openshift-ptp
$ oc get pods -n openshift-ptpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE linuxptp-daemon-2t78p 3/3 Running 0 8h linuxptp-daemon-k8n88 3/3 Running 0 8h
NAME READY STATUS RESTARTS AGE linuxptp-daemon-2t78p 3/3 Running 0 8h linuxptp-daemon-k8n88 3/3 Running 0 8hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,访问所需
cloud-event-proxy容器的指标:oc exec -it <linuxptp-daemon> -n openshift-ptp -c cloud-event-proxy -- curl 127.0.0.1:9091/metrics
$ oc exec -it <linuxptp-daemon> -n openshift-ptp -c cloud-event-proxy -- curl 127.0.0.1:9091/metricsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <linuxptp-daemon>
指定您要查询的 pod,例如
linuxptp-daemon-2t78p。输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
15.7.7. 在 web 控制台中监控 PTP fast 事件指标 复制链接链接已复制到粘贴板!
您可以使用预配置和自我更新 Prometheus 监控堆栈在 OpenShift Container Platform Web 控制台中监控 PTP 快速事件指标。
先决条件
-
安装 OpenShift Container Platform CLI
oc。 -
以具有
cluster-admin权限的用户身份登录。
流程
输入以下命令从
cloud-event-proxysidecar 容器返回可用 PTP 指标列表:oc exec -it <linuxptp_daemon_pod> -n openshift-ptp -c cloud-event-proxy -- curl 127.0.0.1:9091/metrics
$ oc exec -it <linuxptp_daemon_pod> -n openshift-ptp -c cloud-event-proxy -- curl 127.0.0.1:9091/metricsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <linuxptp_daemon_pod>
-
指定您要查询的 pod,例如
linuxptp-daemon-2t78p。
-
从返回的指标列表中复制您要查询的 PTP 指标名称,例如
cne_amqp_events_received。 - 在 OpenShift Container Platform web 控制台中点 Observe → Metrics。
- 将 PTP 指标粘贴到 Expression 字段中,点 Run query。
第 16 章 外部 DNS Operator 复制链接链接已复制到粘贴板!
16.1. OpenShift Container Platform 中的外部 DNS Operator 复制链接链接已复制到粘贴板!
External DNS Operator 部署并管理 ExternalDNS,以便为从外部 DNS 供应商到 OpenShift Container Platform 的服务和路由提供名称解析。
16.1.1. 外部 DNS Operator 复制链接链接已复制到粘贴板!
External DNS Operator 从 olm.openshift.io API 组实现外部 DNS API。External DNS Operator 使用部署资源部署 ExternalDNS。ExternalDNS 部署会监视集群中服务和路由等资源,并更新外部 DNS 供应商。
流程
您可以根据 OperatorHub 的要求部署 ExternalDNS Operator,这会创建一个 Subscription 对象。
检查安装计划的名称:
oc -n external-dns-operator get sub external-dns-operator -o yaml | yq '.status.installplan.name'
$ oc -n external-dns-operator get sub external-dns-operator -o yaml | yq '.status.installplan.name'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
install-zcvlr
install-zcvlrCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查安装计划的状态,安装计划的状态必须为
Complete:oc -n external-dns-operator get ip <install_plan_name> -o yaml | yq '.status.phase'
$ oc -n external-dns-operator get ip <install_plan_name> -o yaml | yq '.status.phase'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Complete
CompleteCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc get命令来查看部署状态 :oc get -n external-dns-operator deployment/external-dns-operator
$ oc get -n external-dns-operator deployment/external-dns-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE external-dns-operator 1/1 1 1 23h
NAME READY UP-TO-DATE AVAILABLE AGE external-dns-operator 1/1 1 1 23hCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.1.2. 外部 DNS Operator 日志 复制链接链接已复制到粘贴板!
您可以使用 oc logs 命令查看外部 DNS Operator 日志。
流程
查看外部 DNS Operator 的日志:
oc logs -n external-dns-operator deployment/external-dns-operator -c external-dns-operator
$ oc logs -n external-dns-operator deployment/external-dns-operator -c external-dns-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.1.2.1. 外部 DNS Operator 域名限制 复制链接链接已复制到粘贴板!
外部 DNS Operator 使用 TXT registry,它遵循新格式并为 TXT 记录添加前缀。这可减少 TXT 记录的域名的最大长度。没有对应的 TXT 记录时无法出现 DNS 记录,因此 DNS 记录的域名必须遵循与 TXT 记录相同的限制。例如,DNS 记录为 <domain-name-from-source>,TXT 记录是 external-dns-<record-type>-<domain-name-from-source>。
外部 DNS Operator 生成的 DNS 记录的域名有以下限制:
| 记录类型 | 字符数 |
|---|---|
| CNAME | 44 |
| AzureDNS 上的通配符 CNAME 记录 | 42 |
| A | 48 |
| AzureDNS 上的通配符 A 记录 | 46 |
如果外部 DNS 生成的域名超过域名限制,外部 DNS 实例会给出以下错误:
oc -n external-dns-operator logs external-dns-aws-7ddbd9c7f8-2jqjh
$ oc -n external-dns-operator logs external-dns-aws-7ddbd9c7f8-2jqjh
- 1
external-dns-aws-7ddbd9c7f8-2jqjh参数指定外部 DNS pod 的名称。
输出示例
time="2022-09-02T08:53:57Z" level=info msg="Desired change: CREATE external-dns-cname-hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc.test.example.io TXT [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]" time="2022-09-02T08:53:57Z" level=info msg="Desired change: CREATE external-dns-hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc.test.example.io TXT [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]" time="2022-09-02T08:53:57Z" level=info msg="Desired change: CREATE hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc.test.example.io A [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]" time="2022-09-02T08:53:57Z" level=error msg="Failure in zone test.example.io. [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]" time="2022-09-02T08:53:57Z" level=error msg="InvalidChangeBatch: [FATAL problem: DomainLabelTooLong (Domain label is too long) encountered with 'external-dns-a-hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc']\n\tstatus code: 400, request id: e54dfd5a-06c6-47b0-bcb9-a4f7c3a4e0c6"
time="2022-09-02T08:53:57Z" level=info msg="Desired change: CREATE external-dns-cname-hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc.test.example.io TXT [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]"
time="2022-09-02T08:53:57Z" level=info msg="Desired change: CREATE external-dns-hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc.test.example.io TXT [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]"
time="2022-09-02T08:53:57Z" level=info msg="Desired change: CREATE hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc.test.example.io A [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]"
time="2022-09-02T08:53:57Z" level=error msg="Failure in zone test.example.io. [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]"
time="2022-09-02T08:53:57Z" level=error msg="InvalidChangeBatch: [FATAL problem: DomainLabelTooLong (Domain label is too long) encountered with 'external-dns-a-hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc']\n\tstatus code: 400, request id: e54dfd5a-06c6-47b0-bcb9-a4f7c3a4e0c6"
16.2. 在云供应商上安装外部 DNS Operator 复制链接链接已复制到粘贴板!
您可以在云供应商环境中安装外部 DNS Operator,如 AWS、Azure 和 GCP。
16.2.1. 安装 External DNS Operator 复制链接链接已复制到粘贴板!
您可以使用 OpenShift Container Platform OperatorHub 安装外部 DNS Operator。
流程
- 在 OpenShift Container Platform Web 控制台中点 Operators → OperatorHub。
- 点 External DNS Operator。您可以使用 Filter by keyword 文本框或过滤器列表从 Operator 列表中搜索 External DNS Operator。
-
选择
external-dns-operator命名空间。 - 在 External DNS Operator 页面中,点 Install。
在 Install Operator 页面中,确保选择了以下选项:
- 将频道更新为 stable-v1.0。
- 安装模式为 A specific name on the cluster。
-
安装的命名空间为
external-dns-operator。如果命名空间external-dns-operator不存在,它会在 Operator 安装过程中创建。 - 将 Approval Strategy 选为 Automatic 或 Manual。默认情况下,批准策略设置为 Automatic。
- 点 Install。
如果选择了 Automatic 更新,Operator Lifecycle Manager(OLM)将自动升级 Operator 的运行实例,而无需任何干预。
如果选择 手动 更新,则 OLM 会创建一个更新请求。作为集群管理员,您必须手动批准该更新请求,才可将 Operator 更新至新版本。
验证
验证 External DNS Operator 是否在 Installed Operators 仪表板上显示 Status 为 Succeeded。
16.3. 外部 DNS Operator 配置参数 复制链接链接已复制到粘贴板!
外部 DNS Operator 包括以下配置参数:
16.3.1. 外部 DNS Operator 配置参数 复制链接链接已复制到粘贴板!
External DNS Operator 包括以下配置参数:
| 参数 | 描述 |
|---|---|
|
| 启用云供应商的类型。 |
|
|
允许您根据域指定 DNS 区域。如果没有指定区, zones: - "myzoneid"
|
|
|
允许您根据域指定 AWS 区域。如果没有指定域, |
|
|
允许您指定 DNS 记录、
|
16.4. 在 AWS 上创建 DNS 记录 复制链接链接已复制到粘贴板!
您可以使用外部 DNS Operator 在 AWS 和 AWS GovCloud 上创建 DNS 记录。
您可以使用 Red Hat External DNS Operator 在 AWS 公共托管区上创建 DNS 记录。您可以使用相同的说明在 AWS GovCloud 的托管区上创建 DNS 记录。
流程
检查用户。用户必须有权访问
kube-system命名空间。如果没有凭证,您可以从kube-system命名空间中获取凭证,以使用云供应商客户端:oc whoami
$ oc whoamiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
system:admin
system:adminCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从
kube-system命名空间中存在的 aws-creds secret 中获取值。export AWS_ACCESS_KEY_ID=$(oc get secrets aws-creds -n kube-system --template={{.data.aws_access_key_id}} | base64 -d) export AWS_SECRET_ACCESS_KEY=$(oc get secrets aws-creds -n kube-system --template={{.data.aws_secret_access_key}} | base64 -d)$ export AWS_ACCESS_KEY_ID=$(oc get secrets aws-creds -n kube-system --template={{.data.aws_access_key_id}} | base64 -d) $ export AWS_SECRET_ACCESS_KEY=$(oc get secrets aws-creds -n kube-system --template={{.data.aws_secret_access_key}} | base64 -d)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取路由来检查域:
oc get routes --all-namespaces | grep console
$ oc get routes --all-namespaces | grep consoleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
openshift-console console console-openshift-console.apps.testextdnsoperator.apacshift.support console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.testextdnsoperator.apacshift.support downloads http edge/Redirect None
openshift-console console console-openshift-console.apps.testextdnsoperator.apacshift.support console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.testextdnsoperator.apacshift.support downloads http edge/Redirect NoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 获取 dns zones 列表以查找与之前找到的路由域对应的 dns 区域:
aws route53 list-hosted-zones | grep testextdnsoperator.apacshift.support
$ aws route53 list-hosted-zones | grep testextdnsoperator.apacshift.supportCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
HOSTEDZONES terraform /hostedzone/Z02355203TNN1XXXX1J6O testextdnsoperator.apacshift.support. 5
HOSTEDZONES terraform /hostedzone/Z02355203TNN1XXXX1J6O testextdnsoperator.apacshift.support. 5Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为
路由源创建ExternalDNS资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 定义外部 DNS 资源的名称。
- 2
- 默认情况下,所有托管区都被选为潜在的目标。您可以包括需要的托管区。
- 3
- 目标区的域匹配必须是完全准确的(与正则表达式匹配不同)。
- 4
- 指定您要更新的区域的确切域。路由的主机名必须是指定域的子域。
- 5
- 定义
AWS Route53DNS 供应商。 - 6
- 定义 DNS 记录源的选项。
- 7
- 定义 OpenShift
路由资源,作为在之前指定的 DNS 供应商中创建的 DNS 记录来源。 - 8
- 如果源是
OpenShiftRoute,您可以传递 OpenShift Ingress Controller 名称。外部 DNS Operator 在创建 CNAME 记录时,选择该路由器的规范主机名作为目标。
使用以下命令,检查为 OCP 路由创建的记录:
aws route53 list-resource-record-sets --hosted-zone-id Z02355203TNN1XXXX1J6O --query "ResourceRecordSets[?Type == 'CNAME']" | grep console
$ aws route53 list-resource-record-sets --hosted-zone-id Z02355203TNN1XXXX1J6O --query "ResourceRecordSets[?Type == 'CNAME']" | grep consoleCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.5. 在 Azure 上创建 DNS 记录 复制链接链接已复制到粘贴板!
您可以使用 External DNS Operator 在 Azure 上创建 DNS 记录。
您可以使用 Red Hat External DNS Operator 为 Azure 的公共 DNS 区域创建 DNS 记录。
流程
检查用户。用户必须有权访问
kube-system命名空间。如果没有凭证,您可以从kube-system命名空间中获取凭证,以使用云供应商客户端:oc whoami
$ oc whoamiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
system:admin
system:adminCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从
kube-system命名空间中获取 azure-credentials secret 的值。CLIENT_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_client_id}} | base64 -d) CLIENT_SECRET=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_client_secret}} | base64 -d) RESOURCE_GROUP=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_resourcegroup}} | base64 -d) SUBSCRIPTION_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_subscription_id}} | base64 -d) TENANT_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_tenant_id}} | base64 -d)$ CLIENT_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_client_id}} | base64 -d) $ CLIENT_SECRET=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_client_secret}} | base64 -d) $ RESOURCE_GROUP=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_resourcegroup}} | base64 -d) $ SUBSCRIPTION_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_subscription_id}} | base64 -d) $ TENANT_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_tenant_id}} | base64 -d)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 base64 解码值登录到 azure:
az login --service-principal -u "${CLIENT_ID}" -p "${CLIENT_SECRET}" --tenant "${TENANT_ID}"$ az login --service-principal -u "${CLIENT_ID}" -p "${CLIENT_SECRET}" --tenant "${TENANT_ID}"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取路由来检查域:
oc get routes --all-namespaces | grep console
$ oc get routes --all-namespaces | grep consoleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
openshift-console console console-openshift-console.apps.test.azure.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.azure.example.com downloads http edge/Redirect None
openshift-console console console-openshift-console.apps.test.azure.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.azure.example.com downloads http edge/Redirect NoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 获取 dns zones 列表以查找与之前找到的路由域对应的 dns 区域:
az network dns zone list --resource-group "${RESOURCE_GROUP}"$ az network dns zone list --resource-group "${RESOURCE_GROUP}"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为
路由源创建ExternalDNS资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令,检查为 OCP 路由创建的记录:
az network dns record-set list -g "${RESOURCE_GROUP}" -z test.azure.example.com | grep console$ az network dns record-set list -g "${RESOURCE_GROUP}" -z test.azure.example.com | grep consoleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意要在私有 Azure dns 上的私有托管区中创建记录,您需要在
zones下指定私有区,在ExternalDNS容器 args 中填充供应商类型到azure-private-dns。
16.6. 在 GCP 上创建 DNS 记录 复制链接链接已复制到粘贴板!
您可以使用 External DNS Operator 在 GCP 上创建 DNS 记录。
您可以使用 Red Hat External DNS Operator 在公共受管区上为 GCP 创建 DNS 记录。
流程
检查用户。用户必须有权访问
kube-system命名空间。如果没有凭证,您可以从kube-system命名空间中获取凭证,以使用云供应商客户端:oc whoami
$ oc whoamiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
system:admin
system:adminCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将 gcp-credentials secret 中的 service_account.json 值复制到编码-gcloud.json 的文件中:
oc get secret gcp-credentials -n kube-system --template='{{$v := index .data "service_account.json"}}{{$v}}' | base64 -d - > decoded-gcloud.json$ oc get secret gcp-credentials -n kube-system --template='{{$v := index .data "service_account.json"}}{{$v}}' | base64 -d - > decoded-gcloud.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 导出 Google 凭证:
export GOOGLE_CREDENTIALS=decoded-gcloud.json
$ export GOOGLE_CREDENTIALS=decoded-gcloud.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令激活您的帐户:
gcloud auth activate-service-account <client_email as per decoded-gcloud.json> --key-file=decoded-gcloud.json
$ gcloud auth activate-service-account <client_email as per decoded-gcloud.json> --key-file=decoded-gcloud.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置项目:
gcloud config set project <project_id as per decoded-gcloud.json>
$ gcloud config set project <project_id as per decoded-gcloud.json>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取路由来检查域:
oc get routes --all-namespaces | grep console
$ oc get routes --all-namespaces | grep consoleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
openshift-console console console-openshift-console.apps.test.gcp.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.gcp.example.com downloads http edge/Redirect None
openshift-console console console-openshift-console.apps.test.gcp.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.gcp.example.com downloads http edge/Redirect NoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 获取受管区列表以查找与之前找到的路由域对应的区:
gcloud dns managed-zones list | grep test.gcp.example.com qe-cvs4g-private-zone test.gcp.example.com
$ gcloud dns managed-zones list | grep test.gcp.example.com qe-cvs4g-private-zone test.gcp.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为
路由源创建ExternalDNS资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定外部 DNS CR 的名称。
- 2
- 默认情况下,所有托管区都被选为潜在的目标。您可以包括需要的托管区。
- 3
- 目标区的域匹配必须是完全准确的(与正则表达式匹配不同)。
- 4
- 指定您要更新的区域的确切域。路由的主机名必须是指定域的子域。
- 5
- 定义 Google Cloud DNS 供应商。
- 6
- 您可以定义 DNS 记录源的选项。
- 7
- 如果源是
OpenShiftRoute,您可以传递 OpenShift Ingress Controller 名称。外部 DNS 在创建 CNAME 记录时,选择该路由器的规范主机名作为目标。 - 8
- 定义 OpenShift
路由资源,作为在之前指定的 DNS 供应商中创建的 DNS 记录来源。
使用以下命令,检查为 OCP 路由创建的记录:
gcloud dns record-sets list --zone=qe-cvs4g-private-zone | grep console
$ gcloud dns record-sets list --zone=qe-cvs4g-private-zone | grep consoleCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.7. 在 Infoblox 上创建 DNS 记录 复制链接链接已复制到粘贴板!
您可以使用 Red Hat External DNS Operator 在 Infoblox 上创建 DNS 记录。
16.7.1. 在 Infoblox 上的公共 DNS 区域中创建 DNS 记录 复制链接链接已复制到粘贴板!
您可以使用 Red Hat External DNS Operator 在 Infoblox 上的公共 DNS 区域中创建 DNS 记录。
先决条件
-
您可以访问 OpenShift CLI(
oc)。 - 您可以访问 Infoblox UI。
流程
运行以下命令,使用 Infoblox 凭证创建
secret对象:oc -n external-dns-operator create secret generic infoblox-credentials --from-literal=EXTERNAL_DNS_INFOBLOX_WAPI_USERNAME=<infoblox_username> --from-literal=EXTERNAL_DNS_INFOBLOX_WAPI_PASSWORD=<infoblox_password>
$ oc -n external-dns-operator create secret generic infoblox-credentials --from-literal=EXTERNAL_DNS_INFOBLOX_WAPI_USERNAME=<infoblox_username> --from-literal=EXTERNAL_DNS_INFOBLOX_WAPI_PASSWORD=<infoblox_password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,获取路由对象以检查集群域:
oc get routes --all-namespaces | grep console
$ oc get routes --all-namespaces | grep consoleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
openshift-console console console-openshift-console.apps.test.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.example.com downloads http edge/Redirect None
openshift-console console console-openshift-console.apps.test.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.example.com downloads http edge/Redirect NoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个
ExternalDNS资源 YAML 文件,如 sample-infoblox.yaml,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,在 Infoblox 上创建
ExternalDNS资源:oc create -f sample-infoblox.yaml
$ oc create -f sample-infoblox.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过 Infoblox UI,检查为
console路由创建的 DNS 记录:- 点 Data Management → DNS → Zones。
- 选择区域名称。
16.8. 在外部 DNS Operator 上配置集群范围代理 复制链接链接已复制到粘贴板!
您可以在 External DNS Operator 中配置集群范围代理。在外部 DNS Operator 中配置集群范围代理后,Operator Lifecycle Manager (OLM) 会自动使用环境变量(如 HTTP_PROXY、HTTPS_PROXY )和 NO_PROXY 等环境变量更新 Operator 的所有部署。
16.8.1. 配置外部 DNS Operator 以信任集群范围代理的证书颁发机构 复制链接链接已复制到粘贴板!
您可以将外部 DNS Operator 配置为信任集群范围代理的证书颁发机构。
流程
运行以下命令,创建配置映射以在
external-dns-operator命名空间中包含 CA 捆绑包:oc -n external-dns-operator create configmap trusted-ca
$ oc -n external-dns-operator create configmap trusted-caCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要将可信 CA 捆绑包注入配置映射中,请运行以下命令将
config.openshift.io/inject-trusted-cabundle=true标签添加到配置映射中:oc -n external-dns-operator label cm trusted-ca config.openshift.io/inject-trusted-cabundle=true
$ oc -n external-dns-operator label cm trusted-ca config.openshift.io/inject-trusted-cabundle=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令更新外部 DNS Operator 的订阅:
oc -n external-dns-operator patch subscription external-dns-operator --type='json' -p='[{"op": "add", "path": "/spec/config", "value":{"env":[{"name":"TRUSTED_CA_CONFIGMAP_NAME","value":"trusted-ca"}]}}]'$ oc -n external-dns-operator patch subscription external-dns-operator --type='json' -p='[{"op": "add", "path": "/spec/config", "value":{"env":[{"name":"TRUSTED_CA_CONFIGMAP_NAME","value":"trusted-ca"}]}}]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
部署外部 DNS Operator 后,运行以下命令来验证可信 CA 环境变量是否已添加到
external-dns-operator部署中:oc -n external-dns-operator exec deploy/external-dns-operator -c external-dns-operator -- printenv TRUSTED_CA_CONFIGMAP_NAME
$ oc -n external-dns-operator exec deploy/external-dns-operator -c external-dns-operator -- printenv TRUSTED_CA_CONFIGMAP_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
trusted-ca
trusted-caCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 17 章 网络策略 复制链接链接已复制到粘贴板!
17.1. 关于网络策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以定义网络策略以限制到集群中的 pod 的网络通讯。
17.1.1. 关于网络策略 复制链接链接已复制到粘贴板!
在使用支持 Kubernetes 网络策略的 Kubernetes Container Network Interface(CNI)插件的集群中,网络隔离完全由 NetworkPolicy 对象控制。在 OpenShift Container Platform 4.11 中,OpenShift SDN 支持在默认的网络隔离模式中使用网络策略。
网络策略不适用于主机网络命名空间。启用主机网络的 Pod 不受网络策略规则的影响。但是,连接到 host-networked pod 的 pod 会受到网络策略规则的影响。
网络策略无法阻止来自 localhost 或来自其驻留的节点的流量。
默认情况下,项目中的所有 pod 都可被其他 pod 和网络端点访问。要在一个项目中隔离一个或多个 Pod,您可以在该项目中创建 NetworkPolicy 对象来指示允许的入站连接。项目管理员可以在自己的项目中创建和删除 NetworkPolicy 对象。
如果一个 pod 由一个或多个 NetworkPolicy 对象中的选择器匹配,那么该 pod 将只接受至少被其中一个 NetworkPolicy 对象所允许的连接。未被任何 NetworkPolicy 对象选择的 pod 可以完全访问。
网络策略仅适用于 TCP、UDP、ICMP 和 SCTP 协议。其他协议不会受到影响。
以下示例 NetworkPolicy 对象演示了支持不同的情景:
拒绝所有流量:
要使项目默认为拒绝流量,请添加一个匹配所有 pod 但不接受任何流量的
NetworkPolicy对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 只允许 OpenShift Container Platform Ingress Controller 的连接:
要使项目只允许 OpenShift Container Platform Ingress Controller 的连接,请添加以下
NetworkPolicy对象。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 只接受项目中 pod 的连接:
要使 pod 接受同一项目中其他 pod 的连接,但拒绝其他项目中所有 pod 的连接,请添加以下
NetworkPolicy对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仅允许基于 pod 标签的 HTTP 和 HTTPS 流量:
要对带有特定标签(以下示例中的
role=frontend)的 pod 仅启用 HTTP 和 HTTPS 访问,请添加类似如下的NetworkPolicy对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用命名空间和 pod 选择器接受连接:
要通过组合使用命名空间和 pod 选择器来匹配网络流量,您可以使用类似如下的
NetworkPolicy对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
NetworkPolicy 对象是可添加的;也就是说,您可以组合多个 NetworkPolicy 对象来满足复杂的网络要求。
例如,对于以上示例中定义的 NetworkPolicy 对象,您可以在同一个项目中定义 allow-same-namespace 和 allow-http-and-https 策略。因此,允许带有标签 role=frontend 的 pod 接受每一策略所允许的任何连接。即,任何端口上来自同一命名空间中的 pod 的连接,以及端口 80 和 443 上的来自任意命名空间中 pod 的连接。
17.1.1.1. 使用 allow-from-router 网络策略 复制链接链接已复制到粘贴板!
使用以下 NetworkPolicy 来允许外部流量,而不考虑路由器配置:
- 1
policy-group.network.openshift.io/ingress:""标签支持 OpenShift-SDN 和 OVN-Kubernetes。
17.1.1.2. 使用 allow-from-hostnetwork 网络策略 复制链接链接已复制到粘贴板!
添加以下 allow-from-hostnetwork NetworkPolicy 对象来指示来自主机网络 pod 的流量:
17.1.2. 网络策略优化 复制链接链接已复制到粘贴板!
使用一个网络策略来通过 pod 上的不同标签来在命名空间中将不同 pod 进行隔离。
有效使用网络策略规则的指南只适用于 OpenShift SDN 集群网络供应商。
将 NetworkPolicy 对象应用到单一命名空间中的大量 pod 时,效率较低。因为 Pod 标签不存在于 IP 地址一级,因此网络策略会为使用 podSelector 选择的每个 pod 之间生成单独的 Open vSwitch(OVS)流量规则 。
例如,在一个 NetworkPolicy 对象中,如果 spec podSelector 和 ingress podSelector 每个都匹配 200 个 pod,则会产生 40,000 (200*200) OVS 流规则。这可能会减慢节点的速度。
在设计您的网络策略时,请参考以下指南:
使用命名空间使其包含需要隔离的 pod 组,可以减少 OVS 流规则数量。
使用
namespaceSelector或空podSelector选择整个命名空间的NetworkPolicy对象会只生成 一个与命名空间的 VXLAN 虚拟网络 ID(VNID)匹配的 OVS 流量规则。- 保留不需要在原始命名空间中隔离的 pod,并将需要隔离的 pod 移到一个或多个不同的命名空间中。
- 创建额外的目标跨命名空间网络策略,以允许来自不同隔离的 pod 的特定流量。
17.1.3. 后续步骤 复制链接链接已复制到粘贴板!
- 创建网络策略
- 可选:定义一个默认网络策略
17.2. 记录网络策略事件 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为集群配置网络策略审计日志记录,并为一个或多个命名空间启用日志记录。
网络策略的审计日志记录仅适用于 OVN-Kubernetes 集群网络供应商。
17.2.1. 网络策略审计日志记录 复制链接链接已复制到粘贴板!
OVN-Kubernetes 集群网络供应商使用 Open Virtual Network(OVN)ACL 管理网络策略。审计日志记录会公开允许和拒绝 ACL 事件。
您可以为网络策略审计日志(如 syslog 服务器或 UNIX 域套接字)配置目的地。无论任何其他配置如何,审计日志始终保存到集群中的每个 OVN-Kubernetes pod 上的 /var/log/ovn/acl-audit-log。
网络策略审计日志记录通过 k8s.ovn.org/acl-logging 键注解命名空间来启用每个命名空间,如下例所示:
命名空间注解示例
日志记录格式与 RFC5424 中定义的 syslog 兼容。syslog 工具可配置,默认为 local0。日志条目示例可能类似如下:
ACL 拒绝日志条目示例
2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_deny-all", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0
2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_deny-all", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0
下表描述了命名空间注解值:
| 注解 | 值 |
|---|---|
|
|
您必须至少指定
|
17.2.2. 网络策略审计配置 复制链接链接已复制到粘贴板!
审计日志记录的配置作为 OVN-Kubernetes 集群网络配置的一部分指定。以下 YAML 演示了网络策略审计日志记录功能的默认值。
审计日志记录配置
下表描述了网络策略审计日志记录的配置字段。
| 字段 | 类型 | 描述 |
|---|---|---|
|
| 整数 |
每个节点每秒生成一次的消息数量上限。默认值为每秒 |
|
| 整数 |
审计日志的最大大小,以字节为单位。默认值为 |
|
| 字符串 | 以下附加审计日志目标之一:
|
|
| 字符串 |
syslog 工具,如 as |
17.2.3. 为集群配置网络策略审计 复制链接链接已复制到粘贴板!
作为集群管理员,您可以自定义集群的网络策略审计日志记录。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
要自定义网络策略审计日志记录配置,请输入以下命令:
oc edit network.operator.openshift.io/cluster
$ oc edit network.operator.openshift.io/clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以自定义并应用以下 YAML 来配置审计日志记录:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要创建带有网络策略的命名空间,请完成以下步骤:
创建命名空间进行验证:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
namespace/verify-audit-logging created
namespace/verify-audit-logging createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用审计日志记录:
oc annotate namespace verify-audit-logging k8s.ovn.org/acl-logging='{ "deny": "alert", "allow": "alert" }'$ oc annotate namespace verify-audit-logging k8s.ovn.org/acl-logging='{ "deny": "alert", "allow": "alert" }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow namespace/verify-audit-logging annotated
namespace/verify-audit-logging annotatedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为命名空间创建网络策略:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
networkpolicy.networking.k8s.io/deny-all created networkpolicy.networking.k8s.io/allow-from-same-namespace created
networkpolicy.networking.k8s.io/deny-all created networkpolicy.networking.k8s.io/allow-from-same-namespace createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
为
default命名空间中的源流量创建 pod:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
verify-audit-logging命名空间中创建两个 pod:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
pod/client created pod/server created
pod/client created pod/server createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要生成流量并生成网络策略审计日志条目,请完成以下步骤:
在
verify-audit-logging命名空间中获取名为server的 pod 的 IP 地址:POD_IP=$(oc get pods server -n verify-audit-logging -o jsonpath='{.status.podIP}')$ POD_IP=$(oc get pods server -n verify-audit-logging -o jsonpath='{.status.podIP}')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从
default命名空间中名为client的 pod 中 ping 上一个命令的 IP 地址,并确认所有数据包都已丢弃:oc exec -it client -n default -- /bin/ping -c 2 $POD_IP
$ oc exec -it client -n default -- /bin/ping -c 2 $POD_IPCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
PING 10.128.2.55 (10.128.2.55) 56(84) bytes of data. --- 10.128.2.55 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 2041ms
PING 10.128.2.55 (10.128.2.55) 56(84) bytes of data. --- 10.128.2.55 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 2041msCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从
verify-audit-logging命名空间中名为client的 pod 中 pingPOD_IPshell 环境变量中保存的 IP 地址,并确认允许所有数据包:oc exec -it client -n verify-audit-logging -- /bin/ping -c 2 $POD_IP
$ oc exec -it client -n verify-audit-logging -- /bin/ping -c 2 $POD_IPCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
显示网络策略审计日志中的最新条目:
for pod in $(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node --no-headers=true | awk '{ print $1 }') ; do oc exec -it $pod -n openshift-ovn-kubernetes -- tail -4 /var/log/ovn/acl-audit-log.log done$ for pod in $(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node --no-headers=true | awk '{ print $1 }') ; do oc exec -it $pod -n openshift-ovn-kubernetes -- tail -4 /var/log/ovn/acl-audit-log.log doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
17.2.4. 为命名空间启用网络策略审计日志记录 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为命名空间启用网络策略审计日志记录。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
要为命名空间启用网络策略审计日志记录,请输入以下命令:
oc annotate namespace <namespace> \ k8s.ovn.org/acl-logging='{ "deny": "alert", "allow": "notice" }'$ oc annotate namespace <namespace> \ k8s.ovn.org/acl-logging='{ "deny": "alert", "allow": "notice" }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>- 指定命名空间的名称。
提示您还可以应用以下 YAML 来启用审计日志记录:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
namespace/verify-audit-logging annotated
namespace/verify-audit-logging annotatedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示网络策略审计日志中的最新条目:
for pod in $(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node --no-headers=true | awk '{ print $1 }') ; do oc exec -it $pod -n openshift-ovn-kubernetes -- tail -4 /var/log/ovn/acl-audit-log.log done$ for pod in $(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node --no-headers=true | awk '{ print $1 }') ; do oc exec -it $pod -n openshift-ovn-kubernetes -- tail -4 /var/log/ovn/acl-audit-log.log doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_deny-all", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0
2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_deny-all", verdict=drop, severity=alert: icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
17.2.5. 禁用命名空间的网络策略审计日志记录 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为命名空间禁用网络策略审计日志记录。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
要禁用命名空间的网络策略审计日志记录,请输入以下命令:
oc annotate --overwrite namespace <namespace> k8s.ovn.org/acl-logging-
$ oc annotate --overwrite namespace <namespace> k8s.ovn.org/acl-logging-Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>- 指定命名空间的名称。
提示您还可以应用以下 YAML 来禁用审计日志记录:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
namespace/verify-audit-logging annotated
namespace/verify-audit-logging annotatedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
17.3. 创建网络策略 复制链接链接已复制到粘贴板!
作为具有 admin 角色的用户,您可以为命名空间创建网络策略。
17.3.1. 示例 NetworkPolicy 对象 复制链接链接已复制到粘贴板!
下文解释了示例 NetworkPolicy 对象:
17.3.2. 使用 CLI 创建网络策略 复制链接链接已复制到粘贴板!
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个网络策略。
如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中创建网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的集群网络供应商,如设置了mode: NetworkPolicy的 OpenShift SDN 网络供应商。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
admin权限的用户登陆到集群。 - 您在网络策略要应用到的命名空间中。
流程
创建策略规则:
创建一个
<policy_name>.yaml文件:touch <policy_name>.yaml
$ touch <policy_name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定网络策略文件名。
在您刚才创建的文件中定义网络策略,如下例所示:
拒绝来自所有命名空间中的所有 pod 的入口流量
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 允许来自所有命名空间中的所有 pod 的入口流量
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令来创建网络策略对象:
oc apply -f <policy_name>.yaml -n <namespace>
$ oc apply -f <policy_name>.yaml -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定网络策略文件名。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
networkpolicy.networking.k8s.io/default-deny created
networkpolicy.networking.k8s.io/default-deny createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式创建网络策略。
17.4. 查看网络策略 复制链接链接已复制到粘贴板!
以具有 admin 角色的用户,您可以查看命名空间的网络策略。
17.4.1. 示例 NetworkPolicy 对象 复制链接链接已复制到粘贴板!
下文解释了示例 NetworkPolicy 对象:
17.4.2. 使用 CLI 查看网络策略 复制链接链接已复制到粘贴板!
您可以检查命名空间中的网络策略。
如果使用具有 cluster-admin 角色的用户登录,您可以查看集群中的任何网络策略。
前提条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
admin权限的用户登陆到集群。 - 您在网络策略所在的命名空间中。
流程
列出命名空间中的网络策略:
要查看命名空间中定义的网络策略对象,请输入以下命令:
oc get networkpolicy
$ oc get networkpolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要检查特定的网络策略,请输入以下命令:
oc describe networkpolicy <policy_name> -n <namespace>
$ oc describe networkpolicy <policy_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定要检查的网络策略的名称。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
例如:
oc describe networkpolicy allow-same-namespace
$ oc describe networkpolicy allow-same-namespaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc describe命令的输出Copy to Clipboard Copied! Toggle word wrap Toggle overflow
如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式查看网络策略。
17.5. 编辑网络策略 复制链接链接已复制到粘贴板!
作为具有 admin 角色的用户,您可以编辑命名空间的现有网络策略。
17.5.1. 编辑网络策略 复制链接链接已复制到粘贴板!
您可以编辑命名空间中的网络策略。
如果使用具有 cluster-admin 角色的用户登录,则可以在集群中的任何命名空间中编辑网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的集群网络供应商,如设置了mode: NetworkPolicy的 OpenShift SDN 网络供应商。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
admin权限的用户登陆到集群。 - 您在网络策略所在的命名空间中。
流程
可选: 要列出一个命名空间中的网络策略对象,请输入以下命令:
oc get networkpolicy
$ oc get networkpolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
编辑网络策略对象。
如果您在文件中保存了网络策略定义,请编辑该文件并进行必要的更改,然后输入以下命令。
oc apply -n <namespace> -f <policy_file>.yaml
$ oc apply -n <namespace> -f <policy_file>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
<policy_file>- 指定包含网络策略的文件的名称。
如果您需要直接更新网络策略对象,请输入以下命令:
oc edit networkpolicy <policy_name> -n <namespace>
$ oc edit networkpolicy <policy_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定网络策略的名称。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
确认网络策略对象已更新。
oc describe networkpolicy <policy_name> -n <namespace>
$ oc describe networkpolicy <policy_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定网络策略的名称。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或通过 Actions 菜单从 web 控制台中的策略编辑网络策略。
17.5.2. 示例 NetworkPolicy 对象 复制链接链接已复制到粘贴板!
下文解释了示例 NetworkPolicy 对象:
17.6. 删除网络策略 复制链接链接已复制到粘贴板!
以具有 admin 角色的用户,您可以从命名空间中删除网络策略。
17.6.1. 使用 CLI 删除网络策略 复制链接链接已复制到粘贴板!
您可以删除命名空间中的网络策略。
如果使用具有 cluster-admin 角色的用户登录,您可以删除集群中的任何网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的集群网络供应商,如设置了mode: NetworkPolicy的 OpenShift SDN 网络供应商。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
admin权限的用户登陆到集群。 - 您在网络策略所在的命名空间中。
流程
要删除网络策略对象,请输入以下命令:
oc delete networkpolicy <policy_name> -n <namespace>
$ oc delete networkpolicy <policy_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定网络策略的名称。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
networkpolicy.networking.k8s.io/default-deny deleted
networkpolicy.networking.k8s.io/default-deny deletedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如果使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群上以 YAML 或通过 Actions 菜单从 web 控制台中的策略删除网络策略。
17.7. 为项目定义默认网络策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在创建新项目时修改新项目模板,使其自动包含网络策略。如果您还没有新项目的自定义模板,则需要首先创建一个。
17.7.1. 为新项目修改模板 复制链接链接已复制到粘贴板!
作为集群管理员,您可以修改默认项目模板,以便使用自定义要求创建新项目。
创建自己的自定义项目模板:
流程
-
以具有
cluster-admin特权的用户身份登录。 生成默认项目模板:
oc adm create-bootstrap-project-template -o yaml > template.yaml
$ oc adm create-bootstrap-project-template -o yaml > template.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用文本编辑器,通过添加对象或修改现有对象来修改生成的
template.yaml文件。 项目模板必须创建在
openshift-config命名空间中。加载修改后的模板:oc create -f template.yaml -n openshift-config
$ oc create -f template.yaml -n openshift-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Web 控制台或 CLI 编辑项目配置资源。
使用 Web 控制台:
- 导航至 Administration → Cluster Settings 页面。
- 单击 Configuration 以查看所有配置资源。
- 找到 Project 的条目,并点击 Edit YAML。
使用 CLI:
编辑
project.config.openshift.io/cluster资源:oc edit project.config.openshift.io/cluster
$ oc edit project.config.openshift.io/clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow
更新
spec部分,使其包含projectRequestTemplate和name参数,再设置您上传的项目模板的名称。默认名称为project-request。带有自定义项目模板的项目配置资源
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存更改后,创建一个新项目来验证是否成功应用了您的更改。
17.7.2. 在新项目模板中添加网络策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在新项目的默认模板中添加网络策略。OpenShift Container Platform 将自动创建项目中模板中指定的所有 NetworkPolicy 对象。
先决条件
-
集群使用支持
NetworkPolicy对象的默认 CNI 网络供应商,如设置了mode: NetworkPolicy的 OpenShift SDN 网络供应商。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc)。 -
您需要使用具有
cluster-admin权限的用户登陆到集群。 - 您必须已为新项目创建了自定义的默认项目模板。
流程
运行以下命令来编辑新项目的默认模板:
oc edit template <project_template> -n openshift-config
$ oc edit template <project_template> -n openshift-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<project_template>替换为您为集群配置的缺省模板的名称。默认模板名称为project-request。在模板中,将每个
NetworkPolicy对象作为一个元素添加到objects参数中。objects参数可以是一个或多个对象的集合。在以下示例中,
objects参数集合包括几个NetworkPolicy对象。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:通过运行以下命令创建一个新项目,来确认您的网络策略对象已被成功创建:
创建一个新项目:
oc new-project <project>
$ oc new-project <project>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<project>替换为您要创建的项目的名称。
确认新项目模板中的网络策略对象存在于新项目中:
oc get networkpolicy NAME POD-SELECTOR AGE allow-from-openshift-ingress <none> 7s allow-from-same-namespace <none> 7s
$ oc get networkpolicy NAME POD-SELECTOR AGE allow-from-openshift-ingress <none> 7s allow-from-same-namespace <none> 7sCopy to Clipboard Copied! Toggle word wrap Toggle overflow
17.8. 使用网络策略配置多租户隔离 复制链接链接已复制到粘贴板!
作为集群管理员,您可以配置网络策略以为多租户网络提供隔离功能。
如果使用 OpenShift SDN 集群网络供应商,请按照本节所述配置网络策略,提供类似于多租户模式的网络隔离,但具有设置网络策略模式。
17.8.1. 使用网络策略配置多租户隔离 复制链接链接已复制到粘贴板!
您可以配置项目,使其与其他项目命名空间中的 pod 和服务分离。
先决条件
-
集群使用支持
NetworkPolicy对象的集群网络供应商,如设置了mode: NetworkPolicy的 OpenShift SDN 网络供应商。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
admin权限的用户登陆到集群。
流程
创建以下
NetworkPolicy对象:名为
allow-from-openshift-ingress的策略。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意policy-group.network.openshift.io/ingress: ""是 OpenShift SDN 的首选命名空间选择器标签。您可以使用network.openshift.io/policy-group: ingress命名空间选择器标签,但这是一个比较旧的用法。名为
allow-from-openshift-monitoring的策略:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 名为
allow-same-namespace的策略:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 名为
allow-from-kube-apiserver-operator的策略:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需了解更多详细信息,请参阅 新的
kube-apiserver-operatorWebhook 控制器验证 Webhook 的健康状况。
可选: 要确认当前项目中存在网络策略,请输入以下命令:
oc describe networkpolicy
$ oc describe networkpolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
17.8.2. 后续步骤 复制链接链接已复制到粘贴板!
第 18 章 CIDR 范围定义 复制链接链接已复制到粘贴板!
您必须为以下 CIDR 范围指定非重叠范围。
创建集群后无法更改机器 CIDR 范围。
OVN-Kubernetes 是 OpenShift Container Platform 4.11 及之后的版本中的默认网络供应商,在内部使用 100.64.0.0/16 IP 地址范围。如果您的集群使用 OVN-Kubernetes,请不要在集群中的任何 CIDR 定义中包含 100.64.0.0/16 IP 地址范围。
18.1. Machine CIDR 复制链接链接已复制到粘贴板!
在 Machine CIDR 字段中,您必须为机器或集群节点指定 IP 地址范围。
默认值为 10.0.0.0/16。这个范围不得与任何连接的网络冲突。
18.2. Service CIDR 复制链接链接已复制到粘贴板!
在 Service CIDR 字段中,您必须为服务指定 IP 地址范围。范围必须足够大,以适应您的工作负载。该地址块不得与从集群内部访问的任何外部服务重叠。默认为 172.30.0.0/16。
18.3. Pod CIDR 复制链接链接已复制到粘贴板!
在 pod CIDR 字段中,您必须为 pod 指定 IP 地址范围。
pod CIDR 与 clusterNetwork CIDR 和集群 CIDR 相同。范围必须足够大,以适应您的工作负载。该地址块不得与从集群内部访问的任何外部服务重叠。默认为 10.128.0.0/14。您可以在集群安装后扩展范围。
18.4. 主机前缀 复制链接链接已复制到粘贴板!
在 Host Prefix 字段中,您必须指定分配给调度到各个机器的 pod 的子网前缀长度。主机前缀决定了每台机器的 pod IP 地址池。
例如,如果主机前缀设置为 /23,则每台机器从 pod CIDR 地址范围中分配一个 /23 子网。默认值为 /23,允许 510 集群节点,以及每个节点的 510 个 pod IP 地址。
第 19 章 AWS Load Balancer Operator 复制链接链接已复制到粘贴板!
AWS Load Balancer (ALB) Operator 部署和管理 aws-load-balancer-controller 的实例。您可以使用 OpenShift Container Platform Web 控制台或 CLI 从 OperatorHub 安装 ALB Operator。
19.1.1. AWS Load Balancer Operator 的注意事项 复制链接链接已复制到粘贴板!
在安装和使用 AWS Load Balancer Operator 前,请查看以下限制。
- IP 流量模式仅适用于 AWS Elastic Kubernetes Service (EKS)。AWS Load Balancer Operator 禁用 AWS Load Balancer Controller 的 IP 流量模式。禁用 IP 流量模式后,AWS Load Balancer Controller 无法使用 pod 就绪度。
-
AWS Load Balancer Operator 将命令行标记(如
--disable-ingress-class-annotation和--disable-ingress-group-name-annotation)添加到 AWS Load Balancer Controller。因此,AWS Load Balancer Operator 不允许在Ingress资源中使用kubernetes.io/ingress.class和alb.ingress.kubernetes.io/group.name注解。
19.1.2. AWS Load Balancer Operator 复制链接链接已复制到粘贴板!
如果缺少 kubernetes.io/role/elb 标签,AWS Load Balancer Operator 可以标记公共子网。另外,AWS Load Balancer Operator 从底层 AWS 云检测到以下内容:
- 托管 Operator 的集群的虚拟私有云 (VPC) 的 ID。
- 发现 VPC 的公共和私有子网。
先决条件
- 您必须具有 AWS 凭证 secret。凭证用于提供子网标记和 VPC 发现功能。
流程
您可以通过创建一个
Subscription对象,部署来自 OperatorHub 的 AWS Load Balancer Operator:oc -n aws-load-balancer-operator get sub aws-load-balancer-operator --template='{{.status.installplan.name}}{{"\n"}}'$ oc -n aws-load-balancer-operator get sub aws-load-balancer-operator --template='{{.status.installplan.name}}{{"\n"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
install-zlfbt
install-zlfbtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查安装计划的状态。安装计划的状态必须是
Complete:oc -n aws-load-balancer-operator get ip <install_plan_name> --template='{{.status.phase}}{{"\n"}}'$ oc -n aws-load-balancer-operator get ip <install_plan_name> --template='{{.status.phase}}{{"\n"}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Complete
CompleteCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oc get命令来查看部署状态 :oc get -n aws-load-balancer-operator deployment/aws-load-balancer-operator-controller-manager
$ oc get -n aws-load-balancer-operator deployment/aws-load-balancer-operator-controller-managerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-operator-controller-manager 1/1 1 1 23h
NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-operator-controller-manager 1/1 1 1 23hCopy to Clipboard Copied! Toggle word wrap Toggle overflow
19.1.3. AWS Load Balancer Operator 日志 复制链接链接已复制到粘贴板!
使用 oc logs 命令查看 AWS Load Balancer Operator 日志。
流程
查看 AWS Load Balancer Operator 的日志:
oc logs -n aws-load-balancer-operator deployment/aws-load-balancer-operator-controller-manager -c manager
$ oc logs -n aws-load-balancer-operator deployment/aws-load-balancer-operator-controller-manager -c managerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
19.2. 了解 AWS Load Balancer Operator 复制链接链接已复制到粘贴板!
AWS Load Balancer(ALB)Operator 部署和管理 aws-load-balancer-controller 资源的实例。您可以使用 OpenShift Container Platform Web 控制台或 CLI 安装来自 OperatorHub 的 AWS Load Balancer Operator。
19.2.1. 安装 AWS Load Balancer Operator 复制链接链接已复制到粘贴板!
您可以使用 OpenShift Container Platform Web 控制台从 OperatorHub 安装 AWS Load Balancer Operator。
先决条件
-
已作为具有
cluster-admin权限的用户身份登录 OpenShift Container Platform Web 控制台。 - 集群被配置为使用 AWS 作为平台类型和云供应商。
流程
- 在 OpenShift Container Platform Web 控制台中进入 Operators → OperatorHub。
- 选择 AWS Load Balancer Operator。您可以使用 Filter by keyword 文本框,或者使用过滤器列表从 Operator 列表搜索 AWS Load Balancer Operator。
-
选择
aws-load-balancer-operator命名空间。 - 按照说明准备 Operator 的安装。
- 在 AWS Load Balancer Operator 页面中,点 Install。
在 Install Operator 页面中,选择以下选项:
- Update the channel 为 stable-v0.1。
- Installation mode 为 A specific namespace on the cluster。
-
Installed Namespace 为
aws-load-balancer-operator。如果aws-load-balancer-operator命名空间不存在,它会在 Operator 安装过程中创建。 - 选择 Update approval 为 Automatic 或 Manual。默认情况下,Update approval 设置为 Automatic。如果选择自动更新,Operator Lifecycle Manager(OLM)将自动升级 Operator 的运行实例,而无需任何干预。如果选择手动更新,OLM 将创建一个更新请求。作为集群管理员,您必须手动批准该更新请求,以便将 Operator 更新至新版本。
- 点 Install。
验证
- 在 Installed Operators 仪表板中验证 AWS Load Balancer Operator 的 Status 显示为 Succeeded。
19.3. 创建 AWS Load Balancer Controller 实例 复制链接链接已复制到粘贴板!
安装 Operator 后,您可以创建 AWS Load Balancer Controller 实例。
您只能在集群中安装 aws-load-balancer-controller 的单个实例。您可以使用 CLI 创建 AWS Load Balancer Controller。AWS Load Balancer(ALB)Operator 只会协调名为 cluster 的资源。
先决条件
-
您已创建了
echoserver命名空间。 -
您可以访问 OpenShift CLI(
oc)。
流程
创建一个
aws-load-balancer-controller资源 YAML 文件,如sample-aws-lb.yaml,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 定义
aws-load-balancer-controller资源。 - 2
- 定义 AWS Load Balancer Controller 实例名称。此实例名称作为后缀添加到所有相关资源。
- 3
- 有效选项为
Auto和Manual。当将值设置为Auto时,Operator 会尝试确定属于集群的子网并适当标记它们。如果内部子网上不存在内部子网标签,Operator 无法正确确定角色。如果在用户提供的基础架构上安装集群,您可以使用适当的角色标签手动标记子网,并将子网标记策略设置为Manual。 - 4
- 定义控制器在置备 AWS 资源时使用的标签。
- 5
- 此字段的默认值为
alb。如果 Operator 不存在,Operator 会置备具有相同名称的IngressClass资源。 - 6
- 指定控制器的副本数。
- 7
- 指定 AWS 负载均衡器的附加组件,该附加组件通过注解指定。
- 8
- 启用
alb.ingress.kubernetes.io/wafv2-acl-arn注解。
运行以下命令,创建一个
aws-load-balancer-controller资源:oc create -f sample-aws-lb.yaml
$ oc create -f sample-aws-lb.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 AWS Load Balancer Controller 运行后,创建一个
部署资源 :Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个
服务资源 :Copy to Clipboard Copied! Toggle word wrap Toggle overflow 部署 ALB 支持的
Ingress资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行以下命令,验证
Ingress资源的状态,以显示置备的 AWS Load Balancer(ALB)的主机:HOST=$(kubectl get ingress -n echoserver echoserver -o json | jq -r '.status.loadBalancer.ingress[0].hostname')
$ HOST=$(kubectl get ingress -n echoserver echoserver -o json | jq -r '.status.loadBalancer.ingress[0].hostname')Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证置备的 AWS Load Balancer(ALB)主机的状态:
curl $HOST
$ curl $HOSTCopy to Clipboard Copied! Toggle word wrap Toggle overflow
19.4. 创建多个入口 复制链接链接已复制到粘贴板!
您可以通过单个 AWS 负载均衡器(ALB)将流量路由到属于单个域的不同服务。每个 Ingress 资源提供域的不同端点。
19.4.1. 通过单个 AWS 负载均衡器创建多个入口 复制链接链接已复制到粘贴板!
您可以使用 CLI 通过单个 AWS Load Balancer(ALB)将流量路由到多个 Ingresses。
先决条件
-
您可以访问 OpenShift CLI(
oc)。
流程
创建一个
IngressClassParams资源 YAML 文件,如sample-single-lb-params.yaml,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
IngressClassParams资源:oc create -f sample-single-lb-params.yaml
$ oc create -f sample-single-lb-params.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个
IngressClass资源 YAML 文件,如sample-single-lb-class.yaml,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
IngressClass资源:oc create -f sample-single-lb-class.yaml
$ oc create -f sample-single-lb-class.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个
AWSLoadBalancerController资源 YAML 文件,如sample-single-lb.yaml,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 定义
IngressClass资源的名称。
运行以下命令来创建
AWSLoadBalancerController资源:oc create -f sample-single-lb.yaml
$ oc create -f sample-single-lb.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个
Ingress资源 YAML 文件,如sample-multiple-ingress.yaml,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
Ingress资源:oc create -f sample-multiple-ingress.yaml
$ oc create -f sample-multiple-ingress.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
19.5. 添加 TLS 终止 复制链接链接已复制到粘贴板!
您可以在 AWS Load Balancer 上添加 TLS 终止。
19.5.1. 在 AWS Load Balancer 中添加 TLS 终止 复制链接链接已复制到粘贴板!
您可以将域的流量路由到服务的 pod,并在 AWS 负载均衡器中添加 TLS 终止。
先决条件
-
您可以访问 OpenShift CLI(
oc)。
流程
安装 Operator 并创建
aws-load-balancer-controller资源的实例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
Ingress资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 20 章 多网络 复制链接链接已复制到粘贴板!
20.1. 了解多网络 复制链接链接已复制到粘贴板!
在 Kubernetes 中,容器网络被委派给实现 Container Network Interface (CNI) 的网络插件。
OpenShift Container Platform 使用 Multus CNI 插件来串联 CNI 插件。在集群安装过程中,您要配置 default pod 网络。默认网络处理集群中的所有一般网络流量。您可以基于可用的 CNI 插件定义额外网络,并将一个或多个此类网络附加到 pod。您可以根据需要为集群定义多个额外网络。这可让您灵活地配置提供交换或路由等网络功能的 pod。
20.1.1. 额外网络使用场景 复制链接链接已复制到粘贴板!
您可以在需要网络隔离的情况下使用额外网络,包括分离数据平面与控制平面。隔离网络流量对以下性能和安全性原因很有用:
- 性能
- 您可以在两个不同的平面上发送流量,以管理每个平面上流量的多少。
- 安全性
- 您可以将敏感的流量发送到专为安全考虑而管理的网络平面,也可隔离不能在租户或客户间共享的私密数据。
集群中的所有 pod 仍然使用集群范围的默认网络,以维持整个集群中的连通性。每个 pod 都有一个 eth0 接口,附加到集群范围的 pod 网络。您可以使用 oc exec -it <pod_name> -- ip a 命令来查看 pod 的接口。如果您添加使用 Multus CNI 的额外网络接口,则名称为 net1、net2、…、netN。
要将额外网络接口附加到 pod,您必须创建配置来定义接口的附加方式。您可以使用 NetworkAttachmentDefinition 自定义资源(CR)来指定各个接口。各个 CR 中的 CNI 配置定义如何创建该接口。
20.1.2. OpenShift Container Platform 中的额外网络 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供以下 CNI 插件,以便在集群中创建额外网络:
- bridge :配置基于网桥的额外网络,以允许同一主机上的 pod 相互通信,并与主机通信。
- host-device:配置 host-device 额外网络,以允许 pod 访问主机系统上的物理以太网网络设备。
- ipvlan :配置基于 ipvlan 的额外网络,以允许主机上的 Pod 与其他主机和那些主机上的 pod 通信,这类似于基于 macvlan 的额外网络。与基于 macvlan 的额外网络不同,每个 pod 共享与父级物理网络接口相同的 MAC 地址。
- macvlan:配置基于 macvlan 的额外网络,以允许主机上的 Pod 通过使用物理网络接口与其他主机和那些主机上的 Pod 通信。附加到基于 macvlan 的额外网络的每个 pod 都会获得一个唯一的 MAC 地址。
- SR-IOV :配置基于 SR-IOV 的额外网络,以允许 pod 附加到主机系统上支持 SR-IOV 的硬件的虚拟功能(VF)接口。
20.2. 配置额外网络 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为集群配置额外网络。支持以下网络类型:
20.2.1. 管理额外网络的方法 复制链接链接已复制到粘贴板!
您可以通过两种方法来管理额外网络的生命周期。每种方法都是相互排斥的,您一次只能使用一种方法来管理额外网络。对于任一方法,额外网络由您配置的 Container Network Interface(CNI)插件管理。
对于额外网络,IP 地址通过您配置为额外网络一部分的 IP 地址管理 (IPAM) CNI 插件来置备。IPAM 插件支持多种 IP 地址分配方法,包括 DHCP 和静态分配。
-
修改 Cluster Network Operator(CNO)配置:CNO 会自动创建和管理
NetworkAttachmentDefinition对象。除了管理对象生命周期外,CNO 可以确保 DHCP 可用于使用 DHCP 分配的 IP 地址的额外网络。 -
应用 YAML 清单:您可以通过创建
NetworkAttachmentDefinition对象直接管理额外网络。这个方法可以串联 CNI 插件。
20.2.2. 配置额外网络附加 复制链接链接已复制到粘贴板!
额外网络通过 k8s.cni.cncf.io API 组中的 NetworkAttachmentDefinition API 来配置。
请勿将任何敏感信息或机密存储在 NetworkAttachmentDefinition 对象中,因为此类信息可由项目管理用户访问。
下表中描述了 API 的配置:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 额外网络的名称。 |
|
|
| 与对象关联的命名空间。 |
|
|
| JSON 格式的 CNI 插件配置。 |
20.2.2.1. 通过 Cluster Network Operator 配置额外网络 复制链接链接已复制到粘贴板!
额外网络附加的配置作为 Cluster Network Operator(CNO)配置的一部分被指定。
以下 YAML 描述了使用 CNO 管理额外网络的配置参数:
Cluster Network Operator 配置
20.2.2.2. 从 YAML 清单配置额外网络 复制链接链接已复制到粘贴板!
从 YAML 配置文件指定额外网络的配置,如下例所示:
20.2.3. 额外网络类型的配置 复制链接链接已复制到粘贴板!
以下部分介绍了额外网络的具体配置字段。
20.2.3.1. 配置桥接额外网络 复制链接链接已复制到粘贴板!
以下对象描述了 bridge CNI 插件的配置参数:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CNI 规格版本。需要 |
|
|
|
您之前为 CNO 配置提供的 |
|
|
|
用于配置的 CNI 插件的名称: |
|
|
| IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。 |
|
|
|
可选:指定要使用的虚拟网桥名称。如果主机上不存在网桥接口,则进行创建。默认值为 |
|
|
|
可选:设置为 |
|
|
|
可选:设置为 |
|
|
|
可选:设置为 |
|
|
|
可选:设置为 |
|
|
|
可选:设置为 |
|
|
|
可选:设置为 |
|
|
| 可选:指定一个虚拟 LAN (VLAN) 标签作为整数值。默认情况下不分配 VLAN 标签。 |
|
|
|
可选:指示在连接到网桥的 |
|
|
|
可选:分配 VLAN 中继标签。默认值为 |
|
|
| 可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。 |
|
|
|
可选:为容器侧 |
|
|
|
可选:启用 mac spoof 检查,将来自容器的流量限制为接口的 mac 地址。默认值为 |
VLAN 参数在 veth 的主机端配置 VLAN 标签,并在网桥接口上启用 vlan_filtering 功能。
要为 L2 网络配置 uplink,您需要使用以下命令在 uplink 接口上允许 vlan :
bridge vlan add vid VLAN_ID dev DEV
$ bridge vlan add vid VLAN_ID dev DEV
20.2.3.1.1. 网桥配置示例 复制链接链接已复制到粘贴板!
以下示例配置了名为 bridge-net 的额外网络:
20.2.3.2. 主机设备额外网络配置 复制链接链接已复制到粘贴板!
仅设置以下参数之一来指定您的网络设备:device、hwaddr、kernelpath 或 pciBusID。
以下对象描述了 host-device CNI 插件的配置参数:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CNI 规格版本。需要 |
|
|
|
您之前为 CNO 配置提供的 |
|
|
|
用于配置的 CNI 插件的名称: |
|
|
|
可选:设备的名称,如 |
|
|
| 可选:设备硬件 MAC 地址。 |
|
|
|
可选:Linux 内核设备路径,如 |
|
|
|
可选:网络设备的 PCI 地址,如 |
20.2.3.2.1. host-device 配置示例 复制链接链接已复制到粘贴板!
以下示例配置了名为 hostdev-net 的额外网络:
20.2.3.3. 配置 IPVLAN 额外网络 复制链接链接已复制到粘贴板!
以下对象描述了 IPVLAN CNI 插件的配置参数:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CNI 规格版本。需要 |
|
|
|
您之前为 CNO 配置提供的 |
|
|
|
要配置的 CNI 插件的名称: |
|
|
| IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。除非插件被串联,否则需要此项。 |
|
|
|
可选:虚拟网络的操作模式。这个值必须是 |
|
|
|
可选:与网络附加关联的以太网接口。如果没有指定 |
|
|
| 可选:将最大传输单元 (MTU) 设置为指定的值。默认值由内核自动设置。 |
-
ipvlan对象不允许虚拟接口与master接口通信。因此,容器无法使用ipvlan接口访问主机。确保容器加入提供主机连接的网络,如支持 Precision Time Protocol (PTP) 的网络。 -
单个
master接口无法同时配置为使用macvlan和ipvlan。 -
对于不能与接口无关的 IP 分配方案,可以使用处理此逻辑的较早插件来串联
ipvlan插件。如果省略master,则前面的结果必须包含一个接口名称,以便ipvlan插件进行 enslave。如果省略ipam,则使用前面的结果来配置ipvlan接口。
20.2.3.3.1. ipvlan 配置示例 复制链接链接已复制到粘贴板!
以下示例配置了名为 ipvlan -net 的额外网络:
20.2.3.4. 配置 MACVLAN 额外网络 复制链接链接已复制到粘贴板!
以下对象描述了 macvlan CNI 插件的配置参数:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CNI 规格版本。需要 |
|
|
|
您之前为 CNO 配置提供的 |
|
|
|
用于配置的 CNI 插件的名称: |
|
|
| IPAM CNI 插件的配置对象。该插件管理附加定义的 IP 地址分配。 |
|
|
|
可选:配置虚拟网络上的流量可见性。必须是 |
|
|
| 可选:与新创建的 macvlan 接口关联的主机网络接口。如果没有指定值,则使用默认路由接口。 |
|
|
| 可选:将最大传输单元 (MTU) 到指定的值。默认值由内核自动设置。 |
如果您为插件配置指定 master key,请使用与主网络插件关联的物理网络接口,以避免可能冲突。
20.2.3.4.1. macvlan 配置示例 复制链接链接已复制到粘贴板!
以下示例配置了名为 macvlan-net 的额外网络:
20.2.4. 为额外网络配置 IP 地址分配 复制链接链接已复制到粘贴板!
IP 地址管理 (IPAM) Container Network Interface (CNI) 插件为其他 CNI 插件提供 IP 地址。
您可以使用以下 IP 地址分配类型:
- 静态分配。
- 通过 DHCP 服务器进行动态分配。您指定的 DHCP 服务器必须可从额外网络访问。
- 通过 Whereabouts IPAM CNI 插件进行动态分配。
20.2.4.1. 静态 IP 地址分配配置 复制链接链接已复制到粘贴板!
下表描述了静态 IP 地址分配的配置:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。值必须是 |
|
|
| 指定分配给虚拟接口的 IP 地址的对象数组。支持 IPv4 和 IPv6 IP 地址。 |
|
|
| 指定要在 pod 中配置的路由的一组对象。 |
|
|
| 可选:指定 DNS 配置的对象数组。 |
address 数组需要带有以下字段的对象:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
您指定的 IP 地址和网络前缀。例如:如果您指定 |
|
|
| 出口网络流量要路由到的默认网关。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CIDR 格式的 IP 地址范围,如 |
|
|
| 网络流量路由的网关。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 用于发送 DNS 查询的一个或多个 IP 地址的数组。 |
|
|
|
要附加到主机名的默认域。例如,如果将域设置为 |
|
|
|
在 DNS 查找查询过程中,附加到非限定主机名(如 |
静态 IP 地址分配配置示例
20.2.4.2. 动态 IP 地址(DHCP)分配配置 复制链接链接已复制到粘贴板!
以下 JSON 描述了使用 DHCP 进行动态 IP 地址地址分配的配置。
pod 在创建时获取其原始 DHCP 租期。该租期必须由集群中运行的一个小型的 DHCP 服务器部署定期续订。
要触发 DHCP 服务器的部署,您必须编辑 Cluster Network Operator 配置来创建 shim 网络附加,如下例所示:
shim 网络附加定义示例
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。需要值 |
动态 IP 地址(DHCP)分配配置示例
{
"ipam": {
"type": "dhcp"
}
}
{
"ipam": {
"type": "dhcp"
}
}
20.2.4.3. 使用 Whereabouts 进行动态 IP 地址分配配置 复制链接链接已复制到粘贴板!
Whereabouts CNI 插件允许在不使用 DHCP 服务器的情况下动态地将 IP 地址分配给额外网络。
下表描述了使用 Whereabouts 进行动态 IP 地址分配的配置:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。需要 |
|
|
| CIDR 表示法中的 IP 地址和范围。IP 地址是通过这个地址范围来分配的。 |
|
|
| 可选: CIDR 标记中零个或更多 IP 地址和范围的列表。包含在排除地址范围中的 IP 地址。 |
使用 Whereabouts 的动态 IP 地址分配配置示例
20.2.4.4. 创建 Whereabouts 协调器守护进程集 复制链接链接已复制到粘贴板!
Whereabouts 协调器负责管理集群中 pod 的动态 IP 地址分配,使用 Whereabouts IP 地址管理 (IPAM) 解决方案。它确保每个 pod 从指定的 IP 地址范围中获取唯一的 IP 地址。它还会在 pod 删除或缩减时处理 IP 地址发行版本。
您还可以使用 NetworkAttachmentDefinition 自定义资源进行动态 IP 地址分配。
通过 Cluster Network Operator 配置额外网络时,Whereabouts reconciler 守护进程集会被自动创建。从 YAML 清单配置额外网络时,它不会自动创建。
要触发 Whereabouts 协调器 daemonset 的部署,您必须通过编辑 Cluster Network Operator 自定义资源文件来手动创建 whereabouts-shim 网络附加。
使用以下步骤部署 Whereabouts 协调器 daemonset。
流程
运行以下命令来编辑
Network.operator.openshift.io自定义资源(CR):oc edit network.operator.openshift.io cluster
$ oc edit network.operator.openshift.io clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 修改 CR 中的
additionalNetworks参数,以添加abouts-shim网络附加定义。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存文件并退出文本编辑器。
运行以下命令,验证
whereabouts-reconciler守护进程集是否已成功部署:oc get all -n openshift-multus | grep whereabouts-reconciler
$ oc get all -n openshift-multus | grep whereabouts-reconcilerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
20.2.5. 使用 Cluster Network Operator 创建额外网络附加 复制链接链接已复制到粘贴板!
Cluster Network Operator (CNO) 管理额外网络定义。当您指定要创建的额外网络时,CNO 会自动创建 NetworkAttachmentDefinition 对象。
不要编辑 Cluster Network Operator 所管理的 NetworkAttachmentDefinition 对象。这样做可能会破坏额外网络上的网络流量。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
可选:为额外网络创建命名空间:
oc create namespace <namespace_name>
$ oc create namespace <namespace_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要编辑 CNO 配置,请输入以下命令:
oc edit networks.operator.openshift.io cluster
$ oc edit networks.operator.openshift.io clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过为您要创建的额外网络添加配置来修改您要创建的 CR,如下例所示。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存您的更改,再退出文本编辑器以提交更改。
验证
通过运行以下命令确认 CNO 创建了
NetworkAttachmentDefinition对象。CNO 创建对象之前可能会有延迟。oc get network-attachment-definitions -n <namespace>
$ oc get network-attachment-definitions -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>- 指定添加到 CNO 配置中的网络附加的命名空间。
输出示例
NAME AGE test-network-1 14m
NAME AGE test-network-1 14mCopy to Clipboard Copied! Toggle word wrap Toggle overflow
20.2.6. 通过应用 YAML 清单来创建额外网络附加 复制链接链接已复制到粘贴板!
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
使用额外网络配置创建 YAML 文件,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建额外网络:
oc apply -f <file>.yaml
$ oc apply -f <file>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<file>- 指定包含 YAML 清单的文件名。
20.3. 关于虚拟路由和转发 复制链接链接已复制到粘贴板!
20.3.1. 关于虚拟路由和转发 复制链接链接已复制到粘贴板!
虚拟路由和转发(VRF)设备与 IP 规则相结合,提供了创建虚拟路由和转发域的能力。VRF 减少了 CNF 所需的权限数量,并可提高二级网络网络拓扑的可见性。VRF 用于提供多租户功能,例如,每个租户都有自己的唯一的路由表且需要不同的默认网关。
进程可将套接字绑定到 VRF 设备。通过绑定套接字的数据包使用与 VRF 设备关联的路由表。VRF 的一个重要特性是,它只影响 OSI 模型层 3 以上的流量,因此 L2 工具(如 LLDP)不会受到影响。这可让优先级更高的 IP 规则(如基于策略的路由)优先于针对特定流量的 VRF 设备规则。
20.3.1.1. 这对针对电信业使用的 pod 的从属网络提供了好处 复制链接链接已复制到粘贴板!
在电信业,每个 CNF 都可连接到共享相同地址空间的多个不同的网络。这些从属网络可能会与集群的主网络 CIDR 冲突。使用 CNI VRF 插件,网络功能可使用相同的 IP 地址连接到不同的客户基础架构,使不同的客户保持隔离。IP 地址与 OpenShift Container Platform IP 空间重叠。CNI VRF 插件还可减少 CNF 所需的权限数量,并提高从属网络的网络拓扑的可见性。
20.4. 配置多网络策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为额外网络配置网络策略。
您只能为 macvlan 额外网络指定多网络策略。不支持其他类型的额外网络,如 ipvlan。
20.4.1. 多网络策略和网络策略之间的区别 复制链接链接已复制到粘贴板!
虽然 MultiNetworkPolicy API 实现 NetworkPolicy API,但有几个重要的区别:
您必须使用
MultiNetworkPolicyAPI:apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
当使用 CLI 与多网络策略交互时,您必须使用
multi-networkpolicy资源名称。例如,您可以使用oc get multi-networkpolicy <name>命令来查看多网络策略对象,其中<name>是多网络策略的名称。 您必须使用定义 macvlan 额外网络的网络附加定义名称指定一个注解:
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for: <network_name>apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for: <network_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<network_name>- 指定网络附加定义的名称。
20.4.2. 为集群启用多网络策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在集群中启用多网络策略支持。
先决条件
-
安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
使用以下 YAML 创建
multinetwork-enable-patch.yaml文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置集群以启用多网络策略:
oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
$ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
network.operator.openshift.io/cluster patched
network.operator.openshift.io/cluster patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
20.4.3. 使用多网络策略 复制链接链接已复制到粘贴板!
作为集群管理员,您可以创建、编辑、查看和删除多网络策略。
20.4.3.1. 先决条件 复制链接链接已复制到粘贴板!
- 您已为集群启用了多网络策略支持。
20.4.3.2. 使用 CLI 创建多网络策略 复制链接链接已复制到粘贴板!
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个多网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的集群网络供应商,如设置了mode: NetworkPolicy的 OpenShift SDN 网络供应商。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 您在多网络策略应用到的命名空间中工作。
流程
创建策略规则:
创建一个
<policy_name>.yaml文件:touch <policy_name>.yaml
$ touch <policy_name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定多网络策略文件名。
在您刚才创建的文件中定义多网络策略,如下例所示:
拒绝来自所有命名空间中的所有 pod 的入口流量
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
<network_name>- 指定网络附加定义的名称。
允许来自所有命名空间中的所有 pod 的入口流量
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
<network_name>- 指定网络附加定义的名称。
运行以下命令来创建多网络策略对象:
oc apply -f <policy_name>.yaml -n <namespace>
$ oc apply -f <policy_name>.yaml -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定多网络策略文件名。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
multinetworkpolicy.k8s.cni.cncf.io/default-deny created
multinetworkpolicy.k8s.cni.cncf.io/default-deny createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式创建网络策略。
20.4.3.3. 编辑多网络策略 复制链接链接已复制到粘贴板!
您可以编辑命名空间中的多网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的集群网络供应商,如设置了mode: NetworkPolicy的 OpenShift SDN 网络供应商。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
可选: 要列出命名空间中的多网络策略对象,请输入以下命令:
oc get multi-networkpolicy
$ oc get multi-networkpolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
编辑多网络策略对象。
如果您在文件中保存了多网络策略定义,请编辑该文件并进行必要的更改,然后输入以下命令。
oc apply -n <namespace> -f <policy_file>.yaml
$ oc apply -n <namespace> -f <policy_file>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
<policy_file>- 指定包含网络策略的文件的名称。
如果您需要直接更新多网络策略对象,请输入以下命令:
oc edit multi-networkpolicy <policy_name> -n <namespace>
$ oc edit multi-networkpolicy <policy_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定网络策略的名称。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
确认已更新多网络策略对象。
oc describe multi-networkpolicy <policy_name> -n <namespace>
$ oc describe multi-networkpolicy <policy_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定多网络策略的名称。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或通过 Actions 菜单从 web 控制台中的策略编辑网络策略。
20.4.3.4. 使用 CLI 查看多网络策略 复制链接链接已复制到粘贴板!
您可以检查命名空间中的多网络策略。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
列出命名空间中的多网络策略:
要查看命名空间中定义的多网络策略对象,请输入以下命令:
oc get multi-networkpolicy
$ oc get multi-networkpolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要检查特定的多网络策略,请输入以下命令:
oc describe multi-networkpolicy <policy_name> -n <namespace>
$ oc describe multi-networkpolicy <policy_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定要检查的多网络策略的名称。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
如果您使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群中的任何命名空间中以 YAML 或 web 控制台的形式查看网络策略。
20.4.3.5. 使用 CLI 删除多网络策略 复制链接链接已复制到粘贴板!
您可以删除命名空间中的多网络策略。
先决条件
-
集群使用支持
NetworkPolicy对象的集群网络供应商,如设置了mode: NetworkPolicy的 OpenShift SDN 网络供应商。此模式是 OpenShift SDN 的默认模式。 -
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。 - 您在存在多网络策略的命名空间中工作。
流程
要删除多网络策略对象,请输入以下命令:
oc delete multi-networkpolicy <policy_name> -n <namespace>
$ oc delete multi-networkpolicy <policy_name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<policy_name>- 指定多网络策略的名称。
<namespace>- 可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted
multinetworkpolicy.k8s.cni.cncf.io/default-deny deletedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如果使用 cluster-admin 权限登录到 web 控制台,您可以选择在集群上以 YAML 或通过 Actions 菜单从 web 控制台中的策略删除网络策略。
20.5. 将 pod 附加到额外网络 复制链接链接已复制到粘贴板!
作为集群用户,您可以将 pod 附加到额外网络。
20.5.1. 将 pod 添加到额外网络 复制链接链接已复制到粘贴板!
您可以将 pod 添加到额外网络。pod 继续通过默认网络发送与集群相关的普通网络流量。
创建 pod 时会附加额外网络。但是,如果 pod 已存在,您无法为其附加额外网络。
pod 必须与额外网络处于相同的命名空间。
先决条件
-
安装 OpenShift CLI(
oc)。 - 登录到集群。
流程
为
Pod对象添加注解。只能使用以下注解格式之一:要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将
<network>替换为要与 pod 关联的额外网络的名称:metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则该 pod 会将多个网络接口附加到该网络。
要通过自定义来附加额外网络,请添加具有以下格式的注解:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令来创建 pod。将
<name>替换为 pod 的名称。oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要确认
PodCR 中是否存在注解,请输入以下命令将<name>替换为 pod 的名称。oc get pod <name> -o yaml
$ oc get pod <name> -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例中,
example-podpod 附加到net1额外网络:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
k8s.v1.cni.cncf.io/networks-status参数是对象的 JSON 数组。每个对象描述附加到 pod 的额外网络的状态。注解值保存为纯文本值。
20.5.1.1. 指定特定于 pod 的地址和路由选项 复制链接链接已复制到粘贴板!
将 pod 附加到额外网络时,您可能需要在特定 pod 中指定有关该网络的其他属性。这可让您更改路由的某些方面,并指定静态 IP 地址和 MAC 地址。要达到此目的,您可以使用 JSON 格式的注解。
先决条件
- pod 必须与额外网络处于相同的命名空间。
-
安装 OpenShift CLI (
oc) 。 - 您必须登录集群。
流程
要在指定地址和/或路由选项的同时将 pod 添加到额外网络,请完成以下步骤:
编辑
Pod资源定义。如果要编辑现有Pod资源,请运行以下命令在默认编辑器中编辑其定义。将<name>替换为要编辑的Pod资源的名称。oc edit pod <name>
$ oc edit pod <name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
Pod资源定义中,将k8s.v1.cni.cncf.io/networks参数添加到 podmetadata映射中。k8s.v1.cni.cncf.io/networks接受 JSON 字符串,该字符串除指定附加属性外,还引用NetworkAttachmentDefinition自定义资源(CR)名称的对象。metadata: annotations: k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]'metadata: annotations: k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]'1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<network>替换为 JSON 对象,如下例所示。单引号是必需的。
在以下示例中,通过
default-route参数,注解指定了哪个网络附加将使用默认路由。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
默认路由将导致任何没有在其它路由中指定的流量被路由到网关。
将 OpenShift Container Platform 的默认路由设置为默认网络接口以外的接口时,可能会导致应该是 pod 和 pod 间的网络流量被路由到其他接口。
要验证 pod 的路由属性,可使用 oc 命令在 pod 中执行 ip 命令。
oc exec -it <pod_name> -- ip route
$ oc exec -it <pod_name> -- ip route
您还可以引用 pod 的 k8s.v1.cni.cncf.io/networks-status 来查看哪个额外网络已经分配了默认路由,这可以通过 JSON 格式的对象列表中的 default-route 键实现。
要为 pod 设置静态 IP 地址或 MAC 地址,您可以使用 JSON 格式的注解。这要求您创建允许此功能的网络。这可以在 CNO 的 rawCNIConfig 中指定。
运行以下命令来编辑 CNO CR:
oc edit networks.operator.openshift.io cluster
$ oc edit networks.operator.openshift.io clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow
以下 YAML 描述了 CNO 的配置参数:
Cluster Network Operator YAML 配置
以下对象描述了使用 macvlan CNI 插件的静态 MAC 地址和 IP 地址的配置参数:
使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象
以上网络附加可能会以 JSON 格式的注解引用,同时使用相关的键来指定将哪些静态 IP 和 MAC 地址分配给指定 pod。
使用以下内容编辑 pod:
oc edit pod <name>
$ oc edit pod <name>
使用静态 IP 和 MAC 地址的 macvlan CNI 插件 JSON 配置对象
静态 IP 地址和 MAC 地址不需要同时使用,您可以单独使用,也可以一起使用。
要验证一个带有额外网络的 pod 的 IP 地址和 MAC 属性,请使用 oc 命令在 pod 中执行 ip 命令。
oc exec -it <pod_name> -- ip a
$ oc exec -it <pod_name> -- ip a
20.6. 从额外网络中删除 pod 复制链接链接已复制到粘贴板!
作为集群用户,您可以从额外网络中删除 pod。
20.6.1. 从额外网络中删除 pod 复制链接链接已复制到粘贴板!
您只能通过删除 pod 来从额外网络中删除 pod。
先决条件
- 一个额外网络被附加到 pod。
-
安装 OpenShift CLI(
oc)。 - 登录到集群。
流程
要删除 pod,输入以下命令:
oc delete pod <name> -n <namespace>
$ oc delete pod <name> -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
<name>是 pod 的名称。 -
<namespace>是包含 pod 的命名空间。
-
20.7. 编辑额外网络 复制链接链接已复制到粘贴板!
作为集群管理员,您可以修改现有额外网络的配置。
20.7.1. 修改额外网络附加定义 复制链接链接已复制到粘贴板!
作为集群管理员,您可以对现有额外网络进行更改。任何附加到额外网络的现有 pod 都不会被更新。
先决条件
- 已为集群配置了额外网络。
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
要为集群编辑额外网络,请完成以下步骤:
运行以下命令,在默认文本编辑器中编辑 Cluster Network Operator (CNO) CR:
oc edit networks.operator.openshift.io cluster
$ oc edit networks.operator.openshift.io clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
在
additionalNetworks集合中,用您的更改更新额外网络。 - 保存您的更改,再退出文本编辑器以提交更改。
可选:运行以下命令确认 CNO 更新了
NetworkAttachmentDefinition对象。将<network-name>替换为要显示的额外网络名称。CNO 根据您的更改更新NetworkAttachmentDefinition对象前可能会有延迟。oc get network-attachment-definitions <network-name> -o yaml
$ oc get network-attachment-definitions <network-name> -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,以下控制台输出显示名为
net1的NetworkAttachmentDefinition对象:oc get network-attachment-definitions net1 -o go-template='{{printf "%s\n" .spec.config}}' { "cniVersion": "0.3.1", "type": "macvlan", "master": "ens5", "mode": "bridge", "ipam": {"type":"static","routes":[{"dst":"0.0.0.0/0","gw":"10.128.2.1"}],"addresses":[{"address":"10.128.2.100/23","gateway":"10.128.2.1"}],"dns":{"nameservers":["172.30.0.10"],"domain":"us-west-2.compute.internal","search":["us-west-2.compute.internal"]}} }$ oc get network-attachment-definitions net1 -o go-template='{{printf "%s\n" .spec.config}}' { "cniVersion": "0.3.1", "type": "macvlan", "master": "ens5", "mode": "bridge", "ipam": {"type":"static","routes":[{"dst":"0.0.0.0/0","gw":"10.128.2.1"}],"addresses":[{"address":"10.128.2.100/23","gateway":"10.128.2.1"}],"dns":{"nameservers":["172.30.0.10"],"domain":"us-west-2.compute.internal","search":["us-west-2.compute.internal"]}} }Copy to Clipboard Copied! Toggle word wrap Toggle overflow
20.8. 删除额外网络 复制链接链接已复制到粘贴板!
作为集群管理员,您可以删除额外网络附加。
20.8.1. 删除额外网络附加定义 复制链接链接已复制到粘贴板!
作为集群管理员,您可以从 OpenShift Container Platform 集群中删除额外网络。额外网络不会从它所附加的任何 pod 中删除。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
要从集群中删除额外网络,请完成以下步骤:
运行以下命令,在默认文本编辑器中编辑 Cluster Network Operator (CNO):
oc edit networks.operator.openshift.io cluster
$ oc edit networks.operator.openshift.io clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从您要删除的网络附加定义的
additionalNetworks集合中删除配置,以此修改 CR。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果要删除
additionalNetworks集合中唯一额外网络附加定义的配置映射,您必须指定一个空集合。
- 保存您的更改,再退出文本编辑器以提交更改。
可选:通过运行以下命令确认删除了额外网络 CR:
oc get network-attachment-definition --all-namespaces
$ oc get network-attachment-definition --all-namespacesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
20.9. 为 VRF 分配从属网络 复制链接链接已复制到粘贴板!
20.9.1. 为 VRF 分配从属网络 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 CNI VRF 插件为 VRF 域配置额外网络。此插件创建的虚拟网络与您指定的物理接口关联。
使用 VRF 的应用程序需要绑定到特定设备。通常的用法是在套接字中使用 SO_BINDTODEVICE 选项。SO_BINDTODEVICE 将套接字绑定到在传递接口名称中指定的设备,例如 eth1。要使用 SO_BINDTODEVICE,应用程序必须具有 CAP_NET_RAW 功能。
OpenShift Container Platform pod 不支持通过 ip vrf exec 命令使用 VRF。要使用 VRF,将应用程序直接绑定到 VRF 接口。
20.9.1.1. 使用 CNI VRF 插件创建额外网络附加 复制链接链接已复制到粘贴板!
Cluster Network Operator (CNO) 管理额外网络定义。当您指定要创建的额外网络时,CNO 会自动创建 NetworkAttachmentDefinition 自定义资源(CR)。
请勿编辑 Cluster Network Operator 所管理的 NetworkAttachmentDefinition CR。这样做可能会破坏额外网络上的网络流量。
要使用 CNI VRF 插件创建额外网络附加,请执行以下步骤。
先决条件
- 安装 OpenShift Container Platform CLI(oc)。
- 以具有 cluster-admin 权限的用户身份登录 OpenShift 集群。
流程
为额外网络附加创建
Network自定义资源 (CR),并为额外网络插入rawCNIConfig配置,如下例所示。将 YAML 保存为文件additional-network-attachment.yaml。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意只有在资源类型为
netdevice时,VRF 才能正常工作。创建
Network资源:oc create -f additional-network-attachment.yaml
$ oc create -f additional-network-attachment.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过运行以下命令确认 CNO 创建了
NetworkAttachmentDefinitionCR。将<namespace>替换为您在配置网络附加时指定的命名空间,如additional-network-1。oc get network-attachment-definitions -n <namespace>
$ oc get network-attachment-definitions -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME AGE additional-network-1 14m
NAME AGE additional-network-1 14mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意CNO 创建 CR 之前可能会有延迟。
验证额外的 VRF 网络附加是否成功
要验证 VRF CNI 是否已正确配置并附加额外网络附加,请执行以下操作:
- 创建使用 VRF CNI 的网络。
- 将网络分配给 pod。
验证 Pod 网络附加是否已连接到 VRF 额外网络。远程 shell 到 pod 并运行以下命令:
ip vrf show
$ ip vrf showCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Name Table ----------------------- red 10
Name Table ----------------------- red 10Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确认 VRF 接口是从属接口的主接口:
ip link
$ ip linkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP mode
5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP modeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 21 章 硬件网络 复制链接链接已复制到粘贴板!
21.1. 关于单根 I/O 虚拟化(SR-IOV)硬件网络 复制链接链接已复制到粘贴板!
Single Root I/O 虚拟化 (SR-IOV) 规范是针对一类 PCI 设备分配的标准,可与多个 pod 共享单个设备。
通过 SR-IOV,您可以将主机节点上识别为物理功能 (PF) 的兼容网络设备分段为多个虚拟功能 (VF)。VF 和其它网络设备一样使用。该设备的 SR-IOV 网络设备驱动程序决定了如何公开容器中的 VF:
-
netdevice驱动程序: 容器netns中的常规内核网络设备 -
vfio-pci驱动程序: 挂载到容器中的字符设备
对于需要高带宽或低延迟的应用程序,您可以在裸机或 Red Hat OpenStack Platform(RHOSP)基础架构上安装 OpenShift Container Platform 集群上的额外网络使用 SR-IOV 网络设备。
您可以使用以下命令在节点上启用 SR-IOV:
oc label node <node_name> feature.node.kubernetes.io/network-sriov.capable="true"
$ oc label node <node_name> feature.node.kubernetes.io/network-sriov.capable="true"
21.1.1. 负责管理 SR-IOV 网络设备的组件 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 会创建和管理 SR-IOV 堆栈的组件。它执行以下功能:
- 编配 SR-IOV 网络设备的发现和管理
-
为 SR-IOV Container Network Interface(CNI)生成
NetworkAttachmentDefinition自定义资源 - 创建和更新 SR-IOV 网络设备插件的配置
-
创建节点特定的
SriovNetworkNodeState自定义资源 -
更新每个
SriovNetworkNodeState自定义资源中的spec.interfaces字段
Operator 置备以下组件:
- SR-IOV 网络配置守护进程
- SR-IOV Network Operator 启动时部署在 worker 节点上的守护进程集。守护进程负责在集群中发现和初始化 SR-IOV 网络设备。
- SR-IOV Network Operator Webhook
- 这是动态准入控制器 Webhook,用于验证 Operator 自定义资源,并为未设置的字段设置适当的默认值。
- SR-IOV Network Resources Injector(网络资源注入器)
-
这是一个动态准入控制器 Webhook,它提供通过请求和限制为自定义网络资源(如 SR-IOV VF)应用 Kubernetes pod 规格的功能。SR-IOV 网络资源注入器只会将
resource字段添加到 pod 中的第一个容器。 - 网络SR-IOV 网络设备插件
- 这个设备插件用于发现、公告并分配 SR-IOV 网络虚拟功能 (VF) 资源。在 Kubernetes 中使用设备插件能够利用有限的资源,这些资源通常为于物理设备中。设备插件可以使 Kubernetes 调度程序了解资源可用性,因此调度程序可以在具有足够资源的节点上调度 pod。
- SR-IOV CNI 插件
- SR-IOV CNI 插件会附加从 SR-IOV 网络设备插件中直接分配给 pod 的 VF 接口。
- SR-IOV InfiniBand CNI 插件
- 附加从 SR-IOV 网络设备插件中直接分配给 pod 的 InfiniBand(IB)VF 接口的 CNI 插件。
SR-IOV Network resources injector 和 SR-IOV Operator Webhook 会被默认启用,可通过编辑 default SriovOperatorConfig CR 来禁用。禁用 SR-IOV Network Operator Admission Controller Webhook 时要小心。您可以在特定情况下禁用 webhook,如故障排除,或者想要使用不支持的设备。
21.1.1.1. 支持的平台 复制链接链接已复制到粘贴板!
在以下平台上支持 SR-IOV Network Operator:
- 裸机
- Red Hat OpenStack Platform(RHOSP)
21.1.1.2. 支持的设备 复制链接链接已复制到粘贴板!
OpenShift Container Platform 支持以下网络接口控制器:
| 制造商 | model | 供应商 ID | 设备 ID |
|---|---|---|---|
| Broadcom | BCM57414 | 14e4 | 16d7 |
| Broadcom | BCM57508 | 14e4 | 1750 |
| Intel | X710 | 8086 | 1572 |
| Intel | XL710 | 8086 | 1583 |
| Intel | XXV710 | 8086 | 158b |
| Intel | E810-CQDA2 | 8086 | 1592 |
| Intel | E810-2CQDA2 | 8086 | 1592 |
| Intel | E810-XXVDA2 | 8086 | 159b |
| Intel | E810-XXVDA4 | 8086 | 1593 |
| Mellanox | MT27700 系列 [ConnectX-4] | 15b3 | 1013 |
| Mellanox | MT27710 系列 [ConnectX-4 Lx] | 15b3 | 1015 |
| Mellanox | MT27800 系列 [ConnectX-5] | 15b3 | 1017 |
| Mellanox | MT28880 系列 [ConnectX-5 Ex] | 15b3 | 1019 |
| Mellanox | MT28908 系列 [ConnectX-6] | 15b3 | 101b |
| Mellanox | MT2892 Family [ConnectX‑6 Dx] | 15b3 | 101d |
| Mellanox | MT2894 Family [ConnectX‑6 Lx] | 15b3 | 101f |
| Pensando [1] | 用于 ionic 驱动程序的 DSC-25 双端口 25G 分布式服务卡 | 0x1dd8 | 0x1002 |
| Pensando [1] | 用于 ionic 驱动程序的 DSC-100 双端口 100G 分布式服务卡 | 0x1dd8 | 0x1003 |
- 支持 OpenShift SR-IOV,但在使用 SR-IOV 时,您必须使用 SR-IOV CNI 配置文件设置静态的虚拟功能(VF)介质访问控制(MAC)地址。
有关支持的卡和兼容的 OpenShift Container Platform 版本的最新列表,请参阅 Openshift Single Root I/O Virtualization(SR-IOV)和 PTP 硬件网络支持列表。
21.1.1.3. 自动发现 SR-IOV 网络设备 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 将搜索集群以获取 worker 节点上的 SR-IOV 功能网络设备。Operator 会为每个提供兼容 SR-IOV 网络设备的 worker 节点创建并更新一个 SriovNetworkNodeState 自定义资源 (CR) 。
为 CR 分配了与 worker 节点相同的名称。status.interfaces 列表提供有关节点上网络设备的信息。
不要修改 SriovNetworkNodeState 对象。Operator 会自动创建和管理这些资源。
21.1.1.3.1. SriovNetworkNodeState 对象示例 复制链接链接已复制到粘贴板!
以下 YAML 是由 SR-IOV Network Operator 创建的 SriovNetworkNodeState 对象的示例:
一 个 SriovNetworkNodeState 对象
21.1.1.4. 在 pod 中使用虚拟功能的示例 复制链接链接已复制到粘贴板!
您可以在附加了 SR-IOV VF 的 pod 中运行远程直接内存访问 (RDMA) 或 Data Plane Development Kit (DPDK) 应用程序。
本示例演示了在 RDMA 模式中使用虚拟功能 (VF) 的 pod:
使用 RDMA 模式的 Pod 规格
以下示例演示了在 DPDK 模式中使用 VF 的 pod:
使用 DPDK 模式的 Pod 规格
21.1.1.5. 用于容器应用程序的 DPDK 库 复制链接链接已复制到粘贴板!
一个可选的库 app-netutil 提供了几个 API 方法,用于从该 pod 中运行的容器内收集 pod 的网络信息。
此库可以将 SR-IOV 虚拟功能(VF)集成到 Data Plane Development Kit(DPDK)模式中。该程序库提供 Golang API 和 C API。
当前,采用三个 API 方法:
GetCPUInfo()- 此函数决定了哪些 CPU 可供容器使用并返回相关列表。
GetHugepages()-
此函数决定了每个容器在
Podspec 中请求的巨页内存量并返回相应的值。 GetInterfaces()- 此函数决定了容器中的一组接口,并返回相关的列表。返回值包括每个接口的接口类型和特定于类型的数据。
库的存储库包括用于构建容器镜像 dpdk-app-centos 的示例 Dockerfile。根据容器集规格中的环境变量,容器镜像可以运行以下 DPDK 示例应用之一: l2fwd、l3wd 或 testpmd。容器镜像提供了一个将 app-netutil 库集成到容器镜像本身的示例。库也可以集成到 init 容器中。init 容器可以收集所需的数据,并将数据传递给现有的 DPDK 工作负载。
21.1.1.6. Downward API 的巨页资源注入 复制链接链接已复制到粘贴板!
当 pod 规格包含巨页的资源请求或限制时,Network Resources Injector 会自动在 pod 规格中添加 Downward API 字段,以便为容器提供巨页信息。
Network Resources Injector 添加一个名为 podnetinfo 的卷,并挂载到 pod 中的每个容器的 /etc/podnetinfo。卷使用 Downward API,并包含一个用于大页面请求和限制的文件。文件命名规则如下:
-
/etc/podnetinfo/hugepages_1G_request_<container-name> -
/etc/podnetinfo/hugepages_1G_limit_<container-name> -
/etc/podnetinfo/hugepages_2M_request_<container-name> -
/etc/podnetinfo/hugepages_2M_limit_<container-name>
上一个列表中指定的路径与 app-netutil 库兼容。默认情况下,该库配置为搜索 /etc/podnetinfo 目录中的资源信息。如果您选择自己手动指定 Downward API 路径项目,app-netutil 库除上一个列表中的路径外还会搜索以下路径。
-
/etc/podnetinfo/hugepages_request -
/etc/podnetinfo/hugepages_limit -
/etc/podnetinfo/hugepages_1G_request -
/etc/podnetinfo/hugepages_1G_limit -
/etc/podnetinfo/hugepages_2M_request -
/etc/podnetinfo/hugepages_2M_limit
与 Network Resources Injector 可以创建的路径一样,以上列表中的路径可以选择以一个 _<container-name> 后缀结尾。
21.1.2. 后续步骤 复制链接链接已复制到粘贴板!
- 安装 SR-IOV Network Operator
- 可选: 配置 SR-IOV Network Operator
- 配置 SR-IOV 网络设备
- 如果使用 OpenShift Virtualization:将虚拟机连接到 SR-IOV 网络
- 配置 SR-IOV 网络附加
- 将 pod 添加到额外网络
21.2. 安装 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
您可以在集群上安装单根 I/O 虚拟化(SR-IOV)网络 Operator,以管理 SR-IOV 网络设备和网络附加。
21.2.1. 安装 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 web 控制台安装 SR-IOV Network Operator。
21.2.1.1. CLI:安装 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 CLI 安装 Operator。
先决条件
- 在裸机环境中安装的集群,其中的节点带有支持 SR-IOV 的硬件。
-
安装 OpenShift CLI(
oc)。 -
具有
cluster-admin特权的帐户。
流程
要创建
openshift-sriov-network-operator命名空间,输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建 OperatorGroup CR:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 订阅 SR-IOV Network Operator。
运行以下命令以获取 OpenShift Container Platform 的主版本和次版本。下一步中需要
channel值。OC_VERSION=$(oc version -o yaml | grep openshiftVersion | \ grep -o '[0-9]*[.][0-9]*' | head -1)$ OC_VERSION=$(oc version -o yaml | grep openshiftVersion | \ grep -o '[0-9]*[.][0-9]*' | head -1)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要为 SR-IOV Network Operator 创建 Subscription CR,输入以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要验证是否已安装 Operator,请输入以下命令:
oc get csv -n openshift-sriov-network-operator \ -o custom-columns=Name:.metadata.name,Phase:.status.phase
$ oc get csv -n openshift-sriov-network-operator \ -o custom-columns=Name:.metadata.name,Phase:.status.phaseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Name Phase sriov-network-operator.4.12.0-202310121402 Succeeded
Name Phase sriov-network-operator.4.12.0-202310121402 SucceededCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.2.1.2. web 控制台:安装 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 Web 控制台安装 Operator。
先决条件
- 在裸机环境中安装的集群,其中的节点带有支持 SR-IOV 的硬件。
-
安装 OpenShift CLI(
oc)。 -
具有
cluster-admin特权的帐户。
流程
安装 SR-IOV Network Operator:
- 在 OpenShift Container Platform Web 控制台中,点击 Operators → OperatorHub。
- 从可用的 Operators 列表中选择 SR-IOV Network Operator,然后点击 Install。
- 在 Install Operator 页面中,在 Installed Namespace 下选择 Operator recommended Namespace。
- 点 Install。
验证 SR-IOV Network Operator 是否已成功安装:
- 导航到 Operators → Installed Operators 页面。
确保 SR-IOV Network Operator 在 openshift-sriov-network-operator 项目中列出,状态 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
- 检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。
-
进入 Workloads → Pods 页面,在
openshift-sriov-network-operator项目中检查 pod 的日志。 检查 YAML 文件的命名空间。如果缺少注解,您可以使用以下命令将注解
workload.openshift.io/allowed=management添加到 Operator 命名空间中:oc annotate ns/openshift-sriov-network-operator workload.openshift.io/allowed=management
$ oc annotate ns/openshift-sriov-network-operator workload.openshift.io/allowed=managementCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意对于单节点 OpenShift 集群,命名空间需要注解
workload.openshift.io/allowed=management。
21.2.2. 后续步骤 复制链接链接已复制到粘贴板!
21.3. 配置 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
Single Root I/O Virtualization(SR-IOV)Network Operator 管理集群中的 SR-IOV 网络设备和网络附加。
21.3.1. 配置 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
通常不需要修改 SR-IOV Network Operator 配置。我们推荐在大多数用例中使用默认配置。只有 Operator 的默认行为与您的用例不兼容时,才需要按照以下步骤修改相关配置。
SR-IOV Network Operator 添加了 SriovOperatorConfig.sriovnetwork.openshift.io 自定义资源定义 (CRD)。Operator 会在 openshift-sriov-network-operator 命名空间中自动创建一个名为 default 的 SriovOperatorConfig 自定义资源 (CR)。
default CR 包含集群的 SR-IOV Network Operator 配置。要更改 Operator 配置,您必须修改此 CR。
21.3.1.1. SR-IOV Network Operator 配置自定义资源 复制链接链接已复制到粘贴板!
sriovoperatorconfig 自定义资源的字段在下表中描述:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
指定 SR-IOV Network Operator 实例的名称。默认值为 |
|
|
|
指定 SR-IOV Network Operator 实例的命名空间。默认值为 |
|
|
| 指定在所选节点上调度 SR-IOV 网络配置守护进程的节点选择。默认情况下,此字段没有设置,Operator 会在 worker 节点上部署 SR-IOV 网络配置守护进程集。 |
|
|
|
指定是否禁用节点排空过程,或者在应用新策略在节点上配置 NIC 时启用节点排空过程。将此字段设置为
对于单节点集群,在安装 Operator 后将此字段设置为 |
|
|
|
指定是否启用或禁用 Network Resources Injector 守护进程集。默认情况下,此字段设置为 |
|
|
|
指定是否启用或禁用 Operator Admission Controller webhook 守护进程集。默认情况下,此字段设置为 |
|
|
|
指定 Operator 的日志详细程度。设置为 |
21.3.1.2. 关于 Network Resources Injector(网络资源注入器) 复制链接链接已复制到粘贴板!
Network Resources Injector 是一个 Kubernetes Dynamic Admission Controller 应用。它提供以下功能:
- 根据 SR-IOV 网络附加定义注解,对 Pod 规格中的资源请求和限值进行修改,以添加 SR-IOV 资源名称。
-
使用 Downward API 卷修改 pod 规格,以公开 pod 注解、标签和巨页请求和限制。在 pod 中运行的容器可以作为
/etc/podnetinfo路径下的文件来访问公开的信息。
默认情况下,Network Resources Injector 由 SR-IOV Network Operator 启用,并作为守护进程集在所有 control plane 节点上运行。以下是在具有三个 control plane 节点的集群中运行的 Network Resources Injector pod 示例:
oc get pods -n openshift-sriov-network-operator
$ oc get pods -n openshift-sriov-network-operator
输出示例
NAME READY STATUS RESTARTS AGE network-resources-injector-5cz5p 1/1 Running 0 10m network-resources-injector-dwqpx 1/1 Running 0 10m network-resources-injector-lktz5 1/1 Running 0 10m
NAME READY STATUS RESTARTS AGE
network-resources-injector-5cz5p 1/1 Running 0 10m
network-resources-injector-dwqpx 1/1 Running 0 10m
network-resources-injector-lktz5 1/1 Running 0 10m
21.3.1.3. 关于 SR-IOV Network Operator 准入控制器 Webhook 复制链接链接已复制到粘贴板!
SR-IOV Network Operator Admission Controller Webhook 是一个 Kubernetes Dynamic Admission Controller 应用程序。它提供以下功能:
-
在创建或更新时,验证
SriovNetworkNodePolicyCR。 -
修改
SriovNetworkNodePolicyCR,在创建或更新 CR 时为priority和deviceType项设置默认值。
默认情况下,SR-IOV Network Operator Admission Controller Webhook 由 Operator 启用,并作为守护进程集在所有 control plane 节点上运行。
禁用 SR-IOV Network Operator Admission Controller Webhook 时要小心。您可以在特定情况下禁用 webhook,如故障排除,或者想要使用不支持的设备。有关配置不支持的设备的详情,请参考将 SR-IOV Network Operator 配置为使用不支持的 NIC。
以下是在具有三个 control plane 节点的集群中运行的 Operator Admission Controller webhook pod 的示例:
oc get pods -n openshift-sriov-network-operator
$ oc get pods -n openshift-sriov-network-operator
输出示例
NAME READY STATUS RESTARTS AGE operator-webhook-9jkw6 1/1 Running 0 16m operator-webhook-kbr5p 1/1 Running 0 16m operator-webhook-rpfrl 1/1 Running 0 16m
NAME READY STATUS RESTARTS AGE
operator-webhook-9jkw6 1/1 Running 0 16m
operator-webhook-kbr5p 1/1 Running 0 16m
operator-webhook-rpfrl 1/1 Running 0 16m
21.3.1.4. 关于自定义节点选择器 复制链接链接已复制到粘贴板!
SR-IOV 网络配置守护进程在集群节点上发现并配置 SR-IOV 网络设备。默认情况下,它将部署到集群中的所有 worker 节点。您可以使用节点标签指定 SR-IOV 网络配置守护进程在哪些节点上运行。
21.3.1.5. 禁用或启用网络资源注入器 复制链接链接已复制到粘贴板!
要禁用或启用默认启用的网络资源注入器,请完成以下步骤。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 您必须已安装了 SR-IOV Network Operator。
流程
设置
enableInjector字段。将<value>替换为false来禁用这个功能;或替换为true来启用这个功能。oc patch sriovoperatorconfig default \ --type=merge -n openshift-sriov-network-operator \ --patch '{ "spec": { "enableInjector": <value> } }'$ oc patch sriovoperatorconfig default \ --type=merge -n openshift-sriov-network-operator \ --patch '{ "spec": { "enableInjector": <value> } }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来更新 Operator:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3.1.6. 禁用或启用 SR-IOV Network Operator 准入控制器 Webhook 复制链接链接已复制到粘贴板!
要禁用或启用默认启用的准入控制器 Webhook,请完成以下步骤。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 您必须已安装了 SR-IOV Network Operator。
流程
设置
enableOperatorWebhook字段。将<value>替换为false来禁用这个功能;或替换为true来启用这个功能:oc patch sriovoperatorconfig default --type=merge \ -n openshift-sriov-network-operator \ --patch '{ "spec": { "enableOperatorWebhook": <value> } }'$ oc patch sriovoperatorconfig default --type=merge \ -n openshift-sriov-network-operator \ --patch '{ "spec": { "enableOperatorWebhook": <value> } }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来更新 Operator:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3.1.7. 为 SR-IOV 网络配置守护进程配置自定义 NodeSelector 复制链接链接已复制到粘贴板!
SR-IOV 网络配置守护进程在集群节点上发现并配置 SR-IOV 网络设备。默认情况下,它将部署到集群中的所有 worker 节点。您可以使用节点标签指定 SR-IOV 网络配置守护进程在哪些节点上运行。
要指定部署了 SR-IOV 网络配置守护进程的节点,请完成以下步骤。
当您更新 configDaemonNodeSelector 字段时,SR-IOV 网络配置守护进程会在所选节点中重新创建。在重新创建守护进程时,集群用户无法应用任何新的 SR-IOV 网络节点策略或创建新的 SR-IOV Pod。
流程
要为 Operator 更新节点选择器,请输入以下命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<node_label>替换为要应用的标签,如下例中:"node-role.kubernetes.io/worker": ""。提示您还可以应用以下 YAML 来更新 Operator:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3.1.8. 为单一节点安装配置 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
默认情况下,SR-IOV Network Operator 会在每次策略更改前从节点排空工作负载。Operator 会执行这个操作,以确保在重新配置前没有使用虚拟功能的工作负载。
对于在单一节点上安装,没有其他节点来接收工作负载。因此,Operator 不得配置为从单一节点排空工作负载。
执行以下步骤禁用排空工作负载后,您必须删除所有使用 SR-IOV 网络接口的工作负载,然后才能更改任何 SR-IOV 网络节点策略。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。 - 您必须已安装了 SR-IOV Network Operator。
流程
要将
disableDrain字段设置为true,请输入以下命令:oc patch sriovoperatorconfig default --type=merge \ -n openshift-sriov-network-operator \ --patch '{ "spec": { "disableDrain": true } }'$ oc patch sriovoperatorconfig default --type=merge \ -n openshift-sriov-network-operator \ --patch '{ "spec": { "disableDrain": true } }'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示您还可以应用以下 YAML 来更新 Operator:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3.2. 后续步骤 复制链接链接已复制到粘贴板!
21.4. 配置 SR-IOV 网络设备 复制链接链接已复制到粘贴板!
您可以在集群中配置单一根 I/O 虚拟化(SR-IOV)设备。
21.4.1. SR-IOV 网络节点配置对象 复制链接链接已复制到粘贴板!
您可以通过创建 SR-IOV 网络节点策略来为节点指定 SR-IOV 网络设备配置。策略的 API 对象是 sriovnetwork.openshift.io API 组的一部分。
以下 YAML 描述了 SR-IOV 网络节点策略:
- 1
- 自定义资源对象的名称。
- 2
- 安装 SR-IOV Network Operator 的命名空间。
- 3
- SR-IOV 网络设备插件的资源名称。您可以为资源名称创建多个 SR-IOV 网络节点策略。
在指定名称时,请确保在
resourceName中使用接受的语法表达式^[a-zA-Z0-9_]+$。 - 4
- 节点选择器指定要配置的节点。只有所选节点上的 SR-IOV 网络设备才会被配置。SR-IOV Container Network Interface(CNI)插件和设备插件仅在所选节点上部署。重要
SR-IOV Network Operator 按顺序将节点网络配置策略应用到节点。在应用节点网络配置策略前,SR-IOV Network Operator 会检查节点的机器配置池(MCP)是否处于不健康状态,如
Degraded或Updating。如果节点处于不健康的 MCP,将节点网络配置策略应用到集群中的所有目标节点的过程会被暂停,直到 MCP 返回健康状态。为了避免处于不健康的 MCP 的节点阻止将节点网络配置策略应用到其他节点,包括处于其他 MCP 的节点,您必须为每个 MCP 创建单独的节点网络配置策略。
- 5
- 可选: priority 是一个
0到99之间的整数。较小的值具有更高的优先级。例如,优先级10是高于优先级99。默认值为99。 - 6
- 可选:虚拟功能的最大传输单元(MTU)。最大 MTU 值可能因不同的网络接口控制器(NIC)型号而有所不同。重要
如果要在默认网络接口上创建虚拟功能,请确保将 MTU 设置为与集群 MTU 匹配的值。
- 7
- 可选:将
needVhostNet设置为true,以在 pod 中挂载/dev/vhost-net设备。使用挂载的/dev/vhost-net设备及 Data Plane Development Kit (DPDK) 将流量转发到内核网络堆栈。 - 8
- 为 SR-IOV 物理网络设备创建的虚拟功能((VF)的数量。对于 Intel 网络接口控制器(NIC),VF 的数量不能超过该设备支持的 VF 总数。对于 Mellanox NIC,VF 的数量不能超过
128。 - 9
- NIC 选择器标识要配置的 Operator 的设备。您不必为所有参数指定值。建议您足够精确地识别网络设备以避免意外选择设备。
如果指定了
rootDevices,则必须同时为vendor、deviceID或pfNames指定一个值。如果同时指定了pfNames和rootDevices,请确保它们引用同一设备。如果您为netFilter指定了一个值,那么您不需要指定任何其他参数,因为网络 ID 是唯一的。 - 10
- 可选: SR-IOV 网络设备的厂商十六进制代码。允许的值只能是
8086和15b3。 - 11
- 可选: SR-IOV 网络设备的设备十六进制代码。例如,
101b是 Mellanox ConnectX-6 设备的设备 ID。 - 12
- 可选:该设备的一个或多个物理功能(PF)名称的数组。
- 13
- 可选:用于该设备的 PF 的一个或多个 PCI 总线地址的数组。使用以下格式提供地址:
0000:02:00.1。 - 14
- 可选:特定平台的网络过滤器。唯一支持的平台是 Red Hat OpenStack Platform(RHOSP)。可接受的值具有以下格式:
openstack/NetworkID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。将xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxx替换为来自/var/config/openstack/latest/network_data.json元数据文件的值。 - 15
- 可选:虚拟功能的驱动程序类型。允许的值只能是
netdevice和vfio-pci。默认值为netdevice。对于裸机节点上的 DPDK 模式的 Mellanox NIC,请使用
netdevice驱动程序类型,并将isRdma设置为true。 - 16
- 可选:配置是否启用远程直接访问 (RDMA) 模式。默认值为
false。如果
isRdma参数设为true,您可以继续使用启用了 RDMA 的 VF 作为普通网络设备。设备可在其中的一个模式中使用。将
isRdma设置为true,并将needVhostNet设置为true以配置 Mellanox NIC 以用于 Fast Datapath DPDK 应用程序。 - 17
- 可选:VF 的链接类型。默认值为
eth(以太网)。在 InfiniBand 中将这个值改为 'ib'。当将
linkType设置为ib时,SR-IOV Network Operator Webhook 会自动将isRdma设置为true。当将linkType设定为ib时,deviceType不应该被设置为vfio-pci。不要为 SriovNetworkNodePolicy 将 linkType 设置为 'eth',因为这可能会导致设备插件报告的可用设备数量不正确。
- 18
- 可选:NIC 设备模式。允许的值只能是
legacy或switchdev。当将
eSwitchMode设置为legacy时,会启用默认的 SR-IOV 行为。当将
eSwitchMode设置为switchdev时,会启用硬件卸载。
21.4.1.1. SR-IOV 网络节点配置示例 复制链接链接已复制到粘贴板!
以下示例描述了 InfiniBand 设备的配置:
InfiniBand 设备的配置示例
以下示例描述了 RHOSP 虚拟机中的 SR-IOV 网络设备配置:
虚拟机中的 SR-IOV 设备配置示例
21.4.1.2. SR-IOV 设备的虚拟功能 (VF) 分区 复制链接链接已复制到粘贴板!
在某些情况下,您可能想要将同一个物理功能 (PF) 的虚拟功能 (VF) 分成多个资源池。例如: 您可能想要某些 VF 使用默认驱动程序载入,而其他的 VF 负载使用 vfio-pci 驱动程序。在这样的部署中,您可以使用SriovNetworkNodePolicy 自定义资源 (CR) 中的 pfNames 选项器(selector)来为池指定 VF 的范围,其格式为: <pfname>#<first_vf>-<last_vf>。
例如,以下 YAML 显示名为 netpf0 的、带有 VF 2 到 7 的接口的选择器:
pfNames: ["netpf0#2-7"]
pfNames: ["netpf0#2-7"]
-
netpf0是 PF 接口名称。 -
2是包含在范围内的第一个 VF 索引(基于 0)。 -
7是包含在范围内的最后一个 VF 索引(基于 0)。
如果满足以下要求,您可以使用不同的策略 CR 从同一 PF 中选择 VF:
-
选择相同 PF 的不同策略的
numVfs值必须相同。 -
VF 索引范围是从
0到<numVfs>-1之间。例如,如果您有一个策略,它的numVfs被设置为8,则<first_vf>的值不能小于0,<last_vf>的值不能大于7。 - 不同策略中的 VF 范围不得互相重叠。
-
<first_vf>不能大于<last_vf>。
以下示例演示了 SR-IOV 设备的 NIC 分区。
策略 policy-net-1 定义了一个资源池 net-1,其中包含带有默认 VF 驱动的 PF netpf0 的 VF 0 。策略 policy-net-1-dpdk 定义了一个资源池 net-1-dpdk,其中包含带有 vfio VF 驱动程序的 PF netpf0 的 VF 8 到 15。
策略 policy-net-1:
策略 policy-net-1-dpdk:
验证接口是否已成功分区
运行以下命令,确认 SR-IOV 设备的接口分区到虚拟功能(VF)。
ip link show <interface>
$ ip link show <interface>
- 1
- 将
<interface>替换为您在分区为 SR-IOV 设备的 VF 时指定的接口,如ens3f1。
输出示例
21.4.2. 配置 SR-IOV 网络设备 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 把 SriovNetworkNodePolicy.sriovnetwork.openshift.io CRD 添加到 OpenShift Container Platform。您可以通过创建一个 SriovNetworkNodePolicy 自定义资源 (CR) 来配置 SR-IOV 网络设备。
在应用由 SriovNetworkNodePolicy 对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。
它可能需要几分钟时间来应用配置更改。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。 - 已安装 SR-IOV Network Operator。
- 集群中有足够的可用节点,用于处理从排空节点中驱除的工作负载。
- 您还没有为 SR-IOV 网络设备配置选择任何 control plane 节点。
流程
-
创建一个
SriovNetworkNodePolicy对象,然后在<name>-sriov-node-network.yaml文件中保存 YAML。使用配置的实际名称替换<name>。 -
可选:将 SR-IOV 功能的集群节点标记为
SriovNetworkNodePolicy.Spec.NodeSelector(如果它们还没有标记)。有关标记节点的更多信息,请参阅"了解如何更新节点上的标签"。 创建
SriovNetworkNodePolicy对象:oc create -f <name>-sriov-node-network.yaml
$ oc create -f <name>-sriov-node-network.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
<name>指定这个配置的名称。在应用配置更新后,
sriov-network-operator命名空间中的所有 Pod 都会变为Running状态。要验证是否已配置了 SR-IOV 网络设备,请输入以下命令。将
<node_name>替换为带有您刚才配置的 SR-IOV 网络设备的节点名称。oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'$ oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.4.3. SR-IOV 配置故障排除 复制链接链接已复制到粘贴板!
在进行了配置 SR-IOV 网络设备的步骤后,以下部分会处理一些错误条件。
要显示节点状态,请运行以下命令:
oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name>
$ oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name>
其中: <node_name> 指定带有 SR-IOV 网络设备的节点名称。
错误输出: 无法分配内存
"lastSyncError": "write /sys/bus/pci/devices/0000:3b:00.1/sriov_numvfs: cannot allocate memory"
"lastSyncError": "write /sys/bus/pci/devices/0000:3b:00.1/sriov_numvfs: cannot allocate memory"
当节点表示无法分配内存时,检查以下项目:
- 确认在 BIOS 中为节点启用了全局 SR-IOV 设置。
- 确认在 BIOS 中为该节点启用了 VT-d。
21.4.4. 将 SR-IOV 网络分配给 VRF 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 CNI VRF 插件为 VRF 域分配 SR-IOV 网络接口。
要做到这一点,将 VRF 配置添加到 SriovNetwork 资源的可选 metaPlugins 参数中。
使用 VRF 的应用程序需要绑定到特定设备。通常的用法是在套接字中使用 SO_BINDTODEVICE 选项。SO_BINDTODEVICE 将套接字绑定到在传递接口名称中指定的设备,例如 eth1。要使用 SO_BINDTODEVICE,应用程序必须具有 CAP_NET_RAW 功能。
OpenShift Container Platform pod 不支持通过 ip vrf exec 命令使用 VRF。要使用 VRF,将应用程序直接绑定到 VRF 接口。
21.4.4.1. 使用 CNI VRF 插件创建额外的 SR-IOV 网络附加 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 管理额外网络定义。当您指定要创建的额外 SR-IOV 网络时,SR-IOV Network Operator 会自动创建 NetworkAttachmentDefinition 自定义资源(CR)。
不要编辑 SR-IOV Network Operator 所管理的 NetworkAttachmentDefinition 自定义资源。这样做可能会破坏额外网络上的网络流量。
要使用 CNI VRF 插件创建额外的 SR-IOV 网络附加,请执行以下步骤。
先决条件
- 安装 OpenShift Container Platform CLI(oc)。
- 以具有 cluster-admin 权限的用户身份登录 OpenShift Container Platform 集群。
流程
为额外 SR-IOV 网络附加创建
SriovNetwork自定义资源 (CR) 并插入metaPlugins配置,如下例所示。将 YAML 保存为文件sriov-network-attachment.yaml。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
SriovNetwork资源:oc create -f sriov-network-attachment.yaml
$ oc create -f sriov-network-attachment.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证 NetworkAttachmentDefinition CR 是否已成功创建
运行以下命令,确认 SR-IOV Network Operator 创建了
NetworkAttachmentDefinitionCR。oc get network-attachment-definitions -n <namespace>
$ oc get network-attachment-definitions -n <namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<namespace>替换为您在配置网络附加时指定的命名空间,如additional-sriov-network-1。
输出示例
NAME AGE additional-sriov-network-1 14m
NAME AGE additional-sriov-network-1 14mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意SR-IOV Network Operator 创建 CR 之前可能会有延迟。
验证额外 SR-IOV 网络附加是否成功
要验证 VRF CNI 是否已正确配置并附加额外的 SR-IOV 网络附加,请执行以下操作:
- 创建使用 VRF CNI 的 SR-IOV 网络。
- 将网络分配给 pod。
验证 pod 网络附加是否已连接到 SR-IOV 额外网络。远程 shell 到 pod 并运行以下命令:
ip vrf show
$ ip vrf showCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Name Table ----------------------- red 10
Name Table ----------------------- red 10Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确认 VRF 接口是从属接口的主接口:
ip link
$ ip linkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
... 5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP mode ...
... 5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP mode ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.4.5. 后续步骤 复制链接链接已复制到粘贴板!
21.5. 配置 SR-IOV 以太网网络附加 复制链接链接已复制到粘贴板!
您可以为集群中的单根 I/O 虚拟化(SR-IOV)设备配置以太网网络附加。
21.5.1. 以太网设备配置对象 复制链接链接已复制到粘贴板!
您可以通过定义 SriovNetwork 对象来配置以太网网络设备。
以下 YAML 描述了 SriovNetwork 对象:
- 1
- 对象的名称。SR-IOV Network Operator 创建一个名称相同的
NetworkAttachmentDefinition对象。 - 2
- 安装 SR-IOV Network Operator 的命名空间。
- 3
- 用于为这个额外网络定义 SR-IOV 硬件的
SriovNetworkNodePolicy对象中的spec.resourceName参数的值。 - 4
SriovNetwork对象的目标命名空间。只有目标命名空间中的 pod 可以附加到额外网络。- 5
- 可选:额外网络的虚拟 LAN(VLAN)ID。它需要是一个从
0到4095范围内的一个整数值。默认值为0。 - 6
- 可选:VF 的 spoof 检查模式。允许的值是字符串
"on"和"off"。重要指定的值必须由引号包括,否则 SR-IOV Network Operator 将拒绝对象。
- 7
- 为 IPAM CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
- 8
- 可选:虚拟功能(VF)的链接状态。允许的值是
enable、disable和auto。 - 9
- 可选:VF 的最大传输率(以 Mbps 为单位)。
- 10
- 可选:VF 的最低传输率(以 Mbps 为单位)。这个值必须小于或等于最大传输率。注意
Intel NIC 不支持
minTxRate参数。如需更多信息,请参阅 BZ#1772847。 - 11
- 可选:VF 的 IEEE 802.1p 优先级级别。默认值为
0。 - 12
- 可选:VF 的信任模式。允许的值是字符串
"on"和"off"。重要您必须在引号中包含指定的值,或者 SR-IOV Network Operator 拒绝对象。
- 13
- 可选:为这个额外网络配置功能。您可以指定
"{ "ips": true }"来启用 IP 地址支持,或指定"{ "mac": true }"来启用 MAC 地址支持。
21.5.1.1. 为额外网络配置 IP 地址分配 复制链接链接已复制到粘贴板!
IP 地址管理 (IPAM) Container Network Interface (CNI) 插件为其他 CNI 插件提供 IP 地址。
您可以使用以下 IP 地址分配类型:
- 静态分配。
- 通过 DHCP 服务器进行动态分配。您指定的 DHCP 服务器必须可从额外网络访问。
- 通过 Whereabouts IPAM CNI 插件进行动态分配。
21.5.1.1.1. 静态 IP 地址分配配置 复制链接链接已复制到粘贴板!
下表描述了静态 IP 地址分配的配置:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。值必须是 |
|
|
| 指定分配给虚拟接口的 IP 地址的对象数组。支持 IPv4 和 IPv6 IP 地址。 |
|
|
| 指定要在 pod 中配置的路由的一组对象。 |
|
|
| 可选:指定 DNS 配置的对象数组。 |
address 数组需要带有以下字段的对象:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
您指定的 IP 地址和网络前缀。例如:如果您指定 |
|
|
| 出口网络流量要路由到的默认网关。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CIDR 格式的 IP 地址范围,如 |
|
|
| 网络流量路由的网关。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 用于发送 DNS 查询的一个或多个 IP 地址的数组。 |
|
|
|
要附加到主机名的默认域。例如,如果将域设置为 |
|
|
|
在 DNS 查找查询过程中,附加到非限定主机名(如 |
静态 IP 地址分配配置示例
21.5.1.1.2. 动态 IP 地址(DHCP)分配配置 复制链接链接已复制到粘贴板!
以下 JSON 描述了使用 DHCP 进行动态 IP 地址地址分配的配置。
pod 在创建时获取其原始 DHCP 租期。该租期必须由集群中运行的一个小型的 DHCP 服务器部署定期续订。
SR-IOV Network Operator 不创建 DHCP 服务器部署。Cluster Network Operator 负责创建小型的 DHCP 服务器部署。
要触发 DHCP 服务器的部署,您必须编辑 Cluster Network Operator 配置来创建 shim 网络附加,如下例所示:
shim 网络附加定义示例
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。需要值 |
动态 IP 地址(DHCP)分配配置示例
{
"ipam": {
"type": "dhcp"
}
}
{
"ipam": {
"type": "dhcp"
}
}
21.5.1.1.3. 使用 Whereabouts 进行动态 IP 地址分配配置 复制链接链接已复制到粘贴板!
Whereabouts CNI 插件允许在不使用 DHCP 服务器的情况下动态地将 IP 地址分配给额外网络。
下表描述了使用 Whereabouts 进行动态 IP 地址分配的配置:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。需要 |
|
|
| CIDR 表示法中的 IP 地址和范围。IP 地址是通过这个地址范围来分配的。 |
|
|
| 可选: CIDR 标记中零个或更多 IP 地址和范围的列表。包含在排除地址范围中的 IP 地址。 |
使用 Whereabouts 的动态 IP 地址分配配置示例
21.5.1.1.4. 创建 Whereabouts 协调器守护进程集 复制链接链接已复制到粘贴板!
Whereabouts 协调器负责管理集群中 pod 的动态 IP 地址分配,使用 Whereabouts IP 地址管理 (IPAM) 解决方案。它确保每个 pod 从指定的 IP 地址范围中获取唯一的 IP 地址。它还会在 pod 删除或缩减时处理 IP 地址发行版本。
您还可以使用 NetworkAttachmentDefinition 自定义资源进行动态 IP 地址分配。
通过 Cluster Network Operator 配置额外网络时,Whereabouts reconciler 守护进程集会被自动创建。从 YAML 清单配置额外网络时,它不会自动创建。
要触发 Whereabouts 协调器 daemonset 的部署,您必须通过编辑 Cluster Network Operator 自定义资源文件来手动创建 whereabouts-shim 网络附加。
使用以下步骤部署 Whereabouts 协调器 daemonset。
流程
运行以下命令来编辑
Network.operator.openshift.io自定义资源(CR):oc edit network.operator.openshift.io cluster
$ oc edit network.operator.openshift.io clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 修改 CR 中的
additionalNetworks参数,以添加abouts-shim网络附加定义。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存文件并退出文本编辑器。
运行以下命令,验证
whereabouts-reconciler守护进程集是否已成功部署:oc get all -n openshift-multus | grep whereabouts-reconciler
$ oc get all -n openshift-multus | grep whereabouts-reconcilerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.5.2. 配置 SR-IOV 额外网络 复制链接链接已复制到粘贴板!
您可以通过创建一个 SriovNetwork 对象来配置使用 SR-IOV 硬件的额外网络。创建 SriovNetwork 对象时,SR-IOV Network Operator 会自动创建一个 NetworkAttachmentDefinition 对象。
如果一个 SriovNetwork 对象已被附加到状态为 running 的 pod,则不要修改或删除它。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
创建一个
SriovNetwork对象,然后在<name>.yaml文件中保存 YAML,其中<name>是这个额外网络的名称。对象规格可能类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建对象:
oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这里的
<name>指定额外网络的名称。可选: 要确认与您在上一步中创建的
SriovNetwork对象关联的NetworkAttachmentDefinition对象是否存在,请输入以下命令。将<namespace>替换为您在SriovNetwork对象中指定的 networkNamespace。oc get net-attach-def -n <namespace>
$ oc get net-attach-def -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.5.3. 后续步骤 复制链接链接已复制到粘贴板!
21.6. 配置 SR-IOV InfiniBand 网络附加 复制链接链接已复制到粘贴板!
您可以为集群中的单根 I/O 虚拟化(SR-IOV)设备配置 InfiniBand(IB)网络附加。
21.6.1. Infiniband 设备配置对象 复制链接链接已复制到粘贴板!
您可以通过定义 SriovIBNetwork 对象来配置 InfiniBand(IB)网络设备。
以下 YAML 描述了 SriovIBNetwork 对象:
- 1
- 对象的名称。SR-IOV Network Operator 创建一个名称相同的
NetworkAttachmentDefinition对象。 - 2
- 安装 SR-IOV Operator 的命名空间。
- 3
- 用于为这个额外网络定义 SR-IOV 硬件的
SriovNetworkNodePolicy对象中的spec.resourceName参数的值。 - 4
SriovIBNetwork对象的目标命名空间。只有目标命名空间中的 pod 可以附加到网络设备。- 5
- 可选:将 IPAM CNI 插件配置为 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
- 6
- 可选:虚拟功能(VF)的链接状态。允许的值是
enable、disable和auto。 - 7
- 可选:为此网络配置功能。您可以指定
"{ "ips": true }"来启用 IP 地址支持,或者"{ "infinibandGUID": true }"启用 IB Global Unique Identifier(GUID)支持。
21.6.1.1. 为额外网络配置 IP 地址分配 复制链接链接已复制到粘贴板!
IP 地址管理 (IPAM) Container Network Interface (CNI) 插件为其他 CNI 插件提供 IP 地址。
您可以使用以下 IP 地址分配类型:
- 静态分配。
- 通过 DHCP 服务器进行动态分配。您指定的 DHCP 服务器必须可从额外网络访问。
- 通过 Whereabouts IPAM CNI 插件进行动态分配。
21.6.1.1.1. 静态 IP 地址分配配置 复制链接链接已复制到粘贴板!
下表描述了静态 IP 地址分配的配置:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。值必须是 |
|
|
| 指定分配给虚拟接口的 IP 地址的对象数组。支持 IPv4 和 IPv6 IP 地址。 |
|
|
| 指定要在 pod 中配置的路由的一组对象。 |
|
|
| 可选:指定 DNS 配置的对象数组。 |
address 数组需要带有以下字段的对象:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
您指定的 IP 地址和网络前缀。例如:如果您指定 |
|
|
| 出口网络流量要路由到的默认网关。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CIDR 格式的 IP 地址范围,如 |
|
|
| 网络流量路由的网关。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 用于发送 DNS 查询的一个或多个 IP 地址的数组。 |
|
|
|
要附加到主机名的默认域。例如,如果将域设置为 |
|
|
|
在 DNS 查找查询过程中,附加到非限定主机名(如 |
静态 IP 地址分配配置示例
21.6.1.1.2. 动态 IP 地址(DHCP)分配配置 复制链接链接已复制到粘贴板!
以下 JSON 描述了使用 DHCP 进行动态 IP 地址地址分配的配置。
pod 在创建时获取其原始 DHCP 租期。该租期必须由集群中运行的一个小型的 DHCP 服务器部署定期续订。
要触发 DHCP 服务器的部署,您必须编辑 Cluster Network Operator 配置来创建 shim 网络附加,如下例所示:
shim 网络附加定义示例
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。需要值 |
动态 IP 地址(DHCP)分配配置示例
{
"ipam": {
"type": "dhcp"
}
}
{
"ipam": {
"type": "dhcp"
}
}
21.6.1.1.3. 使用 Whereabouts 进行动态 IP 地址分配配置 复制链接链接已复制到粘贴板!
Whereabouts CNI 插件允许在不使用 DHCP 服务器的情况下动态地将 IP 地址分配给额外网络。
下表描述了使用 Whereabouts 进行动态 IP 地址分配的配置:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。需要 |
|
|
| CIDR 表示法中的 IP 地址和范围。IP 地址是通过这个地址范围来分配的。 |
|
|
| 可选: CIDR 标记中零个或更多 IP 地址和范围的列表。包含在排除地址范围中的 IP 地址。 |
使用 Whereabouts 的动态 IP 地址分配配置示例
21.6.1.1.4. 创建 Whereabouts 协调器守护进程集 复制链接链接已复制到粘贴板!
Whereabouts 协调器负责管理集群中 pod 的动态 IP 地址分配,使用 Whereabouts IP 地址管理 (IPAM) 解决方案。它确保每个 pod 从指定的 IP 地址范围中获取唯一的 IP 地址。它还会在 pod 删除或缩减时处理 IP 地址发行版本。
您还可以使用 NetworkAttachmentDefinition 自定义资源进行动态 IP 地址分配。
通过 Cluster Network Operator 配置额外网络时,Whereabouts reconciler 守护进程集会被自动创建。从 YAML 清单配置额外网络时,它不会自动创建。
要触发 Whereabouts 协调器 daemonset 的部署,您必须通过编辑 Cluster Network Operator 自定义资源文件来手动创建 whereabouts-shim 网络附加。
使用以下步骤部署 Whereabouts 协调器 daemonset。
流程
运行以下命令来编辑
Network.operator.openshift.io自定义资源(CR):oc edit network.operator.openshift.io cluster
$ oc edit network.operator.openshift.io clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow 修改 CR 中的
additionalNetworks参数,以添加abouts-shim网络附加定义。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存文件并退出文本编辑器。
运行以下命令,验证
whereabouts-reconciler守护进程集是否已成功部署:oc get all -n openshift-multus | grep whereabouts-reconciler
$ oc get all -n openshift-multus | grep whereabouts-reconcilerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.6.2. 配置 SR-IOV 额外网络 复制链接链接已复制到粘贴板!
您可以通过创建一个 SriovIBNetwork 对象来配置使用 SR-IOV 硬件的额外网络。创建 SriovIBNetwork 对象时,SR-IOV Network Operator 会自动创建一个 NetworkAttachmentDefinition 对象。
如果一个 SriovIBNetwork 对象已被附加到状态为 running 的 pod,则不要修改或删除它。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
创建一个
SriovIBNetwork对象,然后在<name>.yaml文件中保存 YAML,其中<name>是这个额外网络的名称。对象规格可能类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建对象:
oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这里的
<name>指定额外网络的名称。可选: 要确认与您在上一步中创建的
SriovIBNetwork对象关联的NetworkAttachmentDefinition对象是否存在,请输入以下命令。将<namespace>替换为您在SriovIBNetwork对象中指定的 networkNamespace。oc get net-attach-def -n <namespace>
$ oc get net-attach-def -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.6.3. 后续步骤 复制链接链接已复制到粘贴板!
21.7. 将 pod 添加到额外网络 复制链接链接已复制到粘贴板!
您可以将 pod 添加到现有的单根 I/O 虚拟化(SR-IOV)网络。
21.7.1. 网络附加的运行时配置 复制链接链接已复制到粘贴板!
将 pod 附加到额外网络时,您可以指定运行时配置来为 pod 进行特定的自定义。例如,,您可以请求特定的 MAC 硬件地址。
您可以通过在 pod 规格中设置注解来指定运行时配置。注解键是 k8s.v1.cni.cncf.io/network,它接受一个 JSON 对象来描述运行时配置。
21.7.1.1. 基于以太网的 SR-IOV 附加的运行时配置 复制链接链接已复制到粘贴板!
以下 JSON 描述了基于以太网的 SR-IOV 网络附加的运行时配置选项。
运行时配置示例
21.7.1.2. 基于 InfiniBand 的 SR-IOV 附加的运行时配置 复制链接链接已复制到粘贴板!
以下 JSON 描述了基于 InfiniBand 的 SR-IOV 网络附加的运行时配置选项。
运行时配置示例
21.7.2. 将 pod 添加到额外网络 复制链接链接已复制到粘贴板!
您可以将 pod 添加到额外网络。pod 继续通过默认网络发送与集群相关的普通网络流量。
创建 pod 时会附加额外网络。但是,如果 pod 已存在,您无法为其附加额外网络。
pod 必须与额外网络处于相同的命名空间。
SR-IOV Network Resource Injector 会自动将 resource 字段添加到 pod 中的第一个容器中。
如果您在 Data Plane Development Kit(DPDK)模式下使用 Intel 网络接口控制器(NIC),则只有 pod 中的第一个容器被配置为访问 NIC。如果在 SriovNetworkNodePolicy 对象中将 deviceType 设置为 vfio-pci,则您的 SR-IOV 额外网络被配置为 DPDK 模式。
您可以通过确保需要访问 NIC 的容器是 Pod 对象定义的第一个容器,或者禁用 Network Resource Injector(Network Resource Injector)来解决此问题。如需更多信息,请参阅 BZ#1990953。
先决条件
-
安装 OpenShift CLI(
oc)。 - 登录到集群。
- 安装 SR-IOV Operator。
-
创建
SriovNetwork对象或SriovIBNetwork对象以将 pod 附加到。
流程
为
Pod对象添加注解。只能使用以下注解格式之一:要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将
<network>替换为要与 pod 关联的额外网络的名称:metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则该 pod 会将多个网络接口附加到该网络。
要通过自定义来附加额外网络,请添加具有以下格式的注解:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令来创建 pod。将
<name>替换为 pod 的名称。oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要确认
PodCR 中是否存在注解,请输入以下命令将<name>替换为 pod 的名称。oc get pod <name> -o yaml
$ oc get pod <name> -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例中,
example-podpod 附加到net1额外网络:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
k8s.v1.cni.cncf.io/networks-status参数是对象的 JSON 数组。每个对象描述附加到 pod 的额外网络的状态。注解值保存为纯文本值。
21.7.3. 创建与 SR-IOV pod 兼容的非统一内存访问 (NUMA) 复制链接链接已复制到粘贴板!
您可以通过限制 SR-IOV 和从相同 NUMA 节点分配的 CPU 资源,使用 restricted 或 single-numa-node Topology Manager 来创建与 SR-IOV pod 兼容的 NUMA。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您已将 CPU Manager 策略配置为
static。有关 CPU Manager 的详情请参考 "Additional resources" 部分。 您已将 Topology Manager 策略配置为
single-numa-node。注意当
single-numa-node无法满足请求时,您可以将拓扑管理器策略配置为restricted。
流程
创建以下 SR-IOV pod 规格,然后在
<name>-sriov-pod.yaml文件中保存 YAML。将<name>替换为这个 pod 的名称。以下示例显示了 SR-IOV pod 规格:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建 SR-IOV pod 示例:
oc create -f <filename>
$ oc create -f <filename>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<filename>替换为您在上一步中创建的文件的名称。
确认
sample-pod配置为带有保证 QoS。oc describe pod sample-pod
$ oc describe pod sample-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确认
sample-pod被分配了独有的 CPU。oc exec sample-pod -- cat /sys/fs/cgroup/cpuset/cpuset.cpus
$ oc exec sample-pod -- cat /sys/fs/cgroup/cpuset/cpuset.cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确认为
sample-pod分配的 SR-IOV 设备和 CPU 位于相同的 NUMA 节点上。oc exec sample-pod -- cat /sys/fs/cgroup/cpuset/cpuset.cpus
$ oc exec sample-pod -- cat /sys/fs/cgroup/cpuset/cpuset.cpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.7.4. 在 OpenStack 上使用 SR-IOV 的集群测试 pod 模板 复制链接链接已复制到粘贴板!
以下 testpmd pod 演示了使用巨页、保留 CPU 和 SR-IOV 端口创建容器。
testpmd pod 示例
- 1
- 本例假定性能配置集的名称为
cnf-performance profile。
21.8. 为 SR-IOV 网络配置接口级别网络 sysctl 设置 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用连接到 SR-IOV 网络设备的 pod 的 tuning Container Network Interface (CNI) meta 插件修改接口级网络 sysctl。
21.8.1. 为启用了 SR-IOV 的 NIC 标记节点 复制链接链接已复制到粘贴板!
如果您只想在 SR-IOV 功能的节点上启用 SR-IOV,请执行几种方法:
-
安装 Node Feature Discovery (NFD) Operator。NFD 检测启用了 SR-IOV 的 NIC,并使用
node.alpha.kubernetes-incubator.io/nfd-network-sriov.enabled = true标记节点。 检查每个节点的
SriovNetworkNodeStateCR。interfaces小节包括 worker 节点上 SR-IOV Network Operator 发现的所有 SR-IOV 设备列表。使用以下命令,为每个节点标记feature.node.kubernetes.io/network-sriov.enabled: "true":$ oc label node <node_name> feature.node.kubernetes.io/network-sriov.capable="true"
$ oc label node <node_name> feature.node.kubernetes.io/network-sriov.capable="true"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您可以使用您需要的任何名称标记节点。
21.8.2. 设置一个 sysctl 标记 复制链接链接已复制到粘贴板!
您可以为连接到 SR-IOV 网络设备的 pod 设置接口级网络 sysctl 设置。
在本例中,net.ipv4.conf.IFNAME.accept_redirects 在创建的虚拟接口上设置为 1。
sysctl-tuning-test 是本例中使用的命名空间。
使用以下命令来创建
sysctl-tuning-test命名空间:oc create namespace sysctl-tuning-test
$ oc create namespace sysctl-tuning-testCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.8.2.1. 在使用 SR-IOV 网络设备的节点上设置一个 sysctl 标志 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 将 SriovNetworkNodePolicy.sriovnetwork.openshift.io 自定义资源定义(CRD) 添加到 OpenShift Container Platform。您可以通过创建一个 SriovNetworkNodePolicy 自定义资源 (CR) 来配置 SR-IOV 网络设备。
当应用由 SriovNetworkNodePolicy 对象中指定的配置时,SR-IOV Operator 可能会排空并重启节点。
它可能需要几分钟时间来应用配置更改。
按照以下步骤创建一个 SriovNetworkNodePolicy 自定义资源 (CR)。
流程
创建一个
SriovNetworkNodePolicy自定义资源 (CR)。例如,将以下 YAML 保存为文件policyoneflag-sriov-node-network.yaml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 自定义资源对象的名称。
- 2
- 安装 SR-IOV Network Operator 的命名空间。
- 3
- SR-IOV 网络设备插件的资源名称。您可以为资源名称创建多个 SR-IOV 网络节点策略。
- 4
- 节点选择器指定要配置的节点。只有所选节点上的 SR-IOV 网络设备才会被配置。SR-IOV Container Network Interface(CNI)插件和设备插件仅在所选节点上部署。
- 5
- 可选: priority 是一个
0到99之间的整数。较小的值具有更高的优先级。例如,优先级10是高于优先级99。默认值为99。 - 6
- 为 SR-IOV 物理网络设备创建的虚拟功能(VF)的数量。对于 Intel 网络接口控制器(NIC),VF 的数量不能超过该设备支持的 VF 总数。对于 Mellanox NIC,VF 的数量不能超过
128。 - 7
- NIC 选择器标识要配置的 Operator 的设备。您不必为所有参数指定值。建议您足够精确地识别网络设备以避免意外选择设备。如果指定了
rootDevices,则必须同时为vendor、deviceID或pfNames指定一个值。如果同时指定了pfNames和rootDevices,请确保它们引用同一设备。如果您为netFilter指定了一个值,那么您不需要指定任何其他参数,因为网络 ID 是唯一的。 - 8
- 可选:该设备的一个或多个物理功能(PF)名称的数组。
- 9
- 可选:虚拟功能的驱动程序类型。唯一允许的值是
netdevice。对于裸机节点上的 DPDK 模式的 Mellanox NIC,请将isRdma设置为true。 - 10
- 可选:配置是否启用远程直接访问 (RDMA) 模式。默认值为
false。如果isRdma参数设为true,您可以继续使用启用了 RDMA 的 VF 作为普通网络设备。设备可在其中的一个模式中使用。将isRdma设置为true,并将needVhostNet设置为true以配置 Mellanox NIC 以用于 Fast Datapath DPDK 应用程序。
注意vfio-pci驱动程序类型不被支持。创建
SriovNetworkNodePolicy对象:oc create -f policyoneflag-sriov-node-network.yaml
$ oc create -f policyoneflag-sriov-node-network.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 应用配置更新后,
sriov-network-operator命名空间中的所有 pod 将变为Running状态。要验证是否已配置了 SR-IOV 网络设备,请输入以下命令。将
<node_name>替换为带有您刚才配置的 SR-IOV 网络设备的节点名称。oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'$ oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Succeeded
SucceededCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.8.2.2. 在 SR-IOV 网络中配置 sysctl 复制链接链接已复制到粘贴板!
您可以通过将调优配置添加到 SriovNetwork 资源的可选 metaPlugins 参数,在 SR-IOV 创建的虚拟接口上设置特定于接口的 sysctl 设置。
SR-IOV Network Operator 管理额外网络定义。当您指定要创建的额外 SR-IOV 网络时,SR-IOV Network Operator 会自动创建 NetworkAttachmentDefinition 自定义资源(CR)。
不要编辑 SR-IOV Network Operator 所管理的 NetworkAttachmentDefinition 自定义资源。这样做可能会破坏额外网络上的网络流量。
要更改接口级别网络 net.ipv4.conf.IFNAME.accept_redirects sysctl 设置,请使用 Container Network Interface (CNI) 调整插件创建额外的 SR-IOV 网络。
先决条件
- 安装 OpenShift Container Platform CLI(oc)。
- 以具有 cluster-admin 权限的用户身份登录 OpenShift Container Platform 集群。
流程
为额外 SR-IOV 网络附加创建
SriovNetwork自定义资源 (CR) 并插入metaPlugins配置,如下例所示。将 YAML 保存为文件sriov-network-interface-sysctl.yaml。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 对象的名称。SR-IOV Network Operator 创建一个名称相同的 NetworkAttachmentDefinition 对象。
- 2
- 安装 SR-IOV Network Operator 的命名空间。
- 3
- 用于为这个额外网络定义 SR-IOV 硬件的
SriovNetworkNodePolicy对象中的spec.resourceName参数的值。 - 4
SriovNetwork对象的目标命名空间。只有目标命名空间中的 pod 可以附加到额外网络。- 5
- 为 IPAM CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
- 6
- 可选:为额外网络设置功能。您可以指定
"{ "ips": true }"来启用 IP 地址支持,或指定"{ "mac": true }"来启用 MAC 地址支持。 - 7
- 可选: metaPlugins 参数用于为该设备添加额外的功能。在这种情况下,将
type字段设置为tuning。指定在sysctl字段中设置的接口级网络sysctl。
创建
SriovNetwork资源:oc create -f sriov-network-interface-sysctl.yaml
$ oc create -f sriov-network-interface-sysctl.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证 NetworkAttachmentDefinition CR 是否已成功创建
运行以下命令,确认 SR-IOV Network Operator 创建了
NetworkAttachmentDefinitionCR:oc get network-attachment-definitions -n <namespace>
$ oc get network-attachment-definitions -n <namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<namespace>替换为您在SriovNetwork对象中指定的networkNamespace的值。例如:sysctl-tuning-test。
输出示例
NAME AGE onevalidflag 14m
NAME AGE onevalidflag 14mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意SR-IOV Network Operator 创建 CR 之前可能会有延迟。
验证额外 SR-IOV 网络附加是否成功
要验证 tuning CNI 是否已正确配置并附加额外的 SR-IOV 网络附加,请执行以下操作:
创建
PodCR。将以下 YAML 保存为文件examplepod.yaml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
PodCR:oc apply -f examplepod.yaml
$ oc apply -f examplepod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 pod 是否已创建:
oc get pod -n sysctl-tuning-test
$ oc get pod -n sysctl-tuning-testCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47s
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令登录到 pod:
oc rsh -n sysctl-tuning-test tunepod
$ oc rsh -n sysctl-tuning-test tunepodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证配置的 sysctl 标记的值。运行以下命令,查找
net.ipv4.conf.IFNAME.accept_redirects的值:sysctl net.ipv4.conf.net1.accept_redirects
$ sysctl net.ipv4.conf.net1.accept_redirectsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
net.ipv4.conf.net1.accept_redirects = 1
net.ipv4.conf.net1.accept_redirects = 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.8.3. 为与绑定 SR-IOV 接口标记关联的 pod 配置 sysctl 设置 复制链接链接已复制到粘贴板!
您可以为连接到绑定的 SR-IOV 网络设备的 pod 设置接口级网络 sysctl 设置。
在本例中,可以配置的特定网络接口级 sysctl 设置在绑定接口上设置。
sysctl-tuning-test 是本例中使用的命名空间。
使用以下命令来创建
sysctl-tuning-test命名空间:oc create namespace sysctl-tuning-test
$ oc create namespace sysctl-tuning-testCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.8.3.1. 在带有绑定的 SR-IOV 网络设备的节点上设置所有 sysctl 标志 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 将 SriovNetworkNodePolicy.sriovnetwork.openshift.io 自定义资源定义(CRD) 添加到 OpenShift Container Platform。您可以通过创建一个 SriovNetworkNodePolicy 自定义资源 (CR) 来配置 SR-IOV 网络设备。
当应用由 SriovNetworkNodePolicy 对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。
它可能需要几分钟时间来应用配置更改。
按照以下步骤创建一个 SriovNetworkNodePolicy 自定义资源 (CR)。
流程
创建一个
SriovNetworkNodePolicy自定义资源 (CR)。将以下 YAML 保存为文件policyallflags-sriov-node-network.yaml。将policyallflags替换为配置的名称。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 自定义资源对象的名称。
- 2
- 安装 SR-IOV Network Operator 的命名空间。
- 3
- SR-IOV 网络设备插件的资源名称。您可以为资源名称创建多个 SR-IOV 网络节点策略。
- 4
- 节点选择器指定要配置的节点。只有所选节点上的 SR-IOV 网络设备才会被配置。SR-IOV Container Network Interface(CNI)插件和设备插件仅在所选节点上部署。
- 5
- 可选: priority 是一个
0到99之间的整数。较小的值具有更高的优先级。例如,优先级10是高于优先级99。默认值为99。 - 6
- 为 SR-IOV 物理网络设备创建的虚拟功能 (VF) 的数量。对于 Intel 网络接口控制器(NIC),VF 的数量不能超过该设备支持的 VF 总数。对于 Mellanox NIC,VF 的数量不能超过
128。 - 7
- NIC 选择器标识要配置的 Operator 的设备。您不必为所有参数指定值。建议您足够精确地识别网络设备以避免意外选择设备。如果指定了
rootDevices,则必须同时为vendor、deviceID或pfNames指定一个值。如果同时指定了pfNames和rootDevices,请确保它们引用同一设备。如果您为netFilter指定了一个值,那么您不需要指定任何其他参数,因为网络 ID 是唯一的。 - 8
- 可选:该设备的一个或多个物理功能(PF)名称的数组。
- 9
- 可选:虚拟功能的驱动程序类型。唯一允许的值是
netdevice。对于裸机节点上的 DPDK 模式的 Mellanox NIC,请将isRdma设置为true。 - 10
- 可选:配置是否启用远程直接访问 (RDMA) 模式。默认值为
false。如果isRdma参数设为true,您可以继续使用启用了 RDMA 的 VF 作为普通网络设备。设备可在其中的一个模式中使用。将isRdma设置为true,并将needVhostNet设置为true以配置 Mellanox NIC 以用于 Fast Datapath DPDK 应用程序。
注意vfio-pci驱动程序类型不被支持。创建 SriovNetworkNodePolicy 对象:
oc create -f policyallflags-sriov-node-network.yaml
$ oc create -f policyallflags-sriov-node-network.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 应用配置更新后,sriov-network-operator 命名空间中的所有 pod 将变为
Running状态。要验证是否已配置了 SR-IOV 网络设备,请输入以下命令。将
<node_name>替换为带有您刚才配置的 SR-IOV 网络设备的节点名称。oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'$ oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Succeeded
SucceededCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.8.3.2. 在绑定的 SR-IOV 网络中配置 sysctl 复制链接链接已复制到粘贴板!
您可以在从两个 SR-IOV 接口创建的绑定接口上设置特定于接口的 sysctl 设置。为此,可将调优配置添加到绑定网络附加定义的可选 Plugins 参数中。
不要编辑 SR-IOV Network Operator 所管理的 NetworkAttachmentDefinition 自定义资源。这样做可能会破坏额外网络上的网络流量。
要更改特定的接口级网络 sysctl 设置,请按照以下流程使用 Container Network Interface (CNI) 调优插件创建 SriovNetwork 自定义资源 (CR)。
先决条件
- 安装 OpenShift Container Platform CLI(oc)。
- 以具有 cluster-admin 权限的用户身份登录 OpenShift Container Platform 集群。
流程
为绑定接口创建
SriovNetwork自定义资源 (CR),如下例所示。将 YAML 保存为文件sriov-network-attachment.yaml。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 对象的名称。SR-IOV Network Operator 创建一个名称相同的 NetworkAttachmentDefinition 对象。
- 2
- 安装 SR-IOV Network Operator 的命名空间。
- 3
- 用于为这个额外网络定义 SR-IOV 硬件的
SriovNetworkNodePolicy对象中的spec.resourceName参数的值。 - 4
SriovNetwork对象的目标命名空间。只有目标命名空间中的 pod 可以附加到额外网络。- 5
- 可选:为这个额外网络配置功能。您可以指定
"{ "ips": true }"来启用 IP 地址支持,或指定"{ "mac": true }"来启用 MAC 地址支持。
创建
SriovNetwork资源:oc create -f sriov-network-attachment.yaml
$ oc create -f sriov-network-attachment.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建绑定网络附加定义,如下例所示。将 YAML 保存为文件
sriov-bond-network-interface.yaml。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 类型是
bond。 - 2
mode属性指定绑定模式。支持的绑定模式有:-
balance-rr- 0 -
active-backup- 1 balance-xor- 2对于
balance-rr或balance-xor模式,您必须为 SR-IOV 虚拟功能将trust模式设置为on。
-
- 3
- 对于 active-backup 模式,
failover属性是必需的。 - 4
linksInContainer=true标志告知 Bond CNI 在容器内找到所需的接口。默认情况下,Bond CNI 会查找主机上的这些接口,该接口无法与 SRIOV 和 Multus 集成。- 5
links部分定义将用于创建绑定的接口。默认情况下,Multus 将附加的接口命名为 "net",再加上一个连续的数字。- 6
- 为 IPAM CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。在这个 pod 示例 IP 地址中被手动配置,因此在本例中
ipam被设置为 static。 - 7
- 为设备添加额外的功能。例如,将
type字段设置为tuning。指定在sysctl字段中设置的接口级网络 sysctl。这个示例设置可设置的所有接口级网络sysctl设置。
创建绑定网络附加定义:
oc create -f sriov-bond-network-interface.yaml
$ oc create -f sriov-bond-network-interface.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证 NetworkAttachmentDefinition CR 是否已成功创建
运行以下命令,确认 SR-IOV Network Operator 创建了
NetworkAttachmentDefinitionCR:oc get network-attachment-definitions -n <namespace>
$ oc get network-attachment-definitions -n <namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<namespace>替换为您在配置网络附加时指定的 networkNamespace,如sysctl-tuning-test。
输出示例
NAME AGE bond-sysctl-network 22m allvalidflags 47m
NAME AGE bond-sysctl-network 22m allvalidflags 47mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意SR-IOV Network Operator 创建 CR 之前可能会有延迟。
验证额外的 SR-IOV 网络资源是否成功
要验证 tuning CNI 是否已正确配置并附加额外的 SR-IOV 网络附加,请执行以下操作:
创建
PodCR。例如,将以下 YAML 保存为文件examplepod.yaml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用 YAML:
oc apply -f examplepod.yaml
$ oc apply -f examplepod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证 pod 是否已创建:
oc get pod -n sysctl-tuning-test
$ oc get pod -n sysctl-tuning-testCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47s
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令登录到 pod:
oc rsh -n sysctl-tuning-test tunepod
$ oc rsh -n sysctl-tuning-test tunepodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证配置的
sysctl标记的值。运行以下命令,查找net.ipv6.neigh.IFNAME.base_reachable_time_ms的值:sysctl net.ipv6.neigh.bond0.base_reachable_time_ms
$ sysctl net.ipv6.neigh.bond0.base_reachable_time_msCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
net.ipv6.neigh.bond0.base_reachable_time_ms = 20000
net.ipv6.neigh.bond0.base_reachable_time_ms = 20000Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.9. 配置高性能多播 复制链接链接已复制到粘贴板!
您可以在您的单根 I/O 虚拟化(SR-IOV)硬件网络中使用多播。
21.9.1. 高性能多播 复制链接链接已复制到粘贴板!
OpenShift SDN 默认 Container Network Interface (CNI) 网络供应商支持默认网络上的 pod 间的多播。目前,多播最适用于低带宽协调或服务发现。它不适用于高带宽的应用程序。对于流传输介质应用程序,如 IPTV 和多方视频会议,可以使用 Single Root I/O Virtualization(SR-IOV)硬件来提供接近原生的性能。
使用额外的 SR-IOV 接口进行多播时:
- pod 必须通过额外的 SR-IOV 接口发送或接收多播软件包。
- 连接 SR-IOV 接口的物理网络决定了多播路由和拓扑结构,不受 OpenShift Container Platform 的控制。
21.9.2. 为多播配置 SR-IOV 接口 复制链接链接已复制到粘贴板!
以下步骤为多播创建一个 SR-IOV 接口示例。
先决条件
-
安装 OpenShift CLI(
oc)。 -
您必须作为
cluster-admin角色用户登录集群。
流程
创建一个
SriovNetworkNodePolicy对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个
SriovNetwork对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建带有多播应用程序的 pod:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 只有在应用程序需要为 SR-IOV 接口分配多播 IP 地址时,才需要
NET_ADMIN功能。否则,可以省略它。
21.10. 使用 DPDK 和 RDMA 复制链接链接已复制到粘贴板!
OpenShift Container Platform 支持容器化 Data Plane Development Kit (DPDK) 应用程序。您可以使用单一根 I/O 虚拟化(SR-IOV)网络硬件和 Data Plane Development Kit (DPDK) 以及远程直接内存访问 (RDMA) 。
有关支持的设备的详情,请参考支持的设备。
21.10.1. 在 DPDK 模式中使用 Intel NIC 的虚拟功能 复制链接链接已复制到粘贴板!
先决条件
-
安装 OpenShift CLI(
oc)。 - 安装 SR-IOV Network Operator。
-
以具有
cluster-admin特权的用户身份登录。
流程
创建以下
SriovNetworkNodePolicy对象,然后在intel-dpdk-node-policy.yaml文件中保存 YAML。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将虚拟功能(VF)的驱动器类型指定为
vfio-pci。
注意如需了解
inSriovNetworkNodePolicy的每个选项的详情,请参阅Configuring SR-IOV network devices部分。当应用由
SriovNetworkNodePolicy对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。应用配置更新后,
openshift-sriov-network-operator命名空间中的所有 pod 将变为Running状态。运行以下命令来创建
SriovNetworkNodePolicy对象:oc create -f intel-dpdk-node-policy.yaml
$ oc create -f intel-dpdk-node-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建以下
SriovNetwork对象,然后在intel-dpdk-network.yaml文件中保存 YAML。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为 ipam CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
注意如需
SriovNetwork中的每个选项的详细说明,请参阅"Configuring SR-IOV additional network" 部分。一个可选的库 app-netutil 提供了多种 API 方法来收集有关容器父 pod 的网络信息。
运行以下命令来创建
SriovNetwork对象:oc create -f intel-dpdk-network.yaml
$ oc create -f intel-dpdk-network.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建以下
Podspec,然后在intel-dpdk-pod.yaml文件中保存 YAML。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定
target_namespace,它与SriovNetwork对象intel-dpdk-network创建于的命令空间相同。如果要在其他命名空间中创建 pod,在Podspec 和SriovNetwork对象中更改target_namespace。 - 2
- 指定包含应用程序和应用程序使用的 DPDK 库的 DPDK 镜像。
- 3
- 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
- 4
- 在
/mnt/huge下将巨页卷挂载到 DPDK pod。巨页卷由 emptyDir 卷类型支持,medium 为Hugepages。 - 5
- 可选:指定分配给 DPDK pod 的 DPDK 设备数。如果未明确指定,则此资源请求和限制将被 SR-IOV 网络资源注入程序自动添加。SR-IOV 网络资源注入程序是由 SR-IOV Operator 管理的准入控制器组件。它默认是启用的,可以通过把默认的
SriovOperatorConfigCR 中的enableInjector选项设置为false来禁用它。 - 6
- 指定 CPU 数量。DPDK pod 通常需要从 kubelet 分配专用 CPU。这可以通过将 CPU Manager 策略设置为
static,并创建带有有保障的QoS 的 pod 来实现。 - 7
- 指定巨页大小
hugepages-1Gi或hugepages-2Mi以及分配给 DPDK pod 的巨页数量。单独配置2Mi和1Gi巨页。配置1Gi巨页需要在节点中添加内核参数。例如:添加内核参数default_hugepagesz=1GB,hugepagesz=1G和hugepages=16将在系统引导时分配16*1Gi巨页。
运行以下命令来创建 DPDK pod:
oc create -f intel-dpdk-pod.yaml
$ oc create -f intel-dpdk-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.10.2. 在带有 Mellanox NIC 的 DPDK 模式中使用虚拟功能 复制链接链接已复制到粘贴板!
您可以创建一个网络节点策略,并在带有 Mellanox NIC 的 DPDK 模式中使用虚拟功能创建 Data Plane Development Kit (DPDK) pod。
先决条件
-
已安装 OpenShift CLI(
oc)。 - 已安装 Single Root I/O Virtualization (SR-IOV) Network Operator。
-
您已以具有
cluster-admin权限的用户身份登录。
流程
将以下
SriovNetworkNodePolicyYAML 配置保存到mlx-dpdk-node-policy.yaml文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如需了解
SriovNetworkNodePolicy对象中的每个选项的详细说明,请参阅配置 SR-IOV 网络设备。当应用由
SriovNetworkNodePolicy对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。应用配置更新后,
openshift-sriov-network-operator命名空间中的所有 pod 将变为Running状态。运行以下命令来创建
SriovNetworkNodePolicy对象:oc create -f mlx-dpdk-node-policy.yaml
$ oc create -f mlx-dpdk-node-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将以下
SriovNetworkYAML 配置保存到mlx-dpdk-network.yaml文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为 IP 地址管理 (IPAM) Container Network Interface (CNI) 插件指定一个配置对象作为 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
注意如需了解
SriovNetwork对象中的每个选项的详细说明,请参阅配置 SR-IOV 网络设备。app-netutil选项库提供了几个 API 方法,用于收集有关容器父 pod 的网络信息。运行以下命令来创建
SriovNetwork对象:oc create -f mlx-dpdk-network.yaml
$ oc create -f mlx-dpdk-network.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将以下
PodYAML 配置保存到mlx-dpdk-pod.yaml文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定
target_namespace,它与SriovNetwork对象mlx-dpdk-network创建于的命令空间相同。要在不同命名空间中创建 pod,在Podspec 和SriovNetwork对象中更改target_namespace。 - 2
- 指定包含应用程序和应用程序使用的 DPDK 库的 DPDK 镜像。
- 3
- 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
- 4
- 将巨页卷挂载到
/mnt/huge下的 DPDK pod 中。巨页卷由emptyDir卷类型支持,介质是Hugepages。 - 5
- 可选:指定分配给 DPDK pod 的 DPDK 设备数。如果没有明确指定,则 SR-IOV 网络资源注入程序会自动添加此资源请求和限制。SR-IOV 网络资源注入程序是由 SR-IOV Operator 管理的准入控制器组件。它默认是启用的,可以通过把默认的
SriovOperatorConfigCR 中的enableInjector选项设置为false来禁用它。 - 6
- 指定 CPU 数量。DPDK pod 通常需要从 kubelet 分配专用 CPU。要做到这一点,将 CPU Manager 策略设置为
static,并创建带有Guaranteed服务质量 (QoS) 的 pod。 - 7
- 指定巨页大小
hugepages-1Gi或hugepages-2Mi以及分配给 DPDK pod 的巨页数量。单独配置2Mi和1Gi巨页。配置1Gi巨页需要在节点中添加内核参数。
运行以下命令来创建 DPDK pod:
oc create -f mlx-dpdk-pod.yaml
$ oc create -f mlx-dpdk-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.10.3. 实现特定 DPDK 行率概述 复制链接链接已复制到粘贴板!
要实现特定的 Data Plane Development Kit (DPDK) 行率,部署 Node Tuning Operator 并配置单根 I/O 虚拟化 (SR-IOV)。您还必须为以下资源调整 DPDK 设置:
- 隔离的 CPU
- Hugepages
- 拓扑调度程序
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 用来实现自动性能优化,以便为 OpenShift Container Platform 应用程序实现低延迟性能。在 OpenShift Container Platform 4.11 及更新的版本中,这个功能是 Node Tuning Operator 的一部分。
DPDK 测试环境
下图显示了流量测试环境的组件:
- 流量生成器:可以生成高容量数据包流量的应用。
- SR-IOV 支持 NIC :与 SR-IOV 兼容的网络接口卡。该卡在物理接口上运行多个虚拟功能。
- 物理功能 (PF) :支持 SR-IOV 接口的网络适配器的 PCI Express (PCIe) 功能。
- 虚拟功能 (VF) :支持 SR-IOV 的网络适配器上的轻量级 PCIe 功能。VF 与网络适配器上的 PCIe PF 关联。VF 代表网络适配器的虚拟实例。
- 交换机 :网络交换机。节点也可以重新连接到回来。
-
testpmd: DPDK 中包含的示例应用程序。testpmd应用可用于在数据包转发模式下测试 DPDK。testpmd应用程序也是如何使用 DPDK 软件开发套件 (SDK) 构建功能全面的应用程序的示例。 - worker 0 和 worker 1:OpenShift Container Platform 节点。
21.10.4. 使用 SR-IOV 和 Node Tuning Operator 实现 DPDK 行率 复制链接链接已复制到粘贴板!
您可以使用 Node Tuning Operator 配置隔离的 CPU、巨页和拓扑调度程序。然后,您可以使用 Node Tuning Operator 和单根 I/O 虚拟化 (SR-IOV) 来实现特定的 Data Plane Development Kit (DPDK) 行率。
先决条件
-
已安装 OpenShift CLI(
oc)。 - 已安装 SR-IOV Network Operator。
-
您已以具有
cluster-admin权限的用户身份登录。 您已部署了独立的 Node Tuning Operator。
注意在以前版本的 OpenShift Container Platform 中,Performance Addon Operator 用来实现自动性能优化,以便为 OpenShift 应用程序实现低延迟性能。在 OpenShift Container Platform 4.11 及更新的版本中,这个功能是 Node Tuning Operator 的一部分。
流程
根据以下示例创建
PerformanceProfile对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果系统上启用了超线程,请分配与
isolated和reservedCPU 组的相关符号链接。如果系统包含多个非统一内存访问节点 (NUMA),请将两个 NUMA 中的 CPU 分配给这两个组。您还可以将 Performance Profile Creator 用于此任务。如需更多信息,请参阅创建性能配置集。 - 2
- 您还可以指定将队列设置为保留 CPU 数的设备列表。如需更多信息,请参阅使用 Node Tuning Operator 缩减 NIC 队列。
- 3
- 分配所需的巨页的数量和大小。您可以为巨页指定 NUMA 配置。默认情况下,系统会为系统上的每个 NUMA 节点分配一个偶数数量。如果需要,您可以请求对节点使用实时内核。如需更多信息,请参阅置备具有实时功能的 worker。
-
将
yaml文件保存为mlx-dpdk-perfprofile-policy.yaml。 使用以下命令应用性能配置集:
oc create -f mlx-dpdk-perfprofile-policy.yaml
$ oc create -f mlx-dpdk-perfprofile-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.10.4.1. 用于虚拟功能的 SR-IOV Network Operator 示例 复制链接链接已复制到粘贴板!
您可以使用单根 I/O 虚拟化 (SR-IOV) Network Operator 从节点上分配和配置虚拟功能 (VF) 的虚拟功能(VF)。
如需有关部署 Operator 的更多信息,请参阅安装 SR-IOV Network Operator。有关配置 SR-IOV 网络设备的更多信息,请参阅配置 SR-IOV 网络设备。
在 Intel VF 和 Mellanox VF 上运行 Data Plane Development Kit (DPDK) 工作负载之间存在一些区别。本节为这两个 VF 类型提供对象配置示例。以下是用于在 Intel NIC 上运行 DPDK 应用程序的 sriovNetworkNodePolicy 对象示例:
以下是 Mellanox NIC 的 sriovNetworkNodePolicy 对象示例:
21.10.4.2. SR-IOV 网络 Operator 示例 复制链接链接已复制到粘贴板!
以下是 sriovNetwork 对象的示例定义。在这种情况下,Intel 和 Mellanox 配置是相同的:
21.10.4.3. DPDK 基础工作负载示例 复制链接链接已复制到粘贴板!
以下是数据平面开发套件 (DPDK) 容器的示例:
不要使用 SLEEP 启动容器集,然后执行到容器集以启动 testpmd 或 DPDK 工作负载。这可添加额外的中断,因为 exec 进程没有固定到任何 CPU。
21.10.4.4. testpmd 脚本示例 复制链接链接已复制到粘贴板!
以下是运行 testpmd 的示例脚本:
这个示例使用两个不同的 sriovNetwork CR。环境变量包含分配给 pod 的虚拟功能 (VF) PCI 地址。如果您在 pod 定义中使用相同的网络,您必须分割 pciAddress。配置流量生成器的正确 MAC 地址非常重要。这个示例使用自定义 MAC 地址。
21.10.5. 在带有 Mellanox NIC 的 RDMA 模式中使用虚拟功能 复制链接链接已复制到粘贴板!
RDMA over Converged Ethernet (RoCE) 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
在 OpenShift Container Platform 上使用 RDMA 时,RDMA over Converged Ethernet (RoCE) 是唯一支持的模式。
先决条件
-
安装 OpenShift CLI(
oc)。 - 安装 SR-IOV Network Operator。
-
以具有
cluster-admin特权的用户身份登录。
流程
创建以下
SriovNetworkNodePolicy对象,然后在mlx-rdma-node-policy.yaml文件中保存 YAML。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如需了解
inSriovNetworkNodePolicy的每个选项的详情,请参阅Configuring SR-IOV network devices部分。当应用由
SriovNetworkNodePolicy对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。应用配置更新后,
openshift-sriov-network-operator命名空间中的所有 pod 将变为Running状态。运行以下命令来创建
SriovNetworkNodePolicy对象:oc create -f mlx-rdma-node-policy.yaml
$ oc create -f mlx-rdma-node-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建以下
SriovNetwork对象,然后在mlx-rdma-network.yaml文件中保存 YAML。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为 ipam CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
注意如需
SriovNetwork中的每个选项的详细说明,请参阅"Configuring SR-IOV additional network" 部分。一个可选的库 app-netutil 提供了多种 API 方法来收集有关容器父 pod 的网络信息。
运行以下命令来创建
SriovNetworkNodePolicy对象:oc create -f mlx-rdma-network.yaml
$ oc create -f mlx-rdma-network.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建以下
Podspec,然后在mlx-rdma-pod.yaml文件中保存 YAML。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定
target_namespace,它与SriovNetwork对象mlx-rdma-network创建于的命令空间相同。如果要在其他命名空间中创建 pod,在Podspec 和SriovNetwork对象中更改target_namespace。 - 2
- 指定包含应用程序和应用程序使用的 RDMA 库的 RDMA 镜像。
- 3
- 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
- 4
- 在
/mnt/huge下将巨页卷挂载到 RDMA pod。巨页卷由 emptyDir 卷类型支持,medium 为Hugepages。 - 5
- 指定 CPU 数量。RDMA pod 通常需要从 kubelet 分配专用 CPU。这可以通过将 CPU Manager 策略设置为
static,并创建带有有保障的QoS 的 pod 来实现。 - 6
- 指定巨页大小
hugepages-1Gi或hugepages-2Mi以及分配给 RDMA pod 的巨页数量。单独配置2Mi和1Gi巨页。配置1Gi巨页需要在节点中添加内核参数。
运行以下命令来创建 RDMA pod:
oc create -f mlx-rdma-pod.yaml
$ oc create -f mlx-rdma-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.10.6. 在 OpenStack 上使用 OVS-DPDK 的集群测试 pod 模板 复制链接链接已复制到粘贴板!
以下 testpmd pod 演示了使用巨页、保留 CPU 和 SR-IOV 端口创建容器。
testpmd pod 示例
21.10.7. 在 OpenStack 上使用 OVS 硬件卸载的集群测试 pod 模板 复制链接链接已复制到粘贴板!
以下 testpmd pod 在 Red Hat OpenStack Platform (RHOSP) 上演示了 Open vSwitch (OVS) 硬件卸载。
testpmd pod 示例
- 1
- 如果您的性能配置集没有命名为
cnf-performance profile,请将该字符串替换为正确的性能配置集名称。
21.11. 使用 pod 级别绑定 复制链接链接已复制到粘贴板!
在 pod 级别的绑定对于启用需要高可用性和更多吞吐量的 pod 内的工作负载至关重要。使用 pod 级别绑定,您可以在内核模式接口上从多个根 I/O 虚拟化(SR-IOV)虚拟功能接口创建绑定接口。SR-IOV 虚拟功能传递到 pod,并附加到内核驱动程序中。
需要 pod 级别绑定的一个场景是从不同物理功能的多个 SR-IOV 虚拟功能创建绑定接口。可以利用主机上的两个不同物理功能创建绑定接口,以便在 pod 级别上实现高可用性。
有关创建 SR-IOV 网络、网络策略、网络附加定义和 pod 等任务的指导,请参阅配置 SR-IOV 网络设备。
21.11.1. 从两个 SR-IOV 接口配置绑定接口 复制链接链接已复制到粘贴板!
绑定可让多个网络接口聚合到一个逻辑 "bonded" 接口。绑定 Container Network Interface (Bond-CNI) 将绑定功能引入容器中。
Bond-CNI 可使用单根 I/O 虚拟化 (SR-IOV) 虚拟功能创建,并将它们放在容器网络命名空间中。
OpenShift Container Platform 仅支持使用 SR-IOV 虚拟功能的 Bond-CNI。SR-IOV Network Operator 提供了管理虚拟功能所需的 SR-IOV CNI 插件。不支持其他 CNI 或接口类型。
先决条件
- 必须安装 SR-IOV Network Operator,并配置为获取容器中的虚拟功能。
- 要配置 SR-IOV 接口,必须为每个接口创建一个 SR-IOV 网络和策略。
- SR-IOV Network Operator 根据定义的 SR-IOV 网络和策略,为每个 SR-IOV 接口创建一个网络附加定义。
-
linkState设置为 SR-IOV 虚拟功能的默认值auto。
21.11.1.1. 创建绑定网络附加定义 复制链接链接已复制到粘贴板!
现在,SR-IOV 虚拟功能可用,您可以创建一个绑定网络附加定义。
- 1
- cni-type 始终设置为
bond。 - 2
mode属性指定绑定模式。注意支持的绑定模式有:
-
balance-rr- 0 -
active-backup- 1 -
balance-xor- 2
对于
balance-rr或balance-xor模式,您必须为 SR-IOV 虚拟功能将trust模式设置为on。-
- 3
- active-backup 模式的
failover属性是必需的,必须设为 1。 - 4
linksInContainer=true标志告知 Bond CNI 在容器内找到所需的接口。默认情况下,Bond CNI 会查找主机上的这些接口,该接口无法与 SRIOV 和 Multus 集成。- 5
links部分定义将用于创建绑定的接口。默认情况下,Multus 将附加的接口命名为 "net",再加上一个连续的数字。
21.11.1.2. 使用绑定接口创建 pod 复制链接链接已复制到粘贴板!
使用名为 example
podbonding.yaml的 YAML 文件创建 pod 来测试设置,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 注意网络注解:它包含两个 SR-IOV 网络附加,以及一个绑定网络附加。绑定附加使用两个 SR-IOV 接口作为绑定的端口接口。
运行以下命令来应用 yaml:
oc apply -f podbonding.yaml
$ oc apply -f podbonding.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令检查 pod 接口:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果在 pod 注解中没有配置接口名称,接口名称会自动分配为
net<n>,其中<n>以1开始。可选: 如果要为 example
bond0设置一个特定的接口名称,请编辑k8s.v1.cni.cncf.io/networks注解,并将bond0设为接口名称,如下所示:annotations: k8s.v1.cni.cncf.io/networks: demo/sriovnet1, demo/sriovnet2, demo/bond-net1@bond0annotations: k8s.v1.cni.cncf.io/networks: demo/sriovnet1, demo/sriovnet2, demo/bond-net1@bond0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.12. 配置硬件卸载 (offloading) 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在兼容节点上配置硬件卸载,以提高数据处理性能并减少主机 CPU 的负载。
21.12.1. 关于硬件卸载 复制链接链接已复制到粘贴板!
Open vSwitch 硬件卸载是一种处理网络任务的方法,方法是将它们从 CPU 中分离出来,并将它们卸载到网络接口控制器上的专用处理器。因此,集群可从更快的数据传输速度、CPU 工作负载减少并降低计算成本中受益。
此功能的关键元素是网络接口控制器的现代类,称为 SmartNIC。SmartNIC 是一个网络接口控制器,它可以处理计算密集型网络处理任务。与专用图形卡可提高图形性能的方式相同,T SmartNIC 可改进网络性能。在各个情形中,专用处理器提高了特定类型的处理任务的性能。
在 OpenShift Container Platform 中,您可以为具有兼容 SmartNIC 的裸机节点配置硬件卸载。SR-IOV Network Operator 配置并启用硬件卸载。
硬件卸载并不适用于所有工作负载或应用程序类型。只支持以下两种通信类型:
- pod 到 pod
- Pod 到服务,其中服务是一个由常规 pod 支持的 ClusterIP 服务
在所有情况下,只有在将 pod 和服务分配给具有兼容 SmartNIC 的节点时,硬件卸载才会发生。假设节点上带有硬件卸载的 pod 会尝试与常规节点上的服务进行通信。常规节点上,所有处理都会在内核中进行,因此 pod 到服务通信的整体性能仅限于该常规节点的最大性能。硬件卸载与 DPDK 应用程序不兼容。
在节点上启用硬件卸载,但没有配置 pod 使用,可能会导致 pod 流量的吞吐量性能降低。您无法为 OpenShift Container Platform 管理的 pod 配置硬件卸载。
21.12.2. 支持的设备 复制链接链接已复制到粘贴板!
在以下网络接口控制器上支持硬件卸载:
| 制造商 | model | 供应商 ID | 设备 ID |
|---|---|---|---|
| Mellanox | MT27800 系列 [ConnectX-5] | 15b3 | 1017 |
| Mellanox | MT28880 系列 [ConnectX-5 Ex] | 15b3 | 1019 |
21.12.3. 先决条件 复制链接链接已复制到粘贴板!
- 集群至少有一个裸机带有网络接口控制器,支持进行硬件卸载。
- 已安装 SR-IOV Network Operator。
- 集群使用 OVN-Kubernetes CNI。
-
在 OVN-Kubernetes CNI 配置中,
gatewayConfig.routingViaHost字段被设置为false。
21.12.4. 为硬件卸载配置机器配置池 复制链接链接已复制到粘贴板!
要启用硬件卸载,您必须首先创建一个专用的机器配置池,并将其配置为使用 SR-IOV Network Operator。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。
流程
为您要使用硬件卸载的机器创建机器配置池。
将节点添加到机器配置池。使用池的节点角色标签标记每个节点:
oc label node worker-2 node-role.kubernetes.io/mcp-offloading=""
$ oc label node worker-2 node-role.kubernetes.io/mcp-offloading=""Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要验证是否创建了新池,请运行以下命令:
oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将此机器配置池添加到
SriovNetworkPoolConfig自定义资源中:创建一个文件,如
sriov-pool-config.yaml,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 用于硬件卸载的机器配置池的名称。
应用配置:
oc create -f <SriovNetworkPoolConfig_name>.yaml
$ oc create -f <SriovNetworkPoolConfig_name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意当您应用由
SriovNetworkPoolConfig对象中指定的配置时,SR-IOV Operator 会排空并重启机器配置池中的节点。它可能需要几分钟时间来应用配置更改。
21.12.5. 配置 SR-IOV 网络节点策略 复制链接链接已复制到粘贴板!
您可以通过创建 SR-IOV 网络节点策略来为节点创建 SR-IOV 网络设备配置。要启用硬件卸载,您必须使用值 "switchdev" 定义 .spec.eSwitchMode 字段。
以下流程为带有硬件卸载的网络接口控制器创建 SR-IOV 接口。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。
流程
创建一个文件,如
sriov-node-policy.yaml,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow <.> 自定义资源对象的名称。<.> 必需。
vfio-pci不支持硬件卸载。<.> 必需。应用策略的配置:
oc create -f sriov-node-policy.yaml
$ oc create -f sriov-node-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意当您应用由
SriovNetworkPoolConfig对象中指定的配置时,SR-IOV Operator 会排空并重启机器配置池中的节点。它可能需要几分钟时间来应用配置更改。
21.12.5.1. OpenStack 的 SR-IOV 网络节点策略示例 复制链接链接已复制到粘贴板!
以下示例描述了在 Red Hat OpenStack Platform (RHOSP) 上使用硬件卸载的网络接口控制器 (NIC) 的 SR-IOV 接口。
用于 RHOSP 上带有硬件卸载的 NIC 的 SR-IOV 接口
21.12.6. 创建网络附加定义 复制链接链接已复制到粘贴板!
在定义机器配置池和 SR-IOV 网络节点策略后,您可以为您指定的网络接口卡创建网络附加定义。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您可以使用具有
cluster-admin角色的用户访问集群。
流程
创建一个文件,如
net-attach-def.yaml,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow <.> 网络附加定义的名称。<.> 网络附加定义的命名空间。<.> 在
SriovNetworkNodePolicy对象中指定的spec.resourceName字段的值。应用网络附加定义的配置:
oc create -f net-attach-def.yaml
$ oc create -f net-attach-def.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行以下命令,以查看是否存在新定义:
oc get net-attach-def -A
$ oc get net-attach-def -ACopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAMESPACE NAME AGE net-attach-def net-attach-def 43h
NAMESPACE NAME AGE net-attach-def net-attach-def 43hCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.12.7. 在 pod 中添加网络附加定义 复制链接链接已复制到粘贴板!
创建机器配置池后,SriovNetworkPoolConfig 和 SriovNetworkNodePolicy 自定义资源以及网络附加定义后,您可以通过在 pod 规格中添加网络附加定义来将这些配置应用到 pod。
流程
在 pod 规格中,添加
.metadata.annotations.k8s.v1.cni.cncf.io/networks字段,并为硬件卸载指定您创建的网络附加定义:.... metadata: annotations: v1.multus-cni.io/default-network: net-attach-def/net-attach-def <.>.... metadata: annotations: v1.multus-cni.io/default-network: net-attach-def/net-attach-def <.>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <.> 该值必须是您为硬件卸载而创建的网络附加定义的名称和命名空间。
21.13. 卸载 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
要卸载 SR-IOV Network Operator,您必须删除所有正在运行的 SR-IOV 工作负载,卸载 Operator,并删除 Operator 使用的 webhook。
21.13.1. 卸载 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以卸载 SR-IOV Network Operator。
先决条件
-
可以使用具有
cluster-admin权限的账户访问 OpenShift Container Platform 集群。 - 已安装 SR-IOV Network Operator。
流程
删除所有 SR-IOV 自定义资源(CR):
oc delete sriovnetwork -n openshift-sriov-network-operator --all
$ oc delete sriovnetwork -n openshift-sriov-network-operator --allCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete sriovnetworknodepolicy -n openshift-sriov-network-operator --all
$ oc delete sriovnetworknodepolicy -n openshift-sriov-network-operator --allCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete sriovibnetwork -n openshift-sriov-network-operator --all
$ oc delete sriovibnetwork -n openshift-sriov-network-operator --allCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 按照 "Deleting Operators from a cluster" 部分的说明从集群中移除 SR-IOV Network Operator。
卸载 SR-IOV Network Operator 后,删除在集群中保留的 SR-IOV 自定义资源定义:
oc delete crd sriovibnetworks.sriovnetwork.openshift.io
$ oc delete crd sriovibnetworks.sriovnetwork.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete crd sriovnetworknodepolicies.sriovnetwork.openshift.io
$ oc delete crd sriovnetworknodepolicies.sriovnetwork.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete crd sriovnetworknodestates.sriovnetwork.openshift.io
$ oc delete crd sriovnetworknodestates.sriovnetwork.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete crd sriovnetworkpoolconfigs.sriovnetwork.openshift.io
$ oc delete crd sriovnetworkpoolconfigs.sriovnetwork.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete crd sriovnetworks.sriovnetwork.openshift.io
$ oc delete crd sriovnetworks.sriovnetwork.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete crd sriovoperatorconfigs.sriovnetwork.openshift.io
$ oc delete crd sriovoperatorconfigs.sriovnetwork.openshift.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 SR-IOV Webhook:
oc delete mutatingwebhookconfigurations network-resources-injector-config
$ oc delete mutatingwebhookconfigurations network-resources-injector-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete MutatingWebhookConfiguration sriov-operator-webhook-config
$ oc delete MutatingWebhookConfiguration sriov-operator-webhook-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete ValidatingWebhookConfiguration sriov-operator-webhook-config
$ oc delete ValidatingWebhookConfiguration sriov-operator-webhook-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 SR-IOV Network Operator 命名空间:
oc delete namespace openshift-sriov-network-operator
$ oc delete namespace openshift-sriov-network-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 22 章 OpenShift SDN 默认 CNI 网络供应商 复制链接链接已复制到粘贴板!
22.1. 关于 OpenShift SDN 默认 CNI 网络供应商 复制链接链接已复制到粘贴板!
OpenShift Container Platform 使用软件定义网络 (SDN) 方法来提供一个统一的集群网络,它允许 OpenShift Container Platform 集群中的不同 pod 相互间进行通信。此 pod 网络是由 OpenShift SDN 建立和维护的,它使用 Open vSwitch (OVS) 配置覆盖网络。
22.1.1. OpenShift SDN 网络隔离模式 复制链接链接已复制到粘贴板!
OpenShift SDN 提供三种 SDN 模式来配置 pod 网络:
-
网络策略模式允许项目管理员使用
NetworkPolicy对象配置自己的隔离策略。Network policy 是 OpenShift Container Platform 4.11 的默认模式。 - 多租户模式为 Pod 和服务提供项目级别的隔离。来自不同项目的 Pod 不能与不同项目的 Pod 和服务互相发送或接收数据包。您可以针对项目禁用隔离,允许它将网络流量发送到整个集群中的所有 pod 和服务,并从那些 pod 和服务接收网络流量。
- 子网模式提供一个扁平 pod 网络,每个 pod 都可以与所有其他 pod 和服务通信。网络策略模式提供与子网模式相同的功能。
22.1.2. 支持的默认 CNI 网络供应商功能列表 复制链接链接已复制到粘贴板!
OpenShift Container Platform 为默认的 Container Network Interface (CNI) 网络供应商提供两个支持的选择:OpenShift SDN 和 OVN-Kubernetes。下表总结了这两个网络供应商当前支持的功能:
| 功能 | OpenShift SDN | OVN-Kubernetes |
|---|---|---|
| 出口 IP | 支持 | 支持 |
| Egress 防火墙 [1] | 支持 | 支持 |
| 出口路由器 | 支持 | 支持 [2] |
| 混合网络 | 不支持 | 支持 |
| IPsec 加密 | 不支持 | 支持 |
| IPv6 | 不支持 | 支持 [3] [4] |
| Kubernetes 网络策略 | 支持 | 支持 |
| Kubernetes 网络策略日志 | 不支持 | 支持 |
| 多播 | 支持 | 支持 |
| 硬件卸载 | 不支持 | 支持 |
- 在 OpenShift SDN 中,出口防火墙也称为出口网络策略。这和网络策略出口不同。
- OVN-Kubernetes 的出口路由器仅支持重定向模式。
- IPv6 只在裸机集群中被支持。
- IPv6 单堆栈不支持 Kubernetes NMState。
22.2. 为项目配置出口 IP 复制链接链接已复制到粘贴板!
作为集群管理员,您可以配置 OpenShift SDN Container Network Interface(CNI)集群网络供应商,为项目分配一个或多个出口 IP 地址。
22.2.1. 出口 IP 地址架构设计和实施 复制链接链接已复制到粘贴板!
OpenShift Container Platform 出口 IP 地址功能可确保来自一个或多个命名空间中的一个或多个 pod 的流量具有集群网络之外的服务具有一致的源 IP 地址。
例如,您可能有一个 pod 定期查询托管在集群外服务器上的数据库。要强制对服务器进行访问要求,将数据包过滤设备配置为只允许来自特定 IP 地址的流量。为确保您可以可靠地允许从该特定 pod 访问服务器,您可以为向服务器发出请求的 pod 配置特定的出口 IP 地址。
分配给命名空间的出口 IP 地址与用来向特定目的地发送流量的出口路由器不同。
在一些集群配置中,应用程序 Pod 和入口路由器 pod 在同一个节点上运行。如果您在这种情况下为应用程序项目配置出口 IP 地址,当您向应用程序项目发送请求时,不会使用 IP 地址。
出口 IP 地址作为额外 IP 地址在节点的主网络接口中使用,且必须与节点的主 IP 地址位于同一个子网中。不能为集群中的任何其他节点分配额外的 IP 地址。
不能在任何 Linux 网络配置文件中配置出口 IP 地址,比如 ifcfg-eth0。
22.2.1.1. 平台支持 复制链接链接已复制到粘贴板!
下表概述了对不同平台中的出口 IP 地址功能的支持:
| 平台 | 支持 |
|---|---|
| 裸机 | 是 |
| VMware vSphere | 是 |
| Red Hat OpenStack Platform (RHOSP) | 否 |
| Amazon Web Services (AWS) | 是 |
| Google Cloud Platform (GCP) | 是 |
| Microsoft Azure | 是 |
在 Amazon Web Services(AWS)上置备的集群中不支持使用 EgressIP 功能将出口 IP 地址分配给 control plane 节点。(BZ#2039656)
22.2.1.2. 公共云平台注意事项 复制链接链接已复制到粘贴板!
对于在公共云基础架构上置备的集群,每个节点绝对的 IP 地址会有一个约束。如下公式描述了每个节点的可分配 IP 地址或 IP 容量 上限:
IP capacity = public cloud default capacity - sum(current IP assignments)
IP capacity = public cloud default capacity - sum(current IP assignments)
虽然 Egress IP 功能管理每个节点的 IP 地址容量,但在部署中计划这个约束非常重要。例如,对于在具有 8 个节点的裸机基础架构上安装的集群,您可以配置 150 个出口 IP 地址。但是,如果公共云提供商将 IP 地址容量限制为每个节点 10 个 IP 地址,则可分配 IP 地址总数仅为 80。为了在这个示例中获得相同的 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 地址。
以下示例演示了来自多个公共云提供商上节点的注解。注解被缩进以便于阅读。
AWS 上的 cloud.network.openshift.io/egress-ipconfig 注解示例
GCP 上的 cloud.network.openshift.io/egress-ipconfig 注解示例
以下小节描述了支持公共云环境的 IP 地址容量,用于容量计算。
22.2.1.2.1. Amazon Web Services(AWS)IP 地址容量限制 复制链接链接已复制到粘贴板!
在 AWS 上,IP 地址分配的限制取决于配置的实例类型。如需更多信息,请参阅 每个实例类型的每个网络接口的 IP 地址
22.2.1.2.2. Google Cloud Platform(GCP)IP 地址容量限制 复制链接链接已复制到粘贴板!
在 GCP 中,网络模型通过 IP 地址别名而不是 IP 地址分配来实施额外的节点 IP 地址。但是,IP 地址容量直接映射到 IP 别名容量。
IP 别名分配存在以下容量限制:
- 每个节点,IPv4 和 IPv6 的最大 IP 别名数为 10。
- 对于每个 VPC,IP 别名的最大数量没有被指定,但 OpenShift Container Platform 可扩展性测试显示最大为 15,000 个。
如需更多信息,请参阅 Per instance 配额和 Alias IP 范围概述。
22.2.1.2.3. Microsoft Azure IP 地址容量限制 复制链接链接已复制到粘贴板!
在 Azure 上,IP 地址分配有以下容量限制:
- 对于每个 NIC,对于 IPv4 和 IPv6,可分配 IP 地址的最大数量为 256。
- 对于每个虚拟网络,分配的 IP 地址的最大数量不能超过 65,536。
如需更多信息,请参阅网络限制。
22.2.1.3. 限制 复制链接链接已复制到粘贴板!
将出口 IP 地址与 OpenShift SDN 集群网络供应商搭配使用时会有以下限制:
- 您不能在同一节点上同时使用手动分配和自动分配的出口 IP 地址。
- 如果手动从 IP 地址范围分配出口 IP 地址,则不得将该范围用于自动 IP 分配。
- 您不能使用 OpenShift SDN 出口 IP 地址在多个命名空间间共享出口 IP 地址。
如果您需要在命名空间间共享 IP 地址,则 OVN-Kubernetes 集群网络供应商出口 IP 地址可以在多个命名空间中分散 IP 地址。
如果您以多租户模式使用 OpenShift SDN,则无法将出口 IP 地址与与其关联的项目附加到另一个命名空间的任何命名空间一起使用。例如,如果 project1 和 project2 通过运行 oc adm pod-network join-projects --to=project1 project2 命令被连接,则这两个项目都不能使用出口 IP 地址。如需更多信息,请参阅 BZ#1645577。
22.2.1.4. IP 地址分配方法 复制链接链接已复制到粘贴板!
您可以通过设置 NetNamespace 对象的 egressIPs 参数,将出口 IP 地址分配给命名空间。在出口 IP 地址与项目关联后,OpenShift SDN 允许您以两种方式为主机分配出口 IP 地址:
- 在自动分配方法中,给节点分配一个出口 IP 地址范围。
- 在手动分配方法中,给节点分配包含一个或多个出口 IP 地址的列表。
请求出口 IP 地址的命名空间与可以托管那些出口 IP 地址的节点匹配,然后为那些节点分配出口 IP 地址。如果在 NetNamespace 对象中设置了 egressIPs 参数,但没有节点托管该出口 IP 地址,则会丢弃来自该命名空间的出口流量。
节点高可用性是自动的。如果托管出口 IP 地址的节点不可访问,并且有可以托管那些出口 IP 地址的节点,那么出口 IP 地址将会移到新节点。当无法访问的托管原始出口 IP 地址的节点恢复正常后,出口 IP 地址会自动转移,以在不同节点之间均衡出口 IP 地址。
22.2.1.4.1. 使用自动分配的出口 IP 地址时的注意事项 复制链接链接已复制到粘贴板!
当对出口 IP 地址使用自动分配方法时,请注意以下事项:
-
您可以设置每个节点的
HostSubnet资源的egressCIDRs参数,以指明节点可以托管的出口 IP 地址范围。OpenShift Container Platform 根据您指定的 IP 地址范围设置HostSubnet资源的egressIPs参数。
如果托管命名空间的出口 IP 地址的节点不可访问,OpenShift Container Platform 会将出口 IP 地址重新分配给具有兼容出口 IP 地址范围的另外一个节点。自动分配方法最适合在把额外的 IP 地址与节点进行关联时具有灵活性的环境中安装的集群。
22.2.1.4.2. 使用手动分配出口 IP 地址时的注意事项 复制链接链接已复制到粘贴板!
这种方法允许您控制哪些节点可以托管出口 IP 地址。
如果在公共云基础架构上安装了集群,则必须确保为每个节点分配出口 IP 地址,以便有足够的备用容量来托管 IP 地址。如需更多信息,请参阅上一节中的"平台注意事项"。
当手动分配出口 IP 地址时,请考虑以下事项:
-
您可以设置每个节点的
HostSubnet资源的egressIPs参数,以指明节点可以托管的 IP 地址。 - 支持一个命名空间带有多个出口 IP 地址。
如果命名空间有多个出口 IP 地址,且这些地址托管在多个节点上,则需要考虑以下额外的注意事项:
- 如果 pod 位于托管出口 IP 地址的节点上,则该 pod 始终使用该节点上的出口 IP 地址。
- 如果 pod 不在托管出口 IP 地址的节点上,则该 pod 会随机使用出口 IP 地址。
22.2.2. 为一个命名空间启用自动分配出口 IP 地址 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,可以为一个或多个节点上的特定命名空间启用自动分配出口 IP 地址。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。
流程
使用以下 JSON,用出口 IP 地址更新
NetNamespace资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<project_name>- 指定项目的名称。
<ip_address>-
为
egressIPs数组指定一个或多个出口 IP 地址。
例如,将
project1分配给 IP 地址 192.168.1.100,将project2分配给 IP 地址 192.168.1.101:oc patch netnamespace project1 --type=merge -p \ '{"egressIPs": ["192.168.1.100"]}' oc patch netnamespace project2 --type=merge -p \ '{"egressIPs": ["192.168.1.101"]}'$ oc patch netnamespace project1 --type=merge -p \ '{"egressIPs": ["192.168.1.100"]}' $ oc patch netnamespace project2 --type=merge -p \ '{"egressIPs": ["192.168.1.101"]}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意由于 OpenShift SDN 管理
NetNamespace对象,因此只能通过修改现有的NetNamespace对象来进行更改。不要创建新的NetNamespace对象。使用以下 JSON 设置每一主机的
egressCIDRs参数,以指明哪些节点可以托管出口 IP 地址:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<node_name>- 指定节点名称。
<ip_address_range>-
指定 CIDR 格式的 IP 地址范围。您可以为
egressCIDRs阵列指定多个地址范围。
例如,将
node1和node2设置为托管范围为 192.168.1.0 到 192.168.1.255 的出口 IP 地址:oc patch hostsubnet node1 --type=merge -p \ '{"egressCIDRs": ["192.168.1.0/24"]}' oc patch hostsubnet node2 --type=merge -p \ '{"egressCIDRs": ["192.168.1.0/24"]}'$ oc patch hostsubnet node1 --type=merge -p \ '{"egressCIDRs": ["192.168.1.0/24"]}' $ oc patch hostsubnet node2 --type=merge -p \ '{"egressCIDRs": ["192.168.1.0/24"]}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenShift Container Platform 会自动以均衡的方式将特定的出口 IP 地址分配给可用的节点。在本例中,它会将出口 IP 地址 192.168.1.100 分配给
node1,并将出口 IP 地址 192.168.1.101 分配给node2,或反之。
22.2.3. 为一个命名空间配置手动分配出口 IP 地址 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,您可以将一个或多个出口 IP 与一个项目关联。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。
流程
通过使用所需 IP 地址指定以下 JSON 对象来更新
NetNamespace对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<project_name>- 指定项目的名称。
<ip_address>-
为
egressIPs数组指定一个或多个出口 IP 地址。
例如,将
project1项目分配给 IP 地址192.168.1.100和192.168.1.101:oc patch netnamespace project1 --type=merge \ -p '{"egressIPs": ["192.168.1.100","192.168.1.101"]}'$ oc patch netnamespace project1 --type=merge \ -p '{"egressIPs": ["192.168.1.100","192.168.1.101"]}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要提供高可用性,将
egressIPs值设置为不同节点上的两个或多个 IP 地址。如果设置了多个出口 IP 地址,则 pod 会大致同样使用所有出口 IP 地址。注意由于 OpenShift SDN 管理
NetNamespace对象,因此只能通过修改现有的NetNamespace对象来进行更改。不要创建新的NetNamespace对象。手动将出口 IP 地址分配给节点主机。
如果在公共云基础架构上安装了集群,则必须确认该节点具有可用的 IP 地址容量。
在节点主机上的
HostSubnet对象中设置egressIPs参数。使用以下 JSON,尽可能包含您要分配给该节点主机的 IP 地址:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<node_name>- 指定节点名称。
<ip_address>-
指定一个 IP 地址。您可以为
egressIPs数组指定多个 IP 地址。
例如,指定
node1应具有出口 IP192.168.1.100、192.168.1.101和192.168.1.102:oc patch hostsubnet node1 --type=merge -p \ '{"egressIPs": ["192.168.1.100", "192.168.1.101", "192.168.1.102"]}'$ oc patch hostsubnet node1 --type=merge -p \ '{"egressIPs": ["192.168.1.100", "192.168.1.101", "192.168.1.102"]}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,
project1的所有出口流量都将路由到托管指定出口 IP 地址的节点,然后通过网络地址转换(NAT)连接到那个 IP 地址。
22.2.4. 其他资源 复制链接链接已复制到粘贴板!
- 如果要配置手动出口 IP 地址分配,请参阅平台考虑 与 IP 容量规划相关的信息。
22.3. 为项目配置出口防火墙 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为项目创建一个出口防火墙,用于限制离开 OpenShift Container Platform 集群的出口流量。
22.3.1. 出口防火墙在一个项目中的工作原理 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用一个出口防火墙来限制集群内的一些 pod 或所有 pod 可以访问的外部主机。出口防火墙适用于以下情况:
- pod 只能连接到内部主机,且无法启动到公共互联网的连接。
- pod 只能连接到公共互联网,且无法启动到 OpenShift Container Platform 集群以外的内部主机的连接。
- pod 无法访问 OpenShift Container Platform 集群外的特定内部子网或主机。
- pod 只能连接到特定的外部主机。
例如,您可以允许某一个项目访问指定的 IP 范围,但拒绝其他项目对同一 IP 范围的访问。或者您可以限制应用程序开发人员从 Python pip 的镜像点进行更新,并强制要求更新只能来自于批准的源。
出口防火墙不适用于主机网络命名空间。启用主机网络的 Pod 不受出口防火墙规则的影响。
您可以通过创建一个 EgressNetworkPolicy 自定义资源(CR)对象来配置出口防火墙策略。出口防火墙与满足以下任一条件的网络流量匹配:
- CIDR 格式的 IP 地址范围
- 解析为 IP 地址的 DNS 名称
如果您的出口防火墙包含 0.0.0.0/0 的拒绝规则,则阻止访问 OpenShift Container Platform API 服务器。为确保 pod 可以访问 OpenShift Container Platform API 服务器,您必须包含内置加入 Open Virtual Network(OVN)的网络 100.64.0.0/16 网络,以便在将节点端口与 EgressFirewall 搭配使用时允许访问。您还必须包含 API 服务器在出口防火墙规则中侦听的 IP 地址范围,如下例所示:
要查找 API 服务器的 IP 地址,请运行 oc get ep kubernetes -n default。
如需更多信息,请参阅 BZ#1988324。
您必须将 OpenShift SDN 配置为使用网络策略或多租户模式来配置出口防火墙。
如果您使用网络策略模式,则出口防火墙只与每个命名空间的一个策略兼容,且无法用于共享网络的项目,如全局项目。
出口防火墙规则不适用于通过路由器的网络流量。任何有权创建 Route CR 对象的用户,都可以通过创建指向禁止的目的地的路由来绕过出口防火墙策略规则。
22.3.1.1. 出口防火墙的限制 复制链接链接已复制到粘贴板!
出口防火墙有以下限制:
项目不能有多个 EgressNetworkPolicy 对象。
重要允许创建多个 EgressNetworkPolicy 对象,但不应这样做。当您创建多个 EgressNetworkPolicy 对象时,会返回以下信息:
dropping all rules。实际上,所有外部流量都会被丢弃,这可能会给您的组织造成安全风险。- 每个项目最多可定义一个最多具有 1000 个规则的 EgressNetworkPolicy 对象。
-
default项目无法使用出口防火墙。 当在多租户模式下使用 OpenShift SDN 默认 Container Network Interface (CNI) 网络供应商时,会有以下限制:
-
全局项目无法使用出口防火墙。您可以使用
oc adm pod-network make-projects-global把一个项目设置为全局项目。 -
通过
oc adm pod-network join-projects命令合并的项目,无法在任何合并的项目中使用出口防火墙。
-
全局项目无法使用出口防火墙。您可以使用
违反这些限制会导致项目的出口防火墙出现问题。因此,所有外部网络流量都会被丢弃,这可能会给您的组织造成安全风险。
可在 kube-node-lease、kube-public、kube-system、openshift 和 openshift- 项目中创建一个 Egress Firewall 资源。
22.3.1.2. 出口防火墙策略规则的匹配顺序 复制链接链接已复制到粘贴板!
出口防火墙策略规则按照它们定义的顺序来评估,从第一个到最后一个的顺序。第一个与 pod 的出口连接匹配的规则会被应用。该连接会忽略后续的所有规则。
22.3.1.3. 域名服务器 (DNS) 解析如何工作 复制链接链接已复制到粘贴板!
如果您在 egress 防火墙策略规则中使用 DNS 名称,则正确解析域名会受到以下限制:
- 域名更新会根据生存时间(TTL)持续时间进行轮询。默认情况下,持续时间为 30 秒。当出口防火墙控制器查询本地名称服务器以获取域名时,如果响应中包含的 TTL 小于 30 秒,控制器会将持续时间设置为返回的值。如果响应中的 TTL 大于 30 分钟,控制器会将持续时间设置为 30 分钟。如果 TTL 介于 30 秒到 30 分钟之间,控制器会忽略该值,并将持续时间设置为 30 秒。
- 在需要时,pod 必须通过相同的本地名称服务器解析域名。否则,egress 防火墙控制器和 pod 已知的域的 IP 地址可能会有所不同。如果主机名的 IP 地址不同,则出口防火墙的强制实施可能不一致。
- 因为出口防火墙控制器和 pod 异步轮询相同的本地名称服务器,所以 pod 可能会在出口控制器执行前获取更新的 IP 地址,从而导致竞争条件。由于这个限制,仅建议在 EgressNetworkPolicy 对象中使用域名来更改 IP 地址的域。
出口防火墙始终允许 pod 访问 pod 所在的用于 DNS 解析的节点的外部接口。
如果您在出口防火墙策略中使用域名,且您的 DNS 解析不是由本地节点上的 DNS 服务器处理,那么您必须添加出口防火墙规则,允许访问您的 DNS 服务器的 IP 地址。如果您在 pod 中使用域名。
22.3.2. EgressNetworkPolicy 自定义资源 (CR) 对象 复制链接链接已复制到粘贴板!
您可以为出口防火墙定义一个或多个规则。规则是一个 Allow 规则,也可以是一个 Deny 规则,它包括规则适用的流量规格。
以下 YAML 描述了一个 EgressNetworkPolicy CR 对象:
EgressNetworkPolicy 对象
22.3.2.1. EgressNetworkPolicy 规则 复制链接链接已复制到粘贴板!
以下 YAML 描述了一个出口防火墙规则对象。egress 小节需要一个包括一个或多个对象的数组。
出口策略规则小节
egress:
- type: <type>
to:
cidrSelector: <cidr>
dnsName: <dns_name>
egress:
- type: <type>
to:
cidrSelector: <cidr>
dnsName: <dns_name>
22.3.2.2. EgressNetworkPolicy CR 对象示例 复制链接链接已复制到粘贴板!
以下示例定义了几个出口防火墙策略规则:
- 1
- 出口防火墙策略规则对象的集合。
22.3.3. 创建出口防火墙策略对象 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为项目创建一个出口防火墙策略对象。
如果项目已经定义了一个 EgressNetworkPolicy 对象,您必须编辑现有的策略来更改出口防火墙规则。
先决条件
- 使用 OpenShift SDN 默认 Container Network Interface (CNI) 网络供应商插件的集群。
-
安装 OpenShift CLI (
oc) 。 - 您需要使用集群管理员身份登陆到集群。
流程
创建策略规则:
-
创建一个
<policy_name>.yaml文件,其中<policy_name>描述出口策略规则。 - 在您创建的文件中,定义出口策略对象。
-
创建一个
运行以下命令来创建策略对象。将
<policy_name>替换为策略的名称,<project>替换为规则应用到的项目。oc create -f <policy_name>.yaml -n <project>
$ oc create -f <policy_name>.yaml -n <project>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例中,在名为
project1的项目中创建一个新的 EgressNetworkPolicy 对象:oc create -f default.yaml -n project1
$ oc create -f default.yaml -n project1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
egressnetworkpolicy.network.openshift.io/v1 created
egressnetworkpolicy.network.openshift.io/v1 createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
可选:保存
<policy_name>.yaml文件,以便在以后进行修改。
22.4. 为项目编辑出口防火墙 复制链接链接已复制到粘贴板!
作为集群管理员,您可以修改现有出口防火墙的网络流量规则。
22.4.1. 查看 EgressNetworkPolicy 对象 复制链接链接已复制到粘贴板!
您可以查看集群中的 EgressNetworkPolicy 对象。
先决条件
- 使用 OpenShift SDN 默认 Container Network Interface (CNI) 网络供应商插件的集群。
-
安装 OpenShift 命令行界面 (CLI),通常称为
oc。 - 您必须登录集群。
流程
可选: 要查看集群中定义的 EgressNetworkPolicy 对象的名称,请输入以下命令:
oc get egressnetworkpolicy --all-namespaces
$ oc get egressnetworkpolicy --all-namespacesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要检查策略,请输入以下命令。将
<policy_name>替换为要检查的策略名称。oc describe egressnetworkpolicy <policy_name>
$ oc describe egressnetworkpolicy <policy_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
22.5. 为项目编辑出口防火墙 复制链接链接已复制到粘贴板!
作为集群管理员,您可以修改现有出口防火墙的网络流量规则。
22.5.1. 编辑 EgressNetworkPolicy 对象 复制链接链接已复制到粘贴板!
作为集群管理员,您可以更新一个项目的出口防火墙。
先决条件
- 使用 OpenShift SDN 默认 Container Network Interface (CNI) 网络供应商插件的集群。
-
安装 OpenShift CLI (
oc) 。 - 您需要使用集群管理员身份登陆到集群。
流程
查找项目的 EgressNetworkPolicy 对象的名称。将
<project>替换为项目的名称。oc get -n <project> egressnetworkpolicy
$ oc get -n <project> egressnetworkpolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选,如果您在创建出口网络防火墙时没有保存 EgressNetworkPolicy 对象的副本,请输入以下命令来创建副本。
oc get -n <project> egressnetworkpolicy <name> -o yaml > <filename>.yaml
$ oc get -n <project> egressnetworkpolicy <name> -o yaml > <filename>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<project>替换为项目的名称。将<name>替换为 Pod 的名称。将<filename>替换为要将 YAML 保存到的文件的名称。更改了策略规则后,请输入以下命令替换 EgressNetworkPolicy 对象。将
<filename>替换为包含更新的 EgressNetworkPolicy 对象的文件名称。oc replace -f <filename>.yaml
$ oc replace -f <filename>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
22.6. 从项目中删除出口防火墙 复制链接链接已复制到粘贴板!
作为集群管理员,您可以从项目中删除出口防火墙,从而删除对项目的离开 OpenShift Container Platform 集群的网络流量的限制。
22.6.1. 删除 EgressNetworkPolicy 对象 复制链接链接已复制到粘贴板!
作为集群管理员,您可以从项目中删除出口防火墙。
先决条件
- 使用 OpenShift SDN 默认 Container Network Interface (CNI) 网络供应商插件的集群。
-
安装 OpenShift CLI (
oc) 。 - 您需要使用集群管理员身份登陆到集群。
流程
查找项目的 EgressNetworkPolicy 对象的名称。将
<project>替换为项目的名称。oc get -n <project> egressnetworkpolicy
$ oc get -n <project> egressnetworkpolicyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令删除 EgressNetworkPolicy 对象。将
<project>替换为项目名称,<name>替换为对象名称。oc delete -n <project> egressnetworkpolicy <name>
$ oc delete -n <project> egressnetworkpolicy <name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
22.7. 使用出口路由器 pod 的注意事项 复制链接链接已复制到粘贴板!
22.7.1. 关于出口路由器 pod 复制链接链接已复制到粘贴板!
OpenShift Container Platform 出口路由器(egress router ) pod 使用一个来自专用的私有源 IP 地址,将网络流量重定向到指定的远程服务器。出口路由器 pod 可以将网络流量发送到设置为仅允许从特定 IP 地址访问的服务器。
出口路由器 pod 并不适用于所有外向的连接。创建大量出口路由器 pod 可能会超过您的网络硬件的限制。例如,为每个项目或应用程序创建出口路由器 pod 可能会导致,在转换为使用软件来进行 MAC 地址过滤前超过了网络接口可以处理的本地 MAC 地址的数量。
出口路由器镜像与 Amazon AWS、Azure Cloud 或其他不支持第 2 层操作的云平台不兼容,因为它们与 macvlan 流量不兼容。
22.7.1.1. 出口路由器模式 复制链接链接已复制到粘贴板!
在重定向模式中,出口路由器 Pod 配置 iptables 规则,将流量从其自身 IP 地址重定向到一个或多个目标 IP 地址。需要使用保留源 IP 地址的客户端 pod 必须配置为访问出口路由器的服务,而不是直接连接到目标 IP。您可以使用 curl 命令从应用程序 pod 访问目标服务和端口。例如:
curl <router_service_IP> <port>
$ curl <router_service_IP> <port>
在 HTTP 代理模式 中,出口路由器 pod 作为一个 HTTP 代理在端口 8080 上运行。这个模式只适用于连接到基于 HTTP 或基于 HTTPS 服务的客户端,但通常需要较少的更改就可以使客户端 pod 正常工作。很多程序可以通过设置环境变量来使用 HTTP 代理服务器。
在 DNS 代理模式 中,出口路由器 pod 作为基于 TCP 服务的 DNS 代理运行,将其自身的 IP 地址转换到一个或多个目标 IP 地址。要使用保留的源 IP 地址,客户端 pod 必须进行修改来连接到出口路由器 pod,而不是直接连接到目标 IP 地址。此修改确保了外部的目的地将流量视为来自一个已知源的流量。
重定向模式可用于除 HTTP 和 HTTPS 以外的所有服务。对于 HTTP 和 HTTPS 服务,请使用 HTTP 代理模式。对于使用 IP 地址或域名的基于 TCP 的服务,请使用 DNS 代理模式。
22.7.1.2. 出口路由器 pod 的实现 复制链接链接已复制到粘贴板!
出口路由器 pod 的设置由一个初始化容器执行。该容器在特权环境中运行,以便可以配置 macvlan 接口并设置 iptables 规则。在初始化容器完成设置 iptables 规则后会退出。接下来,出口路由器 pod 会执行容器来处理出口路由器流量。取决于出口路由器的模式,所使用的镜像会有所不同。
环境变量决定 egress-router 镜像使用的地址。镜像将 macvlan 接口配置为使用 EGRESS_SOURCE 作为其 IP 地址,并将 EGRESS_GATEWAY 作为网关的 IP 地址。
网络地址转换(NAT)规则被设置,使任何到 TCP 或 UDP 端口上的 pod 的集群 IP 地址的连接被重新指向由 EGRESS_DESTINATION 变量指定的 IP 地址的同一端口。
如果集群中只有部分节点能够声明指定的源 IP 地址并使用指定的网关,您可以指定一个 nodeName 或 nodeSelector 来表示哪些节点可以接受。
22.7.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>
$ openstack port set --allowed-address \ ip_address=<ip_address>,mac_address=<mac_address> <neutron_port_uuid>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Red Hat Virtualization(RHV)
- 如果使用 RHV,必须为虚拟网络接口控制器 (vNIC) 选择 No Network Filter。
- VMware vSphere
- 如果您使用 VMware vSphere,请参阅 VMware 文档来保护 vSphere 标准交换机。通过从 vSphere Web 客户端中选择主机虚拟交换机来查看并更改 VMware vSphere 默认设置。
具体来说,请确保启用了以下功能:
22.7.1.4. 故障切换配置 复制链接链接已复制到粘贴板!
为了避免停机,可以使用 Deployment 资源部署出口路由器 pod,如下例所示。要为示例部署创建新 Service 对象,使用 oc expose deployment/egress-demo-controller 命令。
22.8. 以重定向模式部署出口路由器 pod 复制链接链接已复制到粘贴板!
作为集群管理员,您可以部署一个出口路由器 pod,该 pod 被配置为将流量重新定向到指定的目的地 IP 地址。
22.8.1. 重定向模式的出口路由器 pod 规格 复制链接链接已复制到粘贴板!
为 Pod 对象中的一个出口路由器 pod 定义其配置。以下 YAML 描述了以重定向模式配置出口路由器 pod 的字段:
- 1
- 该注解告知 OpenShift Container Platform 在主网络接口控制器(NIC)上创建 macvlan 网络接口,并将 macvlan 接口移到 pod 的网络命名空间。您必须把
"true"值包括在引号中。要让 OpenShift Container Platform 在不同的 NIC 接口上创建 macvlan 接口,请将注解值设置为该接口的名称。例如:eth1。 - 2
- 保留给出口路由器 pod 使用的物理网络的 IP 地址。可选:您可以包括子网长度(
/24后缀),以便正确路由到本地子网。如果没有指定子网长度,则出口路由器只能访问使用EGRESS_GATEWAY变量指定的主机,且子网上没有其他主机。 - 3
- 值与节点使用的默认网关相同。
- 4
- 将流量定向到的外部服务器。使用这个示例,连接到 pod 流量被重新定向到
203.0.113.25,源 IP 地址为192.168.12.99。
出口路由器 pod 规格示例
22.8.2. 出口目的地配置格式 复制链接链接已复制到粘贴板!
当出口路由器 pod 被部署为重定向模式时,您可以使用以下一种或多种格式指定重定向规则:
-
<port> <protocol> <ip_address>- 到给定<port>的内向连接应该被重新定向到给定<ip_address>上的同一端口。<protocol>可以是tcp或udp。 -
<port> <protocol> <ip_address> <remote_port>- 和以上一样,除了连接被重新定向到<ip_address>上的一个不同的<remote_port>中。 -
<ip_address>- 如果最后一行是一个 IP 地址,那么其它端口上的所有连接都会被重新指向那个 IP 地址的对应端口。如果没有故障切换 IP 地址,则其它端口上的连接将被拒绝。
在示例中定义了几个规则:
-
第一行将流量从本地端口
80重定向到203.0.113.25的端口80。 -
第二行和第三行将本地端口
8080和8443重定向到203.0.113.26的远程端口80和443。 - 最后一行与之前规则中没有指定的端口的流量匹配。
配置示例
80 tcp 203.0.113.25 8080 tcp 203.0.113.26 80 8443 tcp 203.0.113.26 443 203.0.113.27
80 tcp 203.0.113.25
8080 tcp 203.0.113.26 80
8443 tcp 203.0.113.26 443
203.0.113.27
22.8.3. 以重定向模式部署出口路由器 pod 复制链接链接已复制到粘贴板!
在重定向模式中,出口路由器 pod 会设置 iptables 规则将流量从其自身 IP 地址重定向到一个或多个目标 IP 地址。需要使用保留源 IP 地址的客户端 pod 必须配置为访问出口路由器的服务,而不是直接连接到目标 IP。您可以使用 curl 命令从应用程序 pod 访问目标服务和端口。例如:
curl <router_service_IP> <port>