配置网络设置


OpenShift Container Platform 4.17

OpenShift Container Platform 中的常规网络配置过程

摘要

本文档论述了在 OpenShift Container Platform 中配置网络方面,如节点端口服务、IP 地址范围、IP 故障转移和集群范围的代理。

要在 OpenShift Container Platform 在运行时修改内核参数和接口属性,您可以使用调优 Container Network Interface (CNI)元插件。该插件在带有主 CNI 插件的链中运行,并允许您更改 sysctl 和接口属性,如 promiscuous 模式、all-multicast 模式、MTU 和 MAC 地址。

CNI 插件

1.1. 使用 tuning CNI 配置系统控制

要在 OpenShift Container Platform 中配置接口级网络 sysctl,您可以在网络附加定义中使用 tuning CNI meta 插件。配置 net.ipv4.conf.IFNAME.accept_redirects sysctl,以启用接受和发送 ICMP 重定向的数据包。

流程

  1. 使用以下内容创建网络附加定义,如 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"
            }
        }
      ]
    }'

  2. 运行以下命令来应用 YAML:

    $ oc apply -f tuning-example.yaml

    输出示例

    networkattachmentdefinition.k8.cni.cncf.io/tuningnad created

  3. 使用类似以下示例的网络附加定义,创建示例 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 配置集。
  4. 运行以下命令来应用 yaml:

    $ oc apply -f examplepod.yaml
  5. 运行以下命令验证 pod 是否已创建:

    $ oc get pod

    输出示例

    NAME      READY   STATUS    RESTARTS   AGE
    tunepod   1/1     Running   0          47s

  6. 运行以下命令登录到 pod:

    $ oc rsh tunepod
  7. 验证配置的 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 插件。启用后,接口会接收网络上的所有多播数据包。

流程

  1. 使用以下内容创建网络附加定义,如 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
          }
        ]
      }'

  2. 运行以下命令应用 YAML 文件中指定的设置:

    $ oc apply -f tuning-allmulti.yaml

    输出示例

    networkattachmentdefinition.k8s.cni.cncf.io/setallmulti created

  3. 使用类似以下 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 配置集。
  4. 运行以下命令应用 YAML 文件中指定的设置:

    $ oc apply -f examplepod.yaml
  5. 运行以下命令验证 pod 是否已创建:

    $ oc get pod

    输出示例

    NAME          READY   STATUS    RESTARTS   AGE
    allmultipod   1/1     Running   0          23s

  6. 运行以下命令登录到 pod:

    $ oc rsh allmultipod
  7. 运行以下命令,列出与 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 网络插件。

流程

  1. 要获取集群的集群网络范围和主机前缀,请输入以下命令:

    $ oc get network.operator.openshift.io \
      -o jsonpath="{.items[0].spec.clusterNetwork}"

    输出示例

    [{"cidr":"10.217.0.0/22","hostPrefix":23}]

  2. 要扩展集群网络 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

  3. 要确认配置是活跃的,请输入以下命令。可能需要 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 地址、监控端口和网络接口。

Expand
表 4.1. IP 故障转移环境变量
变量名称default描述

OPENSHIFT_HA_MONITOR_PORT

80

IP 故障转移 pod 会尝试在每个虚拟 IP(VIP)上打开到此端口的 TCP 连接。如果建立连接,则服务将被视为正在运行。如果此端口设为 0,则测试会始终通过。

OPENSHIFT_HA_NETWORK_INTERFACE

 

IP 故障转移用于发送虚拟路由器冗余协议 (VRRP) 流量的接口名称。默认值为 eth0

如果您的集群使用 OVN-Kubernetes 网络插件,请将此值设置为 br-ex 以避免数据包丢失。对于使用 OVN-Kubernetes 网络插件的集群,所有侦听接口都不会为 VRRP 提供服务,而是预期入站流量会通过 br-ex 网桥进行。

OPENSHIFT_HA_REPLICA_COUNT

2

要创建的副本数。这必须与 IP 故障转移部署配置中的 spec.replicas 值匹配。

OPENSHIFT_HA_VIRTUAL_IPS

 

要复制的 IP 地址范围列表。必须提供.例如,1.2.3.4-6,1.2.3.9

OPENSHIFT_HA_VRRP_ID_OFFSET

0

