使用ASM Serverless网关提升高可用性和弹性

ASM Serverless网关是ASM推出的全新服务网格网关形态,更适合应对突发流量,降低计算成本,提升稳定性。相比运行于数据面ACK Kubernetes集群之上的ASM网关形态,ASM Serverless网关具有高稳定性、高弹性和低成本的优势,以Serverless的形式单独部署,并完全由ASM管理,具备独立于ACK Kubernetes集群的高可用性。本文介绍如何使用ASM Serverless网关,以及相关的网关日志以及监控指标介绍。

前提条件

适用场景

ASM Serverless网关更适合应对突发流量,降低计算成本,提升稳定性。典型的场景包括:

  • 有明显波峰波谷的在线业务:例如在线教育、电商等业务通常有明显的波峰波谷,ASM Serverless网关可以更快速的应对突发流量,显著减少固定资源池的维护,降低计算成本。

  • 多集群场景:例如有两个ACK集群同时加入了某一个ASM实例,ASM Serverless网关并不部署在某个ACK Kubernetes集群中,可以提供独立于Kubernetes集群的高可用性。

步骤一:部署ASM Serverless入口网关

目前仅支持使用YAML创建。与运行于数据面ACK Kubernetes集群之上的ASM网关形态相比,ASM Serverless网关增加了一个注解 asm.alibabacloud.com/managed-by-asm: 'true',并且无需填写数据面ACK Kubernetes集群ID。如果需要采集监控指标,可以通过注解 asm.alibabacloud.com/export-metrics将该网关的监控指标导出到对应的目标数据面ACK Kubernetes集群。

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

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

  3. 入口网关页面,单击使用YAML创建,输入网关名称,配置如下YAML,然后单击创建

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: IstioGateway
    metadata:
      annotations:
        asm.alibabacloud.com/managed-by-asm: 'true'
        asm.alibabacloud.com/export-metrics: 'ack-cluster-id'
      name: ingressgateway
      namespace: istio-system
    spec:
      gatewayType: ingress
      dnsPolicy: ClusterFirst
      externalTrafficPolicy: Local
      hostNetwork: false
      ports:
        - name: http
          port: 80
          protocol: TCP
          targetPort: 80
        - name: https
          port: 443
          protocol: TCP
          targetPort: 443
      replicaCount: 1
      resources:
        limits:
          cpu: '2'
          memory: 2G
        requests:
          cpu: 200m
          memory: 256Mi
      rollingMaxSurge: 100%
      rollingMaxUnavailable: 25%
      runAsRoot: true
      serviceType: LoadBalancer

    注意:当前Serverless网关支持LoadBalancer和ClusterIP类型的Service。如果选择了ClusterIP,需要保证客户端与网关Pod网络互相打通,例如Terway网络插件默认同一VPC下的Pod可以互相访问。

步骤二:创建流量规则

  1. 创建HTTP域名。

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

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

    3. 入口网关页面,单击目标网关,在网关导航栏,单击域名/证书,然后在域名页签,单击创建

    4. 新建域名页面,配置域名*协议HTTP端口名称http端口80,然后单击创建

  2. 导入productapge服务。

    1. 在网关导航栏,单击上游服务,然后单击导入服务

    2. 导入服务页签,选择default命名空间,选中productapge,单击Dingtalk_20230302182310.png图标,然后单击确认

  3. 创建路由规则。

    1. 在网关导航栏,单击路由管理,然后单击创建

    2. 设置路由信息配置向导,配置路由类型http命名空间default路由名称productapge,在匹配规则区域,匹配方式选择前缀匹配内容/,然后单击下一步

    3. 设置路由目的地配置向导,配置选择上游服务productapge,然后单击下一步

    4. 高级选项配置向导,单击创建

步骤三:通过Serverless网关访问productpage应用

在浏览器地址栏输入{网关IP地址}/productpage,可以看到productpage的应用界面。关于如何获取网关,请参见获取入口网关地址

步骤四:配置Serverless网关的访问日志

重要

配置网关访问日志会导致网关重启,请在业务低峰期操作。

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

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

  3. 入口网关页面,在目标网关右侧,单击查看YAML,在YAML输入框中增加注解 asm.alibabacloud.com/aliyun-logs-project: k8s-log-****,配置日志服务Project。

    本示例将网关日志采集到ASM对应的LogProject。对应的YAML示例如下:

    展开查看ingressgateway.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: IstioGateway
    metadata:
      annotations:
        asm.alibabacloud.com/managed-by-asm: 'true'
        asm.alibabacloud.com/aliyun-logs-project: mesh-log-c4e1bbed247634d0482000d94e947****
      name: ingressgateway
      namespace: istio-system
    spec:
     ....
  4. 单击确定,更新Serverless网关。

