×

作为集群管理员,您可以指定一个外部IP地址块,该地址块可以向集群中的服务发送流量。

此功能通常最适用于安装在裸机硬件上的集群。

先决条件

  • 您的网络基础设施必须为外部IP地址到集群的流量进行路由。

关于ExternalIP

对于非云环境,OpenShift Container Platform 通过**ExternalIP**功能支持将外部IP地址分配给Service对象的spec.externalIPs[]字段。通过设置此字段,OpenShift Container Platform会为服务分配一个额外的虚拟IP地址。IP地址可以在为集群定义的服务网络之外。配置了ExternalIP的服务的功能类似于type=NodePort的服务,允许您将流量定向到本地节点进行负载均衡。

您必须配置网络基础设施以确保您定义的外部IP地址块已路由到集群。因此,IP地址不会在节点的网络接口中配置。为了处理流量,您必须使用静态地址解析协议 (ARP) 条目等方法配置外部IP的路由和访问。

OpenShift Container Platform通过添加以下功能扩展了Kubernetes中的ExternalIP功能

  • 通过可配置策略限制用户使用外部IP地址

  • 根据请求自动为服务分配外部IP地址

默认情况下禁用,使用ExternalIP功能可能存在安全风险,因为到外部IP地址的集群内流量将定向到该服务。这可能允许集群用户拦截目标为外部资源的敏感流量。

此功能仅在非云部署中受支持。对于云部署,请使用负载均衡器服务来自动部署云负载均衡器以定位服务的端点。

您可以使用MetalLB实现或IP故障转移部署来通过以下方式将ExternalIP资源附加到服务

自动分配外部IP

当您创建设置了spec.type=LoadBalancerService对象时,OpenShift Container Platform会自动将autoAssignCIDRs CIDR块中的IP地址分配到spec.externalIPs[]数组。在这种情况下,OpenShift Container Platform实现负载均衡器服务类型的非云版本,并将IP地址分配给服务。自动分配默认情况下已禁用,必须由集群管理员进行配置,如下节所述。

手动分配外部IP

当您创建Service对象时,OpenShift Container Platform使用分配给spec.externalIPs[]数组的IP地址。您不能指定另一个服务已使用的IP地址。

ExternalIP配置

在OpenShift Container Platform中使用外部IP地址受名为clusterNetwork.config.openshift.io CR中的以下字段控制

  • spec.externalIP.autoAssignCIDRs 定义了负载均衡器在为服务选择外部 IP 地址时使用的 IP 地址块。OpenShift Container Platform 仅支持单个 IP 地址块用于自动分配。与手动为服务分配 ExternalIPs 时必须管理数量有限的共享 IP 地址的端口空间相比,这可能更简单。如果启用自动分配,则分配给具有 spec.type=LoadBalancerService 对象一个外部 IP 地址。

  • spec.externalIP.policy 定义了手动指定 IP 地址时允许的 IP 地址块。OpenShift Container Platform 不会将策略规则应用于 spec.externalIP.autoAssignCIDRs 定义的 IP 地址块。

如果路由正确,则来自配置的外部 IP 地址块的外部流量可以通过服务公开的任何 TCP 或 UDP 端口到达服务端点。

作为集群管理员,您必须配置到 externalIPs 的路由。您还必须确保您分配的 IP 地址块终止于集群中的一个或多个节点。有关更多信息,请参见 Kubernetes 外部 IP

OpenShift Container Platform 支持 IP 地址的自动和手动分配,并保证每个地址最多分配给一个服务。这确保每个服务都可以公开其选择的端口,而不管其他服务公开的端口。

要在 OpenShift Container Platform 中使用 autoAssignCIDRs 定义的 IP 地址块,您必须为您的主机网络配置必要的 IP 地址分配和路由。

以下 YAML 描述了一个配置了外部 IP 地址的服务

具有已设置 spec.externalIPs[] 的示例 Service 对象
apiVersion: v1
kind: Service
metadata:
  name: http-service
spec:
  clusterIP: 172.30.163.110
  externalIPs:
  - 192.168.132.253
  externalTrafficPolicy: Cluster
  ports:
  - name: highport
    nodePort: 31903
    port: 30102
    protocol: TCP
    targetPort: 30102
  selector:
    app: web
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 192.168.132.253

外部 IP 地址分配限制

作为集群管理员,您可以指定允许和拒绝的 IP 地址块。

限制仅适用于没有 cluster-admin 权限的用户。集群管理员始终可以将服务 spec.externalIPs[] 字段设置为任何 IP 地址。

您可以通过指定 spec.ExternalIP.policy 字段来定义 policy 对象来配置 IP 地址策略。策略对象具有以下结构

{
  "policy": {
    "allowedCIDRs": [],
    "rejectedCIDRs": []
  }
}