用于设置虚拟路由器 ID 的偏移值。使用不同的偏移值可以在同一集群中存在多个 IP 故障转移配置。默认偏移值为 0,允许的范围是 0255

OPENSHIFT_HA_VIP_GROUPS

 

为 VRRP 创建的组数量。如果没有设置,则会为通过 OPENSHIFT_HA_VIP_GROUPS 变量指定的每个虚拟 IP 范围创建一个组。

OPENSHIFT_HA_IPTABLES_CHAIN

输入

iptables 链的名称,用于自动添加允许 VRRP 流量的 iptables 规则。如果没有设置值,则不会添加 iptables 规则。如果链不存在,则不会创建它。

OPENSHIFT_HA_CHECK_SCRIPT

 

定期运行的脚本的 pod 文件系统中的完整路径名称,以验证应用是否正在运行。

OPENSHIFT_HA_CHECK_INTERVAL

2

检查脚本运行的期间(以秒为单位)。

OPENSHIFT_HA_NOTIFY_SCRIPT

 

当状态发生变化时运行的脚本的 pod 文件系统的完整路径名称。

OPENSHIFT_HA_PREEMPTION

preempt_nodelay 300

处理新的具有更高优先级主机的策略。nopreempt 策略不会将 master 从较低优先级主机移到优先级更高的主机。

4.2. 在集群中配置 IP 故障切换

要在 OpenShift Container Platform 集群中配置 IP 故障转移并为虚拟 IP 地址提供高可用性,您可以创建一个在所选节点上运行的 Keepalived 的部署来监控服务并在节点不可用时通过 VIP 失败。

IP 故障转移部署确保故障转移 pod 在符合限制或使用的标签的每个节点上运行。运行 Keepalived 的 pod 可以监控端点,并在第一个节点无法访问服务或端点时使用 Virtual Router Redundancy Protocol (VRRP)从一个节点切换到另一个节点。

对于生产环境,设置一个选择器(selector),用于选择至少两个节点,并设置与所选节点数量相等的副本

先决条件

流程

  1. 创建 IP 故障转移服务帐户:

    $ oc create sa ipfailover
  2. hostNetwork 更新安全性上下文约束(SCC):

    $ oc adm policy add-scc-to-user privileged -z ipfailover
    $ oc adm policy add-scc-to-user hostnetwork -z ipfailover
  3. 仅限 Red Hat OpenStack Platform (RHOSP):完成以下步骤,使在 RHOSP 端口上可以访问故障转移 VIP 地址。

    1. 使用 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'

    2. 为 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

    3. 创建部署 YAML 文件,为您的部署配置 IP 故障切换。请参阅后续步骤中的"IP 故障转移配置的部署 YAML 示例"。
    4. 在 IP 故障转移部署中指定以下规格,以便将故障转移 VIP 地址传递给 OPENSHIFT_HA_VIRTUAL_IPS 环境变量:

      1.1.1.1 VIP 地址添加到 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"
      # ...

  4. 创建部署 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,允许的范围为 0255
    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 的状态,可以是 masterbackupfault

检查和通知脚本的完整路径名被添加到 Keepalived 配置文件 /etc/keepalived/keepalived.conf 中,该文件会在每个 Keepalived 启动时加载。您可以使用 ConfigMap 对象向 pod 添加脚本,如以下部分所述。

检查脚本

keepalived 通过定期运行一个可选的、用户提供的检查脚本来监控应用程序的健康状况。例如,该脚本可以通过发出请求并验证响应来测试 Web 服务器。如果没有提供检查脚本,Keepalived 会运行一个测试 TCP 连接的默认脚本。当 monitor 端口设置为 0 时,禁止此默认测试。

如果检查脚本返回非零值,节点将进入 backup 状态以及它包含的任何 VIP 被重新分配。

notify 脚本

作为集群管理员,您可以提供一个可选的 notify 脚本,在 VIP 状态更改时 Keepalived 调用。keepalived 将以下参数传递给 notify 脚本:

  • $1 - groupinstance
  • $2 - name of the groupinstance
  • $ 3- new state: master,backup, 或 fault

先决条件

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

