IBM Cloud Docs
管理 ALB

管理 ALB

管理集群中的 Ingress ALB,确保流量不间断地流动。

更新 ALB

IBM Cloud Kubernetes Service 定期发布 ALB 版本以提供新功能并解决安全漏洞。 使用 ibmcloud ks ingress alb versions 命令列出可用版本,或者查看版本历史记录的 Ingress ALB 版本更改日志

ALB 版本遵循 <ingress_nginx_version>_<ibm_build>_iks 格式,其中 <ingress_nginx_version> 表示 Kubernetes Ingress NGINX Controller 的版本,<ibm_build> 编号表示 IBM Cloud Kubernetes Service 构建版本。

可以自动将 ALB 更新为缺省版本,也可以选择手动禁用自动更新和管理 ALB 版本。

启用自动更新

启用自动更新时,ALB 将更新为标记为缺省值的版本。 当较新版本成为缺省版本时,ALB 将自动更新为该版本。

如果集群中的专区中仅存在一个工作程序节点,并且您将 ALB 副本数设置为 1,那么将删除此单个 ALB pod,并在应用更新时创建新 pod。 此过程可能会导致流量中断,即使您在其他区域中具有工作程序节点和 ALB 副本也是如此。 要防止流量中断,请确保每个专区中至少存在两个工作程序节点,并且 每个 ALB 都存在两个副本。 请注意,在更新过程中,只有新连接会路由到第二个 ALB pod; 更新 ALB pod 上的现有连接会安全终止。 对于在更新期间终止的现有连接,请在客户机应用程序中启动重试。

调度自动更新的维护窗口

您可以通过创建自定义的 ConfigMap 来控制和管理 ALB 自动更新,其中指定了您希望更新的时间。

要设置自动更新的时间,可在部署 ConfigMap 中设置 updateStartTimeupdateEndTime 键。 每个键表示 24 小时格式 (HH:MM) 的分配时间。 请注意,此时间以协调通用时间 (UTC) 而不是本地时间指定。

  1. 为ConfigMap 创建一个 YAML 文件。 在 data 字段中指定 updateStartTimeupdateEndTime 字段为键值对。

    以下示例 ConfigMap 设置自动更新功能,以在 20:34 到 23:59 UTC 之间更新集群中 35% 的 ALB pod。

    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: ibm-ingress-deploy-config
        namespace: kube-system
    data:
        "updateStartTime": "20:34"
        "updateEndTime": "23:59"
    
  2. 在集群中部署 ConfigMap。 新规则将在下次执行更新时应用。

    kubectl apply -f <filename>.yaml
    

禁用自动更新

要接收错误修订和安全更新,请保持启用自动更新。 禁用自动更新后,您将负责手动更新 ALB。

您可以通过运行 ibmcloud ks ingress alb autoupdate disable -c <cluster_name_or_ID> 来禁用 ALB 的自动更新。

要检查是否为集群启用了自动更新,请使用 ibmcloud ks ingress alb autoupdate get -c <cluster_name_or_ID> 命令。 如果您决定再次启用自动更新,那么可以运行 ibmcloud ks ingress alb autoupdate enable -c <cluster_name_or_ID>

应用手动更新

您可以使用 ibmcloud ks ingress alb update 命令手动应用 Ingress ALB pod 的一次性更新。 此命令将应用缺省 ALB 映像版本,但您可以通过包含 --version 选项来应用其他版本。 有关更多信息或命令选项,请参阅 CLI 参考

要使用 --version 选项将 ALB 映像更新到特定版本,必须 禁用自动 ALB 更新,然后使其处于禁用状态 (只要您想要运行指定的版本)。 自动更新始终应用缺省版本,并覆盖您应用的任何手动更新。 如果要使用其他版本,那么无法启用自动更新。

  • 要列出可用的 ALB 版本,请运行以下命令。

    ibmcloud ks ingress alb version ls --region <region>
    
  • 要更新集群中的所有 ALB pod,请运行以下命令。

    ibmcloud ks ingress alb update -c <cluster_name_or_ID> --version <image_version>
    
  • 要更新特定 ALB 的 ALB,请运行以下命令。

    ibmcloud ks ingress alb update -c <cluster_name_or_ID> --version <image_version> --alb <ALB_ID> [--alb <ALB_2_ID> ...]
    

