设置一个 Application Load Balancer for VPC

通过在集群中设置 Kubernetes LoadBalancer 服务,向公用或专用网络公开应用程序。 当您发布应用时,系统会自动在集群外的 VPC 中为您创建一个 Application Load Balancer for VPC (VPC ALB),用于将请求路由到您的应用。 然后,您可以选择 通过 DNS 记录和 TLS 证书为 VPC ALB 进行注册。 VPC ALB 仅支持 TCP 协议。

请勿将 Application Load Balancer for VPC 与 Red Hat OpenShift on IBM Cloud 的Ingress应用负载均衡器混淆。 VPC 应用负载均衡器(VPC ALB)在您的 VPC 中、集群外部运行,并由您创建的 Kubernetes LoadBalancer 服务进行配置。 Ingress 应用程序负载平衡器(ALB) 是在集群中的工作节点上运行的 Ingress 控制器。

设置公共或私有 VPC ALB

准备工作

要使您的应用能够接收公共或私有请求:

  1. 将应用程序部署到集群。 确保在部署配置文件的 metadata 部分中添加标签。 此定制标签可标识运行您的应用程序的所有 pod,以便在负载均衡中包含这些 pod。

  2. 为您的 Kubernetes LoadBalancer 服务创建配置 YAML 文件。 在 YAML 文件中,将 service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type 注解指定为 "public""private"。 示例文件中的 annotations 部分仅包含一些可用注释。 有关必需和可选 VPC ALB 注释的完整列表,请参阅 注释和规范

    为使您的 VPC ALB 易于识别,请考虑以 <app_name>-vpc-alb-<VPC_zone> 的格式命名服务。

    apiVersion: v1
    kind: Service
    metadata:
      name: myloadbalancer
      annotations:
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "`<app_name>-vpc-alb-<VPC_zone>`"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "proxy-protocol"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "<public_or_private>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector: "<key>=<value>"
    spec:
     type: LoadBalancer
     selector:     
        <selector_key>: <selector_value>
     ports:
       - name: http
         protocol: TCP
         port: 8080
         targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
       - name: https
         protocol: TCP
         port: 443
         targetPort: 443 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
      externalTrafficPolicy: Local # Specify Local or Cluster.
    
  3. 在集群中创建 Kubernetes LoadBalancer 服务。

    oc apply -f myloadbalancer.yaml -n <namespace>
    
  4. 验证 Kubernetes LoadBalancer 服务是否已在集群中成功创建。 创建服务时,LoadBalancer 的“Ingress”字段会自动填充由 VPC ALB 分配的主机名。

在您的 VPC 中配置 VPC ALB 需要几分钟时间。 在 VPC ALB 完全配置完成之前,您无法通过 Kubernetes LoadBalancer 服务的主机名访问您的应用。

```sh {: pre}
oc describe svc myloadbalancer -n <namespace>
```
公共 `LoadBalancer` 服务的 CLI 输出示例:
```sh {: screen}
NAME:                     myvpcalb
Namespace:                default
Labels:                   <none>
Annotations:              
Selector:                 app=echo-server
Type:                     LoadBalancer
IP:                       172.21.XX.XX
LoadBalancer Ingress:     1234abcd-us-south.lb.appdomain.cloud
Port:                     tcp-80  80/TCP
TargetPort:               8080/TCP
NodePort:                 tcp-80  30610/TCP
Endpoints:                172.17.17.133:8080,172.17.22.68:8080,172.17.34.18:8080 + 3 more...
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     31438
Events:
    Type    Reason                           Age   From                Message
----    ------                           ----  ----                -------
Normal  EnsuringLoadBalancer             16m   service-controller  Ensuring load balancer
Normal  EnsuredLoadBalancer              15m   service-controller  Ensured load balancer
Normal  CloudVPCLoadBalancerNormalEvent  13m   ibm-cloud-provider  Event on cloud load balancer myvpcalb for service default/myvpcalb with UID 08cbacf0-2c93-4186-84b6-c4ab88a2faf9: The VPC load balancer that routes requests to this Kubernetes LoadBalancer service is currently online/active.
```
  1. 请确认 VPC ALB 已在您的 VPC 中成功创建。 在输出结果中,请确认该 VPC ALB 的“运行状态”为 online,且“配置状态”为 active

    ibmcloud is load-balancers
    

    在下面的 CLI 输出示例中,为 Kubernetes LoadBalancer 服务创建了一个名为 kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306 的 VPC ALB:

    ID                                          Name                                                         Family        Subnets               Is public   Provision status   Operating status   Resource group
    r006-d044af9b-92bf-4047-8f77-a7b86efcb923   kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306   Application   mysubnet-us-south-3   true        active             online             default
    
  2. 如果您创建了一个公共的 LoadBalancer 服务,请使用curl命令访问 Kubernetes LoadBalancer 服务的主机名,该主机名由您在第4步中找到的VPC ALB分配。 示例:

    curl 06496f64-us-south.lb.appdomain.cloud:8080
    

    示例输出

    Hello world from hello-world-deployment-5fd7787c79-sl9hn! Your app is up and running in a cluster!
    

    如果创建的是专用 LoadBalancer 服务,那么必须连接到专用 VPC 网络才能对主机名运行 curl 命令。

