第 12 章 关于 ExternalIP

对于非云环境,OpenShift Container Platform 支持通过 ExternalIP 工具将外部 IP 地址分配给 Service spec.externalIPs 字段。这会公开分配给服务的额外虚拟 IP 地址,这些地址可能不在为集群定义的服务网络之外。使用外部 IP 功能配置的服务,和带有 type=NodePort 的服务相似,允许您将流量定向到本地节点以进行负载平衡。

您必须配置网络基础架构,以确保您定义的外部 IP 地址块路由到集群。

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

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

默认情况下,只有具有 cluster-admin 特权的用户才能创建带有 spec.externalIPs[] 设置为外部 IP 地址块中定义的 IP 地址的服务。

小心

默认情况下禁用,使用 ExternalIP 功能可能会造成安全隐患,因为集群内到一个外部 IP 地址的流量会定向到那个服务。这可让集群用户拦截用于外部资源的敏感流量。

重要

这个功能只在非云部署中被支持。对于云部署,使用负载均衡器服务自动部署云负载均衡器,以服务端点为目标。

您可以使用以下方法分配外部 IP 地址:

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

12.1. 配置 ExternalIP

在 OpenShift Container Platform 中使用外部 IP 地址取决于名为 clusterNetwork.config.openshift.io CR 中的以下字段:

  • spec.externalIP.autoAssignCIDRs 定义了一个负载均衡器在为服务选择外部 IP 地址时使用的 IP 地址块。OpenShift Container Platform 只支持单个 IP 地址块进行自动分配。当手工为服务分配 ExternalIPs 时,这比管理有限共享 IP 地址的端口空间更简单。如果启用了自动分配,则会为带有 spec.type=LoadBalancer 的服务分配一个外部 IP 地址。
  • 在手动指定 IP 地址时,spec.externalIP.policy 定义了允许的 IP 地址块。OpenShift Container Platform 不会将策略规则应用到 spec.externalIP.autoAssignCIDRs 定义的 IP 地址块。

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

小心

您必须确保分配的 IP 地址块在集群中的一个或多个节点上终止。

OpenShift Container Platform 支持自动和手动分配 IP 地址,并且保证每个地址都被分配到最多一个服务。这样可保证,无论由其他服务公开的端口是什么,每个服务都可以公开选择的端口。

注意

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

以下 YAML 描述了配置了外部 IP 的服务:

带有 spec.externalIPs[] 设置的示例服务对象

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