基于MSE实现K8s集群内多服务的灰度发布
1. 创建资源
1、在体验实验室页面左侧,单击创建资源,创建所需资源(本场景默认会提供一个ACK集群)。
2、在页面左侧导航栏中,单击云产品资源列表,查看本次实验资源相关信息。
说明 :
资源创建过程需要10分钟左右(需要创建一个K8s集群,感谢您的耐心等待~)。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:K8s集群ID、IP地址、用户名和密码等。
2. ACK部署微服务
本实验中通过浏览器发起测试请求,请求访问到MSE云原生网关(MSE Ingress Controller)的入口地址,网关会根据你配置的路由策略再将请求转发到Kubernates集群上部署Demo服务的Pod,所以现在需要ACK(托管版的Kubernates集群)部署我们的Demo服务。
1. 双击打开虚拟桌面的Firefox ESR浏览器,在RAM用户登录框中单击下一步,复制云产品资源列表中子用户密码,按CTRL+V把密码粘贴到密码输区,登录子账户(后续在远程桌面里的粘贴操作均使用CTRL + V快捷键)。
2. 复制容器服务控制台地址,在FireFox浏览器打开新页签,粘贴并访问容器服务控制台。
https://cs.console.aliyun.com/#/k8s/cluster/list
3. 在集群列表页面,根据集群ID找到具体ACK集群(需记忆下集群名称,后续操作将用到),单击详情。
4. 进入详情页面,在集群信息页选择点击集群资源,找到安全组信息。
5. 点开安全组右侧ID连接,在打开的安全组规则页,点击手动添加填写如下优先级1、协议类型全部、端口范围-1/-1、授权对象0.0.0.0/0再保存。这里是设置安全组规则允许网关访问(因为演示直接设置了0.0.0.0/0)。
6. 切回容器服务的详情页面,在左侧栏展开工作负载,选择点击无状态Tab。
7. 复制以下yaml内容(v1版本的Demo),再点击当前页面点击使用YAML创建资源,清空模版将内容粘贴进去,点击创建。
apiVersion: apps/v1 kind: Deployment metadata: name: go-httpbin-v1 namespace: default spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: go-httpbin strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: go-httpbin version: v1 spec: containers: - args: - '--version=v1' image: 'registry.cn-hangzhou.aliyuncs.com/mse-ingress/httpbin:v1' imagePullPolicy: Always name: go-httpbin --- apiVersion: v1 kind: Service metadata: name: go-httpbin-v1 spec: ports: - port: 80 targetPort: 8080 protocol: TCP selector: app: go-httpbin version: v1
8. 确认创建成功后,再次点击无状态,即可查看到已经部署的版本v1的Demo服务(pod带有version=v1标签)。
9. 同样操作我们再复制以下yaml内容部署v2版本的Demo(pod带有version=v2标签)。
apiVersion: apps/v1 kind: Deployment metadata: name: go-httpbin-v2 namespace: default spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: go-httpbin strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: go-httpbin version: v2 spec: containers: - args: - '--version=v2' image: 'registry.cn-hangzhou.aliyuncs.com/mse-ingress/httpbin:v1' imagePullPolicy: Always name: go-httpbin --- apiVersion: v1 kind: Service metadata: name: go-httpbin-v2 spec: ports: - port: 80 targetPort: 8080 protocol: TCP selector: app: go-httpbin version: v2
10. 检查所有必要的资源是否就绪,Deployment和Service资源如下:
至此,我们完成了所有需要的Demo无状态和服务资源的创建工作,接下来我们就可以开始配置Ingress资源了。
3. ACK安装MSE Ingress Controller
在容器服务中安装MSE Ingress Controller组件来管理云原生网关,并通过MSE Ingress来暴露集群中的容器服务,这一步我们来安装Controller。
在当前容器集群详情页中,点击运维管理->组件管理。
2. 点击网络Tab页,找到MSE-Ingress-Controller,点击安装。
至此我们完成了MSE Ingress Controller组件的安装工作。
4. 通过Yaml配置创建MSE云原生网关
- 复制以下配置文,用于部署名称为test的Deployment。
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
- 切换到工作负载-自定义资源页面点击使用YAML创建资源,在打开的页面粘贴上面复制的内容,点击创建。
创建完成后,按下图切换到资源对象浏览器,再API组中找到mse.alibabacloud.com下的MseIngressConfig资源,左侧列表操作栏点击YAML编辑确认当状态显示为Listening时(这个过程较慢,可能需要3到5分钟,可以尝试过几分钟查看),表示云原生网关创建成功并且处于运行状态。并自动监听集群中IngressClass为mse的Ingress资源。
- 页面切到网络-路由页面,创建并应用以下Ingress资源:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress namespace: default spec: ingressClassName: mse rules: - http: paths: - backend: service: name: go-httpbin-v1 port: number: 80 path: /version pathType: Prefix
- 查看目标Ingress的IP地址。
- 复制上述端点信息再拼接“/version”,如下114.55.xx.xx/version进行访问测试。
- 至此我们完成了Ingress资源的配置,并成功验证从公网访问到go-httpbin-v1服务响应返回如上图展示。
5. 修改Ingress配置生效灰度
基于客户端请求的流量切分场景,假设当前线上环境,您已经有一套服务go-httpbin-v1对外提供7层服务,此时上线了一些新的特性,需要发布上线一个新的版本go-httpbin-v2。但又不想直接替换go-httpbin-v1服务,而是希望将请求头中包含version=v2的客户端请求转发到go-httpbin-v2服务中。
页面切到网络-路由页面,再新增一个canary-v2的路由资源。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-v2 namespace: default annotations: nginx.ingress.kubernetes.io/canary: 'true' nginx.ingress.kubernetes.io/canary-by-header: version nginx.ingress.kubernetes.io/canary-by-header-value: 'v2' spec: ingressClassName: mse rules: - http: paths: - backend: service: name: go-httpbin-v2 port: number: 80 path: /version pathType: ImplementationSpecific
- 使用本地电脑打开终端程序(linux/macOS打开终端,windows打开安装有curl命令的CMD或者本地安装有支持header设置的HTTP请求工具,如PostMan)执行以下命令,请求头中满足version=v2的客户端请求访问服务。
2.1 通过终端测试
curl -H "version: v2" 'http://120.55.xx.xx/version'
预期请求头满足version=v2的请求如下返回:
预期没有特殊请求头的请求如下正常返回:
2.2 通过PostMan测试,请求头带有header version=v2 将访问灰度服务go-httpbin-v2。
预期没有特殊请求头的请求将会访问正式服务go-httpbin-v1
至此我们已经掌握了基于MSE云原生网关在ACK上的Ingress场景灰度,更多灰度方式场景可以参考https://help.aliyun.com/document_detail/200941.html。
实验链接:https://developer.aliyun.com/adc/scenario/2bc3a435654448b5a7d27d2bcb2bc646