在创建群集时或在区域中添加工作节点时,请勿删除连接到群集的子网。 如果删除群集使用过的 VPC 子网,使用该子网 IP 地址的负载平衡器可能会出现问题,而且可能无法创建新的负载平衡器。

未与 Kubernetes 或 OpenShift 集群关联的 VPC ALB 和 NLB,可直接通过“ibmcloud is”命令或控制台中的 “VPC 基础设施”部分进行更新。 例如,更改前端监听器的端口或健康检查超时值。 但对于与 Kubernetes 或 OpenShift 集群关联的 VPC 负载均衡器,对其进行的任何更新都必须通过 Ingress 配置中的注解来完成。 IBM Cloud 提供程序会定期与任何关联的 VPC ALB 和 NLB 重新同步,以确保正在运行的负载均衡器符合 Ingress 的预期配置。 因此,如果您不使用 Ingress 注解,而是直接通过 VPC 对这样的负载均衡器进行任何更改,这些更改将会被撤销。

注册 DNS 记录和 TLS 证书

Application Load Balancer for VPC (VPC ALB)提供了一个默认的 HTTP 主机名,格式为 1234abcd-<region>.lb.appdomain.cloud,您可以通过该主机名访问您的应用。 不过,如果您希望为应用域获取一个 TLS 证书以支持 HTTPS,您可以为公共和私有 VPC ALB 分别创建一个由 IBM 提供的子域名,或者使用您自己的自定义域名。

为 VPC ALB 主机名创建 DNS 子域名后,您将无法使用 nlb-dns health-monitor 命令来创建自定义健康检查。 相反,系统会使用为默认 VPC ALB 主机名提供的默认 VPC 负载均衡器健康检查。 有关更多信息,请参阅 VPC 文档

准备工作

  • 设置 VPC ALB。 确保在配置 VPC ALB 的 Kubernetes LoadBalancer 服务中定义 HTTPS 端口。
  • 若要使用 TLS 证书通过 HTTPS 访问您的应用,您的应用必须能够终止 TLS 连接。

