建立一个 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与 IBM Cloud Kubernetes Service 入口应用程序负载平衡器混淆。 VPC 的应用程序负载平衡器(VPC ALB)在 VPC 中的群集外运行,并由您创建的 Kubernetes LoadBalancer
服务进行配置。 Ingress 应用程序负载平衡器(ALB) 是在集群中的工作节点上运行的 Ingress 控制器。
设置公共或私有 VPC ALB
准备工作
- 确保您拥有 Writer 或 Manager IBM Cloud IAM 服务访问角色,用于为 VPC ALB 部署 Kubernetes
LoadBalancer
服务的命名空间。 - 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
- 要查看 VPC ALB,请安装
infrastructure-service
插件。 用于运行命令的前缀是ibmcloud is
。ibmcloud plugin install infrastructure-service
使您的应用程序能够接收公开或私人请求:
-
将应用程序部署到集群。 确保在部署配置文件的 metadata 部分中添加标签。 此定制标签可标识运行您的应用程序的所有 pod,以便在负载均衡中包含这些 pod。
-
为您的 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.
-
在集群中创建 Kubernetes
LoadBalancer
服务。kubectl apply -f myloadbalancer.yaml -n <namespace>
-
验证 Kubernetes
LoadBalancer
服务是否已在集群中成功创建。 创建服务时,LoadBalancer Ingress 字段将填入 VPC ALB 分配的主机名。在 VPC 中配置 VPC ALB 只需几分钟时间。 在 VPC ALB 完全配置之前,您无法使用 Kubernetes
LoadBalancer
服务的主机名访问您的应用程序。kubectl describe svc myloadbalancer -n <namespace>
公共
LoadBalancer
服务的 CLI 输出示例: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.
-
验证是否已在 VPC 中成功创建 VPC ALB。 在输出中,验证 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
-
如果创建的是公共
LoadBalancer
服务,请使用步骤 4 中找到的 VPC ALB 分配的 KubernetesLoadBalancer
服务的主机名。 示例: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 Provider 会定期与任何相关的 VPC ALB 和 NLB 重新同步,以确保运行中的负载平衡器符合 Ingress 的预期配置。 因此,如果您直接通过 VPC 而不是使用 Ingress 注释对负载平衡器进行任何更改,这些更改将被还原。
注册 DNS 记录和 TLS 证书
Application Load Balancer for VPC (VPC ALB) 提供了一个默认的 HTTP 主机名,格式为 1234abcd-<region>.lb.appdomain.cloud
,您可以通过它访问您的应用程序。 但是,如果您希望应用域的 TLS 证书支持 HTTPS,可以创建 IBM 提供的子域,或为公共和私有 VPC ALB 自定义域。
为 VPC ALB 主机名创建 DNS 子域后,就不能使用 nlb-dns health-monitor
命令创建自定义健康检查了。 取而代之的是使用为默认 VPC ALB 主机名提供的默认 VPC 负载平衡器健康检查。 有关更多信息,请参阅 VPC 文档。
准备工作
- 设置 VPC ALB。 确保在配置 VPC ALB 的 Kubernetes
LoadBalancer
服务中定义 HTTPS 端口。 - 要使用 TLS 证书通过 HTTPS 访问应用程序,您的应用程序必须能够终止 TLS 连接。
使用 DNS 子域注册 VPC ALB 主机名:
-
运行
get svc
命令,获取 VPC ALB 的主机名。 在输出的 EXTERNAL-IP 列中查找该主机名。 例如,1234abcd-us-south.lb.appdomain.cloud
。kubectl 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
-
为负载平衡器主机名创建自定义或 IBM 提供的 DNS 子域。
-
自定义域:提供您自己的自定义域,并通过指定负载平衡器的外部 IP(格式为
1234abcd-us-south.lb.appdomain.cloud
作为规范名称记录 (CNAME))为其赋予别名。- 通过与域名服务 (DNS) 提供商或 IBM Cloud DNS 合作,注册自定义域名。
- 通过将负载平衡器外部 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 证书。- 创建 DNS 子域和 TLS 证书。
ibmcloud ks nlb-dns create vpc-gen2 --cluster <cluster_name_or_id> --lb-host <vpc_lb_hostname> --type (public|private)
- 验证子域是否已创建。 有关更多信息,请参阅了解子域格式。
示例输出ibmcloud ks 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>
- 创建 DNS 子域和 TLS 证书。
-
-
如果为公共 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 记录
在 1.28 或更高版本中,您可以使用以下可选注释将服务于自定义 DNS instance
的自有 DNS zone
与私有 VPC ALB 关联起来。 为此,必须设置两个可选注释。 如果未指定,则此负载平衡器 A
属性的 DNS hostname
记录将被添加到公共 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 Services 和 Add 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 ks subnets --provider vpc-gen2 --vpc-id <vpc> --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 负载平衡器资源上的健康检查协议。 可用选项为
http
、https
或tcp
。 通常,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
设置为http
或https
时适用。 URL 路径必须采用 origin-form 请求目标格式。 如果未指定此注释,且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
。 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"
- 1.30 或更高版本。
- 使用指定的 Ingress domain 注册负载平衡器的 IP 地址。 如果指定的域不存在,则会创建一个使用内部 IBM 托管提供程序 (
akamai
)的域。要创建新域,名称必须在所有现有域(不仅是群集中的域)中唯一。 删除负载平衡器服务会从域中删除 IP 地址。 但是,删除注释并不会从域中删除 IP 地址。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-instance-crn: "private-dns-crn"
- 1.28 或更高版本。
- 要与此负载平衡器关联的 DNS
instance
。 有关更多信息,请参阅 注册专用 DNS 记录。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-zone-id: "dns-zone-id"
- 1.28 或更高版本。
- 要与此负载平衡器关联的 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 上配置的外部端口不同。
-
a-z0-9- ↩︎