管理 VPC 负载均衡器
更改现有 VPC 负载平衡器。
不要重命名任何 VPC NLB 或 ALB。 重命名 VPC 负载平衡器会导致 Kubernetes LoadBalancer
服务出错,这可能会中断您的工作负载。
持久 VPC 负载均衡器
默认情况下,VPC 负载均衡器会在与其关联的群集被删除时被删除。 不过,在创建 LoadBalancer
服务定义时,您可以将负载平衡器设置为持久性,这样即使群集被删除,负载平衡器也仍然可用。 持久性 VPC 负载均衡器可在其前一个群集被删除后应用于另一个群集。
VPC 负载平衡器名称默认格式为 kube-<cluster_ID>-<kubernetes_lb_service_UID>
。 删除群集时,此名称格式指定的相关负载平衡器也会被删除。 为确保删除群集时负载平衡器不会被删除,请在 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name
服务定义中包含 LoadBalancer
注解,为负载平衡器命名。 负载平衡器名称在 VPC 中必须是唯一的,并且只能包含小写字母数字字符和连字符 (-
)。注释可应用于所有 VPC 负载平衡器类型。
当不再需要持久性 VPC 负载平衡器时,您需要负责删除它们。 要删除持久 VPC 负载平衡器,请删除与 VPC 负载平衡器关联的 Kubernetes LoadBalancer
服务定义。
将 VPC 负载平衡器从一个群集移动到另一个群集
永久 VPC 负载平衡器 可从一个 VPC 群集分离,然后连接到另一个 VPC 群集。 新群集必须与原群集位于同一 VPC 中。
从群集中分离 VPC 负载均衡器
VPC 负载平衡器与创建时使用的 Kubernetes LoadBalancer
服务定义相连。 要从群集中分离持久性 VPC 负载平衡器,必须断开与 LoadBalancer
服务的链接。 这样做会导致 LoadBalancer
服务无法使用,因此可以安全地将其删除。 然后,VPC 负载平衡器可以 连接到不同的群集。
要断开 VPC 负载平衡器和 LoadBalancer
服务之间的链接,可以 重新命名 VPC 负载平衡器,或者从原始 LoadBalancer
服务定义中删除 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name
注解。 请注意,这是 * 重命名 VPC 负载平衡器的唯一*情况,因为这样做会导致 Kubernetes 资源出错。 但是,如果您的最终目标是在不同的群集上使用 VPC 负载平衡器,那么这个错误不会影响您的工作负载。 如果要在同一个群集中保留负载平衡器,请不要重命名 VPC 负载平衡器。
将 VPC 负载平衡器连接到群集
持久 VPC 负载平衡器从群集分离后,您可以通过创建引用 VPC 负载平衡器的新 Kubernetes LoadBalancer
服务定义,将其附加到另一个群集。
在新群集上创建新的 LoadBalancer
服务时,可以使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name
注解指定要附加的 VPC 负载平衡器的名称。
创建 LoadBalancer 服务时,VPC 负载平衡器类型(ALB、NLB)和 IP 类型(公共、私有)必须与 LoadBalancer
服务中的规范相匹配。 例如,新群集上指定 NLB 类型的现有 LoadBalancer
服务不能用于将 VPC ALB 附加到群集。 指定负载平衡器类型和 IP 类型的注释是 service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features
和 service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type
。
LoadBalancer
服务中指定的端口和节点端口不必与创建 VPC 负载平衡器时的端口和节点端口一致。 VPC 负载平衡器会根据新群集中与之关联的 LoadBalancer
服务的端口定义重新配置。
负载平衡器的健康检查
VPC 负载平衡器会自动配置健康检查,您可以使用 externalTrafficPolicy
注解对其进行配置。 您可以使用附加注解在负载平衡器上 自定义健康检查。
- 如果
externalTrafficPolicy
设置为Cluster
,则会应用 TCP 健康检查。 如果要配置 UDP 负载平衡器,您必须制定额外的端口规格。 - 如果将
externalTrafficPolicy
设置为Local
,则将应用 HTTP 健康检查。 传入的流量只传送到驻留在特定节点上的应用程序 pod。 如果特定节点上没有应用程序 pod,则会丢弃传入的流量。
externalTrafficPolicy: Local
设置可能会导致负载平衡器工作节点的健康检查失败。 通常,这种结果是预期行为,并不一定说明有问题,因为如果负载平衡器试图连接到没有应用程序 pod 的任何节点,就会故意放弃流量。 有关更多信息,请参阅 Why are VPC load balancer health checks failing on my worker nodes?。
自定义 VPC 负载均衡器的健康检查
要对 VPC 负载均衡器的健康检查进行更多控制,可以使用可选注释,通过对测试间隔、超时和重试的高级配置来定制健康检查。 您可以随时更改或删除这些自定义设置。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-protocol
- 可选:此注解在与 Kubernetes 负载平衡器服务关联的 VPC 负载平衡器资源上设置健康检查协议。 通常,VPC LB 健康检查协议由 Kubernetes 负载平衡器服务规范中的
externalTrafficPolicy
设置值决定。 本注解将覆盖该逻辑。 此注解不会改变Kubernetes(尤其是 kube-proxy)在externalTrafficPolicy
的各种设置方面的行为。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-port
- 可选。 用于健康检查的 TCP 端口。 只有同时指定
ibm-load-balancer-cloud-provider-vpc-health-check-protocol
时,此注释才适用。- 如果指定的 TCP 端口在 Kubernetes 节点端口范围(30,000-32,767)之外,则必须 修改适用于群集工作节点的 VPC 安全组,以允许端口上的入站流量。
- 如果此注释应用于与 VPC ALB 关联的 Kubernetes 负载平衡器服务,则必须对分配给 VPC ALB 的安全组的出站规则进行 修改,以允许出站流量到指定的 TCP 端口。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-path
- 可选。 HTTP 和HTTPs健康检查的 URL 路径。 此注释仅在
ibm-load-balancer-cloud-provider-vpc-health-check-protocol
设置为http
或https
时适用。- URL 路径必须采用 源表单请求目标格式。
- 如果未指定此注释,且
ibm-load-balancer-cloud-provider-vpc-health-check-protocol
注释设置为http
或https
,则应用默认值/
。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-delay
- 可选。 两次健康检查之间的等待秒数。 默认情况下,该值设置为
5
,最小值为2
,最大值为60
。 该值必须大于ibm-load-balancer-cloud-provider-vpc-health-check-timeout
值,默认设置为2
。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-timeout
- 可选。 等待健康检查回复的秒数。 默认情况下,该值设置为
2
,最小值为1
,最大值为59
。 该值必须小于ibm-load-balancer-cloud-provider-vpc-health-check-delay
值,默认设置为5
。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-retries
- VPC 负载均衡器健康检查重试的最大次数。 默认情况下,该值设置为
2
,最小值为1
,最大值为10
。
为 UDP 负载均衡器启用 TCP 健康检查
由于没有 UDP 健康检查,使用 TCP 健康检查的 UDP 负载平衡器必须使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp
注解指定额外的 TCP 端口。
您可以为群集中运行的另一个负载平衡器或 NodePort 指定 TCP 节点端口。 对于群集 1.29 和更早版本,如果节点端口位于 30000-32767
范围之外,则必须 修改 VPC 群集安全组 kube-<cluster-ID>
以允许传入流量 到指定端口。
请注意,如果指定端口值的服务意外宕机或端口值被重新配置,TCP 健康检查将停止工作,直到服务恢复正常或使用新的 TCP 端口值重新配置 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp
注解。 为避免这种情况,您可以指定 kubelet
端口 10250
,这是一个不会出现服务中断的静态端口值。 但是,对于群集版本
1.29 和更早版本,您必须 修改 VPC 群集安全组 kube-<cluster-ID>
以接受来自 kubelet
端口的传入流量。
想要避免在 UDP 负载均衡器中指定额外 TCP 端口进行健康检查的复杂性? 将 externalTrafficPolicy
设置为 Local
,即可使用 HTTP 进行健康检查,无需额外端口规格。
更改负载平衡器的子网或区域
创建VPC NLB后,您无法重新配置创建时使用的侦听子网。 如果要更改现有 VPC NLB 的监听子网,必须删除、更新并重新应用相应的 Kubernetes LoadBalancer
服务。
-
列出您的 Kubernetes 服务,并找到您要更改的
LoadBalancer
服务的名称。kubectl get services
示例输出。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-load-balancer LoadBalancer 172.21.77.198 52.118.150.107 8080:32767/TCP,443:30943/TCP 5d
-
查找与 Kubernetes
LoadBalancer
服务相对应的 VPC 负载平衡器。VPC 负载平衡器名称的格式为
kube-<cluster_ID>-<kubernetes_lb_service_UID>
。 要查看群集 ID,请运行ibmcloud ks cluster get --cluster <cluster_name>
。 要查看 Kubernetes LoadBalancer 服务 UID,请运行kubectl get svc <load-balancer-name> -o yaml
并在输出中查找 metadata.uid 字段。 在 VPC 负载均衡器名称中,删除 KubernetesLoadBalancer
服务 UID 中的连字符 (-)。ibmcloud is load-balancers
示例输出。
ID Name Family Subnets Is public Provision status Operating status Resource group r000-5aaaa11f6-c111-111f-b2e0-1c11aaaaf0dc0 kube-c441c43d02mb8mg00r70-3e25d0b5bf11111111fe4ca3f11111cb Network subnet-1 true active online default Application
-
获取 Kubernetes
LoadBalancer
服务定义,并将输出保存为名为my-lb.yaml
的 yaml 文件。kubectl describe service my-load-balancer -o yaml
-
删除 Kubernetes
LoadBalancer
服务。 这也会删除相应的 VPC 负载平衡器。kubectl delete service my-load-balancer
-
使用要实施的子网或区域变更更新 Kubernetes
LoadBalancer
服务定义文件。 请勿更改LoadBalancer
服务的名称。 有关为网络负载平衡器指定子网或区域的详细信息,请参阅 为 VPC 设置 Network Load Balancer for VPC。 -
应用新的
LoadBalancer
定义文件。kubectl apply -f my-lb.yaml
-
验证 Kubernetes
LoadBalancer
服务是否已在群集中成功重新创建。 创建服务时,LoadBalancer 入口字段将填入 NLB 的外部 IP 地址。kubectl describe service my-load-balancer
示例输出。
NAME: my-load-balancer Namespace: default Labels: <none> Annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: nlb Selector: app=echo-server Type: LoadBalancer IP: 172.X.XXX.XX LoadBalancer Ingress: 169.XXX.XXX.XXX Port: tcp-80 80/TCP TargetPort: 8080/TCP NodePort: tcp-80 32022/TCP Endpoints: 172.XX.XX.XXX:8080,172.XX.XX.XX:8080,172.XX.XX.XX:8080 + 3 more... Session Affinity: None External Traffic Policy: Local HealthCheck NodePort: 30882 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 9m27s (x7 over 15m) service-controller Ensuring load balancer Normal EnsuredLoadBalancer 9m20s service-controller Ensured load balancer Normal CloudVPCLoadBalancerNormalEvent 8m17s ibm-cloud-provider Event on cloud load balancer myvpcnlb for service default/my-load-balancer with UID 2d93b07d-ecf6-41d2-ad3f-9c2985122ec1: The VPC load balancer that routes requests to this Kubernetes LoadBalancer service is currently online/active.
-
验证 VPC 负载平衡器是否已重新创建,子网或区域是否已更新。 请注意,调配 VPC 负载平衡器需要几分钟时间,在完全调配之前,您可能会看到
create_pending
状态。ibmcloud is load-balancers
示例输出。
ID Name Family Subnets Is public Provision status Operating status Resource group r006-5ecc68f6-c751-409f-b2e0-1c69babf0dc0 kube-c441c43d02mb8mg00r70-3e25d0b5bf03445796fe4ca3f73885cb Network subnet-2 true active online default