Article / 文章中心

KubeVela + ASM 云原生交付体验

发布时间:2021-11-25 点击数:502

前提条件
● 已创建ASM实例,且ASM实例的Istio为1.9.7.93及以上版本。具体操作,请参见创建ASM实例。
● 已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群。
● 添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
步骤一:启用数据面集群KubeAPI访问Istio资源功能

  1. 登录ASM控制台。
  2. 在左侧导航栏,选择服务网格 > 网格管理。
  3. 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
  4. 在网格信息页面单击右上角的功能设置。
  5. 在功能设置更新面板选中启用数据面集群KubeAPI访问Istio资源,然后单击确定。

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

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

步骤三:安装asm-cr-aggregation

  1. 通过cloudshell连接集群
  2. 下载并解压至asm-cr-aggregation本地。

curl -O -L https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-helmcharts/asm-cr-aggregation.tgz
tar xvf asm-cr-aggregation.tgz

  1. 进入asm-cr-aggregation文件夹中,找到values.yaml文件,在values.yaml文件中补充ASM ID、集群地域ID、AccessKey ID和AccessKey Secret,修改repository为registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/asm-craggregation-apiservice,然后保存values.yaml文件。
  2. 执行以下命令,安装asm-cr-aggregation。

helm upgrade -i -f values.yaml asm-cr-aggregation ./

  1. 验证asm-cr-aggregation是否安装成功。
    a. 登录容器服务管理控制台。
    b. 在控制台左侧导航栏中,单击集群。
    c. 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
    d. 在集群管理页面左侧导航栏选择应用 > Helm。在Helm页面可以看到asm-cr-aggregation,说明asm-cr-aggregation安装成功。

步骤四:授予RAM用户权限
使用数据面集群Kubernetes API访问Istio资源之前,您的账号需要拥有在数据面集群访问Istio资源的权限和ASM的自定义资源权限:

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

  1. 使用阿里云账号登录容器服务管理控制台。
  2. 在控制台左侧导航栏单击授权管理。
  3. 在子账号页签下单击目标RAM用户右侧的管理权限。
  4. 在集群RBAC配置页面中单击“+”图标,选择要授予的集群和命名空间,设置访问权限为自定义,在文本框中选择asm-istio-admin,然后单击下一步。
  5. 验证RAM用户是否拥有访问Istio资源的读写权限。
    a. 执行以下命令,查看虚拟服务。

kubectl get VirtualService
预期输出:
NAME CREATED AT
reviews-route 2021-11-15T07:09:10Z
b. 执行以下命令,编辑虚拟服务。
kubectl edit VirtualService reviews-route
预期输出:
virtualservice.networking.istio.io/reviews-route edited
步骤五:安装KubeVela

  1. 登录容器服务管理控制台。
  2. 在控制台左侧导航栏中,选择市场 > 应用目录。
  3. 在应用目录页面搜索ack-kubevela,然后单击ack-kubevela。
  4. 修改两个image,指向深圳的内网仓库:
    a. registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/vela-core
    b. registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/kube-webhook-certgen
  5. 在ack-kubevela详情页面创建面板选择集群,然后单击创建。

步骤六:部署Kebuvla配置文件

  1. 下载操作文件

curl -O -L https://aliware-images.oss-cn-hangzhou.aliyuncs.com/ASM/Istio%E8%B5%84%E6%BA%90%E5%AE%89%E8%A3%85%E5%8C%85/asm_kubevela.zip
unzip asm_kubevela.zip

  1. 进入asm_kubevela文件夹中,执行以下命令,逐个部署Kebuvla配置文件。

kubectl apply -f rollback-wf-def.yaml
kubectl apply -f canary-rollout-wf-def.yaml
kubectl apply -f traffic-trait-def.yaml
步骤七:部署应用和网关

  1. 进入asm_kubevela文件夹中,执行以下命令,部署Bookinfo应用。application.yaml文件中为review服务配置traits字段下type为canary-traffic,表示配置了渐进式流量发布的运维特征。

kubectl apply -f - << EOF
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: book-info
namespace: default
spec:
components:

- name: reviews type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-reviews-v2:1.16.2 port: 9080 volumes: - name: wlp-output type: emptyDir mountPath: /opt/ibm/wlp/output - name: tmp type: emptyDir mountPath: /tmp traits: - type: canary-traffic properties: port: - 9080 - type: rollout properties: targetSize: 2 # This means to rollout two more replicas in two batches. rolloutBatches: - replicas: 2 - name: productpage type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-productpage-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080 - name: ratings type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-ratings-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080 - name: details type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-details-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080

EOF

  1. 在ASM控制台中部署网关规则和虚拟服务。
    a. 登录ASM控制台。
    b. 在左侧导航栏,选择服务网格 > 网格管理。
    c. 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
    d. 部署网关规则。
    ⅰ. 在网格详情页面左侧导航栏选择流量管理 > 网关规则,在右侧页面单击使用YAML创建。
    ⅱ. 在创建页面设置命名空间为default,复制以下内容到文本框中,然后单击创建。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:

istio: ingressgateway # use istio default controller

servers:

  • port:

    number: 80 name: http protocol: HTTP

    hosts:

    • "*"