使用 DNS 子域注册 VPC ALB 主机名:

  1. 运行 get svc 命令,获取 VPC ALB 的主机名。 在输出的 EXTERNAL-IP 列中查找该主机名。 例如,1234abcd-us-south.lb.appdomain.cloud

    oc get svc -o wide
    

    示例输出

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP                            PORT(S)     AGE       SELECTOR
    ...
    webserver-lb    LoadBalancer   172.21.xxx.xxx   1234abcd-us-south.lb.appdomain.cloud   8080:30532/TCP     1d       run=webserver
    
  2. 为负载均衡器的主机名创建一个自定义的或由 IBM 提供的DNS子域名。

    • 自定义域:提供您自己的自定义域,并通过指定负载平衡器的外部 IP(格式为 1234abcd-us-south.lb.appdomain.cloud 作为规范名称记录 (CNAME))为其赋予别名。

      1. 通过与域名服务 (DNS) 提供商或 IBM Cloud DNS 合作,注册自定义域名。
      2. 通过将负载均衡器的外部 IP 地址指定为规范名称记录 (CNAME),为您的自定义域名定义一个别名。 在下面的示例中,外部 IP 为 1234abcd-us-south.lb.appdomain.cloud 的负载平衡器可通过 www.your-custom-domain.com 到达。
      主机/服务
      您希望到达应用程序的前缀,如 www
      资源类型
      选择 CNAME
      TTL
      选择生活的时间。
      值/目标
      您之前获取的 LoadBalancer 外部 IP。 例如 1234abcd-us-south.lb.appdomain.cloud.。 请注意,在使用 IBM Cloud DNS 时,请务必输入尾部句点。
    • IBM-提供的子域名:使用 nlb-dns 命令,为 VPC ALB 主机名生成一个带有 TLS 证书的子域名。IBM Cloud 会为您自动生成并维护该子域名的通配符 TLS 证书。

      1. 创建一个 DNS 子域名和 TLS 证书。
        ibmcloud oc nlb-dns create vpc-gen2 --cluster CLUSTER_NAME_OR_ID --lb-host VPC_LB_HOSTNAME --type (public|private)
        
      2. 验证子域是否已创建。 有关更多信息,请参阅了解子域格式
        ibmcloud oc nlb-dns ls --cluster CLUSTER_NAME_OR_ID
        
        示例输出
        Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
        
  3. 如果您为公共 VPC ALB 创建了子域名,请打开网页浏览器,输入 URL,即可通过该子域名访问您的应用,例如示例中的 www.your-custom-domain.com。 如果您为私有 VPC ALB 创建了子域名,则 必须连接到私有 VPC 网络 才能测试对该子域名的访问。

若要使用 TLS 证书通过 HTTPS 访问您的应用,请确保已在 Kubernetes LoadBalancer 服务中 定义了 HTTPS 端口。 您可以通过运行 curl -v --insecure https://<domain> 来验证请求是否正确地通过 HTTPS 端口进行路由。 连接错误表明该服务上没有打开的 HTTPS 端口。 此外,请确保您的应用能够终止 TLS 连接。 您可以通过运行 curl -v https://<domain> 来验证您的应用是否正确终止了 TLS。 证书错误表明您的应用未能正确关闭 TLS 连接。

为私有 VPC ALB 注册私有 DNS 记录

在 4.15 或更高版本中,您可以使用以下可选注释将服务于自定义 DNS instance 的自有 DNS zone 与私有 VPC ALB 关联起来。 为此,必须设置两个可选注释。 如果未指定,则会将此负载均衡器的 hostname 属性的 DNS A 记录添加到公共 DNS 区域 lb.appdomain.cloud 中。

service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-instance-crn: "private-dns-crn"
与该负载均衡器关联的 DNS instance 。 根据 IAM 政策,指定的实例可能位于不同的区域或账户中。 可能的值:9 ≤ 长度 ≤ 512
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-zone-id: "dns-zone-id"
与该负载均衡器关联的 DNS zone 。 根据 IAM 政策,指定区域可能位于不同的区域或账户中。 可能的值:1 ≤ length ≤ 128,值必须匹配正则表达式 [1]*[a-z0-9]$

使用此功能前,您需要满足以下要求:

  • 创建可绑定到负载平衡器的 DNS 区域
  • 启用 VPC LB 和 DNS Services之间的服务对服务授权
  • 将群集的 VPC 添加到区域的允许网络中

有关详细信息,请参阅 Integrating an application load balancer with IBM Cloud DNS ServicesAdd a VPC as a permitted network to the DNS zone 文档。

示例:

apiVersion: v1
kind: Service
metadata:
  name: myloadbalancer
  annotations:
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "my-load-balancer"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "private"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-instance-crn: "crn:v1:bluemix:public:dns-svcs:global:a/bb1b52262f7441a586f49068482f1e60:f761b566-030a-4696-8649-cc9d09889e88::"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-zone-id: "d66662cc-aa23-4fe1-9987-858487a61f45"
spec:
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 169.60.115.164
...

