通过云原生API网关管理多个ACK集群

为了保障业务稳定性,通常采用多个ACK集群对等部署的方式来实现高可用。云原生API网关支持多ACK集群接入,通过一个网关实例同时关联多个集群,将同名服务合并,在多个服务端点之间做负载均衡。搭配网关的健康检测功能,自动探测服务可用性,实现更高效的故障自动切流。本文以两个ACK集群为例,介绍如何通过云原生API网关管理多个ACK集群。

前提条件

  • 创建两个ACK集群。具体操作,请参见创建ACK托管集群

  • 在两个集群中配置同名的服务。以httpbin服务为例,示例配置如下所示。

    展开查看YAML文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/mse-ingress/go-httpbin
              args:
                - "--version=v1"
              imagePullPolicy: Always
              name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      namespace: default
    spec:
      ports:
        - port: 8080
          protocol: TCP
      selector:
        app: httpbin

背景信息

在生产实践中,若对业务稳定性要求非常高,通常会采用多ACK集群对等部署的方式来保障高可用。例如,集群A部署在可用区A,集群B部署在可用区B,A与B两个集群部署的服务一致,当其中一个集群故障时可以快速切换流量。

云原生API网关为了支持业务的高可用部署诉求,提供了多ACK集群接入功能。即用一个云原生API网关实例同时关联A、B两个集群,网关会将两个集群的同名服务进行合并,合并后的服务名称与原来保持一致,但是服务的IP地址列表会同时包含两个服务的所有IP地址。如果A或者B集群故障,利用云原生API网关的路由能力会自动将流量分发到正常集群。推荐搭配网关的主动健康检测功能一起使用,由网关主动探测服务的IP地址可用性,从而带来更高效的故障自动切流。

如下图所示,云原生API网关管理着来自两个ACK集群的A、B两个服务。当ACK集群B发生crash时,仍然能够通过网关访问到集群A的A、B两个服务,且该切流动作自动发生,无需人工干涉。

image

步骤一:在云原生API网关中添加容器服务来源

  1. 登录云原生API网关控制台

  2. 在左侧导航栏,选择实例,并在顶部菜单栏选择地域。

  3. 实例页面,单击目标网关实例名称。

  4. 在左侧导航栏,选择服务,并单击来源页签。

  5. 单击创建来源。在创建来源面板,选择来源类型容器服务,并配置相关参数,然后单击确定。具体操作,请参见创建服务来源

    image

步骤二:在云原生API网关中分别添加服务A与B

  1. 登录云原生API网关控制台

  2. 在左侧导航栏,选择实例,并在顶部菜单栏选择地域。

  3. 实例页面,单击目标网关实例名称。

  4. 在左侧导航栏,选择服务,并单击服务页签。

  5. 单击创建服务。在创建服务面板,选择服务来源容器服务,并选择命名空间服务列表,然后单击确定。具体操作,请参见创建服务

    image

步骤三:在云原生API网关中为目标服务添加路由配置

  1. 创建HTTP API,具体操作,请参见创建HTTP API

  2. 单击目标API,在左上角单击创建路由

  3. 创建路由页面,配置相关参数,然后单击保存并发布。具体操作,请参见创建路由

    image

结果验证

当集群A、B正常时

  1. 服务列表页面查看服务地址。

    可观察到服务地址中有两条记录。

    image

  2. 多次访问网关,具体代码如下所示,可看到会返回两个不同的hostname。

    curl <网关的环境二级域名地址>/version

    image

当集群A异常时

  1. 在集群A中删除httpbin服务。

    此时,服务地址只有一条记录。

    image

  2. 多次访问网关,具体代码如下所示,可看到hostname只有一个。

    curl <网关的环境二级域名地址>/version

    image