26.2. 为服务配置 ExternalIP


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

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

26.2.1. 先决条件

  • 您的网络基础架构必须将外部 IP 地址的流量路由到集群。

26.2.2. 关于 ExternalIP

对于非云环境,OpenShift Container Platform 支持使用 ExternalIP 工具在 Service 对象的 spec.externalIPs[] 参数中指定外部 IP 地址。使用 ExternalIP 功能配置的服务与具有 type=NodePort 的服务相似,通过流量定向到本地节点以进行负载均衡。

重要

对于云环境,使用负载均衡器服务自动部署云负载均衡器,以服务端点为目标。

为参数指定值后,OpenShift Container Platform 会为该服务分配额外的虚拟 IP 地址。IP 地址可以存在于您为集群定义的服务网络之外。

警告

因为默认情况下会禁用 ExternalIP,所以启用 ExternalIP 功能可能会给该服务带来安全风险,因为集群内到外部 IP 地址的流量会定向到该服务。此配置意味着集群用户可以截获用于外部资源的敏感流量。

您可以使用 MetalLB 实现或 IP 故障转移部署,将 ExternalIP 资源附加到服务:

自动分配一个外部 IP
当创建了一个带有 spec.type=LoadBalancer 设置的 Service 对象时,OpenShift Container Platform 会从autoAssignCIDRs CIDR 块中自动为 spec.externalIPs[] 分配一个 IP 地址。对于此配置,OpenShift Container Platform 实施负载均衡器服务类型的云版本,并为服务分配 IP 地址。默认情况下,自动分配被禁用,必须由集群管理员配置,如 "Configuration for ExternalIP" 部分所述。
手动分配外部 IP
OpenShift Container Platform 在创建 Service 对象时使用分配给 spec.externalIPs[] 数组的 IP 地址。您不能指定已经被其他服务使用的 IP 地址。

在使用 MetalLB 实现或 IP 故障转移部署来托管外部 IP 地址块后,您必须配置网络基础架构,以确保外部 IP 地址块路由到集群。此配置意味着,IP 地址没有在来自节点的网络接口中配置。要处理流量,您必须使用方法配置路由和访问外部 IP,如静态地址解析协议(ARP)条目。

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

  • 通过可配置策略对用户使用外部 IP 地址的限制
  • 根据请求自动将外部 IP 地址分配给服务

26.2.3. 其他资源

26.2.4. 配置 ExternalIP

在 OpenShift Container Platform 中使用外部 IP 地址取决于名为 clusterNetwork.config.openshift.io 自定义资源(CR)中的以下参数:

  • spec.externalIP.autoAssignCIDRs 定义了一个负载均衡器在为服务选择外部 IP 地址时使用的 IP 地址块。OpenShift Container Platform 只支持单个 IP 地址块进行自动分配。这个配置需要较少的步骤,而不是手动为服务分配 ExternalIP,这需要管理有限共享 IP 地址的端口空间。如果您启用自动分配,则会为带有 spec.type=LoadBalancerService 对象分配一个外部 IP 地址。
  • 在手动指定 IP 地址时,spec.externalIP.policy 定义了允许的 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
# ...

26.2.5. 对外部 IP 地址分配的限制

作为集群管理员,您可以指定 IP 地址块来允许和拒绝服务的 IP 地址。限制只针对没有 cluster-admin 权限的用户。集群管理员始终可以将服务 spec.externalIPs[] 字段设置为任何 IP 地址。

您可以通过在策略对象中为 spec.ExternalIP.policy 参数指定无类别域间路由(CIDR)地址块来配置 IP 地址 策略

策略对象 及其 CIDR 参数的 JSON 格式示例

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

在配置策略限制时,会应用以下规则:

  • 如果 策略设置为 {},创建带有 spec.ExternalIPs[]Service 对象会导致服务失败。此设置是 OpenShift Container Platform 的默认设置。策略存在同样的行为: null
  • 如果设置了policy,并且设置了 policy.allowedCIDRs[]policy.rejectedCIDRs[],则应用以下规则:

    • 如果同时设置了 allowedCIDRs[]rejectedCIDRs[],则 rejectedCIDRs[] 优先于 allowedCIDRs[]
    • 如果设置了 allowedCIDRs[],只有在允许指定的 IP 地址时,创建带有 spec.ExternalIPs[]Service 对象才能成功。
    • 如果设置了 rejectedCIDRs[],只有在指定的 IP 地址未被拒绝时,创建带有 spec.ExternalIPs[]Service 对象才能成功。

26.2.6. 策略对象示例

本节中的示例显示不同的 spec.externalIP.policy 配置。

  • 在以下示例中,策略会阻止 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 设置为 {}。使用这个配置,使用 oc get network.config.openshift.io -o yaml 命令查看配置意味着 policy 参数不会显示在命令输出上。策略存在同样的行为: null

    允许为 Service 对象 spec.externalIPs[]指定的任何值的示例策略

    apiVersion: config.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      clusterNetwork:
      - cidr: 10.128.0.0/14
        hostPrefix: 23
      externalIP:
        policy: {}
    # ...

26.2.7. ExternalIP 地址块配置

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

重要

在集群安装过程中,Cluster Version Operator(CVO)会自动创建一个名为 cluster 的网络 CR。不支持创建此类型的任何其他 CR 对象。

以下 YAML 描述了 ExternalIP 配置:

network.config.openshift.io CR 名为 cluster

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

26.2.8. 为集群配置外部 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"}}'

26.2.9. 后续步骤

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.