可以将 LoadBalancer 类型的 Kubernetes 服务配置为使用静态 IP 地址。实施此功能之前,请了解最低组件要求、重要的安全注意事项和集群强化指导。

最低要求

在满足以下要求的 Tanzu Kubernetes 集群上,支持对 LoadBalancer 类型的 Kubernetes 服务进行静态 IP 寻址:
组件 最低要求 更多信息
vCenter Server 和 ESXi vSphere 7.0 Update 2 请参见发行说明
主管集群 v1.19.1+vmware.2-vsc0.0.8-17610687 请参见通过执行 vSphere 命名空间更新来更新 主管集群
负载均衡器

NSX-T Data Center v3.1

NSX Advanced 20.1.x

请参见发行说明
Tanzu Kubernetes 版本 Tanzu Kubernetes 最新版本之一。 请参见验证 Tanzu Kubernetes 集群的更新兼容性

对 LoadBalancer 类型的服务使用静态 IP

通常,定义 LoadBalancer 类型的 Kubernetes 服务时,会获得由负载均衡器分配的临时 IP 地址。请参见Tanzu Kubernetes 服务负载均衡器示例

或者,也可以为负载均衡器指定静态 IP 地址。创建服务时,将使用分配的静态 IP 地址置备负载均衡器实例。

以下示例服务展示了如何为支持的负载均衡器配置静态 IP 地址。在服务规范中,包括 loadBalancerIP 参数和 IP 地址值,在此示例中为 10.11.12.49
kind: Service
apiVersion: v1
metadata:
  name: load-balancer-service-with-static-ip
spec:
  selector:
    app: hello-world
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 80
  type: LoadBalancer
  loadBalancerIP: 10.11.12.49

对于 NSX Advanced Load Balancer,使用安装负载均衡器时为其配置的 IPAM 池中的 IP 地址。创建服务并分配静态 IP 地址后,负载均衡器会将其标记为已分配,并像管理临时 IP 地址一样管理该 IP 地址的生命周期。也就是说,如果移除该服务,该 IP 地址将取消分配并可用于重新分配。

对于 NSX-T 负载均衡器,有两种方案。默认机制与 NSX Advanced Load Balancer 一样:使用安装负载均衡器时为其配置的 IP 池中的 IP 地址。分配静态 IP 地址后,负载均衡器自动将其标记为已分配并管理其生命周期。

第二种 NSX-T 方案是手动预分配静态 IP 地址。在这种情况下,不使用分配给负载均衡器的外部负载均衡器 IP 池中的 IP 地址,而是从浮动 IP 池中获取。在这种情况下,需要使用 NSX Manager 手动管理 IP 地址的分配和生命周期。

重要安全注意事项和强化要求

使用此功能时,需要注意一个潜在的安全问题。如果开发人员能够修补 Service.status.loadBalancerIP 值,则开发人员可能能够劫持集群中流向已修补 IP 地址的流量。具体而言,如果具有 patch 权限的 Role 或 ClusterRole 绑定到实施此功能的集群上的服务或用户帐户,则该帐户所有者能够使用自己的凭据发出 kubectl 命令,并更改分配给负载均衡器的静态 IP 地址。

为了避免对负载均衡器服务使用静态 IP 分配带来的潜在安全隐患,必须强化要实施此功能的每个集群。为此,您为任何开发人员定义的 Role 或 ClusterRole 都不得对 apiGroups:""resources: services/status 使用 patch 谓词。示例角色代码片段展示了实施此功能时禁止执行的操作。

不允许修补
- apiGroups:
  - ""
  resources:
  - services/status
  verbs:
  - patch
要检查开发人员是否具有修补程序权限,请以该用户角色运行以下命令:
kubectl --kubeconfig <KUBECONFIG> auth can-i patch service/status

如果命令返回 yes,说明用户具有 patch 权限。有关详细信息,请参见 Kubernetes 文档中的检查 API 访问

要授予开发人员对集群的访问权限,请参见向开发人员授予 Tanzu Kubernetes 集群访问权限。有关您可以自定义的 Role 模板示例,请参见 Pod 安全策略的示例角色。有关如何限制集群访问权限的示例,请参见 https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-example