作者:华相 阿里云技术专家
前提条件
● 已创建ASM实例,且ASM实例的Istio为1.9.7.93及以上版本。具体操作,请参见创建ASM实例。
● 已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群。
● 添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
步骤一:启用数据面集群KubeAPI访问Istio资源功能
- 登录ASM控制台。
- 在左侧导航栏,选择服务网格 > 网格管理。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格信息页面单击右上角的功能设置。
- 在功能设置更新面板选中启用数据面集群KubeAPI访问Istio资源,然后单击确定。
步骤二:获取asm-cr-aggregation配置信息
- 查看ASM实例ID。
a. 登录ASM控制台。
b. 在左侧导航栏,选择服务网格 > 网格管理。
c. 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。在网格信息页面查看ASM实例ID。 - 查看集群地域ID。
a. 登录容器服务管理控制台。
b. 在控制台左侧导航栏单击集群。在集群页面查看目标集群的地域,例如您集群地域为华北2(北京),则集群地域ID为cn-beijing。 - 查看AccessKey ID和AccessKey Secret。具体操作,请参见获取AccessKey。
步骤三:安装asm-cr-aggregation
- 通过cloudshell连接集群
- 下载并解压至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
- 进入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文件。
- 执行以下命令,安装asm-cr-aggregation。
helm upgrade -i -f values.yaml asm-cr-aggregation ./
- 验证asm-cr-aggregation是否安装成功。
a. 登录容器服务管理控制台。
b. 在控制台左侧导航栏中,单击集群。
c. 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
d. 在集群管理页面左侧导航栏选择应用 > Helm。在Helm页面可以看到asm-cr-aggregation,说明asm-cr-aggregation安装成功。
步骤四:授予RAM用户权限
使用数据面集群Kubernetes API访问Istio资源之前,您的账号需要拥有在数据面集群访问Istio资源的权限和ASM的自定义资源权限:
授予RAM用户访问Istio资源的读写权限。
- 使用阿里云账号登录容器服务管理控制台。
- 在控制台左侧导航栏单击授权管理。
- 在子账号页签下单击目标RAM用户右侧的管理权限。
- 在集群RBAC配置页面中单击“+”图标,选择要授予的集群和命名空间,设置访问权限为自定义,在文本框中选择asm-istio-admin,然后单击下一步。
- 验证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
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,选择市场 > 应用目录。
- 在应用目录页面搜索ack-kubevela,然后单击ack-kubevela。
- 修改两个image,指向深圳的内网仓库:
a. registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/vela-core
b. registry-vpc.cn-shenzhen.aliyuncs.com/ali-workshop/kube-webhook-certgen - 在ack-kubevela详情页面创建面板选择集群,然后单击创建。
步骤六:部署Kebuvla配置文件
- 下载操作文件
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
- 进入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
步骤七:部署应用和网关
- 进入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
- 在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
- uri:
- 访问Bookinfo应用。
a. 登录容器服务管理控制台。
b. 在控制台左侧导航栏中,单击集群。
c. 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
d. 在集群管理页面选择网络 > 服务。
e. 在服务页面顶部设置命名空间为istio-system,查看istio-ingressgateway右侧80端口的外部端点,然后在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。多次刷新页面,可以看到页面上显示黑色星星。
步骤八:渐进式发布应用
- 执行以下命令,升级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服务。
- 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。多次刷新页面,10%概率可以看到红色星星,90%概率看到黑色星星。
- 执行以下命令,继续执行工作流,使reviews服务全部升级到v3版本。
curl -O https://ali-workshop.oss-cn-shenzhen.aliyuncs.com/vela
chmod +x vela
./vela workflow resume book-info
- 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。多次刷新页面,页面上只显示红色星星。说明reviews服务全部升级到v3版本。
(可选)步骤九:回滚应用
如果发现发布的新版本应用不符合预期,您可以终止发布工作流量,并将应用回滚到之前的版本。
- 执行以下命令,回滚应用。
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
- 在rollback.yaml文件中设置type为canary-rollback,会自动进行以下操作:
a. 更新Rollout对象的targetRevisionName成旧的版本,自动回滚所有已发布的新版本的实例回到旧版本,并且保持还没升级的旧版本实例。
b. 更新VirtualService对象的route字段,将所有流量导向旧的版本。
c. 更新DestinationRule对象的subset字段,只容纳旧的版本。 - 在浏览器地址栏中输入80端口的入口网关地址/productpage,访问Bookinfo应用。多次刷新页面,页面上只显示黑色星星。说明reviews服务回滚到v2版本。