流程

  1. 创建所需脚本,并创建 ConfigMap 对象来容纳它。脚本没有输入参数,并且必须返回 0OK)和 1fail)。

    检查脚本,mycheckscript.sh

    #!/bin/bash
        # Whatever tests are needed
        # E.g., send request and verify response
    exit 0
  2. 运行以下命令来创建 ConfigMap 对象:

    $ oc create configmap mycustomcheck --from-file=mycheckscript.sh
  3. 将脚本添加到容器集。挂载的 ConfigMap 对象的 defaultMode 必须能够使用 oc 命令或编辑 IP 故障转移配置来运行。

    1. 运行以下命令,将脚本添加到 pod。值通常为 0755493 十进制。例如:

      $ 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 命令对空格敏感。= 符号的两侧不能有空格。

    2. 或者,运行以下命令来编辑 ipfailover-keepalived 配置:

      $ oc edit deploy ipfailover-keepalived

      ipfailover-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
    3. 保存更改并退出编辑器。这会重启 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 故障转换配置的 Deployment YAML 示例

    ...
        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 地址。

流程

  1. 可选:识别并删除存储为配置映射的任何检查和通知脚本:

    1. 确定任何用于 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

    2. 如果上一步提供了用作卷的配置映射的名称,请删除配置映射:

      $ oc delete configmap <configmap_name>
  2. 为 IP 故障切换识别现有部署:

    $ oc get deployment -l ipfailover

    输出示例

    NAMESPACE   NAME         READY   UP-TO-DATE   AVAILABLE   AGE
    default     ipfailover   2/2     2            2           105d

  3. 删除部署:

    $ oc delete deployment <ipfailover_deployment_name>
  4. 删除 ipfailover 服务帐户:

    $ oc delete sa ipfailover
  5. 运行一个作业,该作业会删除最初配置 IP 故障切换时添加的 IP 表规则:

    1. 创建一个文件,如 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 故障切换的每个节点运行作业,并每次替换主机名。
    2. 运行作业:

      $ 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[].cidrnetworking.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:
注意

只支持名为 clusterProxy 对象,且无法创建额外的代理。

集群管理员可以通过修改这个 cluster Proxy 对象来配置 OpenShift Container Platform 的代理。

警告

在为集群启用集群范围代理功能并保存 Proxy 对象文件后,Machine Config Operator (MCO) 会重启集群中的所有节点,以便每个节点可以访问集群外的连接。您不需要手动重新引导这些节点。

先决条件

  • 有集群管理员权限。
  • 已安装 OpenShift Container Platform oc CLI 工具。

流程

  1. 创建包含代理 HTTPS 连接所需的额外 CA 证书的 ConfigMap。

    注意

    如果代理的身份证书由 Red Hat Enterprise Linux CoreOS (RHCOS) 信任捆绑包的颁发机构签名,您可以跳过这一步。

    1. 创建名为 user-ca-bundle.yaml 的文件,并提供 PEM 编码证书的值:

      apiVersion: v1
      data:
        ca-bundle.crt: | 
      1
      
          <MY_PEM_ENCODED_CERTS> 
      2
      
      kind: ConfigMap
      metadata:
        name: user-ca-bundle 
      3
      
        namespace: openshift-config 
      4

      其中:

      data.ca-bundle.crt
      指定必须命名为 ca-bundle.crt 的数据键。
      <MY_PEM_ENCODED_CERTS>
      指定用于为代理身份证书签名的一个或多个 PEM 编码的 X.509 证书。
      user-ca-bundle
      指定从 Proxy 对象引用的配置映射名称。
      openshift-config
      指定配置映射必须存在的命名空间。
    2. 输入以下命令从 user-ca-bundle.yaml 文件创建配置映射:

      $ oc create -f user-ca-bundle.yaml
  2. 使用 oc edit 命令修改 Proxy 对象:

    $ oc edit proxy/cluster
  3. 为代理配置所需的字段:

    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.com 
    3
    
      readinessEndpoints:
      - http://www.google.com 
    4
    
      - https://www.google.com
      trustedCA:
        name: user-ca-bundle 
    5

    其中:

    httpProxy
    指定用于创建集群外的 HTTP 连接的代理 URL。URL 方案必须是 http
    httpsProxy
    指定用于创建集群外的 HTTPS 连接的代理 URL。URL 方案必须是 httphttps。指定支持 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/24noproxy 字段和字段尝试访问 https://10.0.0.11,则地址可以成功匹配。但是,尝试访问 https://exampleserver.externaldomain.com (其 A 记录条目为 10.0.0.11 )会失败。对于 noproxy 字段,还需要额外的 .externaldomain.com 值。

    如果您扩展了未包含在安装配置中 networking.machineNetwork[].cidr 字段定义的计算节点,您必须将它们添加到此列表中,以防止连接问题。

    如果未设置 httpProxyhttpsProxy 字段,则此字段将被忽略。

    readinessEndpoints
    指定集群外部用于执行就绪度检查的一个或多个 URL,然后再将 httpProxyhttpsProxy 值写入 status。
    trustedCA
    指定对 openshift-config 命名空间中配置映射的引用,其中包含代理 HTTPS 连接所需的额外 CA 证书。注意 ConfigMap 必须已经存在,然后才能在这里引用它。此字段是必需的,除非代理的身份证书由来自 RHCOS 信任捆绑包的颁发机构签名。
  4. 保存文件以使改变生效。