配置策略限制时,适用以下规则

  • 如果设置了 policy={},则创建具有已设置 spec.ExternalIPs[]Service 对象将失败。这是 OpenShift Container Platform 的默认值。设置 policy=null 时的行为相同。

  • 如果设置了 policy,并且设置了 policy.allowedCIDRs[]policy.rejectedCIDRs[],则适用以下规则

    • 如果同时设置了 allowedCIDRs[]rejectedCIDRs[],则 rejectedCIDRs[] 优先于 allowedCIDRs[]

    • 如果设置了 allowedCIDRs[],则只有在允许指定的 IP 地址时,创建具有 spec.ExternalIPs[]Service 对象才会成功。

    • 如果设置了 rejectedCIDRs[],则只有在未拒绝指定的 IP 地址时,创建具有 spec.ExternalIPs[]Service 对象才会成功。

示例策略对象

以下示例演示了几种不同的策略配置。

  • 在以下示例中,策略阻止 OpenShift Container Platform 创建任何指定了外部 IP 地址的服务

    拒绝为 Service 对象 spec.externalIPs[] 指定的任何值的示例策略
    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      externalIP:
        policy: {}
      ...
  • 在以下示例中,同时设置了 allowedCIDRsrejectedCIDRs 字段。

    包含允许和拒绝的 CIDR 块的示例策略
    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      externalIP:
        policy:
          allowedCIDRs:
          - 172.16.66.10/23
          rejectedCIDRs:
          - 172.16.66.10/24
      ...
  • 在以下示例中,policy 设置为 null。如果设置为 null,则通过输入 oc get networks.config.openshift.io -o yaml 检查配置对象时,policy 字段将不会出现在输出中。

    允许为 Service 对象 spec.externalIPs[] 指定的任何值的示例策略
    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      externalIP:
        policy: null
      ...

ExternalIP 地址块配置

ExternalIP 地址块的配置由名为 cluster 的网络自定义资源 (CR) 定义。Network CR 是 config.openshift.io API 组的一部分。

在集群安装期间,集群版本运算符 (CVO) 会自动创建名为 cluster 的 Network CR。不支持创建此类型的任何其他 CR 对象。

以下 YAML 描述了 ExternalIP 配置

名为 cluster 的 Network.config.openshift.io CR
apiVersion: config.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  externalIP:
    autoAssignCIDRs: [] (1)
    policy: (2)
      ...
1 以 CIDR 格式定义可用于自动将外部 IP 地址分配给服务的 IP 地址块。只允许单个 IP 地址范围。
2 定义对手动将 IP 地址分配给服务的限制。如果未定义任何限制,则不允许在 Service 对象中指定 spec.externalIP 字段。默认情况下,未定义任何限制。

以下 YAML 描述了 policy 部分的字段

Network.config.openshift.io policy 部分
policy:
  allowedCIDRs: [] (1)
  rejectedCIDRs: [] (2)
1 以 CIDR 格式列出的允许的 IP 地址范围。
2 以 CIDR 格式列出的拒绝的 IP 地址范围。

示例外部 IP 配置

以下示例显示了外部 IP 地址池的几种可能的配置

  • 以下 YAML 描述了启用自动分配的外部 IP 地址的配置

    设置了 spec.externalIP.autoAssignCIDRs 的示例配置
    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      ...
      externalIP:
        autoAssignCIDRs:
        - 192.168.132.254/29
  • 以下 YAML 配置允许和拒绝的 CIDR 范围的策略规则

    设置了 spec.externalIP.policy 的示例配置
    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      ...
      externalIP:
        policy:
          allowedCIDRs:
          - 192.168.132.0/29
          - 192.168.132.8/29
          rejectedCIDRs:
          - 192.168.132.7/32

为您的集群配置外部 IP 地址块

作为集群管理员,您可以配置以下 ExternalIP 设置

  • OpenShift Container Platform 用于自动填充 Service 对象的 spec.clusterIP 字段的 ExternalIP 地址块。

  • 一个策略对象,用于限制可以手动分配给 Service 对象的 spec.clusterIP 数组的 IP 地址。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 以具有 cluster-admin 角色的用户身份访问集群。

步骤
  1. 可选:要显示当前的外部 IP 配置,请输入以下命令

    $ oc describe networks.config cluster
  2. 要编辑配置,请输入以下命令

    $ oc edit networks.config cluster
  3. 修改 ExternalIP 配置,例如:

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      ...
      externalIP: (1)
      ...
    1 指定 externalIP 部分的配置。
  4. 要确认更新后的 ExternalIP 配置,请输入以下命令

    $ oc get networks.config cluster -o go-template='{{.spec.externalIP}}{{"\n"}}'