基于MSE实现微服务的全链路灰度
1. 实验资源方式简介及开始实验
云起实验室实验资源方式介绍
云起实验室支持公共资源体验、领取免费试用额度、个人账户资源三种实验资源方式。
- 公共资源体验
- 平台提供临时资源及RAM子账号进行实验操作。
- 资源归属于平台,仅供本次实验使用。
- 实验结束后,实验资源及实验记录将被释放。
- 资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等)。
- 说明:实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。
- 领取免费试用额度
- 使用个人账号开通试用,平台仅提供手册参考。
- 所有实验操作将保留至您的账号,请谨慎操作。
- 在实验页面下方卡片会展示本实验支持的试用规格,可以选择你要试用的云产品资源进行开通。您在实验过程中,可以随时用右下角icon唤起试用卡片。阿里云支持试用的产品列表、权益及具体规则说明请参考开发者试用中心。
- 说明:试用云产品开通在您的个人账号下,并占用您的试用权益。如试用超出免费试用额度,可能会产生一定费用。
- 个人账户资源
- 使用您个人的云资源进行操作,资源归属于个人。
- 所有实验操作将保留至您的账号,请谨慎操作。
- 平台仅提供手册参考,不会对资源做任何操作。
- 说明:使用个人账户资源,在创建资源时,可能会产生一定的费用,请您及时关注相关云产品资源的计费概述。
准备开始实验
在实验开始前,请您选择其中一种实验资源,单击确认开启实验。
说明:每个实验所支持的实验资源方式都不相同,实验不一定能满足有三种实验资源方式,请根据实验的实际情况,进行选择。
2. 领取免费试用资源
实验前必看!
- 本教程会使用到负载均衡SLB,会产生少量费用,具体计费详情,请参见负载均衡SLB费用计算器。
- 如果您的阿里云主账号符合开通容器服务Serverles版ACK Serverless免费试用的资格,建议您开通免费试用容器服务Serverles版ACK Serverless。ACK Serverless试用集群由计算资源弹性容器实例ECI和网络资源负载均衡CLB组成,可以免费试用1个月,ACK Serverless试用集群资源的免费额度请参见ACK Serverless试用集群减免的费用。
- 如果您的阿里云主账号符合开通微服务引擎服务治理MSE免费试用的资格,建议您开通免费试用微服务引擎服务治理MSE。微服务引擎服务治理MSE提供开通后30天,不限量免费使用无损上下线、全链路灰度、限流降级等微服务治理全部产品能力。
- 如果您的阿里云主账号符合开通微服务引擎云原生网关MSE免费试用的资格,建议您开通免费试用微服务引擎云原生网关MSE。微服务引擎云原生网关MSE提供2核4GB、1节点、1个月时长的网关实例,试用额度不包含SLB费用,试用期结束后将自动转按量付费,若试用后不再使用,请及时删除实例。
- 如果您的阿里云账号只能领取部分免费试用产品,请您领取符合免费试用资格的产品,然后进入实验,不满足免费试用资格的产品将会使用个人账户资源进行创建,并会产生一定的费用,请您及时关注账户扣费。
- 为了避免资源浪费并造成账号扣费的情况,请严格按照本文提供的参数进行配置。在实验完成之后,请您及时删除或禁用压测任务。
- 在实验开始前,请您选择开通免费试用。
- 开通容器服务Serverles版ACK Serverless免费试用。
2.1 在实验室页面下方,选择容器服务Serverles版ACK Serverless,单击立即试用。
2.2 在容器服务Serverles版ACK Serverless面板,在服务协议右侧,单击已完成服务角色的授权链接,然后单击同意授权,完成ACK Serverless试用集群的授权操作。
2.3 返回容器服务Serverles版ACK Serverless开通面板,选择任一地域,本教程以华东1(杭州)地域为例,其他配置项保持默认。仔细阅读各服务协议,并选中服务协议选框,然后单击立即试用。试用申请成功通过后,系统将会为您自动创建ACK Serverless标准版集群。
2.4 前往容器服务控制台,集群创建大约需要3~5分钟,当集群状态为运行中时,即可正常使用,然后单击集群名称。
2.5 在集群资源页签,查看ACK Serverless集群所在的的虚拟专有网络VPC和节点虚拟交换机。
说明:本实验需要ACK Serverless集群和服务引擎云原生网关MSE在同一VPC下。
- 开通微服务引擎服务治理MSE免费试用。
3.1 开通微服务引擎服务治理MSE免费试用前,您需要为MSE创建关联角色AliyunServiceRoleForMSE,开通微服务引擎服务。前往MSE微服务引擎控制台。
3.2 在欢迎访问微服务引擎MSE 2.0页面,单击立即授权。
说明:开通微服务引擎不收费。
3.3 在确认授权对话框中,单击确认,然后单击下一步。
3.4 单击立即体验微服务引擎MSE。
3.5 在实验室页面下方,选择微服务引擎服务治理MSE,单击立即试用。
3.6 在微服务引擎服务治理MSE面板,勾选服务协议后,单击立即试用。
- 开通微服务引擎云原生网关MSE免费试用。
4.1 在实验室页面下方,选择服务引擎云原生网关MSE,单击立即试用。
4.2 在微服务引擎云原生网关MSE面板,完成参数信息配置。本试用教程以表格中的参数信息为例,未提及参数保持默认值,勾选服务协议后,单击立即试用,并根据页面提示完成试用申请。
参数 |
示例值 |
地域 |
华东1(杭州) |
网关名称 |
自定义网关名称 |
资源组 |
默认资源组 |
专有网络 |
选择与ACK Serverless集群同一个VPC。 |
可用区 |
选择与ACK Serverless集群同一个交换机 |
公网SLB规格 |
简约型(slb.s1.small) |
4.3 在网关列表页面,等待状态变为运行正常,即可正常使用。
- 领取完免费试用后,返回资源领取界面,单击我已开通,进入实验。
说明:如果您的阿里云账号只能领取部分免费试用产品,请您领取符合免费试用资格的产品,然后进入实验,不满足免费试用资格的产品将会使用个人账户资源进行创建,并会产生一定的费用,请您及时关注账户扣费。
3. 创建实验资源
- 创建容器服务Serverles版ACK Serverless集群。
说明:
- 如果您选择的免费试用,并且在上一步骤中领取了容器服务Serverles版ACK Serverless的免费试用,后台会自动为您创建容器服务Serverles版ACK Serverless集群,请您跳过本步骤,直接进行下一小节操作。
- 如果您选择的免费试用,但是您的阿里云主账号没有资格领取容器服务Serverles版ACK Serverless的免费试用,请您根据如下操作,创建容器服务Serverles版ACK Serverless集群,并且会产生一定的费用,详情请参考云产品资源计费。
- 如果您选择的个人资源,请您根据如下操作,创建容器服务Serverles版ACK Serverless集群,并且会产生一定的费用,详情请参考云产品资源计费。
1.1 前往容器服务ACK Serverless控制台,在集群列表页面,单击创建集群。
1.2 在集群配置页面,根据如下说明配置参数,未提及的参数保持默认,然后单击下一步:组件配置。
说明:本试用教程以下列的配置信息为例,实际操作时,建议根据您的实际业务体量和需求选择。
参数说明:
配置项 |
教程示例 |
集群类型 |
ACK Serverless集群 |
集群规格 |
标准版 |
集群名称 |
test |
地域 |
华东1(杭州) |
Kubernetes版本 |
1.26.3-aliyun.1 |
专有网络 |
选择使用已有,单击下方的创建专有网络,创建完成后,返回ACK Serverless创建页面选择创建完成的专有网络。 本教程不需要配置SNAT。 |
虚拟交换机 |
单击下方的创建虚拟交换机,创建完成后,返回ACK Serverless创建页面选择创建完成的虚拟交换机。 |
1.3 在组件配置页面,关取消和Knative的默认勾选,单击下一步:确认配置。
1.4 在确认配置页面,选中服务协议,单击创建集群。
1.4 在日志页面,单击集群列表。
1.5 在集群列表页面,等待大约3~5分钟。状态变为运行中后,表示ACK Serverless集群创建完成,即可正常使用,然后单击集群名称。
1.6 在集群资源页签,查看ACK Serverless集群所在的的虚拟专有网络VPC和节点虚拟交换机。
说明:本实验需要ACK Serverless集群和服务引擎云原生网关MSE在同一VPC下。
- 开通微服务引擎服务治理MSE。
说明:
- 如果您选择的免费试用,并且在上一步骤中领取了微服务引擎服务治理MSE的免费试用,请您跳过本步骤,直接进行下一小节操作。
- 如果您选择的免费试用,但是您的阿里云主账号没有资格领取微服务引擎服务治理MSE的免费试用,请您根据如下操作,开通微服务引擎服务治理MSE,并且会产生一定的费用,详情请参见计费概述。
- 如果您选择的个人资源,请您根据如下操作,开通微服务引擎服务治理MSE,并且会产生一定的费用,详情请参见计费概述。
2.1 登录MSE微服务引擎控制台。
说明:如果提示需要创建关联角色AliyunServiceRoleForMSE,请您单击立即授权。
2.2 在概览页面右侧服务治理区域,根据页面提示,开通微服务治理。
- 创建微服务引擎云原生网关MSE。
说明:
- 如果您选择的免费试用,并且在上一步骤中领取了微服务引擎云原生网关MSE的免费试用,请您跳过本步骤,直接进行下一小节操作。
- 如果您选择的免费试用,但是您的阿里云主账号没有资格领取微服务引擎云原生网关MSE的免费试用,请您根据如下操作,创建微服务引擎云原生网关MSE,并且会产生一定的费用,详情请参见计费概述。
- 如果您选择的个人资源,请您根据如下操作,创建微服务引擎云原生网关MSE,并且会产生一定的费用,详情请参见计费概述。
3.1 前往MSE网关管理控制台。
3.2 在网关列表页面,单击创建网关。
3.3 在云原生网关购买页面,完成参数信息配置。本试用教程以表格中的参数信息为例,未提及参数保持默认值,单击立即购买。
3.4 在确认订单页面,选中服务协议,单击立即开通。
3.5 在购买完成页面,单击前往控制台。
3.6 在实例列表页面,等待状态变为运行中,即可正常使用。
4. 修改容器服务集群名称
为了避免多用户之间实验资源冲突,需要对属于本帐号的容器服务集群名称进行重命名。
- 双击打开远程桌面的Chromium网页浏览器。
说明:
如果远程桌面浏览器无法打开,可在本机浏览器上【打开新的无痕浏览器】,复制如下链接登录实验提供的RAM子用户。
https://signin.aliyun.com/login.htm?callback=https%3A%2F%2Fecs.console.aliyun.com%2Fserver%2Fregion%2Fcn-shanghai#/main
- 在RAM用户登录框中单击下一步,并复制粘贴页面左上角的子用户密码到用户密码输入框,单击登录。
- 复制下方地址,在Chromium网页浏览器打开新页签,粘贴并访问容器服务控制台。
https://cs.console.aliyun.com/#/k8s/cluster/list
- 找到属于本账号的ACK集群,根据左侧云产品资源下方的k8s实例ID找到对应的ACK集群
- 修改集群名称为K8s实例ID,保持与集群实例ID值一致
5. 开启MSE微服务治理
本步骤指导您如何安装MSE微服务治理组件。
- 在容器服务控制台( https://cs.console.aliyun.com/ )左侧导航栏中,选择市场>应用市场。
- 在应用市场页面单击应用目录页签,然后搜索并单击ack-onepilot组件。
- 在ack-onepilot页面右上方单击一键部署,在创建面板中选择集群和命名空间,设置组件发布名称,然后单击下一步。
说明:推荐使用默认的命名空间ack-onepilot。
- 在参数配置向导中确认组件参数信息,然后单击确定。安装完成后,在命名空间ack-onepilot中出现ack-onepilot应用,表示安装成功。
6. ACK Serverless部署微服务
结合如下架构图,依次部署注册中心、应用A、应用B、应用C。
- 在集群列表页面,根据集群ID找到具体ACK集群(需记忆下集群名称,后续操作将用到),单击详情。
- 在左侧导航栏中,选择工作负载>无状态,在无状态页面,单击右上角的使用YAML创建资源部署应用A、应用B、应用C以及注册中心。
- 在创建页面,输入如下注册中心的YAML,单击创建,并等待注册中心启动(一般耗时30s)。
apiVersion: apps/v1 kind: Deployment metadata: name: nacos-server spec: replicas: 1 selector: matchLabels: app: nacos-server template: metadata: labels: app: nacos-server spec: containers: - env: - name: MODE value: standalone image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:v2.1.2 imagePullPolicy: Always name: nacos-server livenessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 8848 timeoutSeconds: 3 readinessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 8848 timeoutSeconds: 3 resources: requests: cpu: 500m memory: 1Gi dnsPolicy: ClusterFirst restartPolicy: Always # Nacos Server Service 配置 --- apiVersion: v1 kind: Service metadata: name: nacos-server spec: ports: - port: 8848 protocol: TCP targetPort: 8848 selector: app: nacos-server type: ClusterIP
- 在创建页面,输入如下的应用A、应用B、应用C的YAML,单击创建。
apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-a spec: replicas: 1 selector: matchLabels: app: spring-cloud-a template: metadata: labels: msePilotCreateAppName: spring-cloud-a msePilotAutoEnable: 'on' app: spring-cloud-a spec: containers: - name: spring-cloud-a image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0 imagePullPolicy: Always ports: - containerPort: 20001 livenessProbe: tcpSocket: port: 20001 initialDelaySeconds: 10 periodSeconds: 30 --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-a-gray spec: replicas: 1 selector: matchLabels: app: spring-cloud-a-gray strategy: template: metadata: labels: alicloud.service.tag: gray msePilotCreateAppName: spring-cloud-a msePilotAutoEnable: 'on' app: spring-cloud-a-gray spec: containers: - name: spring-cloud-a-new image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0 imagePullPolicy: Always ports: - containerPort: 20001 livenessProbe: tcpSocket: port: 20001 initialDelaySeconds: 10 periodSeconds: 30 --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-b spec: replicas: 1 selector: matchLabels: app: spring-cloud-b strategy: template: metadata: labels: msePilotCreateAppName: spring-cloud-b msePilotAutoEnable: 'on' app: spring-cloud-b spec: containers: - name: spring-cloud-b image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0 imagePullPolicy: Always ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 20002 initialDelaySeconds: 10 periodSeconds: 30 --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-c spec: replicas: 1 selector: matchLabels: app: spring-cloud-c template: metadata: labels: msePilotCreateAppName: spring-cloud-c msePilotAutoEnable: 'on' app: spring-cloud-c spec: containers: - name: spring-cloud-c image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0 imagePullPolicy: Always ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 20003 initialDelaySeconds: 10 periodSeconds: 30 --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-c-gray spec: replicas: 1 selector: matchLabels: app: spring-cloud-c-gray template: metadata: labels: alicloud.service.tag: gray msePilotCreateAppName: spring-cloud-c msePilotAutoEnable: 'on' app: spring-cloud-c-gray spec: containers: - name: spring-cloud-c-gray image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0 imagePullPolicy: Always ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 20003 initialDelaySeconds: 10 periodSeconds: 30
本步骤部署了应用A、应用B、应用C以及注册中心,可以让内部流量按照业务逻辑进行调用。下一步我们将会配置MSE Ingress网关,引入外部流量。
7. 部署MSE Ingress网关
在容器服务中安装MSE Ingress Controller组件来管理云原生网关,并通过MSE Ingress来暴露集群中的容器服务,这一步我们来安装Controller。
- 我们复制以下链接打开浏览器新页面在应用市场开始安装操作。
https://cs.console.aliyun.com/?#/next/app-catalog/ack/incubator/ack-mse-ingress-controller
- 在打开的介绍页面,单击一键部署。
- 在创建面板中选择您的集群和命名空间,设置组件发布名称,然后单击下一步。
- 安装完成后,切回到ACK集群详情的无状态页面,将目标集群的命名空间切换到mse-ingress-controller,如果出现ack-mse-ingress-controller应用(命名空间出现可能有延迟,稍等一会尝试刷新),表示安装成功。
至此我们完成了MSE Ingress Controller组件的安装工作,接下来开始部署MSE Ingress网关实例。
- 复制以下配置文件MseIngressConfig用于部署MSE Ingress网关实例。
apiVersion: mse.alibabacloud.com/v1alpha1 kind: MseIngressConfig metadata: name: test spec: name: mse-ingress common: pay: payType: POSTPAY instance: spec: 2c4g replicas: 1 network: publicSLBSpec: slb.s1.small securityGroupType: normal global: deleteSLB: true --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: mse spec: controller: mse.alibabacloud.com/ingress parameters: apiGroup: mse.alibabacloud.com kind: MseIngressConfig name: test
- 切换到工作负载-自定义资源页面单击使用YAML创建资源,在打开的页面粘贴上面复制的内容,单击创建。
- 创建完成后,按下图切换到资源对象浏览器,再API组中找到mse.alibabacloud.com下的MseIngressConfig资源,左侧列表操作栏单击YAML编辑确认当状态显示为Listening时(这个过程较慢,可能需要3到5分钟,可以尝试过几分钟查看),表示云原生网关创建成功并且处于运行状态。并自动监听集群中IngressClass为mse的Ingress资源。
到这里,我们的MSE Ingress网关实例已经成功创建,并自动监听集群中IngressClass为mse的Ingress资源
8. 配置MSE Ingress规则
- 针对入口应用A,配置两个K8s Service,复制以下配置,点击网络 > 服务 > 使用YAML创建资源。
apiVersion: v1 kind: Service metadata: name: spring-cloud-a-base namespace: default spec: ports: - name: http port: 20001 protocol: TCP targetPort: 20001 selector: app: spring-cloud-a --- apiVersion: v1 kind: Service metadata: name: spring-cloud-a-gray namespace: default spec: ports: - name: http port: 20001 protocol: TCP targetPort: 20001 selector: app: spring-cloud-a-gray
- 点击网络 > 路由 > 使用YAML创建资源,通过以下Ingress规则对外暴露应用A的正式版本spring-cloud-a-base。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: spring-cloud-a namespace: default spec: ingressClassName: mse rules: - http: paths: - backend: service: name: spring-cloud-a-base port: number: 20001 path: / pathType: Prefix
- 假设这里基于URL的请求参数策略来区分线上正式流量和灰度流量,希望带有URL的请求参数为x-user-id: 100的请求流量,路由到灰度环境中,此时流量会优先访问链路中各个应用对应的灰度版本,若无灰度版本,则会容灾到基线版本。通过以下Ingress规则对外暴露应用A的灰度版本spring-cloud-a-gray。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: 'true' mse.ingress.kubernetes.io/canary-by-query: x-user-id mse.ingress.kubernetes.io/canary-by-query-value: '100' mse.ingress.kubernetes.io/request-header-control-update: x-mse-tag gray name: spring-cloud-a-gray namespace: default spec: ingressClassName: mse rules: - http: paths: - backend: service: name: spring-cloud-a-gray port: number: 20001 path: / pathType: Prefix
9. 验证全链路灰度
- 查看您的MSE Ingress网关的IP地址,在集群>网络>路由,查看Ingress的端点信息。
- 验证正式环境的流量,在您的浏览器输入以下URL
http://{您的MSE Ingress网关IP地址}/a
返回内容如下,可以看到,应用A、B、C都访问到了基线版本。
A[10.1.0.29] -> B[10.1.0.28] -> C[10.1.0.27]
- 验证灰度环境的流量,在您的浏览器输入以下URL
http://{您的MSE Ingress网关IP地址}/a?x-user-id=100
返回的内容如下,可以看到,应用A、C访问到了灰度版本,应用B没有灰度版本,所以fallback到了基线版本。
Agray[10.1.0.13] -> B[10.1.0.11] -> Cgray[10.1.0.22]
10. 安装CoreDNS和MSE微服务治理ack-onepilot
- 前往容器服务控制台。
- 在集群列表页面,选择您的ACK Serverless集群,单击详情。
- 在左侧导航栏,选择运维管理 > 组件管理。
- 在组件管理页面,单击网络页签,找到CoreDNS,然后单击卡片右下角的安装。
- 在安装组件 CoreDNS面板中,设置如下内存和CPU配置项,其他配置项保持默认值,然后单击确定。
- MemoryRequest 内存需求:512M。
- CpuRequest CPU需求:500m。
- 在组件管理页面,单击网络页签,找到ack-onepilot,然后单击卡片右下角的安装。
- 在安装组件 ack-onepilot面板中,配置项保持默认值,单击确定。
11. 在容器集群中部署微服务
结合如下架构图,依次部署注册中心,应用A、应用B、应用C的正式版本,以及应用A、应用C的灰度版本。
- 在容器服务控制台的集群列表页面,选择您的ACK Serverless集群,单击详情。
- 在左侧导航栏中,选择工作负载>无状态。
- 在无状态页面,单击右上角的使用YAML创建资源部署应用A、应用B、应用C以及注册中心。
- 在创建页面,输入如下注册中心的YAML,单击创建,并等待注册中心启动(一般耗时30s)。
apiVersion: apps/v1 kind: Deployment metadata: name: nacos-server spec: replicas: 1 selector: matchLabels: app: nacos-server template: metadata: labels: app: nacos-server spec: containers: - env: - name: MODE value: standalone image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/nacos-server:v2.1.2 imagePullPolicy: Always name: nacos-server livenessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 8848 timeoutSeconds: 3 readinessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 8848 timeoutSeconds: 3 resources: requests: cpu: 1 memory: 2Gi dnsPolicy: ClusterFirst restartPolicy: Always # Nacos Server Service 配置 --- apiVersion: v1 kind: Service metadata: name: nacos-server spec: ports: - port: 8848 protocol: TCP targetPort: 8848 selector: app: nacos-server type: ClusterIP
- 在创建页面,输入如下:应用A、应用B、应用C的正式版本YAML,应用A、应用C的灰度版本YAML,单击创建。
apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-a spec: replicas: 1 selector: matchLabels: app: spring-cloud-a template: metadata: labels: msePilotCreateAppName: spring-cloud-a msePilotAutoEnable: 'on' app: spring-cloud-a spec: containers: - name: spring-cloud-a image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-a:1.0.0 imagePullPolicy: Always ports: - containerPort: 20001 livenessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 20001 timeoutSeconds: 3 resources: requests: cpu: 1 memory: 2Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-a-gray spec: replicas: 1 selector: matchLabels: app: spring-cloud-a-gray strategy: template: metadata: labels: alicloud.service.tag: gray msePilotCreateAppName: spring-cloud-a msePilotAutoEnable: 'on' app: spring-cloud-a-gray spec: containers: - name: spring-cloud-a-new image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-a:1.0.0 imagePullPolicy: Always ports: - containerPort: 20001 livenessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 20001 timeoutSeconds: 3 resources: requests: cpu: 1 memory: 2Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-b spec: replicas: 1 selector: matchLabels: app: spring-cloud-b strategy: template: metadata: labels: msePilotCreateAppName: spring-cloud-b msePilotAutoEnable: 'on' app: spring-cloud-b spec: containers: - name: spring-cloud-b image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-b:1.0.0 imagePullPolicy: Always ports: - containerPort: 20002 livenessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 20002 timeoutSeconds: 3 resources: requests: cpu: 1 memory: 2Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-c spec: replicas: 1 selector: matchLabels: app: spring-cloud-c template: metadata: labels: msePilotCreateAppName: spring-cloud-c msePilotAutoEnable: 'on' app: spring-cloud-c spec: containers: - name: spring-cloud-c image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-c:1.0.0 imagePullPolicy: Always ports: - containerPort: 20003 livenessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 20003 timeoutSeconds: 3 resources: requests: cpu: 1 memory: 2Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-c-gray spec: replicas: 1 selector: matchLabels: app: spring-cloud-c-gray template: metadata: labels: alicloud.service.tag: gray msePilotCreateAppName: spring-cloud-c msePilotAutoEnable: 'on' app: spring-cloud-c-gray spec: containers: - name: spring-cloud-c-gray image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-c:1.0.0 imagePullPolicy: Always ports: - containerPort: 20003 livenessProbe: failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 20003 timeoutSeconds: 3 resources: requests: cpu: 1 memory: 2Gi
本步骤部署了应用A、应用B、应用C以及注册中心,可以让内部流量按照业务逻辑进行调用。下一步我们将会配置MSE Ingress网关,引入外部流量。
12. MSE Ingress网关关联容器集群并监听Ingress
- 前往MSE云原生网关控制台。
- 在网关列表页面,找到您的网关实例,单击实例ID。
- 在基本概览页面,单击安全组授权。
说明:进行安全组授权,即授权MSE Ingress网关的安全组能够访问容器集群的安全组。
- 在基本概览页面的安全组授权页签,单击立即创建。
- 在授权安全组面板,选择ACK Serverless集群所在的安全组,端口范围输入1/65535,单击确定。
- 在左侧导航栏中,选择服务管理->来源管理。
- 在来源管理页面,单击创建来源。
- 在创建来源面板,来源类型选择容器服务,ACK/ACK Serverless集群选择您的ACK Serverless集群,并开启监听K8s Ingress,其中Ingress Class设置为mse,然后单击确定。
到这里,我们的MSE Ingress网关实例已经成功关联ACK Serverless集群,并自动监听集群中IngressClass为mse的Ingress资源。
13. 配置MSE Ingress规则
- 返回到容器服务控制台的集群列表页面,选择您的ACK Serverless集群,单击详情。
- 针对入口应用A的正式版本和灰度版本,分别配置对应的K8s Service,复制以下配置,选择网络 > 服务 > 使用YAML创建资源。
apiVersion: v1 kind: Service metadata: name: spring-cloud-a-base namespace: default spec: ports: - name: http port: 20001 protocol: TCP targetPort: 20001 selector: app: spring-cloud-a --- apiVersion: v1 kind: Service metadata: name: spring-cloud-a-gray namespace: default spec: ports: - name: http port: 20001 protocol: TCP targetPort: 20001 selector: app: spring-cloud-a-gray
- 选择网络 > 路由 > 使用YAML创建资源,通过以下Ingress规则对外暴露应用A的正式版本spring-cloud-a-base。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: spring-cloud-a namespace: default spec: ingressClassName: mse rules: - http: paths: - backend: service: name: spring-cloud-a-base port: number: 20001 path: / pathType: Prefix
- 假设这里基于URL的请求参数策略来区分线上正式流量和灰度流量,希望带有URL的请求参数为x-user-id: 100的请求流量,路由到灰度环境中,此时流量会优先访问链路中各个应用对应的灰度版本,若无灰度版本,则会容灾到基线版本。选择网络 > 路由 > 使用YAML创建资源,通过以下Ingress规则对外暴露应用A的灰度版本spring-cloud-a-gray。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/canary: 'true' mse.ingress.kubernetes.io/canary-by-query: x-user-id mse.ingress.kubernetes.io/canary-by-query-value: '100' mse.ingress.kubernetes.io/request-header-control-update: x-mse-tag gray name: spring-cloud-a-gray namespace: default spec: ingressClassName: mse rules: - http: paths: - backend: service: name: spring-cloud-a-gray port: number: 20001 path: / pathType: Prefix
14. 验证全链路灰度
- 查看您的MSE Ingress网关的IP地址,在集群>网络>路由,查看Ingress的端点信息。
- 验证正式环境的流量,在您的浏览器输入以下URL
http://{您的MSE Ingress网关IP地址}/a
返回类似如下内容,您可以看到,应用A、B、C都访问到了基线版本。
A[172.16.1.196] -> B[172.16.1.194] -> C[172.16.1.197]
- 验证灰度环境的流量,在您的浏览器输入以下URL
http://{您的MSE Ingress网关IP地址}/a?x-user-id=100
返回的内容如下,可以看到,应用A、C访问到了灰度版本,应用B没有灰度版本,所以fallback到了基线版本。
Agray[172.16.1.193] -> B[172.16.1.194] -> Cgray[172.16.1.195]
15. 释放资源
实验完成后,建议及时删除资源,避免额外资损。
ACK Serverless集群
- 删除已创建的应用和服务
- 在容器服务管理控制台的集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态,找到已创建的应用,在页面右侧操作列,选择更多 > 删除。
- 在确认面板中,选中移除关联的服务(Service),然后单击确定。
- 删除集群
ACK Serverless集群目前处于公测中,可免费试用。但是在使用ACK Serverless集群过程中用到的其他阿里云云产品资源,您需要按照各云产品规定的计费规则,为您使用的资源付费,费用由各云产品收取。完成教程后,请参考以下场景处理集群:
- 如果无需继续使用集群,请登录容器服务管理控制台,在集群列表页面的操作列,单击目标集群对应的更多>删除。在删除集群页面,选中同时删除集群下的ALB资源、同时删除集群下的PrivateZone资源和我已知晓以上信息并确认删除集群,然后单击确定。关于删除ACK Serverless集群的更多信息,请参见删除集群。
- 如果需要继续使用集群,请至少在试用期到期1小时前为阿里云账号充值,确保账户金额不小于100.00元人民币。在使用ACK Serverless Pro版集群过程中用到的其他阿里云云产品资源,相关计费说明,请参见云产品资源计费。
微服务引擎云原生网关MSE
- 如果无需继续使用微服务引擎云原生网关MSE,请前往MSE网关管理控制台,找到目标网关,选择右侧操作列中的图标>释放实例。在释放对话框中,选中是否同时删除网关创建时代购的SLB实例,单击确定。
- 如果仍需要继续使用微服务引擎云原生网关MSE,请随时关注账户扣费情况。
实验地址 :https://developer.aliyun.com/adc/scenario/28da193e442b42f39803a287126475f5