27.2. 为服务配置 ExternalIP
作为集群管理员,您可以指定可向集群中服务发送流量的集群外部 IP 地址块。
这个功能通常最适用于在裸机硬件上安装的集群。
27.2.1. 先决条件
- 您的网络基础架构必须将外部 IP 地址的流量路由到集群。
27.2.2. 关于 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=LoadBalancer
设置的Service
对象时,OpenShift Container Platform 会从autoAssignCIDRs
CIDR 块中自动为spec.externalIPs[]
分配一个 IP 地址。在本例中,OpenShift Container Platform 实现了负载均衡器服务类型的非云版本,并为服务分配 IP 地址。默认情况下,自动分配被禁用,且必须由集群管理员配置,如以下部分所述。 - 手动分配外部 IP
-
OpenShift Container Platform 在创建
Service
对象时使用分配给spec.externalIPs[]
数组的 IP 地址。您不能指定已经被其他服务使用的 IP 地址。
27.2.2.1. 配置 ExternalIP
在 OpenShift Container Platform 中使用外部 IP 地址取决于名为 cluster
的 Network.config.openshift.io
CR 中的以下字段:
-
spec.externalIP.autoAssignCIDRs
定义了一个负载均衡器在为服务选择外部 IP 地址时使用的 IP 地址块。OpenShift Container Platform 只支持单个 IP 地址块进行自动分配。当手工为服务分配 ExternalIPs 时,这比管理有限共享 IP 地址的端口空间更简单。如果启用了自动分配,则会为带有spec.type=LoadBalancer
的Service
对象分配一个外部 IP 地址。 -
在手动指定 IP 地址时,
spec.externalIP.policy
定义了允许的 IP 地址块。OpenShift Container Platform 不会将策略规则应用到spec.externalIP.autoAssignCIDRs
定义的 IP 地址块。
如果路由正确,来自配置的外部 IP 地址块的外部流量可以通过服务公开的任何 TCP 或 UDP 端口访问服务端点。
作为集群管理员,您必须在 OpenShiftSDN 和 OVN-Kubernetes 网络类型中配置到 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
27.2.2.2. 对外部 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[]
,则allowedCIDRs[]
的设置高于rejectedCIDRs[]
。 -
如果设置了
allowedCIDRs[]
,只有在允许指定的 IP 地址时,创建带有spec.ExternalIPs[]
的Service
对象才能成功。 -
如果设置了
rejectedCIDRs[]
,只有在指定的 IP 地址未被拒绝时,创建带有spec.ExternalIPs[]
的Service
对象才能成功。
-
如果同时设置了
27.2.2.3. 策略对象示例
下面的例子演示了几个不同的策略配置。
在以下示例中,策略会防止 OpenShift Container Platform 使用指定的外部 IP 地址创建任何服务:
拒绝为
Service
对象spec.externalIPs[]
指定的任何值的策略示例apiVersion: config.openshift.io/v1 kind: Network metadata: name: cluster spec: externalIP: policy: {} ...
在以下示例中,设置了
allowedCIDRs
和rejectedCIDRs
字段。包括允许和拒绝 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 network.config.openshift.io -o yaml
来检查配置对象时,policy
项不会出现在输出中。允许为
Service
对象spec.externalIPs[]
指定的任何值的示例策略apiVersion: config.openshift.io/v1 kind: Network metadata: name: cluster spec: externalIP: policy: null ...
27.2.3. 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 ...
以下 YAML 描述了 policy
小节的字段:
network.config.openshift.io policy
小节
policy: allowedCIDRs: [] 1 rejectedCIDRs: [] 2
外部 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
27.2.4. 为集群配置外部 IP 地址块
作为集群管理员,可以配置以下 ExternalIP 设置:
-
OpenShift Container Platform 用来自动填充
Service
对象的spec.clusterIP
字段的 ExternalIP 地址块。 -
用于限制可手动分配给
Service
对象的spec.clusterIP
数组的 IP 地址的策略对象。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
角色的用户访问集群。
流程
可选: 要显示当前的外部 IP 配置,请输入以下命令:
$ oc describe networks.config cluster
要编辑配置,请输入以下命令:
$ oc edit networks.config cluster
修改 ExternalIP 配置,如下例所示:
apiVersion: config.openshift.io/v1 kind: Network metadata: name: cluster spec: ... externalIP: 1 ...
- 1
- 指定
externalIP
小节的配置。
要确认更新的 ExternalIP 配置,请输入以下命令:
$ oc get networks.config cluster -o go-template='{{.spec.externalIP}}{{"\n"}}'