配置网络设置
OpenShift Container Platform 中的常规网络配置过程
摘要
第 1 章 使用调优插件配置系统控制和接口属性 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 在运行时修改内核参数和接口属性,您可以使用调优 Container Network Interface (CNI)元插件。该插件在带有主 CNI 插件的链中运行,并允许您更改 sysctl 和接口属性,如 promiscuous 模式、all-multicast 模式、MTU 和 MAC 地址。
1.1. 使用 tuning CNI 配置系统控制 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 中配置接口级网络 sysctl,您可以在网络附加定义中使用 tuning CNI meta 插件。配置 net.ipv4.conf.IFNAME.accept_redirects sysctl,以启用接受和发送 ICMP 重定向的数据包。
流程
使用以下内容创建网络附加定义,如
tuning-example.yaml:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: <name> namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "<name>", "plugins": [{ "type": "<main_CNI_plugin>" }, { "type": "tuning", "sysctl": { "net.ipv4.conf.IFNAME.accept_redirects": "1" } } ] }其中:
metadata.name- 指定要创建的额外网络附加的名称。名称在指定的命名空间中必须是唯一的。
metadata.namespace- 指定与对象关联的命名空间。
spec.config.cniVersion- 指定 CNI 规格版本。
spec.config.name- 指定配置的名称。建议您将配置名称与网络附加定义的 name 值匹配。
spec.config.plugins.type- 指定要配置的主 CNI 插件的名称。
spec.config.plugins.tuning.sysctl-
指定要设置的 sysctl。接口名称由
IFNAME令牌表示,并替换为运行时接口的实际名称。
网络附加定义示例
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: tuningnad namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "tuningnad", "plugins": [{ "type": "bridge" }, { "type": "tuning", "sysctl": { "net.ipv4.conf.IFNAME.accept_redirects": "1" } } ] }'运行以下命令来应用 YAML:
$ oc apply -f tuning-example.yaml输出示例
networkattachmentdefinition.k8.cni.cncf.io/tuningnad created使用类似以下示例的网络附加定义,创建示例
pod.yaml:apiVersion: v1 kind: Pod metadata: name: tunepod namespace: default annotations: k8s.v1.cni.cncf.io/networks: tuningnad spec: containers: - name: podexample image: centos command: ["/bin/bash", "-c", "sleep INF"] securityContext: runAsUser: 2000 runAsGroup: 3000 allowPrivilegeEscalation: false capabilities: drop: ["ALL"] securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault其中:
metadata.annotations.k8s.v1.cni.cncf.io/networks-
指定配置的
NetworkAttachmentDefinition的名称。 spec.containers.securityContext.runAsUser- 指定容器使用哪个用户 ID。
spec.containers.securityContext.runAsGroup- 指定容器使用哪个主要组 ID。
spec.containers.securityContext.allowPrivilegeEscalation-
指定 pod 是否可以请求允许特权升级。如果未指定,则默认为 true。这个布尔值直接控制在容器进程中是否设置了
no_new_privs标志。 spec.containers.securityContext.capabilities- 指定特权操作,而不提供完整的 root 访问权限。此策略可确保从 pod 中丢弃了所有功能。
spec.securityContext.runAsNonRoot: true- 指定容器将使用任何 UID 为 0 的用户运行。
spec.securityContext.seccompProfile- 指定 pod 或容器工作负载的默认 seccomp 配置集。
运行以下命令来应用 yaml:
$ oc apply -f examplepod.yaml运行以下命令验证 pod 是否已创建:
$ oc get pod输出示例
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47s运行以下命令登录到 pod:
$ oc rsh tunepod验证配置的 sysctl 标记的值。例如,通过运行以下命令查找
net.ipv4.conf.net1.accept_redirects的值:sh-4.4# sysctl net.ipv4.conf.net1.accept_redirects预期输出
net.ipv4.conf.net1.accept_redirects = 1
1.2. 使用调优 CNI 启用 all-multicast 模式 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 中的网络接口上启用全多播模式,您可以在网络附加定义中使用 tuning Container Network Interface (CNI) meta 插件。启用后,接口会接收网络上的所有多播数据包。
流程
使用以下内容创建网络附加定义,如
tuning-example.yaml:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: <name> namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "<name>", "plugins": [{ "type": "<main_CNI_plugin>" }, { "type": "tuning", "allmulti": true } } ] }其中:
<name>- 指定要创建的额外网络附加的名称。名称在指定的命名空间中必须是唯一的。
default- 指定与对象关联的命名空间。
"0.4.0"- 指定 CNI 规格版本。
"<name>"- 指定配置的名称。将配置名称与网络附加定义的 name 值匹配。
"<main_CNI_plugin>"- 指定要配置的主 CNI 插件的名称。
"tuning"- 指定 CNI meta 插件的名称。
"true"- 指定接口的全多播模式。如果启用,接口将接收网络上的所有多播数据包。
网络附加定义示例
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: setallmulti namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "setallmulti", "plugins": [ { "type": "bridge" }, { "type": "tuning", "allmulti": true } ] }'运行以下命令应用 YAML 文件中指定的设置:
$ oc apply -f tuning-allmulti.yaml输出示例
networkattachmentdefinition.k8s.cni.cncf.io/setallmulti created使用类似以下
examplepod.yaml文件中指定的网络附加定义创建 pod :apiVersion: v1 kind: Pod metadata: name: allmultipod namespace: default annotations: k8s.v1.cni.cncf.io/networks: setallmulti spec: containers: - name: podexample image: centos command: ["/bin/bash", "-c", "sleep INF"] securityContext: runAsUser: 2000 runAsGroup: 3000 allowPrivilegeEscalation: false capabilities: drop: ["ALL"] securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault其中:
metadata.annotations.k8s.v1.cni.cncf.io/networks-
指定配置的
NetworkAttachmentDefinition的名称。 spec.containers.securityContext.runAsUser- 指定容器使用哪个用户 ID。
spec.containers.securityContext.runAsGroup- 指定容器使用哪个主要组 ID。
spec.containers.securityContext.allowPrivilegeEscalation-
指定 pod 是否可以请求允许特权升级。如果未指定,则默认为 true。这个布尔值直接控制在容器进程中是否设置了
no_new_privs标志。 spec.containers.securityContext.capabilities- 指定特权操作,而不提供完整的 root 访问权限。此策略可确保从 pod 中丢弃了所有功能。
spec.containers.securityContext.runAsNonRoot: true- 指定容器将使用任何 UID 为 0 的用户运行。
spec.containers.securityContext.seccompProfile- 指定 pod 或容器工作负载的默认 seccomp 配置集。
运行以下命令应用 YAML 文件中指定的设置:
$ oc apply -f examplepod.yaml运行以下命令验证 pod 是否已创建:
$ oc get pod输出示例
NAME READY STATUS RESTARTS AGE allmultipod 1/1 Running 0 23s运行以下命令登录到 pod:
$ oc rsh allmultipod运行以下命令,列出与 pod 关联的所有接口:
sh-4.4# ip link输出示例
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8901 qdisc noqueue state UP mode DEFAULT group default link/ether 0a:58:0a:83:00:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0 3: net1@if24: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether ee:9b:66:a4:ec:1d brd ff:ff:ff:ff:ff:ff link-netnsid 0其中:
eth0@if22- 指定主接口。
net1@if24- 指定使用支持 all-multicast 模式(ALLMULTI 标志)的 network-attachment-definition 配置的二级接口。
第 2 章 配置节点端口服务范围 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 中满足集群节点端口要求,您可以在安装过程中配置节点端口服务范围或在安装后扩展它。您可以在两端扩展默认范围 30000-32768,并在您的新配置中保留此默认范围。
红帽没有在默认的端口范围 30000-32768 之外执行测试。对于默认端口范围以外的范围,请确保测试以验证扩展节点端口范围不会影响您的集群。特别是,请确保存在:
- 不与主机进程已经使用的任何端口重叠
- 没有与已经由使用主机网络配置的 pod 使用的端口重叠
如果您扩展范围和端口分配问题,请创建新集群并为其设置所需的范围。
如果扩展节点端口范围和 OpenShift CLI (oc)会停止工作,因为端口与 OpenShift Container Platform API 服务器冲突,您必须创建新集群。
2.1. 扩展节点端口范围 复制链接链接已复制到粘贴板!
要在安装后扩展 OpenShift Container Platform 集群的节点端口范围,您可以使用 oc patch 命令更新 serviceNodePortRange 参数。您可以在两端扩展范围,但在安装后无法缩小它。
红帽没有在默认的端口范围 30000-32768 之外执行测试。对于默认端口范围以外的范围,请确保测试以验证扩展节点端口范围是否不会影响您的集群。如果您扩展范围和端口分配问题,请创建新集群并为其设置所需的范围。
在扩展 serviceNodePortRange 参数时,请确保为该参数设置的值不会与内核的临时端口范围 net.ipv4.ip_local_port_range 重叠。
OVN-Kubernetes 使用此临时范围进行出站 pod 流量上的源网络地址转换(SNAT)源端口选择。当 SNAT 源端口与节点端口号冲突时,返回的流量可能会错误路由,从而导致出站 TCP 连接超时。
如需更多信息,请参阅附加资源部分中的 "安全和不安全 sysctl"。
先决条件
-
已安装 OpenShift CLI (
oc)。 -
以具有
cluster-admin权限的用户身份登录集群。 -
您确保集群基础架构允许访问扩展范围中存在的端口。例如,如果您将节点端口范围扩展到
30000-32900,您的防火墙或数据包过滤配置必须允许包含端口范围30000-32900。
流程
要扩展集群用来管理 pod 流量的
network.config.openshift.io对象中的serviceNodePortRange参数的范围,请输入以下命令:$ oc patch network.config.openshift.io cluster --type=merge -p \ '{ "spec": { "serviceNodePortRange": "<port_range>" } }'其中:
<port_range>-
指定扩展的范围,如
30000-32900。
提示您还可以应用以下 YAML 来更新节点端口范围:
apiVersion: config.openshift.io/v1 kind: Network metadata: name: cluster spec: serviceNodePortRange: "<port_range>" # ...输出示例
network.config.openshift.io/cluster patched
验证
要确认更新的配置处于活跃状态,请输入以下命令。应用更新可能需要几分钟时间。
$ oc get configmaps -n openshift-kube-apiserver config \ -o jsonpath="{.data['config\.yaml']}" | \ grep -Eo '"service-node-port-range":["[[:digit:]]+-[[:digit:]]+"]'输出示例
"service-node-port-range":["30000-32900"]
第 3 章 配置集群网络范围 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 中扩展集群网络范围以支持更多节点和 IP 地址,您可以在集群安装后修改集群网络 CIDR 掩码。此流程需要 OVN-Kubernetes 网络插件,并为额外的节点提供更多 IP 空间。
例如,如果您部署了集群,并将 10.128.0.0/19 指定为集群网络范围,主机前缀为 23,则限制为 16 个节点。您可以通过将集群中的 CIDR 掩码更改为 /14 来扩展到 510 个节点。
修改集群网络 IP 地址范围时会有以下限制:
- 指定的 CIDR 掩码大小必须总是小于当前配置的 CIDR 掩码大小,因为您只能向已安装的集群添加更多节点来增加 IP 空间
- 无法修改主机前缀
- 使用覆盖默认网关配置的 Pod 必须在集群网络扩展后重新创建
3.1. 扩展集群网络 IP 地址范围 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 中扩展集群网络 IP 地址范围来支持更多节点,您可以使用 oc patch 命令修改集群网络 CIDR 掩码。
这个更改需要在集群中推出新的 Operator 配置,且最多可能需要 30 分钟才能生效。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
已使用具有
cluster-admin权限的用户登陆到集群。 - 确保集群使用 OVN-Kubernetes 网络插件。
流程
要获取集群的集群网络范围和主机前缀,请输入以下命令:
$ oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.clusterNetwork}"输出示例
[{"cidr":"10.217.0.0/22","hostPrefix":23}]要扩展集群网络 IP 地址范围,请输入以下命令。使用上一命令输出返回的 CIDR IP 地址范围和主机前缀。
$ oc patch Network.config.openshift.io cluster --type='merge' --patch \ '{ "spec":{ "clusterNetwork": [ {"cidr":"<network>/<cidr>","hostPrefix":<prefix>} ], "networkType": "OVNKubernetes" } }'其中:
<network>-
指定您在上一步中获取的
cidr字段的网络部分。您无法更改这个值。 <cidr>-
指定网络前缀长度。例如,
14。将此值更改为比上一步中的输出值小的值,以扩展集群网络范围。 <prefix>-
指定集群的当前主机前缀。这个值必须与您在上一步中获取的
hostPrefix字段的值相同。
示例命令
$ oc patch Network.config.openshift.io cluster --type='merge' --patch \ '{ "spec":{ "clusterNetwork": [ {"cidr":"10.217.0.0/14","hostPrefix": 23} ], "networkType": "OVNKubernetes" } }'输出示例
network.config.openshift.io/cluster patched要确认配置是活跃的,请输入以下命令。可能需要 30 分钟才能使此更改生效。
$ oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.clusterNetwork}"输出示例
[{"cidr":"10.217.0.0/14","hostPrefix":23}]
第 4 章 配置 IP 故障转移 复制链接链接已复制到粘贴板!
要为虚拟 IP 地址提供高可用性,并确保当节点在 OpenShift Container Platform 中出现故障时,可以使用 Keepalived 配置 IP 故障切换。
IP 故障转移使用 Keepalived 在一组主机上托管一组外部访问的虚拟 IP (VIP) 地址。每个 VIP 地址仅由单个主机提供服务。Keepalived 使用虚拟路由器冗余协议(VRRP)决定在主机集合中使用哪个主机提供 VIP 服务。如果主机不可用,或者 Keepalived 正在监视的服务没有响应,则 VIP 会切换到主机集中的另外一个主机。这意味着只要主机可用,便始终可以提供 VIP 服务。
集合中的每个 VIP 都由从集合中选择的节点提供服务。如果单个节点可用,则会提供 VIP。无法将 VIP 显式分发到节点上,因此可能存在没有 VIP 的节点和其他具有多个 VIP 的节点。如果只有一个节点,则所有 VIP 都在其中。
管理员必须确保所有 VIP 地址都满足以下要求:
- 可在集群外部配置的主机上访问。
- 不用于集群中的任何其他目的。
每个节点上的 keepalived 确定所需服务是否在运行。如果是,则支持 VIP,Keepalived 参与协商来确定哪个节点服务 VIP。对于要参与的节点,服务必须侦听 VIP 上的观察端口,或者必须禁用检查。
集合中的每个 VIP 都可以由不同的节点提供。
IP 故障转移会监控每个 VIP 上的端口,以确定该端口能否在节点上访问。如果端口无法访问,则不会向节点分配 VIP。如果端口设为 0,则会禁止此检查。检查脚本执行所需的测试。
当运行 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。设置 NodePort 是一个特权操作。
在服务定义中使用外部 IP 时,VIP 被设置为外部 IP,IP 故障转移监控端口则设为服务端口。在使用节点端口时,该端口在集群的每个节点上打开,服务则从当前服务于 VIP 的任何节点对流量进行负载平衡。在这种情况下,IP 故障转移监控端口在服务定义中设置为 NodePort。
即使一个服务 VIP 具有高可用性,但性能仍会受到影响。keepalived 确保每个 VIP 都由配置中的某个节点提供服务,即使其他节点没有,也可以在同一节点上出现多个 VIP。当 IP 故障转移在同一节点上放置多个 VIP 时,在一组 VIP 间进行外部负载平衡的策略可能会被破解。
当使用 ExternalIP 时,您可以将 IP 故障转移设置为与 ExternalIP 范围相同的 VIP 范围。您还可以禁用监控端口。在这种情况下,所有 VIP 都出现在集群中的同一节点上。任何用户都可以使用 ExternalIP 设置服务并使其高度可用。
集群中最多有 254 个 VIP。
4.1. IP 故障转移环境变量 复制链接链接已复制到粘贴板!
IP 故障转移环境变量引用列出了您可以在 OpenShift Container Platform 中配置 IP 故障切换的所有变量,包括 VIP 地址、监控端口和网络接口。
| 变量名称 | default | 描述 |
|---|---|---|
|
|
|
IP 故障转移 pod 会尝试在每个虚拟 IP(VIP)上打开到此端口的 TCP 连接。如果建立连接,则服务将被视为正在运行。如果此端口设为 |
|
|
IP 故障转移用于发送虚拟路由器冗余协议 (VRRP) 流量的接口名称。默认值为
如果您的集群使用 OVN-Kubernetes 网络插件,请将此值设置为 | |
|
|
|
要创建的副本数。这必须与 IP 故障转移部署配置中的 |
|
|
要复制的 IP 地址范围列表。必须提供.例如, | |
|
|
|
用于设置虚拟路由器 ID 的偏移值。使用不同的偏移值可以在同一集群中存在多个 IP 故障转移配置。默认偏移值为 |
|
|
为 VRRP 创建的组数量。如果没有设置,则会为通过 | |
|
| 输入 |
iptables 链的名称,用于自动添加允许 VRRP 流量的 |
|
| 定期运行的脚本的 pod 文件系统中的完整路径名称,以验证应用是否正在运行。 | |
|
|
| 检查脚本运行的期间(以秒为单位)。 |
|
| 当状态发生变化时运行的脚本的 pod 文件系统的完整路径名称。 | |
|
|
|
处理新的具有更高优先级主机的策略。 |
4.2. 在集群中配置 IP 故障切换 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 集群中配置 IP 故障转移并为虚拟 IP 地址提供高可用性,您可以创建一个在所选节点上运行的 Keepalived 的部署来监控服务并在节点不可用时通过 VIP 失败。
IP 故障转移部署确保故障转移 pod 在符合限制或使用的标签的每个节点上运行。运行 Keepalived 的 pod 可以监控端点,并在第一个节点无法访问服务或端点时使用 Virtual Router Redundancy Protocol (VRRP)从一个节点切换到另一个节点。
对于生产环境,设置一个选择器(selector),用于选择至少两个节点,并设置与所选节点数量相等的副本。
先决条件
-
已以具有
cluster-admin权限的用户身份登录集群。 - 您已创建了 pull secret。
仅限 Red Hat OpenStack Platform (RHOSP):
- 您已在目标环境中安装了 RHOSP 客户端(RHCOS 文档)。
-
您已下载了 RHOSP
openrc.shrc 文件(RHCOS 文档)。
流程
创建 IP 故障转移服务帐户:
$ oc create sa ipfailover为
hostNetwork更新安全性上下文约束(SCC):$ oc adm policy add-scc-to-user privileged -z ipfailover$ oc adm policy add-scc-to-user hostnetwork -z ipfailover仅限 Red Hat OpenStack Platform (RHOSP):完成以下步骤,使在 RHOSP 端口上可以访问故障转移 VIP 地址。
使用 RHOSP CLI 在 RHOSP 集群的
allowed_address_pairs参数中显示默认的 RHOSP API 和 VIP 地址:$ openstack port show <cluster_name> -c allowed_address_pairs输出示例
*Field* *Value* allowed_address_pairs ip_address='192.168.0.5', mac_address='fa:16:3e:31:f9:cb' ip_address='192.168.0.7', mac_address='fa:16:3e:31:f9:cb'为 IP 故障转移部署设置不同的 VIP 地址,并通过在 RHOSP CLI 中输入以下命令使 RHOSP 端口上的地址访问。不要将任何默认的 RHOSP API 和 VIP 地址设置为 IP 故障转移部署的故障转移 VIP 地址。
在 RHOSP 端口中添加
1.1.1.1故障转移 IP 地址作为允许的地址的示例。$ openstack port set <cluster_name> --allowed-address ip-address=1.1.1.1,mac-address=fa:fa:16:3e:31:f9:cb- 创建部署 YAML 文件,为您的部署配置 IP 故障切换。请参阅后续步骤中的"IP 故障转移配置的部署 YAML 示例"。
在 IP 故障转移部署中指定以下规格,以便将故障转移 VIP 地址传递给
OPENSHIFT_HA_VIRTUAL_IPS环境变量:将
1.1.1.1VIP 地址添加到OPENSHIFT_HA_VIRTUAL_IPS的示例apiVersion: apps/v1 kind: Deployment metadata: name: ipfailover-keepalived # ... spec: env: - name: OPENSHIFT_HA_VIRTUAL_IPS value: "1.1.1.1" # ...
创建部署 YAML 文件来配置 IP 故障切换。
注意对于 Red Hat OpenStack Platform (RHOSP),您不需要重新创建部署 YAML 文件。您已作为之前说明的一部分创建了此文件。
IP 故障转移配置的部署 YAML 示例
apiVersion: apps/v1 kind: Deployment metadata: name: ipfailover-keepalived labels: ipfailover: hello-openshift spec: strategy: type: Recreate replicas: 2 selector: matchLabels: ipfailover: hello-openshift template: metadata: labels: ipfailover: hello-openshift spec: serviceAccountName: ipfailover privileged: true hostNetwork: true nodeSelector: node-role.kubernetes.io/worker: "" containers: - name: openshift-ipfailover image: registry.redhat.io/openshift4/ose-keepalived-ipfailover-rhel9:v4.17 ports: - containerPort: 63000 hostPort: 63000 imagePullPolicy: IfNotPresent securityContext: privileged: true volumeMounts: - name: lib-modules mountPath: /lib/modules readOnly: true - name: host-slash mountPath: /host readOnly: true mountPropagation: HostToContainer - name: etc-sysconfig mountPath: /etc/sysconfig readOnly: true - name: config-volume mountPath: /etc/keepalive env: - name: OPENSHIFT_HA_CONFIG_NAME value: "ipfailover" - name: OPENSHIFT_HA_VIRTUAL_IPS value: "1.1.1.1-2" - name: OPENSHIFT_HA_VIP_GROUPS value: "10" - name: OPENSHIFT_HA_NETWORK_INTERFACE value: "ens3" #The host interface to assign the VIPs - name: OPENSHIFT_HA_MONITOR_PORT value: "30060" - name: OPENSHIFT_HA_VRRP_ID_OFFSET value: "0" - name: OPENSHIFT_HA_REPLICA_COUNT value: "2" #Must match the number of replicas in the deployment - name: OPENSHIFT_HA_USE_UNICAST value: "false" #- name: OPENSHIFT_HA_UNICAST_PEERS #value: "10.0.148.40,10.0.160.234,10.0.199.110" - name: OPENSHIFT_HA_IPTABLES_CHAIN value: "INPUT" #- name: OPENSHIFT_HA_NOTIFY_SCRIPT # value: /etc/keepalive/mynotifyscript.sh - name: OPENSHIFT_HA_CHECK_SCRIPT value: "/etc/keepalive/mycheckscript.sh" - name: OPENSHIFT_HA_PREEMPTION value: "preempt_delay 300" - name: OPENSHIFT_HA_CHECK_INTERVAL value: "2" livenessProbe: initialDelaySeconds: 10 exec: command: - pgrep - keepalived volumes: - name: lib-modules hostPath: path: /lib/modules - name: host-slash hostPath: path: / - name: etc-sysconfig hostPath: path: /etc/sysconfig # config-volume contains the check script # created with `oc create configmap keepalived-checkscript --from-file=mycheckscript.sh` - configMap: defaultMode: 0755 name: keepalived-checkscript name: config-volume imagePullSecrets: - name: openshift-pull-secret其中:
ipfailover-keepalived- 指定 IP 故障转移部署的名称。
OPENSHIFT_HA_VIRTUAL_IPS-
指定要复制的 IP 地址范围的lis t。必须提供.例如,
1.2.3.4-6,1.2.3.9。 OPENSHIFT_HA_VIP_GROUPS-
指定为 VRRP 创建的组数量。如果没有设置,则会为通过
OPENSHIFT_HA_VIP_GROUPS变量指定的每个虚拟 IP 范围创建一个组。 OPENSHIFT_HA_NETWORK_INTERFACE-
指定 IP 故障转移用于发送 VRRP 流量的接口名称。默认情况下使用
eth0。 OPENSHIFT_HA_MONITOR_PORT-
指定 IP 故障转移 pod 会尝试在每个 VIP 上打开到此端口的 TCP 连接。如果建立连接,则服务将被视为正在运行。如果此端口设为
0,则测试会始终通过。默认值为80。 OPENSHIFT_HA_VRRP_ID_OFFSET-
指定用于设置虚拟路由器 ID 的偏移值。使用不同的偏移值可以在同一集群中存在多个 IP 故障转移配置。默认偏移值为
10,允许的范围为0到255。 OPENSHIFT_HA_REPLICA_COUNT-
指定要创建的副本数。这必须与 IP 故障转移配置中的
spec.replicas值匹配。默认值为2。 OPENSHIFT_HA_USE_UNICAST-
指定是否为 VRRP 使用单播模式。默认值为
false。 OPENSHIFT_HA_UNICAST_PEERS-
指定单播对等点的 IP 地址列表。如果
OPENSHIFT_HA_USE_UNICAST设为true,则必须提供此要求。 OPENSHIFT_HA_IPTABLES_CHAIN-
指定
iptables链的名称,以自动添加允许 VRRP 流量的iptables规则。如果没有设置值,则不会添加iptables规则。如果链不存在,则不会创建链,Keepalived 在单播模式下运行。默认为INPUT。 OPENSHIFT_HA_NOTIFY_SCRIPT- 指定在状态更改时运行的脚本的 pod 文件系统中的完整路径名称。
OPENSHIFT_HA_CHECK_SCRIPT- 指定定期运行的脚本的 pod 文件系统中的完整路径名称,以验证应用程序是否正在运行。
OPENSHIFT_HA_PREEMPTION-
指定处理新具有更高优先级主机的策略。默认值为
preempt_delay 300,这会导致,在有一个较低优先级的 master 提供 VIP 时,Keepalived 实例在 5 分钟后会接管 VIP。 OPENSHIFT_HA_CHECK_INTERVAL-
指定检查脚本运行的期间(以秒为单位)。默认值为
2。 openshift-pull-secret- 指定用于 IP 故障转移部署的 pull secret 名称。在创建部署之前创建 pull secret,否则您将在创建部署时收到错误。
4.3. 配置检查和通知脚本 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 中的 VIP 状态更改时自定义 IP 故障转移和接收通知,您可以使用 ConfigMap 对象配置检查和通知脚本。
检查和通知在 IP 故障转移 pod 中运行的脚本,并使用 pod 文件系统,而不是主机文件系统。主机文件系统可供 /hosts 挂载路径下的 pod 使用。在配置检查或通知脚本时,您必须提供脚本的完整路径。
每个 IP 故障转移 pod 管理一个 Keepalived 守护进程,它控制运行 pod 的节点上的一个或多个虚拟 IP (VIP)地址。keepalived 跟踪节点上每个 VIP 的状态,可以是 master、backup 或 fault。
检查和通知脚本的完整路径名被添加到 Keepalived 配置文件 /etc/keepalived/keepalived.conf 中,该文件会在每个 Keepalived 启动时加载。您可以使用 ConfigMap 对象向 pod 添加脚本,如以下部分所述。
- 检查脚本
keepalived 通过定期运行一个可选的、用户提供的检查脚本来监控应用程序的健康状况。例如,该脚本可以通过发出请求并验证响应来测试 Web 服务器。如果没有提供检查脚本,Keepalived 会运行一个测试 TCP 连接的默认脚本。当 monitor 端口设置为
0时,禁止此默认测试。如果检查脚本返回非零值,节点将进入
backup状态以及它包含的任何 VIP 被重新分配。- notify 脚本
作为集群管理员,您可以提供一个可选的 notify 脚本,在 VIP 状态更改时 Keepalived 调用。keepalived 将以下参数传递给 notify 脚本:
-
$1-group或instance -
$2- name of thegroup或instance -
$3- new state:master,backup, 或fault
-
先决条件
-
已安装 OpenShift CLI(
oc)。 -
使用具有
cluster-admin权限的用户登陆到集群。
流程
创建所需脚本,并创建
ConfigMap对象来容纳它。脚本没有输入参数,并且必须返回0(OK)和1(fail)。检查脚本,
mycheckscript.sh:#!/bin/bash # Whatever tests are needed # E.g., send request and verify response exit 0运行以下命令来创建
ConfigMap对象:$ oc create configmap mycustomcheck --from-file=mycheckscript.sh将脚本添加到容器集。挂载的
ConfigMap对象的defaultMode必须能够使用oc命令或编辑 IP 故障转移配置来运行。运行以下命令,将脚本添加到 pod。值通常为
0755、493十进制。例如:$ oc set env deploy/ipfailover-keepalived \ OPENSHIFT_HA_CHECK_SCRIPT=/etc/keepalive/mycheckscript.sh$ oc set volume deploy/ipfailover-keepalived --add --overwrite \ --name=config-volume \ --mount-path=/etc/keepalive \ --source='{"configMap": { "name": "mycustomcheck", "defaultMode": 493}}'注意oc set env命令对空格敏感。=符号的两侧不能有空格。或者,运行以下命令来编辑
ipfailover-keepalived配置:$ oc edit deploy ipfailover-keepalivedipfailover-keepalived配置示例spec: containers: - env: - name: OPENSHIFT_HA_CHECK_SCRIPT value: /etc/keepalive/mycheckscript.sh ... volumeMounts: - mountPath: /etc/keepalive name: config-volume dnsPolicy: ClusterFirst ... volumes: - configMap: defaultMode: 0755 name: customrouter name: config-volume ...其中:
spec.container.env.name-
指定
OPENSHIFT_HA_CHECK_SCRIPT环境变量,以指向挂载的脚本文件。 spec.container.volumeMounts-
指定用于创建挂载点的
spec.container.volumeMounts字段。 spec.volumes-
指定一个新的
spec.volumes字段来提及配置映射。 spec.volumes.configMap.defaultMode-
指定文件的运行权限。在重新读后,其显示为十进制
493。
-
保存更改并退出编辑器。这会重启
ipfailover-keepalived配置。
4.4. 配置 VRRP 抢占 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 中恢复节点时控制 VIP 抢占行为,您可以配置 OPENSHIFT_HA_PREEMPTION 变量,以在优先级更高的 VIP 接管或完全禁用抢占前设置延迟。
当节点上的虚拟 IP (VIP)从 fault 状态中恢复时,如果它的优先级低于 master 状态的 VIP,它会进入 backup 状态。
OPENSHIFT_HA_PREEMPTION 变量有两个选项:
-
nopreempt: 当设置时,master角色不会从较低优先级 VIP 移到优先级更高的 VIP。 -
preempt_delay 300:当设置时,Keepalived 会在将master角色移到优先级更高的 VIP 之前等待 300 秒。
在以下示例中,OPENSHIFT_HA_PREEMPTION 值设为 preempt_delay 300。
流程
要指定抢占,输入
oc edit deploy ipfailover-keepalived以编辑路由器部署配置:$ oc edit deploy ipfailover-keepalived# ... spec: containers: - env: - name: OPENSHIFT_HA_PREEMPTION value: preempt_delay 300 #...
4.5. 部署多个 IP 故障转移实例 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中部署多个 IP 故障转移实例时,每个 Keepalived 守护进程会为虚拟 IP 地址分配唯一的 VRRP ID。配置 OPENSHIFT_HA_VRRP_ID_OFFSET 变量,以防止在不同 IP 故障转移配置之间重叠 VRRP ID 范围。
每个 IP 故障转移 pod 由 IP 故障转移配置(每个节点一个 pod 或副本)创建的每个 IP 故障转移 pod 都运行一个 Keepalived 守护进程。当存在多个 IP 故障转移配置时,会创建额外的 pod,其 Keepalived 守护进程会参与虚拟路由器冗余协议(VRRP)协商。此协商决定了每个虚拟 IP (VIP)的每个节点服务。
对于每个 VIP,Keepalived 分配一个唯一的内部 vrrp-id。在 VRRP 协商过程中,这些 vrrp-id 值用于选择服务相应 VIP 的节点。
IP 故障转移 pod 按顺序将 vrrp-id 值分配给 IP 故障转移配置中定义的 VIP,从 OPENSHIFT_HA_VRRP_ID_OFFSET 指定的值开始。有效的 vrrp-id 值在 1..255 之间。
当您部署多个 IP 故障转移配置时,请确保配置的偏移留给额外的 VIP,并防止 vrrp-id 范围跨配置重叠。
4.6. 为超过 254 地址配置 IP 故障转移 复制链接链接已复制到粘贴板!
要在 OpenShift Container Platform 中为超过 254 个虚拟 IP 地址配置 IP 故障转移,您可以使用 OPENSHIFT_HA_VIP_GROUPS 变量将多个地址分组到一起。通过使用 OPENSHIFT_HA_VIP_GROUPS 变量,您可以更改每个 VRRP 实例的 VIP 数量,并在配置 IP 故障转移时定义每个 VRRP 实例可用的 VIP 组数量。
在 VRRP 故障转移事件中,对 VIP 进行分组会为每个 VRRP 创建更广泛的 VIP 分配范围,并在集群中的所有主机都能够从本地访问服务时很有用。例如,当服务通过 ExternalIP 公开时。
使用故障转移的一个规则是,请勿将路由等服务限制到一个特定的主机。相反,服务应复制到每一主机上,以便在 IP 故障转移时,不必在新主机上重新创建服务。
如果使用 OpenShift Container Platform 健康检查,IP 故障转移和组的性质意味着不会检查组中的所有实例。因此,必须使用 Kubernetes 健康检查来确保服务处于活动状态。
先决条件
-
使用具有
cluster-admin权限的用户登陆到集群。
流程
要更改分配给每个组的 IP 地址数量,请更改
OPENSHIFT_HA_VIP_GROUPS变量的值,例如:IP 故障转换配置的
DeploymentYAML 示例... spec: env: - name: OPENSHIFT_HA_VIP_GROUPS value: "3" ...在本例中,
OPENSHIFT_HA_VIP_GROUPS变量设置为3。在有 7 个 VIP 的环境中,它会创建三个组,为第一个组分配三个 VIP,并将两个 VIP 分配到剩余的两个组。注意如果
OPENSHIFT_HA_VIP_GROUPS设置的组数量少于设置为故障的 IP 地址数量,则组包含多个 IP 地址,且所有地址都作为一个单元移动。
4.7. ExternalIP 的高可用性 复制链接链接已复制到粘贴板!
OpenShift Container Platform 非云集群中为 ExternalIP 的高可用性,将 IP 故障转移与 ExternalIP 自动分配相结合,以确保服务在节点失败时仍然可访问。您可以为 ExternalIP 自动分配和 IP 故障切换使用相同的 CIDR 范围来配置它。
要为 ExternalIP 配置高可用性,您可以指定集群网络配置的 spec.ExternalIP.autoAssignCIDRs 范围,然后在创建 IP 故障转移配置时使用相同的范围。
因为 IP 故障转移最多可支持整个集群的 255 个 VIP,所以 spec.ExternalIP.autoAssignCIDRs 必须为 /24 或更小。
4.8. 删除 IP 故障切换 复制链接链接已复制到粘贴板!
要从 OpenShift Container Platform 集群中删除 IP 故障转移并清理 iptables 规则和虚拟 IP 地址,您可以删除部署和服务帐户,然后在配置的每个节点上运行清理作业。
在初始配置 IP 故障切换时,集群中的 worker 节点会使用 iptables 规则修改,该规则明确允许 Keepalived 在 224.0.0.18 上多播数据包。由于对节点的更改,移除 IP 故障切换需要运行一个作业来删除 iptables 规则并删除 Keepalived 使用的虚拟 IP 地址。
流程
可选:识别并删除存储为配置映射的任何检查和通知脚本:
确定任何用于 IP 故障切换的 pod 是否使用配置映射作为卷:
$ oc get pod -l ipfailover \ -o jsonpath="\ {range .items[?(@.spec.volumes[*].configMap)]} {'Namespace: '}{.metadata.namespace} {'Pod: '}{.metadata.name} {'Volumes that use config maps:'} {range .spec.volumes[?(@.configMap)]} {'volume: '}{.name} {'configMap: '}{.configMap.name}{'\n'}{end} {end}"输出示例
Namespace: default Pod: keepalived-worker-59df45db9c-2x9mn Volumes that use config maps: volume: config-volume configMap: mycustomcheck如果上一步提供了用作卷的配置映射的名称,请删除配置映射:
$ oc delete configmap <configmap_name>
为 IP 故障切换识别现有部署:
$ oc get deployment -l ipfailover输出示例
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE default ipfailover 2/2 2 2 105d删除部署:
$ oc delete deployment <ipfailover_deployment_name>删除
ipfailover服务帐户:$ oc delete sa ipfailover运行一个作业,该作业会删除最初配置 IP 故障切换时添加的 IP 表规则:
创建一个文件,如
remove-ipfailover-job.yaml,其内容类似以下示例:apiVersion: batch/v1 kind: Job metadata: generateName: remove-ipfailover- labels: app: remove-ipfailover spec: template: metadata: name: remove-ipfailover spec: containers: - name: remove-ipfailover image: registry.redhat.io/openshift4/ose-keepalived-ipfailover-rhel9:v4.17 command: ["/var/lib/ipfailover/keepalived/remove-failover.sh"] nodeSelector: kubernetes.io/hostname: <host_name> restartPolicy: Never-
nodeSelector可能与旧 IP 故障转移部署中使用的选择器相同。 - 为集群中配置 IP 故障切换的每个节点运行作业,并每次替换主机名。
-
运行作业:
$ oc create -f remove-ipfailover-job.yaml输出示例
job.batch/remove-ipfailover-2h8dm created
验证
确认作业删除了 IP 故障切换的初始配置。
$ oc logs job/remove-ipfailover-2h8dm输出示例
remove-failover.sh: OpenShift IP Failover service terminating. - Removing ip_vs module ... - Cleaning up ... - Releasing VIPs (interface eth0) ...
第 5 章 配置集群范围代理 复制链接链接已复制到粘贴板!
要在直接互联网访问时让 OpenShift Container Platform 集群使用 HTTP 或 HTTPS 代理,您可以通过修改现有集群的 Proxy 对象或在新集群的 install-config.yaml 文件中配置代理设置,来配置集群范围的代理设置。
在支持的平台中为集群启用集群范围的出口代理后,Red Hat Enterprise Linux CoreOS (RHCOS)会使用支持的平台上存在的 install-config.yaml 文件中的 networking.machineNetwork[].cidr, networking.clusterNetwork[].cidr, 和 networking.serviceNetwork[] 字段的值填充 status.noProxy 参数。
作为安装后任务,您可以更改 networking.clusterNetwork[].cidr 值,但不能更改 networking.machineNetwork[].cidr 和 networking.serviceNetwork[] 值。如需更多信息,请参阅"配置集群网络范围"。
对于在 Amazon Web Services (AWS)、Google Cloud、Microsoft Azure 和 Red Hat OpenStack Platform (RHOSP)上安装,status.noProxy 参数也会使用实例元数据端点 169.254.169.254 填充。
由 RHCOS 添加到 Proxy 对象的 status: 段中的值示例
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
# ...
networking:
clusterNetwork:
- cidr: <ip_address_from_cidr>
hostPrefix: 23
network type: OVNKubernetes
machineNetwork:
- cidr: <ip_address_from_cidr>
serviceNetwork:
- 172.30.0.0/16
# ...
status:
noProxy:
- localhost
- .cluster.local
- .svc
- 127.0.0.1
- <api_server_internal_url>
# ...
其中:
<ip_address_from_cidr>-
指定从中分配 Pod IP 地址的 IP 地址块。默认值为
10.128.0.0/14,主机前缀为/23。 <ip_address_from_cidr>-
指定机器的 IP 地址块。默认值为
10.0.0.0/16。 <ip_address_from_cidr>-
为服务指定 IP 地址块。默认值为
172.30.0.0/16。 <api_server_internal_url>-
您可以通过运行
oc get infrastructures.config.openshift.io cluster -o jsonpath='{.status.etcdDiscoveryDomain}'命令来查找内部 API 服务器的 URL。
如果您的安装类型不包括设置 networking.machineNetwork[].cidr 字段,则必须在 .status.noProxy 字段中手动包含机器 IP 地址,以确保节点之间的流量可以绕过代理。
5.1. 先决条件 复制链接链接已复制到粘贴板!
查看集群需要访问的站点中的内容,决定这些站点中的任何站点是否需要绕过代理。默认情况下,所有集群系统的出站流量都需经过代理,包括对托管集群的云供应商 API 的调用。系统范围的代理仅影响系统组件,而不会影响用户工作负载。如有必要,将站点添加到 Proxy 对象的 spec.noProxy 参数,以绕过代理。
5.2. 启用集群范围代理 复制链接链接已复制到粘贴板!
要为 OpenShift Container Platform 集群启用集群范围的出口代理,您可以修改 Proxy 对象来配置 HTTP 和 HTTPS 代理设置,并指定绕过代理的域。
当在没有配置代理的情况下安装或升级集群时,仍会生成 Proxy 对象,但它有一个空的 spec。例如:
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
spec:
trustedCA:
name: ""
status:
只支持名为 cluster 的 Proxy 对象,且无法创建额外的代理。
集群管理员可以通过修改这个 cluster Proxy 对象来配置 OpenShift Container Platform 的代理。
在为集群启用集群范围代理功能并保存 Proxy 对象文件后,Machine Config Operator (MCO) 会重启集群中的所有节点,以便每个节点可以访问集群外的连接。您不需要手动重新引导这些节点。
先决条件
- 有集群管理员权限。
-
已安装 OpenShift Container Platform
ocCLI 工具。
流程
创建包含代理 HTTPS 连接所需的额外 CA 证书的 ConfigMap。
注意如果代理的身份证书由 Red Hat Enterprise Linux CoreOS (RHCOS) 信任捆绑包的颁发机构签名,您可以跳过这一步。
创建名为
user-ca-bundle.yaml的文件,并提供 PEM 编码证书的值:apiVersion: v1 data: ca-bundle.crt: |1 <MY_PEM_ENCODED_CERTS>2 kind: ConfigMap metadata: name: user-ca-bundle3 namespace: openshift-config4 其中:
data.ca-bundle.crt-
指定必须命名为
ca-bundle.crt的数据键。 <MY_PEM_ENCODED_CERTS>- 指定用于为代理身份证书签名的一个或多个 PEM 编码的 X.509 证书。
user-ca-bundle-
指定从
Proxy对象引用的配置映射名称。 openshift-config- 指定配置映射必须存在的命名空间。
输入以下命令从
user-ca-bundle.yaml文件创建配置映射:$ oc create -f user-ca-bundle.yaml
使用
oc edit命令修改Proxy对象:$ oc edit proxy/cluster为代理配置所需的字段:
apiVersion: config.openshift.io/v1 kind: Proxy metadata: name: cluster spec: httpProxy: http://<username>:<pswd>@<ip>:<port>1 httpsProxy: https://<username>:<pswd>@<ip>:<port>2 noProxy: example.com3 readinessEndpoints: - http://www.google.com4 - https://www.google.com trustedCA: name: user-ca-bundle5 其中:
httpProxy-
指定用于创建集群外的 HTTP 连接的代理 URL。URL 方案必须是
http。 httpsProxy-
指定用于创建集群外的 HTTPS 连接的代理 URL。URL 方案必须是
http或https。指定支持 URL 方案的代理的 URL。例如,如果大多数代理被配置为使用https,则大多数代理都会报告错误,但它们只支持http。此失败消息可能无法传播到日志,并可能显示为网络连接失败。如果使用侦听来自集群的https连接的代理,您可能需要配置集群以接受代理使用的 CA 和证书。 noProxy指定排除代理的目标域名、域、IP 地址(或其他网络 CIDR)和端口号的逗号分隔列表。请注意,只有在配置 IPv6 地址时,才支持端口号。配置 IPv4 地址时不支持端口号。
在域前面加上
.以仅匹配子域。例如,.y.com匹配x.y.com,但不匹配y.com。使用*可对所有目的地绕过所有代理。如果您的
noproxy字段需要包含域地址,您必须在noproxy字段中明确指定该 FQDN 或前缀匹配子域。您不能使用封装域的 IP 地址或 CIDR 范围。这是因为集群不会在分配路由连接前等待 DNS 返回 IP 地址,并根据请求明确检查。例如,如果您有一个 CIDR 块值,如10.0.0.0/24,noproxy字段和字段尝试访问https://10.0.0.11,则地址可以成功匹配。但是,尝试访问https://exampleserver.externaldomain.com(其 A 记录条目为10.0.0.11)会失败。对于noproxy字段,还需要额外的.externaldomain.com值。如果您扩展了未包含在安装配置中
networking.machineNetwork[].cidr字段定义的计算节点,您必须将它们添加到此列表中,以防止连接问题。如果未设置
httpProxy或httpsProxy字段,则此字段将被忽略。readinessEndpoints-
指定集群外部用于执行就绪度检查的一个或多个 URL,然后再将
httpProxy和httpsProxy值写入 status。 trustedCA-
指定对
openshift-config命名空间中配置映射的引用,其中包含代理 HTTPS 连接所需的额外 CA 证书。注意 ConfigMap 必须已经存在,然后才能在这里引用它。此字段是必需的,除非代理的身份证书由来自 RHCOS 信任捆绑包的颁发机构签名。
- 保存文件以使改变生效。
5.3. 删除集群范围代理服务器 复制链接链接已复制到粘贴板!
cluster Proxy 对象不能被删除。要从 OpenShift Container Platform 集群中删除集群范围代理配置,您可以使用 oc edit 命令从 Proxy 对象中删除所有 spec 字段。
先决条件
- 集群管理员权限
-
已安装 OpenShift Container Platform
ocCLI 工具
流程
使用
oc edit命令来修改代理:$ oc edit proxy/cluster删除 Proxy 对象的所有
spec字段。例如:apiVersion: config.openshift.io/v1 kind: Proxy metadata: name: cluster spec: {}- 保存文件以使改变生效。
5.4. 验证集群范围代理配置 复制链接链接已复制到粘贴板!
要验证集群范围代理配置是否在 OpenShift Container Platform 中正常工作,您可以检查 Proxy 对象状态,查看 Machine Config Operator 日志,并通过代理确认系统组件是否在 OpenShift Container Platform 中路由外部请求。
先决条件
- 有集群管理员权限。
-
已安装 OpenShift Container Platform
ocCLI 工具。
流程
使用
oc命令检查代理配置状态:$ oc get proxy/cluster -o yaml-
验证输出中的代理字段,以确保它们与您的配置匹配。具体来说,检查
spec.httpProxy,spec.httpsProxy,spec.noProxy, 和spec.trustedCA字段。 检查
Proxy对象的状态:$ oc get proxy/cluster -o jsonpath='{.status}'输出示例
{ status: httpProxy: http://user:xxx@xxxx:3128 httpsProxy: http://user:xxx@xxxx:3128 noProxy: .cluster.local,.svc,10.0.0.0/16,10.128.0.0/14,127.0.0.1,169.254.169.254,172.30.0.0/16,localhost,test.no-proxy.com }检查 Machine Config Operator (MCO) 的日志,以确保成功应用配置更改:
$ oc logs -n openshift-machine-config-operator $(oc get pods -n openshift-machine-config-operator -l k8s-app=machine-config-operator -o name)- 查找指示代理设置的消息,并在需要时重启节点。
通过检查发出外部请求的组件的日志来验证系统组件是否使用代理,如 Cluster Version Operator (CVO):
$ oc logs -n openshift-cluster-version $(oc get pods -n openshift-cluster-version -l k8s-app=machine-config-operator -o name)- 查找显示外部请求已通过代理路由的日志条目。
第 6 章 配置自定义 PKI 复制链接链接已复制到粘贴板!
为确保 OpenShift Container Platform 集群中内部组件之间的安全通信,您可以将机构的自定义证书颁发机构(CA)证书添加到集群范围的信任存储中。
您可以使用 Proxy API 添加集群范围的可信 CA 证书。您必须在安装过程中或运行时执行此操作。
在安装过程中,配置集群范围的代理。您需要在
install-config.yaml文件中的additionalTrustBundle设置中定义私有签名的 CA 证书。安装程序生成名为
user-ca-bundle的 ConfigMap,其中包含您定义的附加 CA 证书。然后,Cluster Network Operator 会创建trusted-ca-bundleConfigMap,将这些内容与 Red Hat Enterprise Linux CoreOS (RHCOS) 信任捆绑包合并,Proxy 对象的trustedCA字段中也会引用此 ConfigMap。-
在运行时,修改默认 Proxy 对象使其包含您私有签名的 CA 证书 (集群代理启用工作流的一部分)。这涉及创建包含集群应信任的私有签名 CA 证书的 ConfigMap,然后使用
trustedCA引用私有签名证书的 ConfigMap 修改代理服务器资源。
安装程序配置的 additionalTrustBundle 字段和 proxy 资源的 trustedCA 字段被用来管理集群范围信任捆绑包; 在安装时会使用 additionalTrustBundle ,并在运行时使用代理的trustedCA。
trustedCA 字段是对包含集群组件使用的自定义证书和密钥对的 ConfigMap 的引用。
6.1. 在安装过程中配置集群范围的代理 复制链接链接已复制到粘贴板!
要在拒绝直接连接的环境中启用互联网访问,请在 install-config.yaml 文件中配置集群范围代理。此配置可确保新的 OpenShift Container Platform 集群通过指定的 HTTP 或 HTTPS 代理路由流量。
先决条件
-
您有一个现有的
install-config.yaml文件。 您已查看集群需要访问的站点,并确定它们中的任何站点是否需要绕过代理。默认情况下,所有集群出口流量都经过代理,包括对托管云供应商 API 的调用。如果需要,您将在
Proxy 对象的spec.noProxy字段中添加站点来绕过代理。注意Proxy对象status.noProxy字段使用安装配置中的networking.machineNetwork[].cidr、networking.clusterNetwork[].cidr和networking.serviceNetwork[]字段的值填充。对于在 Amazon Web Services (AWS)、Google Cloud、Microsoft Azure 和 Red Hat OpenStack Platform (RHOSP)上安装,
Proxy对象status.noProxy字段也会填充实例元数据端点(169.254.169.254)。
流程
编辑
install-config.yaml文件并添加代理设置。例如:apiVersion: v1 baseDomain: my.domain.com proxy: httpProxy: http://<username>:<pswd>@<ip>:<port> httpsProxy: https://<username>:<pswd>@<ip>:<port> noProxy: example.com additionalTrustBundle: | -----BEGIN CERTIFICATE----- <MY_TRUSTED_CA_CERT> -----END CERTIFICATE----- additionalTrustBundlePolicy: <policy_to_add_additionalTrustBundle> # ...其中:
proxy.httpProxy-
指定用于创建集群外的 HTTP 连接的代理 URL。URL 方案必须是
http。 proxy.httpsProxy- 指定用于创建集群外的 HTTPS 连接的代理 URL。
proxy.noProxy-
指定要从代理中排除的目标域名、IP 地址或其他网络 CIDR 的逗号分隔列表。在域前面加
.来仅匹配子域。例如:.y.com匹配x.y.com,但不匹配y.com。使用*绕过所有目的地的代理。 additionalTrustBundle-
如果提供,安装程序会在
openshift-config命名空间中生成名为user-ca-bundle的配置映射来保存额外的 CA 证书。如果您提供additionalTrustBundle和至少一个代理设置,则Proxy对象会被配置为引用trustedCA字段中的user-ca-bundle配置映射。然后,Cluster Network Operator 会创建一个trusted-ca-bundle配置映射,该配置映射将为trustedCA参数指定的内容与 RHCOS 信任捆绑包合并。additionalTrustBundle字段是必需的,除非代理的身份证书由来自 RHCOS 信任捆绑包的颁发机构签名。 additionalTrustBundlePolicy指定决定
Proxy对象的配置以引用trustedCA字段中user-ca-bundle配置映射的策略。允许的值是Proxyonly和Always。仅在配置了http/https代理时,使用Proxyonly引用user-ca-bundle配置映射。使用Always始终引用user-ca-bundle配置映射。默认值为Proxyonly。可选参数。注意安装程序不支持代理的
readinessEndpoints字段。注意如果安装程序超时,重启并使用安装程序的
wait-for命令完成部署。例如:$ ./openshift-install wait-for install-complete --log-level debug
保存该文件并在安装 OpenShift Container Platform 时引用。
安装程序会创建一个名为 cluster 的集群范围代理,该代理
使用提供的install-config.yaml文件中的代理设置。如果没有提供代理设置,仍然会创建一个clusterProxy对象,但它会有一个空spec。注意只支持名为
cluster的Proxy对象,且无法创建额外的代理。
6.2. 启用集群范围代理 复制链接链接已复制到粘贴板!
要为 OpenShift Container Platform 集群启用集群范围的出口代理,您可以修改 Proxy 对象来配置 HTTP 和 HTTPS 代理设置,并指定绕过代理的域。
当在没有配置代理的情况下安装或升级集群时,仍会生成 Proxy 对象,但它有一个空的 spec。例如:
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
spec:
trustedCA:
name: ""
status:
只支持名为 cluster 的 Proxy 对象,且无法创建额外的代理。
集群管理员可以通过修改这个 cluster Proxy 对象来配置 OpenShift Container Platform 的代理。
在为集群启用集群范围代理功能并保存 Proxy 对象文件后,Machine Config Operator (MCO) 会重启集群中的所有节点,以便每个节点可以访问集群外的连接。您不需要手动重新引导这些节点。
先决条件
- 有集群管理员权限。
-
已安装 OpenShift Container Platform
ocCLI 工具。
流程
创建包含代理 HTTPS 连接所需的额外 CA 证书的 ConfigMap。
注意如果代理的身份证书由 Red Hat Enterprise Linux CoreOS (RHCOS) 信任捆绑包的颁发机构签名,您可以跳过这一步。
创建名为
user-ca-bundle.yaml的文件,并提供 PEM 编码证书的值:apiVersion: v1 data: ca-bundle.crt: |1 <MY_PEM_ENCODED_CERTS>2 kind: ConfigMap metadata: name: user-ca-bundle3 namespace: openshift-config4 其中:
data.ca-bundle.crt-
指定必须命名为
ca-bundle.crt的数据键。 <MY_PEM_ENCODED_CERTS>- 指定用于为代理身份证书签名的一个或多个 PEM 编码的 X.509 证书。
user-ca-bundle-
指定从
Proxy对象引用的配置映射名称。 openshift-config- 指定配置映射必须存在的命名空间。
输入以下命令从
user-ca-bundle.yaml文件创建配置映射:$ oc create -f user-ca-bundle.yaml
使用
oc edit命令修改Proxy对象:$ oc edit proxy/cluster为代理配置所需的字段:
apiVersion: config.openshift.io/v1 kind: Proxy metadata: name: cluster spec: httpProxy: http://<username>:<pswd>@<ip>:<port>1 httpsProxy: https://<username>:<pswd>@<ip>:<port>2 noProxy: example.com3 readinessEndpoints: - http://www.google.com4 - https://www.google.com trustedCA: name: user-ca-bundle5 其中:
httpProxy-
指定用于创建集群外的 HTTP 连接的代理 URL。URL 方案必须是
http。 httpsProxy-
指定用于创建集群外的 HTTPS 连接的代理 URL。URL 方案必须是
http或https。指定支持 URL 方案的代理的 URL。例如,如果大多数代理被配置为使用https,则大多数代理都会报告错误,但它们只支持http。此失败消息可能无法传播到日志,并可能显示为网络连接失败。如果使用侦听来自集群的https连接的代理,您可能需要配置集群以接受代理使用的 CA 和证书。 noProxy指定排除代理的目标域名、域、IP 地址(或其他网络 CIDR)和端口号的逗号分隔列表。请注意,只有在配置 IPv6 地址时,才支持端口号。配置 IPv4 地址时不支持端口号。
在域前面加
.来仅匹配子域。例如:.y.com匹配x.y.com,但不匹配y.com。使用*可对所有目的地绕过所有代理。如果您的
noproxy字段需要包含域地址,您必须在noproxy字段中明确指定该 FQDN 或前缀匹配子域。您不能使用封装域的 IP 地址或 CIDR 范围。这是因为集群不会在分配路由连接前等待 DNS 返回 IP 地址,并根据请求明确检查。例如,如果您有一个 CIDR 块值,如10.0.0.0/24,noproxy字段和字段尝试访问https://10.0.0.11,则地址可以成功匹配。但是,尝试访问https://exampleserver.externaldomain.com(其 A 记录条目为10.0.0.11)会失败。对于noproxy字段,还需要额外的.externaldomain.com值。如果您扩展了未包含在安装配置中
networking.machineNetwork[].cidr字段定义的计算节点,您必须将它们添加到此列表中,以防止连接问题。如果未设置
httpProxy或httpsProxy字段,则此字段将被忽略。readinessEndpoints-
指定集群外部用于执行就绪度检查的一个或多个 URL,然后再将
httpProxy和httpsProxy值写入 status。 trustedCA-
指定对
openshift-config命名空间中配置映射的引用,其中包含代理 HTTPS 连接所需的额外 CA 证书。注意 ConfigMap 必须已经存在,然后才能在这里引用它。此字段是必需的,除非代理的身份证书由来自 RHCOS 信任捆绑包的颁发机构签名。
- 保存文件以使改变生效。
6.3. 使用 Operator 进行证书注入 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 中,使用 Operator 的证书注入将自定义证书颁发机构(CA)与系统证书合并,并将合并的捆绑包注入请求它的 Operator。您可以使用此功能,以便 Operator 信任自定义证书,而无需手动证书捆绑包管理。
在配置映射中添加 config.openshift.io/inject-trusted-cabundle="true" 标签后,会删除其中的现有数据。Cluster Network Operator 获取配置映射的所有权,并只接受 ca-bundle 作为数据。您必须使用单独的配置映射存储 service-ca.crt,方法是使用 service.beta.openshift.io/inject-cabundle=true 注解或类似的配置。在同一配置映射中添加 config.openshift.io/inject-trusted-cabundle="true" 标签和 service.beta.openshift.io/inject-cabundle=true 注解可能会导致问题。
Operator 通过创建一个带有以下标签的空 ConfigMap 来请求此注入:
config.openshift.io/inject-trusted-cabundle="true"
空 ConfigMap 示例:
apiVersion: v1
data: {}
kind: ConfigMap
metadata:
labels:
config.openshift.io/inject-trusted-cabundle: "true"
name: ca-inject
namespace: apache
其中:
metadata.name- 指定空 ConfigMap 名称。
Operator 将这个 ConfigMap 挂载到容器的本地信任存储中。
只有在 Red Hat Enterprise Linux CoreOS (RHCOS) 信任捆绑包中没有包括证书时才需要添加可信的 CA 证书。
证书注入不仅限于 Operator。当使用 config.openshift.io/inject-trusted-cabundle=true标记(label) 创建一个空的 ConfigMap 时,Cluster Network Operator会跨命名空间注入证书 。
ConfigMap 可以驻留在任何命名空间中,但 ConfigMap 必须作为卷挂载到需要自定义 CA 的 Pod 中的每个容器。例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-example-custom-ca-deployment
namespace: my-example-custom-ca-ns
spec:
...
spec:
...
containers:
- name: my-container-that-needs-custom-ca
volumeMounts:
- name: trusted-ca
mountPath: /etc/pki/ca-trust/extracted/pem
readOnly: true
volumes:
- name: trusted-ca
configMap:
name: ca-inject
items:
- key: ca-bundle.crt
path: tls-ca-bundle.pem
其中:
volumes.items.key- 指定 ConfigMap 键。
volumes.items.path- 指定 ConfigMap 路径。