5.3. 删除集群范围代理服务器

cluster Proxy 对象不能被删除。要从 OpenShift Container Platform 集群中删除集群范围代理配置,您可以使用 oc edit 命令从 Proxy 对象中删除所有 spec 字段。

先决条件

  • 集群管理员权限
  • 已安装 OpenShift Container Platform oc CLI 工具

流程

  1. 使用 oc edit 命令来修改代理:

    $ oc edit proxy/cluster
  2. 删除 Proxy 对象的所有 spec 字段。例如:

    apiVersion: config.openshift.io/v1
    kind: Proxy
    metadata:
      name: cluster
    spec: {}
  3. 保存文件以使改变生效。

5.4. 验证集群范围代理配置

要验证集群范围代理配置是否在 OpenShift Container Platform 中正常工作,您可以检查 Proxy 对象状态,查看 Machine Config Operator 日志,并通过代理确认系统组件是否在 OpenShift Container Platform 中路由外部请求。

先决条件

  • 有集群管理员权限。
  • 已安装 OpenShift Container Platform oc CLI 工具。

流程

  1. 使用 oc 命令检查代理配置状态:

    $ oc get proxy/cluster -o yaml
  2. 验证输出中的代理字段,以确保它们与您的配置匹配。具体来说,检查 spec.httpProxy,spec.httpsProxy,spec.noProxy, 和 spec.trustedCA 字段。
  3. 检查 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
    }

  4. 检查 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)
  5. 查找指示代理设置的消息,并在需要时重启节点。
  6. 通过检查发出外部请求的组件的日志来验证系统组件是否使用代理,如 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)
  7. 查找显示外部请求已通过代理路由的日志条目。

第 6 章 配置自定义 PKI

为确保 OpenShift Container Platform 集群中内部组件之间的安全通信,您可以将机构的自定义证书颁发机构(CA)证书添加到集群范围的信任存储中。

您可以使用 Proxy API 添加集群范围的可信 CA 证书。您必须在安装过程中或运行时执行此操作。

  • 在安装过程中配置集群范围的代理。您需要在 install-config.yaml 文件中的 additionalTrustBundle 设置中定义私有签名的 CA 证书。

    安装程序生成名为 user-ca-bundle 的 ConfigMap,其中包含您定义的附加 CA 证书。然后,Cluster Network Operator 会创建 trusted-ca-bundle ConfigMap,将这些内容与 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[].cidrnetworking.clusterNetwork[].cidrnetworking.serviceNetwork[] 字段的值填充。

    对于在 Amazon Web Services (AWS)、Google Cloud、Microsoft Azure 和 Red Hat OpenStack Platform (RHOSP)上安装,Proxy 对象 status.noProxy 字段也会填充实例元数据端点(169.254.169.254)。

流程

  1. 编辑 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 配置映射的策略。允许的值是 ProxyonlyAlways。仅在配置了 http/https 代理时,使用 Proxyonly 引用 user-ca-bundle 配置映射。使用 Always 始终引用 user-ca-bundle 配置映射。默认值为 Proxyonly。可选参数。

    注意

    安装程序不支持代理的 readinessEndpoints 字段。

    注意

    如果安装程序超时,重启并使用安装程序的 wait-for 命令完成部署。例如:

    $ ./openshift-install wait-for install-complete --log-level debug
  2. 保存该文件并在安装 OpenShift Container Platform 时引用。

    安装程序会创建一个名为 cluster 的集群范围代理,该代理 使用 提供的 install-config.yaml 文件中的代理设置。如果没有提供代理设置,仍然会创建一个 cluster Proxy 对象,但它会有一个空 spec

    注意

    只支持名为 clusterProxy 对象,且无法创建额外的代理。

