使用ASM Serverless网关支撑弹性业务场景

ASM Serverless网关是基于虚拟节点和ECI提供的一种Serverless网关形态,用于支撑各种弹性和免节点运维的场景。本文介绍如何使用ASM Serverless网关支撑弹性业务场景。

前提条件

相关概念

概念

说明

弹性容器实例ECI(Elastic Container Instance)

阿里云弹性容器实例ECI是面向容器的无服务器弹性计算服务,提供免运维、强隔离、快速启动的容器运行环境。使用ECI无需购买和管理底层ECS服务器,让您更加关注在容器应用而非底层基础设施的维护工作。您可按需创建ECI,仅为容器配置的资源付费(按量按秒计费)。更多信息,请参见什么是弹性容器实例计费概述

虚拟节点(Virtual Node)

适合运行在有明显的波峰波谷计算特征的场景,帮助您极大地降低计算成本,提升计算弹性效率。

污点(Taint)

作用于节点上,使节点可以排斥一类特定的Pod。

ACK集群中的Virtual Node默认都会打上污点virtual-kubelet.io/provider=alibabacloud:NoSchedule,以避免您在不知情的情况下使用ECI弹性资源。

容忍度(Toleration)

作用于Pod上,允许调度器将该Pod调度到带有对应污点的节点上。

若您需要在ACK集群中使Pod可以使用ECI弹性资源,请配置以下tolerations来容忍污点virtual-kubelet.io/provider=alibabacloud:NoSchedule。更多信息,请参见通过部署ACK虚拟节点组件创建ECI Pod

      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Equal
        value: alibabacloud
        effect: NoSchedule
说明

污点和容忍度相互配合,可用于避免Pod被分配到不合适的节点上。每个节点都可以应用一个或多个污点。

  • 若Pod不能容忍指定的污点,将不会被节点接受,即Pod不能调度到具有匹配污点的节点上。

  • 若Pod可以容忍指定的污点,表示Pod可以(但不要求)被调度到具有匹配污点的节点上。

更多信息,请参见taint-and-toleration

节点亲和性(nodeAffinity)

规定Pod调度时的软需求或者偏好,且在这种偏好不被满足时成功调度该Pod到其他节点。

步骤一:添加标签至节点

  1. 执行以下命令,获取集群的节点名称。

    kubectl get nodes
  2. 执行以下命令,将标签添加到目标节点。

    # 命令格式。
    kubectl label nodes <node-name> <label-key>=<label-value>
    
    # 命令示例。
    kubectl label nodes node1 mykey4pod=asmgateway

步骤二:添加污点至节点

执行以下命令,为节点增加一个污点。

kubectl taint nodes node1 mykey=myvalue:NoSchedule

该命令表示为节点node1增加一个污点。其中,Key是mykey,Value是myvalue,Effect是NoSchedule,表示只有拥有和这个污点相匹配的容忍度的Pod才能够被分配到node1节点。

步骤三:为ASM网关设置节点亲和性和容忍度

在ASM网关中配置nodeAffinity参数,使ASM网关的Pod分布到指定的节点上;配置tolerations参数与步骤二创建的污点相匹配,使网关的Pod能够被分配到指定的节点上。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

  3. 入口网关页面右侧,单击目标网关对应的查看YAML

  4. 编辑对话框的spec字段下,增加如下内容,然后单击确定

       affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - preference:
                matchExpressions:
                  - key: type
                    operator: In
                    values:
                      - virtual-kubelet
              weight: 20
            - preference:
                matchExpressions:
                  - key: mykey4pod
                    operator: In
                    values:
                      - asmgateway
              weight: 80
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: mykey4pod
                    operator: In
                    values:
                      - asmgateway
              - matchExpressions:
                  - key: type
                    operator: In
                    values:
                      - virtual-kubelet
      tolerations:
        - effect: NoSchedule
          key: virtual-kubelet.io/provider
          operator: Equal
          value: alibabacloud
        - effect: NoSchedule
          key: mykey
          operator: Equal
          value: myvalue

    关键参数说明如下。关于参数的更多信息,请参见Assigning Pods to Nodes

    参数

    说明

    preferredDuringSchedulingIgnoredDuringExecution

    调度器会尝试寻找满足对应规则的节点。若找不到匹配的节点,调度器仍然会调度该Pod。该参数关联2个matchExpressionsweight的值为相对值,优先使用较大值。weight20的配置表示调度Pod使用ECI资源;weight80的配置表示调度Pod到指定Label的ECS节点上。

    requiredDuringSchedulingIgnoredDuringExecution

    调度器只有在规则被满足的时候才能执行调度。该参数关联2个matchExpressions,分别表示调度Pod到指定Label的ECS节点上、调度Pod使用ECI资源。

    tolerations

    表示容忍污点virtual-kubelet.io/provider=alibabacloud:NoSchedule,使Pod可以使用ECI资源。

  5. 查看网关的Pod所在的节点是否符合预期。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 容器组

    3. 容器组页面上方,选择istio-system命名空间,查看网关Pod所在的节点是否符合预期。

      若网关Pod所在的节点为目标节点,表明为ASM网关设置节点亲和性和容忍度成功。