注释和规格

查看所需和可选的 VPC ALB 注释和规范。

所需的注释和规格

service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "alb"
注释来创建 VPC ALB。 如果不包含 service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features,则默认配置 VPC ALB。
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "private"
(私有 VPC ALB 需要)用于指定接受公共或私有请求的服务的注释。 如果不包含此注释,则会创建公共 VPC ALB。
externalTrafficPolicy
指定 Cluster 以将请求转发到包含应用程序 pod 的 Worker 节点。 该工作节点可能位于不同的区域。 默认情况下,该注解设置为 Cluster
指定 Local 以防止传入流量转发到其他节点。 该选项还可配置 HTTP 健康检查。
请注意,要在 VPC ALB 中使用原始客户端源 IP,必须使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "proxy-protocol" 注解启用 PROXY 协议。

可选注释和规格

service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name
包含一个唯一的名称,使您的 VPC 负载均衡器具有持久性。 删除所属群集时,不会删除持久 VPC 负载平衡器。 有关详细信息,请参阅 持久 VPC 负载平衡器。 此注释只能在创建负载平衡器时设置。 它不能用于更新操作。
service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "proxy-protocol"
启用 PROXY 协议。 负载平衡器会将客户端连接信息(包括客户端 IP 地址、代理服务器 IP 地址和端口号)通过请求头传递给后端应用程序。 请注意,您的后端应用程序必须配置为接受 PROXY 协议。 例如,您可以按照 以下步骤配置 NGINX 应用程序,使其支持PROXY协议。
service.kubernetes.io/ibm-load-balancer-cloud-provider-zone
注释,以指定群集所连接的 VPC 区域。 在此注释中指定区域时,会发生两个过程:(1) VPC ALB 被部署到该区域中与工人节点连接的同一子网,以及 (2) 该区域中只有群集中的工人节点被配置为接收来自 VPC ALB 的流量。 要将负载平衡器置于特定区域,必须在创建负载平衡器时指定此注释。 如果以后将此注释更改为不同的区域,监听和后端 Worker 节点会自动更新,以匹配新的区域。 如果在工作节点上设置了 dedicated: edge 标签,并指定了此注释,则只有指定区域中的边缘节点才会被配置为接收流量。 其他区域的边缘节点和指定区域的非边缘节点不会接收来自负载平衡器的流量。 要查看分区,请运行 ibmcloud ks zone ls --provider vpc-gen2
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets
注释,用于指定 VPC ALB 服务部署到的一个或多个子网。 如果指定,该注解优先于 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 注解。 如果没有此注释,当群集从单区区域更新为多区区域时,或反之亦然,VPC ALB 部署的子网会自动更新以匹配群集的区域。 请注意,您可以在同一 VPC 中指定与群集所连接的子网不同的子网。 在这种情况下,即使 VPC ALB 部署到同一 VPC 中的不同子网,VPC ALB 仍可将流量路由到群集子网上的工作节点。 要查看所有资源组中的子网,请运行 ibmcloud oc subnets --provider vpc-gen2 --vpc-id VPC_ID --zone ZONE。 可为现有的 VPC ALB 添加或修改此注释。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector
注释,用于指定工作节点标签选择器。 您可以通过指定标签选择器密钥,将群集中的特定工作节点配置为接收流量。 注释中只能包含一个标签选择器,且必须以 "key=value" 格式指定该选择器。 如果未指定此注释,群集中的所有工作节点都会被配置为接收来自 VPC ALB 的流量。 此注解优先于 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 注解,工作节点上的任何 dedicated: edge 标签都将被忽略。 要将流量限制在特定区域内,可以使用此注释指定该区域内的工作者节点。 请注意,在群集工作节点上设置新标签并不会自动将工作节点配置为接收流量;您必须重新创建或更新 VPC ALB,才能让新标签的工作节点接收流量。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-protocol
与 Kubernetes 负载平衡器服务关联的 VPC 负载平衡器资源上的健康检查协议。 可用选项为 httphttpstcp。 通常,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 时,此注释才适用。
如果您的群集不运行 Secure by Default,您可能需要对应用的 VPC 安全组进行以下修改。 如果您的群集运行“默认情况下安全”,则会自动应用这些更改。
  • 如果指定的 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
