ASM支持通过数据面集群的Kubernetes API(KubeAPI)对Istio资源进行增删改查操作。本文以创建和查看Istio资源为例,介绍如何使用数据面集群KubeAPI访问Istio资源。

前提条件

背景信息

Kubernetes API是通过HTTP提供的基于资源的编程接口,支持通过标准HTTP谓词(POST、PUT、PATCH、DELETE、GET)检索、创建、更新和删除集群的主资源,例如Deployment、Service等。更多信息,请参见Kubernetes API

注意事项

  • 强烈建议在单集群模式下使用数据面集群KubeAPI访问Istio资源功能。如果ASM的数据平面有多个集群,则任意一个数据平面集群都可以对ASM上的Istio资源进行增删改查操作。
  • 开启数据面集群KubeAPI访问Istio资源功能后,数据面集群将无法删除istio-system命名空间。如果要删除,您需要先从ASM实例中移出数据面集群。
  • 删除数据平面的某一命名空间,不会删除ASM控制平面的对应命名空间,以及该命名空间下的Istio资源。
  • 如果ASM控制平面有某一命名空间,但是数据平面没有此命名空间,您需要先在数据平面创建出此命名空间,然后才能在这个命名空间下对Istio资源进行增删改查操作。否则会提示以下错误信息:
    Error from server (NotFound): error when creating "xx.yaml": namespaces "daily-01" not found
  • 如果在数据平面创建的Istio资源对应的命名空间在ASM控制平面不存在,则会在控制平面自动创建该命名空间。
  • Istio资源的增删改查操作不支持缩写,需要使用资源名字的全称,例如virtualservice

步骤一:启用数据面集群KubeAPI访问Istio资源功能

您可以通过以下两种方式来启用数据面集群KubeAPI访问Istio资源功能:
  • 如果您没有创建ASM实例,您可以在创建ASM实例时选中启用数据面集群KubeAPI访问Istio资源来启用数据面集群KubeAPI访问Istio资源功能。具体操作,请参见创建ASM实例
  • 如果您已创建ASM实例,您可以在ASM实例的网格信息页面启用数据面集群KubeAPI访问Istio资源功能。本文以已创建ASM实例场景为例。
  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 网格信息页面单击右上角的功能设置
  5. 功能设置更新面板选中启用数据面集群KubeAPI访问Istio资源,然后单击确定

    开启数据面集群KubeAPI访问Istio资源后,ASM会创建asm-istio-admin和asm-istio-readonly两个ClusterRole到数据面集群。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        api: asm-apiservice-apiserver
        apiserver: "true"
      name: asm-istio-admin
    rules:
    - apiGroups:
      - networking.istio.io
      - security.istio.io
      resources:
      - '*'
      verbs:
      - '*'
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        api: asm-apiservice-apiserver
        apiserver: "true"
      name: asm-istio-readonly
    rules:
    - apiGroups:
      - networking.istio.io
      - security.istio.io
      resources:
      - '*'
      verbs:
      - get
      - list
      - watch

步骤二:获取asm-cr-aggregation配置信息

  1. 查看ASM实例ID。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
      网格信息页面查看ASM实例ID。
  2. 查看集群地域ID。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏单击集群
      集群页面查看目标集群的地域,例如您集群地域为华北2(北京),则集群地域ID为cn-beijing。
  3. 查看AccessKey ID和AccessKey Secret。具体操作,请参见获取AccessKey

步骤三:安装asm-cr-aggregation

  1. 已通过kubectl连接集群。具体操作,请参见通过kubectl工具连接集群
  2. 在本地安装Helm。具体操作,请参见Helm
    说明 使用kubectl连接集群后,Helm客户端会自动使用KubeConfig连接集群。
  3. 下载并解压asm-cr-aggregation至本地。
  4. 进入asm-cr-aggregation文件夹中,找到values.yaml文件,在values.yaml文件中补充ASM ID、集群地域ID、AccessKey ID和AccessKey Secret,然后保存values.yaml文件。
    注意 如果您的集群位于海外地域,您还需要在values.yaml文件中修改asm-cr-aggregation镜像地址的地域为集群所在的地域,例如您的集群位于硅谷,您需要将registry.cn-hangzhou.aliyuncs.com/acs/asm-craggregation-apiservice修改为registry.cn-us-west-1.aliyuncs.com/acs/asm-craggregation-apiservice
  5. 执行以下命令,安装asm-cr-aggregation。
    helm install -f values.yaml asm-cr-aggregation ./
  6. 验证asm-cr-aggregation是否安装成功。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页面左侧导航栏选择应用 > Helm
      Helm页面可以看到asm-cr-aggregation,说明asm-cr-aggregation安装成功。

步骤四:授予RAM用户权限