e. 部署虚拟服务。

ⅰ. 在网格详情页面左侧导航栏选择流量管理 > 虚拟服务,在右侧页面单击使用YAML创建。
ⅱ. 在创建页面设置命名空间为default,复制以下内容到文本框中,然后单击确定。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:

  • "*"

gateways:

  • bookinfo-gateway

http:

  • match:

    • uri:
      exact: /productpage
    • uri:
      prefix: /static
    • uri:
      exact: /login
    • uri:
      exact: /logout
    • uri:
      prefix: /api/v1/products

    route:

    • destination:
      host: productpage
      port:
      number: 9080
  1. 访问Bookinfo应用。
    a. 登录容器服务管理控制台。
    b. 在控制台左侧导航栏中,单击集群。
    c. 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
    d. 在集群管理页面选择网络 > 服务。
    e. 在服务页面顶部设置命名空间为istio-system,查看istio-ingressgateway右侧80端口的外部端点,然后在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。多次刷新页面,可以看到页面上显示黑色星星。

步骤八:渐进式发布应用

  1. 执行以下命令,升级reviews应用,并调整流量。

kubectl apply -f - << EOF
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: book-info
namespace: default
spec:
components:

- name: reviews type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-reviews-v3:1.16.2 port: 9080 volumes: - name: wlp-output type: emptyDir mountPath: /opt/ibm/wlp/output - name: tmp type: emptyDir mountPath: /tmp traits: - type: canary-traffic properties: port: - 9080 - type: rollout properties: targetSize: 2 # This means to rollout two more replicas in two batches. rolloutBatches: - replicas: 1 - replicas: 1 - name: productpage type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-productpage-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080 - name: ratings type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-ratings-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080 - name: details type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-details-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080 

workflow:

steps:
  - name: rollout-1st-batch
    type: canary-rollout
    properties:
      # just upgrade first batch of component
      batchPartition: 0
      traffic:
        weightedTargets:
          - revision: reviews-v1
            weight: 90 # 90% shift to new version
          - revision: reviews-v2
            weight: 10 # 10% shift to new version

  # give user time to verify part of traffic shifting to newRevision
  - name: manual-approval
    type: suspend

  - name: rollout-rest
    type: canary-rollout
    properties:
      # upgrade all batches of component
      batchPartition: 1
      traffic:
        weightedTargets:
          - revision: reviews-v2
            weight: 100 # 100% shift to new version

EOF
a. targetSize:升级实例的批次。
b. rolloutBatches:每批实例升级的个数。
c. 在application_rollout-v2.yaml文件中设置了以下三个执行工作流:

ⅰ. 设置batchPartition等于0,表示只升级第一批次实例,即将reviews服务的2个Pod中,只升级其中的1个Pod。然后设置traffic.weightedTargets参数,将10%流量导向新升级的reviews服务,90%的流量仍然流向旧版本的服务。
ⅱ. 设置type为suspend,完成第一步工作流后,将暂停工作流。
ⅲ. 设置batchPartition等于1,表示升级第二批次实例,即将reviews服务的2个Pod都升级到v3版本镜像。然后设置traffic.weightedTargets参数,将100%流量导向新升级的reviews服务。
  1. 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。多次刷新页面,10%概率可以看到红色星星,90%概率看到黑色星星。
  2. 执行以下命令,继续执行工作流,使reviews服务全部升级到v3版本。

curl -O https://ali-workshop.oss-cn-shenzhen.aliyuncs.com/vela
chmod +x vela
./vela workflow resume book-info

  1. 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。多次刷新页面,页面上只显示红色星星。说明reviews服务全部升级到v3版本。

(可选)步骤九:回滚应用
如果发现发布的新版本应用不符合预期,您可以终止发布工作流量,并将应用回滚到之前的版本。

  1. 执行以下命令,回滚应用。

kubectl apply -f - << EOF
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: book-info
namespace: default
spec:
components:

- name: reviews type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-reviews-v3:1.16.2 port: 9080 volumes: - name: wlp-output type: emptyDir mountPath: /opt/ibm/wlp/output - name: tmp type: emptyDir mountPath: /tmp traits: - type: canary-traffic properties: port: - 9080 - type: rollout properties: targetSize: 2 # This means to rollout two more replicas in two batches. rolloutBatches: - replicas: 1 - replicas: 1 - name: productpage type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-productpage-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080 - name: ratings type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-ratings-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080 - name: details type: webservice properties: image: registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/examples-bookinfo-details-v1:1.16.2 port: 9080 traits: - type: expose properties: port: - 9080 

workflow:

steps:
  - name: rollback type: canary-rollback

EOF

  1. 在rollback.yaml文件中设置type为canary-rollback,会自动进行以下操作:
    a. 更新Rollout对象的targetRevisionName成旧的版本,自动回滚所有已发布的新版本的实例回到旧版本,并且保持还没升级的旧版本实例。
    b. 更新VirtualService对象的route字段,将所有流量导向旧的版本。
    c. 更新DestinationRule对象的subset字段,只容纳旧的版本。
  2. 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。多次刷新页面,页面上只显示黑色星星。说明reviews服务回滚到v2版本。