步骤五:配置HTTPS访问

  1. 执行以下命令,生成证书。

    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./CN=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt 
    openssl req -out aliyun.com.csr -newkey rsa:2048 -nodes -keyout aliyun.com.key -subj "/CN=aliyun.com/O=myexample organization"
    openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -in aliyun.com.csr -out aliyun.com.crt
  2. 创建证书。

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

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

    3. 在证书管理页面,单击创建,然后在证书信息面板,配置相关信息,然后单击确定。

      配置项

      说明

      名称

      证书名称,本示例为myexample-credential。

      公钥证书

      步骤五.1生成的aliyun.com.crt内容。

      私钥

      步骤五.1生成的aliyun.com.key内容。

  3. 创建HTTPS域名。

    1. 在左侧导航栏,单击入口网关,单击目标网关,在网关导航栏,单击域名/证书,然后在域名页签,单击创建

    2. 新建域名页面,配置域名*协议HTTPS端口名称https端口443证书选择myexample-credential,选中是否使用TLS保护连接,然后单击创建

  4. 执行以下命令,通过HTTPS协议访问Serverless网关。

    curl -k -H Host:aliyun.com --resolve aliyun.com:443:{替换成真实的入口网关IP地址}  https://aliyun.com/productpage -I

步骤六:查看Serverless网关日志

  1. 登录日志服务控制台

  2. Project列表区域,单击目标日志名称(步骤四.1配置的日志名称),然后在左侧导航栏,单击Dingtalk_20231122151017.png图标(日志存储),在日志库单击mesh-ingress-log,在搜索框输入productpage,然后单击查询/分析

    托管网关日志.png

FAQ

如何导出Serverless网关的监控指标?

  1. 已开启ASM的指标生成和采集,且可以在可观测管理中心 > 监控指标页面看到指标大盘。具体操作,请参见将监控指标采集到可观测监控Prometheus版

  2. 在Serverless网关的YAML中配置指标导出的annotations,格式为asm.alibabacloud.com/export-metrics: ${ack-cluster-id}

    该功能仅支持ASM实例版本为1.18.0.147或以上。关于如何升级版本,请参见升级ASM实例

    annotations配置后,会将网关的Service和Endpoint同步到指定的ACK集群,然后在Prometheus的抓取配置中添加对应Endpoint的采集配置即可。

  3. 在ARMS控制台,添加Endpoint的采集配置。

    1. 登录ARMS控制台
    2. 在左侧导航栏,单击Prometheus 监控 > 实例列表,然后在页面左上角选择目标地域。

    3. 实例列表页面,单击Prometheus实例名称,然后在左侧导航栏,单击设置

    4. 设置页面的设置页签,单击编辑Prometheus.yaml,添加如下配置,然后单击保存

      展开查看YAML

      scrape_configs:
      - job_name: istio-system/managed-envoy
        honor_timestamps: true
        honor_labels: false
        scrape_interval: 30s
        scheme: http
        metrics_path: /stats/prometheus
        relabel_configs:
        - regex: 'true'
          action: keep
          source_labels:
          - __meta_kubernetes_service_labelpresent_asm_sync_target
          replacement: $1
          separator: ;
        - regex: http-envoy-prom
          action: keep
          source_labels:
          - __meta_kubernetes_endpoint_port_name
          replacement: $1
          separator: ;
        - regex: (.*)
          action: replace
          source_labels:
          - __meta_kubernetes_namespace
          replacement: $1
          separator: ;
          target_label: namespace
        metric_relabel_configs:
        - regex: envoy_.*
          action: drop
          source_labels:
          - __name__
          replacement: $1
          separator: ;
        kubernetes_sd_configs:
        - role: endpoints
          namespaces: {}
          follow_redirects: true
        scrape_timeout: 10s

Serverless网关无法访问后端应用该如何处理?

  1. 确保数据面集群的安全组没有拦截来自Serverless网关的流量。

    1. 查看ASM的vSwitch网段。

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

      2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 基本信息

      3. 基本信息页面,单击交换机右侧的链接,然后在交换机详情页面,查看对应的网段。

    2. 查看数据面集群的安全组信息。

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

      2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息

      3. 集群信息页面,单击集群资源页签,然后单击安全组右侧的链接。

      4. 在安全组详情页面,查看安全组的入方向规则,确保该规则包含ASM的vSwitch网段,以及后端服务的Pod端口。

  2. 如果返回404、503等错误,请检查流量规则配置及后端服务是否正常运行。