健康检查 URL 路径,用于 HTTP 和 HTTPs 健康检查。 此注释仅在 ibm-load-balancer-cloud-provider-vpc-health-check-protocol 设置为 httphttps 时适用。 URL 路径必须采用 origin-form 请求目标格式。 如果未指定此注释,且 ibm-load-balancer-cloud-provider-vpc-health-check-protocol 注释被设置为 httphttps,则会应用默认值 /
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
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-idle-connection-timeout
侦听器的空闲连接超时(以秒为单位)。 默认空闲超时取决于您的账户设置。 通常,该值为 50。 不过,有些允许列表账户的超时设置更大。 如果不设置注释,负载平衡器将使用账户中的超时设置。 您可以通过设置此注解明确指定超时时间。 最小值为 50。 最大值为 7200
service.kubernetes.io/ibm-load-balancer-cloud-provider-dns-name: "example-ingress-domain.<region>.containers.appdomain.cloud"
版本为 4.17 或更高版本。
使用指定的 Ingress domain 注册负载平衡器的 IP 地址。 如果指定的域不存在,则会创建一个使用内部 IBM 托管提供程序 (IBM NS1)的域。要创建新域,名称必须在所有现有域(不仅是群集中的域)中唯一。 删除负载平衡器服务会从域中删除 IP 地址。 但是,删除注释并不会从域中删除 IP 地址。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-instance-crn: "private-dns-crn"
版本为 4.15 或更高版本。
与该负载均衡器关联的 DNS instance。 有关更多信息,请参阅 注册专用 DNS 记录
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-zone-id: "dns-zone-id"
版本为 4.15 或更高版本。
与该负载均衡器关联的 DNS zone。 有关更多信息,请参阅 注册专用 DNS 记录
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota
负载平衡器路由到的每个区域的工作节点数量。 缺省值为 8。 对于工作节点分布在三个区域的集群,这将导致负载均衡器将流量路由到总共 24 个工作节点。 负载平衡器路由到的所有区域的工作节点总数不能超过 50 个。 如果集群中所有区域的工作节点都少于 50 个,则指定 0 以路由到区域中的所有工作节点。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-security-group
版本为 1.30 或更高版本。
要添加到 VPC 负载平衡器的客户管理安全组。 如果不想使用 IBM安全组,请指定一个自己拥有和管理的安全组。 该选项将删除IBM安全组,代之以你指定的安全组。 从现有负载平衡器中删除注释后,您添加的安全组就会替换为IBM安全组。 您可以随时添加或删除此注释。 您有责任管理您的安全组并保持更新。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-allow-outbound-traffic
适用于运行 Secure by Default 的群集。 注释,为与您指定的外部端口相关联的 ALB 的每个 IP 地址创建安全组。 这些规则在群集安全组中创建,并在 VPC ALB IP 地址发生变化时自动更新。 用逗号分隔的列表指定有效的外部端口,如 80,443。 在本例中,如果与每个外部端口值相关联的每个公共 ALB 有两个 IP 地址,则每个 IP 地址创建一条出站规则,总共创建 4 条新规则。 您可以随时添加或删除此注释。
selector
您在应用部署 YAML 文件的 spec.template.metadata.labels 部分中使用的标签键(<selector_key> )和值(<selector_value> )。 此定制标签可标识运行您的应用程序的所有 pod,以便在负载均衡中包含这些 pod。
port
服务侦听的端口。
targetPort
服务将流量定向到的目标端口。 在 Pod 中运行的应用程序必须监听该目标端口上的传入 TCP 流量。 目标端口通常在应用程序 pod 中运行的映像中静态定义。 pod 中配置的目标端口与服务的节点端口不同,也可能与 VPC LB 上配置的外部端口不同。

  1. a-z0-9- ↩︎