使用数据面集群Kubernetes API访问Istio资源之前,您的账号需要拥有在数据面集群访问Istio资源的权限和ASM的自定义资源权限:
说明 您拥有的数据面集群访问Istio资源的权限和ASM的自定义资源权限需要保持一致,即如果您拥有ASM自定义资源的读写权限,那您同时也需要拥有数据面集群访问Istio资源的读写权限。
  • 您使用的账号需要拥有控制平面ASM自定义资源的操作权限,即拥有网格管理人员或者网格管理受限人员权限。具体操作,请参见授予RAM用户和RAM角色RBAC权限

    网格管理人员拥有ASM自定义资源的读写权限,网格管理受限人员拥有ASM自定义资源的只读权限。

  • 您使用的账号需要拥有在数据面集群访问Istio资源的权限,否则将访问失败。

    您可以执行以下命令,检查RAM用户是否拥有访问Istio资源的权限。

    kubectl get VirtualService

    预期输出:

    Error from server (Forbidden): virtualservices.networking.istio.io is forbidden: User "24869613637716****" cannot list resource "virtualservices" in API group "networking.istio.io" in the namespace "default" 

    返回以上结果,说明RAM用户没用访问Istio资源的权限。您需要授予RAM用户访问Istio资源的权限,具体操作如下:

授予RAM用户访问Istio资源的只读权限。

  1. 使用阿里云账号登录容器服务管理控制台
  2. 在控制台左侧导航栏单击授权管理
  3. 子账号页签下单击目标RAM用户右侧的管理权限
  4. 集群RBAC配置页面中单击加号图标,选择要授予的集群和命名空间,设置访问权限自定义,在文本框中选择asm-istio-readonly,然后单击下一步
    只读权限

    页面提示授权成功

  5. 验证RAM用户是否拥有访问Istio资源的只读权限。
    1. 执行以下命令,查看虚拟服务。
      kubectl get VirtualService

      预期输出:

      NAME            CREATED AT
      reviews-route   2021-11-15T07:09:10Z
    2. 执行以下命令,编辑虚拟服务。
      kubectl edit VirtualService reviews-route

      预期输出:

      error: virtualservices.networking.istio.io "reviews-route" could not be patched: virtualservices.networking.istio.io "reviews-route" is forbidden: User "22992783668156****" cannot patch resource "virtualservices" in API group "networking.istio.io" in the namespace "default

授予RAM用户访问Istio资源的读写权限。

  1. 使用阿里云账号登录容器服务管理控制台
  2. 在控制台左侧导航栏单击授权管理
  3. 子账号页签下单击目标RAM用户右侧的管理权限
  4. 集群RBAC配置页面中单击加号图标,选择要授予的集群和命名空间,设置访问权限自定义,在文本框中选择asm-istio-admin,然后单击下一步
    读写权限

    页面提示授权成功

  5. 验证RAM用户是否拥有访问Istio资源的读写权限。
    1. 执行以下命令,查看虚拟服务。
      kubectl get VirtualService

      预期输出:

      NAME            CREATED AT
      reviews-route   2021-11-15T07:09:10Z
    2. 执行以下命令,编辑虚拟服务。
      kubectl edit VirtualService reviews-route

      预期输出:

      virtualservice.networking.istio.io/reviews-route edited

步骤五:使用数据面集群KubeAPI创建和查看Istio资源

本文以Helm Chart方式创建和查看Istio资源为例。
说明 在开启数据面集群KubeAPI访问Istio资源功能后,数据平面集群需要等待1~2分钟,然后才可以使用该功能。
  1. 下载并解压Istio-bookinfo至本地。
    Istio-bookinfo文件包含Istio资源和Bookinfo应用的YAML文件。
  2. 进入到Istio-bookinfo文件下,执行以下命令,创建Istio资源并安装Bookinfo应用。
    helm install -f values.yaml istio-bookinfo ./
  3. 验证Istio-bookinfo是否安装成功。
    1. 在ASM控制台查看Istio资源。
      1. 在网格管理页面选择流量管理 > 网关规则
        网关规则页面可以看到bookinfo-gateway网关,说明创建Istio资源成功。网关
    2. 在ACK控制台查看Bookinfo应用。
      1. 登录容器服务管理控制台
      2. 在控制台左侧导航栏中,单击集群
      3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      4. 在集群管理页面可以选择工作负载 > 无状态
        无状态页面可以看到reviews、details等应用,说明安装Bookinfo应用成功。Bookinfo

      根据以上结果,说明Istio-bookinfo安装成功,同时也说明使用数据面集群KubeAPI创建Istio资源成功。

  4. 执行以下命令,使用数据面集群KubeAPI查看bookinfo-gateway网关。
    kubectl get Gateway bookinfo-gateway -o yaml

    返回bookinfo-gateway网关的YAML文件内容,说明查看bookinfo-gateway网关成功。