基于MSE实现K8s集群内多服务的灰度发布

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: MSE 云原生网关是阿里云推出的下一代网关,您可以在 MSE 上通过 Ingress 资源来配置不同的转发规则,从而根据不同的规则设置,来注册集群内不同的服务,以及实现多服务的灰度发布。

基于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云原生网关

  1. 复制以下配置文,用于部署名称为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
  1. 切换到工作负载-自定义资源页面点击使用YAML创建资源,在打开的页面粘贴上面复制的内容,点击创建

创建完成后,按下图切换到资源对象浏览器,API组中找到mse.alibabacloud.com下的MseIngressConfig资源,左侧列表操作栏点击YAML编辑确认当状态显示为Listening时(这个过程较慢,可能需要3到5分钟,可以尝试过几分钟查看),表示云原生网关创建成功并且处于运行状态。并自动监听集群中IngressClass为mse的Ingress资源。

  1. 页面切到网络-路由页面,创建并应用以下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

  1. 查看目标Ingress的IP地址

  1. 复制上述端点信息再拼接“/version”,如下114.55.xx.xx/version进行访问测试。

  1. 至此我们完成了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

  1. 使用本地电脑打开终端程序(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

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
148 12
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
2月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
87 2
|
2月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
3月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
99 1
|
4月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
4月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
4月前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
309 4
|
4月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
306 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。

相关产品

  • 微服务引擎