对于非云环境,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块中的IP地址分配到spec.externalIPs[]
数组。在这种情况下,OpenShift Container Platform实现负载均衡器服务类型的非云版本,并将IP地址分配给服务。自动分配默认情况下已禁用,必须由集群管理员进行配置,如下节所述。
- 手动分配外部IP
-
当您创建Service
对象时,OpenShift Container Platform使用分配给spec.externalIPs[]
数组的IP地址。您不能指定另一个服务已使用的IP地址。
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 地址。
-
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": []
}
}
示例策略对象
-
在以下示例中,策略阻止 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 networks.config.openshift.io -o yaml
检查配置对象时,policy
字段将不会出现在输出中。
允许为 Service
对象 spec.externalIPs[]
指定的任何值的示例策略
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
externalIP:
policy: null
...