6.2. 启用集群范围代理

要为 OpenShift Container Platform 集群启用集群范围的出口代理,您可以修改 Proxy 对象来配置 HTTP 和 HTTPS 代理设置,并指定绕过代理的域。

当在没有配置代理的情况下安装或升级集群时,仍会生成 Proxy 对象,但它有一个空的 spec。例如:

apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
  name: cluster
spec:
  trustedCA:
    name: ""
status:
注意

只支持名为 clusterProxy 对象,且无法创建额外的代理。

集群管理员可以通过修改这个 cluster Proxy 对象来配置 OpenShift Container Platform 的代理。

警告

在为集群启用集群范围代理功能并保存 Proxy 对象文件后,Machine Config Operator (MCO) 会重启集群中的所有节点,以便每个节点可以访问集群外的连接。您不需要手动重新引导这些节点。

先决条件

  • 有集群管理员权限。
  • 已安装 OpenShift Container Platform oc CLI 工具。

流程

  1. 创建包含代理 HTTPS 连接所需的额外 CA 证书的 ConfigMap。

    注意

    如果代理的身份证书由 Red Hat Enterprise Linux CoreOS (RHCOS) 信任捆绑包的颁发机构签名,您可以跳过这一步。

    1. 创建名为 user-ca-bundle.yaml 的文件,并提供 PEM 编码证书的值:

      apiVersion: v1
      data:
        ca-bundle.crt: | 
      1
      
          <MY_PEM_ENCODED_CERTS> 
      2
      
      kind: ConfigMap
      metadata:
        name: user-ca-bundle 
      3
      
        namespace: openshift-config 
      4

      其中:

      data.ca-bundle.crt
      指定必须命名为 ca-bundle.crt 的数据键。
      <MY_PEM_ENCODED_CERTS>
      指定用于为代理身份证书签名的一个或多个 PEM 编码的 X.509 证书。
      user-ca-bundle
      指定从 Proxy 对象引用的配置映射名称。
      openshift-config
      指定配置映射必须存在的命名空间。
    2. 输入以下命令从 user-ca-bundle.yaml 文件创建配置映射:

      $ oc create -f user-ca-bundle.yaml
  2. 使用 oc edit 命令修改 Proxy 对象:

    $ oc edit proxy/cluster
  3. 为代理配置所需的字段:

    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.com 
    3
    
      readinessEndpoints:
      - http://www.google.com 
    4
    
      - https://www.google.com
      trustedCA:
        name: user-ca-bundle 
    5

    其中:

    httpProxy
    指定用于创建集群外的 HTTP 连接的代理 URL。URL 方案必须是 http
    httpsProxy
    指定用于创建集群外的 HTTPS 连接的代理 URL。URL 方案必须是 httphttps。指定支持 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/24noproxy 字段和字段尝试访问 https://10.0.0.11,则地址可以成功匹配。但是,尝试访问 https://exampleserver.externaldomain.com (其 A 记录条目为 10.0.0.11 )会失败。对于 noproxy 字段,还需要额外的 .externaldomain.com 值。

    如果您扩展了未包含在安装配置中 networking.machineNetwork[].cidr 字段定义的计算节点,您必须将它们添加到此列表中,以防止连接问题。

    如果未设置 httpProxyhttpsProxy 字段,则此字段将被忽略。

    readinessEndpoints
    指定集群外部用于执行就绪度检查的一个或多个 URL,然后再将 httpProxyhttpsProxy 值写入 status。
    trustedCA
    指定对 openshift-config 命名空间中配置映射的引用,其中包含代理 HTTPS 连接所需的额外 CA 证书。注意 ConfigMap 必须已经存在,然后才能在这里引用它。此字段是必需的,除非代理的身份证书由来自 RHCOS 信任捆绑包的颁发机构签名。
  4. 保存文件以使改变生效。

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 路径。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

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

让开源更具包容性

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

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部