选择受支持的映像版本

IBM Cloud Kubernetes Service 仅支持集群中 Ingress 应用程序负载均衡器 (ALB) 的 Kubernetes Ingress 映像。 Kubernetes Ingress 映像是基于社区 Kubernetes 项目的 NGINX Ingress 控制器实现而构建的。 先前支持的 IBM Cloud Kubernetes Service Ingress 映像 (在 NGINX Ingress 控制器的定制实现上构建) 不受支持。

在 2020 年 12 月 01 日或之后创建的集群: 缺省应用程序负载均衡器 (ALB) 在所有新的 IBM Cloud Kubernetes Service 集群中运行 Kubernetes Ingress 映像。

2020 年 12 月 1 日前创建的集群:

  • 具有运行定制 IBM Ingress 映像的 ALB 的现有集群继续按现状运行。
  • 对定制 IBM Ingress 映像的支持已于 2021 年 6 月 2 日结束。
  • 必须通过迁移任何现有 Ingress 设置来移至新的 Kubernetes Ingress。 现有 ALB 和其他 Ingress 资源不会自动迁移到新的 Kubernetes Ingress 映像。
  • 具有不受支持的映像的任何 ALB 都将继续运行,但 IBM不支持这些 ALB。

当您 创建新的 ALB启用先前已禁用的 ALB 或 [手动更新 (#update-alb) ALB]时,可以使用 --version 选项为 ALB 指定映像版本。 如果在启用或更新现有 ALB 时省略 --version 选项,那么 ALB 将运行与 ALB 先前运行的映像相同的缺省版本; Kubernetes Ingress 映像或 IBM Cloud Kubernetes Service Ingress 映像。

自动更新仅应用缺省版本。 要指定非缺省版本,必须通过运行 ibmcloud ks ingress alb autoupdate disable 命令来 禁用自动更新

查看受支持的映像版本

要列出每种类型的映像支持的最新三个版本,请运行以下命令。

ibmcloud ks ingress alb versions

示例输出

Kubernetes Ingress versions
1.1.2_2507_iks (default)
1.2.1_2506_iks
0.35.0_1374_iks

Kubernetes Ingress 版本遵循格式 <community_version>_<ibm_build>_iks。 IBM 构建号指示 IBM Cloud Kubernetes Service 发布的 Kubernetes Ingress NGINX 发行版的最新构建。 例如,版本 1.1.2_2507_iks 指示 0.47.0 Ingress NGINX 版本的最新构建。IBM Cloud Kubernetes Service 可能会发布社区映像版本的构建以解决漏洞。

有关每个 Ingress 映像版本中的更改,请参阅 Ingress 版本更改日志

恢复到早期版本

如果最近更新了 ALB pod,但 ALB 的定制配置受最新映像版本构建的影响,那么可以使用带有 --version 选项的 ibmcloud ks ingress alb update 命令将 ALB pod 回滚到受支持的较早版本。 将 ALB 更改为的映像版本必须是 ibmcloud ks ingress alb versions 输出中列出的受支持映像版本。

请注意,如果还原到较低版本,那么必须 禁用自动 ALB 更新,然后保持禁用状态,只要您想要运行较低版本。 自动更新始终应用最新版本并覆盖您应用的任何手动更新。 如果要使用较早版本,那么无法启用自动更新。

手动缩放 ALB

每个 ALB 每秒可处理约 20,000 个连接。 如果需要处理其他连接,可以在区域中创建更多 ALB 或增加 ALB pod 副本数。

在区域中创建更多 ALB

区域中的每个 ALB 都作为两个 pod 部署在不同的工作程序节点上。 要扩展 ALB 处理功能并处理更多连接,可以在区域中创建其他 ALB。 新 ALB 的 IP 地址将自动添加到 Ingress 子域。

创建多区域群集时,会在每个有工作者节点的区域创建一个默认的公共 ALB。 如果您稍后除去这三个原始专区中的一个,并在另一专区中添加工作程序,那么不会在该新专区中创建缺省公共 ALB。 您可以手动创建 ALB 以处理该新专区中的连接。

使用 Ingress 资源验证时,所有 ALB 都会验证每个创建和更新请求。 如果没有针对特定 ALB 实例运行任何 pod,那么您可能无法在集群上应用 Ingress 资源。 确保每个处于已启用状态的 ALB 至少有一个正在运行的 pod。 有关更多信息,请参阅 Ingress 部署定制参考

  1. 在具有工作程序节点的每个区域中,创建 ALB。

    以下命令适用于 经典集群。 有关更多信息和命令选项,请参阅 CLI 参考

    ibmcloud ks ingress alb create --cluster <cluster_name_or_ID> --type <public_or_private> --zone <zone> --vlan <VLAN_ID> [--ip <IP_address>] [--version image_version]
    

    以下命令适用于 VPC 集群。 有关更多信息和命令选项,请参阅 CLI 参考

    ibmcloud ks ingress alb create vpc-gen2 --cluster <cluster_name_or_ID> --type <public_or_private> --zone <vpc_zone> [--version image_version]
    
  2. 验证您在每个区域中创建的 ALB 的 状态 是否为 enabled。 对于经典集群,请检查是否已分配 ALB IP。 对于 VPC 集群,请检查是否已分配 负载均衡器主机名

    ibmcloud ks ingress alb ls --cluster <cluster_name_or_ID>
    

    经典集群的示例输出。

    ALB ID                                            Enabled   Status     Type      ALB IP          Zone    Build                          ALB VLAN ID   NLB Version
    private-crdf253b6025d64944ab99ed63bb4567b6-alb1   false     disabled   private   -               dal12   ingress:1.1.2_2507_iks   2294021       -
    private-crdf253b6025d64944ab99ed63bb4567b6-alb2   false     disabled   private   -               dal10   ingress:1.1.2_2507_iks   2234947       -
    public-crdf253b6025d64944ab99ed63bb4567b6-alb1    true      enabled    public    169.48.228.78   dal12   ingress:1.1.2_2507_iks   2294019       -
    public-crdf253b6025d64944ab99ed63bb4567b6-alb2    true      enabled    public    169.46.17.6     dal10   ingress:1.1.2_2507_iks   2234945       -
    

    VPC 集群的示例输出。

    ALB ID                                            Enabled   Status     Type      Load Balancer Hostname                 Zone         Build
    private-crdf253b6025d64944ab99ed63bb4567b6-alb1   false     disabled   private   -                                      us-south-2   ingress:1.1.2_2507_iks
    private-crdf253b6025d64944ab99ed63bb4567b6-alb2   false     disabled   private   -                                      us-south-1   ingress:1.1.2_2507_iks
    public-crdf253b6025d64944ab99ed63bb4567b6-alb1    true      enabled    public    23f2dfb1-us-south.lb.appdomain.cloud   us-south-2   ingress:1.1.2_2507_iks
    public-crdf253b6025d64944ab99ed63bb4567b6-alb2    true      enabled    public    23f2dfb1-us-south.lb.appdomain.cloud   us-south-1   ingress:1.1.2_2507_iks
    
    

更改 ALB pod 副本数

缺省情况下,每个 ALB 都有 2 个副本。 您可以通过手动更改 ALB pod 的数量或通过启用动态自动缩放来定制 ALB 处理功能。

单个 ALB pod 可以处理大量请求。 如果迂到超时,响应缓慢或其他超负荷迹象,请检查后端应用程序的状态。 在缩放 ALB pod 之前,请确保 ALB 是应用程序的瓶颈,否则它可能无法提供预期结果。

对于经典集群: 如果 ALB 的负载均衡器服务配置将 externalTrafficPolicy 设置为 Local,请不要超过 2 个副本。 经典负载均衡器使用 2 副本的固定配置运行,并且只能将流量转发到与负载均衡器 pod 位于同一节点上的 ALB pod。

缺省情况下,定期 Ingress 版本更新会自动推广到 ALB。 如果集群中的专区中仅存在一个工作程序节点,并且您将 ALB 副本数设置为 1,那么将删除此单个 ALB pod,并在应用更新时创建新 pod。 此过程可能会导致流量中断,即使您在其他区域中具有工作程序节点和 ALB 副本也是如此。 要防止流量中断,请确保每个专区中至少存在两个工作程序节点,并且每个 ALB 都存在两个副本。 请注意,在更新过程中,只有新连接会路由到第二个 ALB pod; 更新 ALB pod 上的现有连接会安全终止。 建议客户机应用程序对更新期间终止的现有连接启动重试。

通过创建 ConfigMap来手动更改 ALB 副本数。 请注意,如果 已将 ALB 配置为使用动态缩放,那么无法手动缩放 ALB 副本。

  1. 获取 ALB 的标识。

    ibmcloud ks ingress alb ls -c <cluster_name_or_ID>
    
  2. ibm-ingress-deploy-config ConfigMap创建 YAML 文件。 对于每个 ALB,添加 '{"replicas":<number_of_replicas>}'。 此示例将 ALB pod 的数量增加到 4 个副本。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ibm-ingress-deploy-config
      namespace: kube-system
    data:
      <alb1-id>: '{"replicas":4}'
      <alb2-id>: '{"replicas":4}'
      ...
    
  3. 在集群中创建 ibm-ingress-deploy-config ConfigMap。

    kubectl create -f ibm-ingress-deploy-config.yaml
    
  4. 要应用更改,请更新 ALB。 请注意,可能需要最多 5 分钟才能应用更改。

    ibmcloud ks ingress alb update -c <cluster_name_or_ID>
    
  5. 验证 Ready 的 ALB pod 数是否增加到您指定的副本数。

    kubectl get pods -n kube-system | grep alb
    

使用自动缩放器动态缩放 ALB

通过动态缩放,将根据实际负载自动更改 ALB 副本数。 当实际负载较低时副本数会减少,当负载较高时副本数会增加,从而节省计算容量,同时保持在高峰期间处理流量的能力。 您可以配置 ALB 自动缩放器,以根据 CPU 利用率或您定义的定制度量来实现缩放。

要设置自动扩展,请运行以下命令。 您可以通过包含 --cpu-average-utilization 选项来根据 CPU 利用率进行缩放。 或者,可以通过包含 --custom-metrics-file 选项并指定配置文件路径来根据定制度量进行缩放。

ibmcloud ks ingress alb autoscale set --alb ALB --cluster CLUSTER --max-replicas NUM_REPLICAS --min-replicas NUM_REPLICAS [--output OUTPUT] [-q] (--cpu-average-utilization PERCENT | --custom-metrics-file FILE)
--cluster, -c CLUSTER
必须填写:群集的名称或 ID。
--alb ALB
ALB 标识。 要查看可用的 ALB 标识,请运行 ibmcloud ks ingress alb ls
--max-replicas REPLICAS:
ALB 的最大副本数量。 指定整数。 最大 ALB 副本数限制为集群上的工作程序节点数。 要将更多工作程序节点添加到集群,请参阅 将工作程序节点添加到经典集群将工作程序节点添加到 VPC 集群
--min-replicas REPLICAS
ALB 的最少副本数量。 指定至少为 2 的整数。
--cpu-average-utilization PERCENT
使用平均 CPU 利用率自动缩放: 自动缩放器的目标 CPU 利用率百分比。 平均值表示所有 ALB pod 的已用 CPU 占所请求 CPU 的百分比。 要检查 ALB pod 的当前 CPU 使用率,请运行 kubectl top pods -n kube-system -l app=<alb-id>。 要检查为 ALB pod 请求的 CPU 数量,请运行 kubectl get deployment -n kube-system <alb-id> -o=jsonpath='{.spec.template.spec.containers[0].resources.requests.cpu}。 该选项不能与 --custom-metrics-file 选项一起使用。
--custom-metrics-file FILE
使用定制度量值自动缩放: 指定用于定义自动缩放的定制度量值和目标值的配置文件的名称。 请注意,您负责安装和配置度量值提供程序,例如 Prometheus。 该选项不能与 --cpu-average-utilization 选项一起使用。

定制度量值 YAML 文件示例。 在 YAML 文件中配置定制度量。 保存文件并使用 --custom-metrics-file 命令选项指定文件名。 有关编写定制度量标准规范文件的更多信息,请参阅 Kubernetes 文档 (有关 水平 pod 自动缩放MetricSpec API 文档)。

- type: Object
  object:
    metric:
      name: example_metrics
    describedObject:
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      name: example-ingress
    target:
      type: Value
      value: 2k

用于配置动态 ALB 自动缩放的示例命令

用于基于平均 CPU 利用率 60% 的动态缩放的示例命令。

ibmcloud ks ingress alb autoscale set -c <cluster_name_or_ID> --alb <alb-id> --min-replicas 2 --max-replicas 5 --cpu-average-utilization 60

用于基于存储在名为 my-custom-metrics.yaml 的文件中的定制度量的动态缩放的示例命令。

ibmcloud ks ingress alb autoscale set -c <cluster_name_or_ID> --alb <alb-id> --min-replicas 2 --max-replicas 5 --custom-metrics-file my-custom-metrics.yaml

计算平均 CPU 利用率

下图显示了用于在规划自动缩放配置时确定 CPU 使用率的示例方案。

假定您有一个空闲集群,其中有两个正在运行的 ALB 副本没有入局流量。 在这种情况下,总 CPU 请求数为 2*20m=40m。 其中一个副本可能使用 5m CPU 和另一个 7m CPU。 我们可以使用以下公式计算 CPU 利用率。

计算 CPU 平均利用率
图片包含计算 CPU 平均
的表格*

禁用 ALB 自动缩放

运行该命令以禁用 ALB 的自动缩放。

ibmcloud ks ingress alb autoscale unset --alb ALB --cluster CLUSTER

禁用 ALB

要缩减 ALB,您可以禁用 ALB,以使其不再路由集群中的流量。

ibmcloud ks ingress alb disable --alb <ALB_ID> -c <cluster_name_or_ID>

您可以随时通过对经典集群或 ibmcloud ks ingress alb enable vpc-gen2 --alb <ALB_ID> -c <cluster_name_or_ID> 运行 ibmcloud ks ingress alb enable classic --alb <ALB_ID> -c <cluster_name_or_ID> 来重新启用 ALB。

在经典集群中的 VLAN 之间移动 ALB

本主题中的信息仅特定于经典集群。

当您 更改工作程序节点 VLAN 连接 时,工作程序节点将连接到新的 VLAN 并分配新的公共或专用 IP 地址。 但是,ALB 无法自动迁移到新 VLAN,因为已从属于旧 VLAN 的子网为其分配稳定,可移植的公共或专用 IP 地址。 当工作程序节点和 ALB 连接到不同的 VLAN 时,ALB 无法将入局网络流量转发到应用程序 pod 到工作程序节点。 要将 ALB 移至其他 VLAN,必须在新 VLAN 上创建 ALB,并在旧 VLAN 上禁用 ALB。 请注意,集群中的所有公共 ALB 共享同一 IBM分配的 Ingress 子域。 创建新的 ALB 时,无需更改 Ingress 资源文件。

从 VLAN 中除去所有工作程序将除去 VLAN 区域中 ALB 的 IP 地址。

  1. 获取在每个专区中更改工作程序节点连接的新的公用或专用 VLAN。

    1. 列出专区中工作程序的详细信息。

      ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_id>
      
    2. 在输出中,记下公用或专用 VLAN 的 标识

      • 要创建公共 ALB,请记下公用 VLAN 标识。
      • 要创建专用 ALB,请记下专用 VLAN 标识。
    3. 对每个专区中的工作程序重复这些步骤,以便在每个专区中具有新的公用或专用 VLAN 的标识。

  2. 在每个专区中,在新 VLAN 上创建 ALB。 有关此命令的参数的更多信息,请参阅 CLI 参考

    ibmcloud ks ingress alb create --cluster <cluster_name_or_ID> --type <public_or_private> --zone <zone> --vlan <VLAN_ID> [--ip <IP_address>] [--version image_version]
    
  3. 验证您在每个专区中的新 VLAN 上创建的 ALB 的 状态 是否为 enabled,以及是否分配了 ALB IP 地址。

    ibmcloud ks ingress alb ls --cluster <cluster_name_or_ID>
    

    在其中在 dal12 中的 VLAN 2294030dal10 中的 2234940 上创建新的公共 ALB 的集群的示例输出。

    ALB ID                                            Enabled   Status     Type      ALB IP          Zone    Build                          ALB VLAN ID   NLB Version
    private-crdf253b6025d64944ab99ed63bb4567b6-alb1   false     disabled   private   -               dal12   ingress:1.1.2_2507_iks   2294021
    private-crdf253b6025d64944ab99ed63bb4567b6-alb2   false     disabled   private   -               dal10   ingress:1.1.2_2507_iks   2234947
    public-crdf253b6025d64944ab99ed63bb4567b6-alb1    true      enabled    public    169.48.228.78   dal12   ingress:1.1.2_2507_iks   2294019
    public-crdf253b6025d64944ab99ed63bb4567b6-alb2    true      enabled    public    169.46.17.6     dal10   ingress:1.1.2_2507_iks   2234945
    public-crdf253b6025d64944ab99ed63bb4567b6-alb3    true      enabled    public    169.49.28.09    dal12   ingress:1.1.2_2507_iks   2294030
    public-crdf253b6025d64944ab99ed63bb4567b6-alb4    true      enabled    public    169.50.35.62    dal10   ingress:1.1.2_2507_iks   2234940
    
  4. 禁用连接到旧 VLAN 的每个 ALB。

    ibmcloud ks ingress alb disable --alb <old_ALB_ID> -c <cluster_name_or_ID>
    
  5. 验证连接到旧 VLAN 的每个 ALB 的 状态 是否为 disabled。 只有连接到新 VLAN 的 ALB 才会接收入局网络流量并与应用程序 pod 进行通信。

    ibmcloud ks ingress alb ls --cluster <cluster_name_or_ID>
    

    在其中禁用了 dal12 中的 VLAN 2294019dal10 中的 2234945 上的缺省公共 ALB 的集群的示例输出。

    ALB ID                                            Enabled   Status     Type      ALB IP          Zone    Build
    private-crdf253b6025d64944ab99ed63bb4567b6-alb1   false     disabled   private   -               dal12   ingress:1.1.2_2507_iks   2294021
    private-crdf253b6025d64944ab99ed63bb4567b6-alb2   false     disabled   private   -               dal10   ingress:1.1.2_2507_iks   2234947
    public-crdf253b6025d64944ab99ed63bb4567b6-alb1    false     disabled   public    169.48.228.78   dal12   ingress:1.1.2_2507_iks   2294019
    public-crdf253b6025d64944ab99ed63bb4567b6-alb2    false     disabled   public    169.46.17.6     dal10   ingress:1.1.2_2507_iks   2234945
    public-crdf253b6025d64944ab99ed63bb4567b6-alb3    true      enabled    public    169.49.28.09    dal12   ingress:1.1.2_2507_iks   2294030
    public-crdf253b6025d64944ab99ed63bb4567b6-alb4    true      enabled    public    169.50.35.62    dal10   ingress:1.1.2_2507_iks   2234940
    
  6. 对于公共 ALB 可选: 验证新 ALB 的 IP 地址是否列示在集群的 IBM提供的 Ingress 子域下。 您可以通过运行 ibmcloud ks cluster get --cluster <cluster_name_or_ID>.

    nslookup <Ingress_subdomain>
    

    示例输出

    Non-authoritative answer:
    Name:    mycluster-<hash>-0000.us-south.containers.appdomain.cloud
    Addresses:  169.49.28.09
            169.50.35.62
    
  7. 可选:如果不再需要旧 VLAN 上的子网,那么可以除去子网