使用istio对spring cloud kubernetes项目进行金丝雀发布_水中加点糖-CSDN博客_istio springcloud

标签: | 发表时间:2021-06-20 16:48 | 作者:
出处:https://blog.csdn.net

本系列文章目录

其他相关文章

前言

上一篇文章 《spring cloud项目改造为spring-cloud-kubernetes项目》以开源的spring-boot-cloud项目为例分享了如何将一个传统的spring cloud项目换成spring cloud kubernetes项目,同时还演示了改造后中的Hystrix熔断、本地服务调用本地服务、fabric8插件一键部署等功能。

这一篇为是对之前的文章 《采用rancher2+kubernetes+skywalking部署springcloud项目(五[istio蓝绿部署]-错误演示)》的一个后续,上次因为项目全采用的spring cloud原生组件来实现的微服务,但将项目部署到istio时因为原来spring cloud组件与istio中部分组件的冲突导致没能将蓝绿部署演示成功。但目前原来的spring-boot-cloud项目中的组件已经用spring cloud kubernetes替换掉了,所以这里决定再次进行尝试用istio来演示如何进行金丝雀/灰度发布

对于istio的环境的搭建直接参考之前的文章即可

部署改造后的spring-boot-cloud项目

这次仅部署config、gateway、svca-service、svcb-service,访问gateway项目会调用svca-service,svca-service又会调用svcb-service

其部署文件如下:

      #-------------config-----------------
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: config
spec:
  replicas: 1
  selector:
    matchLabels:
      app: config
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: config
    spec:
      containers:
        - image: ccr.ccs.tencentyun.com/spring-boot-cloud/config:v3
          imagePullPolicy: Always
          name: config
          ports:
            - containerPort: 30876
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: config
spec:
  ports:
    - name: http
      port: 30876
      protocol: TCP
      targetPort: 30876
  selector:
    app: config
#-------------svca-service-----------------
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: svca-service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: svca-service
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: svca-service
    spec:
      containers:
        - image: ccr.ccs.tencentyun.com/spring-boot-cloud/svca-service:v3
          imagePullPolicy: Always
          name: svca-service
          ports:
            - containerPort: 8080
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: svca-service
spec:
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: svca-service
#-------------svcb-service-----------------
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: svcb-service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: svcb-service
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: svcb-service
    spec:
      containers:
        - image: ccr.ccs.tencentyun.com/spring-boot-cloud/svcb-service:v3
          imagePullPolicy: Always
          name: svcb-service
          ports:
            - containerPort: 8070
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: svcb-service
spec:
  ports:
    - name: http
      port: 8070
      protocol: TCP
      targetPort: 8070
  selector:
    app: svcb-service
#-------------gateway-----------------
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gateway
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gateway
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: gateway
    spec:
      containers:
        - image: ccr.ccs.tencentyun.com/spring-boot-cloud/gateway:v3
          imagePullPolicy: Always
          name: gateway
          ports:
            - containerPort: 8060
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: gateway
spec:
  ports:
    - name: http
      port: 8060
      protocol: TCP
      targetPort: 8060
  selector:
    app: gateway
---

如果启动时发布有权限不足的话,记得给serviceaccount加权限,要不然可能会报下面这样的错误
rbac权限不足
具体的操作方式参考上一篇文章中k8s rbac部分

部署好了项目之后,接着添加virtualservice和gateway,以访问gateway项目

      apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: gateway-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "gateway.springcloud.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: gateway
spec:
  hosts:
  - "gateway.springcloud.com"
  gateways:
  - istio-system/gateway-gateway #can omit the namespace if gateway is in same namespace as virtual service
  http:
  - route:
    - destination:
        host: gateway
        port:
          number: 8060
---

然后再访问测试一下:

由于上面gateway中配置的是gateway.springcloud.com这上域名,所以需要在访问的机器上配一下host
gateway访问测试

使用istio发布注意点

在使用istio部署spring cloud kubernetes项目前记得 将kubernetes的ribbon模式修改为service模式,默认是pod模式。
如果是pod模式的话,istio中对于virtualservice的配置是不会生效的

      spring:
  cloud:
    kubernetes:
      ribbon:
        mode: service

svcb-service蓝绿部署

为了演示方便,这里对svcb-service进行蓝绿部署,准备好2个版本分别为v3和v5,不同的版本会输出不同的内容

其svcb-service的deployment配置文件如下:

      apiVersion: apps/v1
kind: Deployment
metadata:
  name: svcb-service-v3
spec:
  replicas: 1
  selector:
    matchLabels:
      app: svcb-service
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: svcb-service
        version: v3
    spec:
      containers:
        - image: ccr.ccs.tencentyun.com/spring-boot-cloud/svcb-service:v3
          imagePullPolicy: Always
          name: svca-service
          ports:
            - containerPort: 8070
              protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: svcb-service-v5
spec:
  replicas: 1
  selector:
    matchLabels:
      app: svcb-service
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: svcb-service
        version: v5
    spec:
      containers:
        - image: ccr.ccs.tencentyun.com/spring-boot-cloud/svcb-service:v5
          imagePullPolicy: Always
          name: svcb-service
          ports:
            - containerPort: 8070
              protocol: TCP

执行后测试一下,会出现一会儿输出V3一会儿输出V5的情况

访问截图如下:

轮询访问
通过观察请求结果我们可以看到,目前因为有两个版本的svcb-service,所以访问时也会轮询v3和v5两个版本的服务。其kiali监控图如下:
kiali监控图

svcb-service kiali

接下来加virtualservice,来让所有对于svcb-service的请求都发到v5版本上去

      apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: svcb-service
spec:
  hosts:
  - svcb-service
  http:
  - route:
    - destination:
        host: svcb-service
        subset: v5
---

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: svcb-service
spec:
  host: svcb-service
  subsets:
  - name: v3
    labels:
      version: v3
  - name: v5
    labels:
      version: v5

上面的操作添加了一个VirtualService并绑定了一个DestinationRule,其VirtualService中让所有的svcb-service请求都转发到了labels为v5的pod中

此时再来测试一下效果
all v5

从图片可以看出,所有的请求全发到了v5版本的svcb-service中了
all v5 kiali

金丝雀/灰度发布演示

感觉所谓的金丝雀部署就是按照比例来进行部署,有了蓝绿部署金丝雀部署就简单了,直接来个配置文件修改virtualservice的配置就行了:

      apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: svcb-service
spec:
  hosts:
  - svcb-service
  http:
  - route:
    - destination:
        host: svcb-service
        subset: v3
      weight: 90
    - destination:
        host: svcb-service
        subset: v5
      weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: svcb-service
spec:
  host: svcb-service
  subsets:
  - name: v3
    labels:
      version: v3
  - name: v5
    labels:
      version: v5

演示一下:

金丝雀发布
从结果中可以看出,在加上金丝雀发布后,根据请求的比例差不多10%的请求被转发到了V5版本中,其余的请求转发到了V3版本中
金丝雀部署kiali

最后想说

在体验了spring cloud kubernetes+istio之后最后想说,service mesh果然名不虚传

相关 [istio spring cloud] 推荐:

使用istio对spring cloud kubernetes项目进行金丝雀发布_水中加点糖-CSDN博客_istio springcloud

- -
(一)基础k8s yaml脚本发布. (二)helm+shell脚本优化大量冗余配置发布. (三)jenkins用户审核的流水化方式部署. (四)service mesh(istio)服务网格化发布. (五)istio对项目进行金丝雀部署. spring-cloud-kubernetes之开发环境搭建.

大话 Spring Cloud

- - IT瘾-dev
研究了一段时间spring boot了准备向spirng cloud进发,公司架构和项目也全面拥抱了Spring Cloud. 在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统构建的要求,使我们以非常低的成本(技术或者硬件)搭建一套高效、分布式、容错的平台,但Spring Cloud也不是没有缺点,小型独立的项目不适合使用.

Spring Cloud限流详解 | Spring Cloud|周立

- -
限流往往是一个绕不开的话题. 本文详细探讨在Spring Cloud中如何实现限流. Zuul上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. 常见的限流算法有漏桶算法以及令牌桶算法. https://www.cnblogs.com/LBSer/p/4083131.html,写得通俗易懂,你值得拥有,我就不拽文了.

Spring Cloud Kubernetes指南

- -
当我们构建微服务解决方案时,SpringCloud和Kubernetes都是最佳解决方案,因为它们为解决最常见的挑战提供组件. 但是,如果我们决定选择Kubernetes作为我们的解决方案的主要容器管理器和部署平台,我们仍然可以主要通过SpringCloudKubernetes项目使用SpringCloud的有趣特性.

Spring Cloud 快速入门

- - IT瘾-tuicool
Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量. 本课程由浅入深带领大家一步步攻克 Spring Cloud 各大模块,接着通过一个实例带领大家了解大型分布式微服务架构的搭建过程,最后深入源码加深对它的了解.

Deploy the spring cloud project using jenkins

- - Telami
先简单记录下Jenkins部署maven聚合工程要点. Root pom配置成项目根目录的pom.xml. maven命令单独install 欲构建的项目. 选项后可跟随{groupId}:{artifactId}或者所选模块的相对路径(多个模块以逗号分隔). 表示同时处理选定模块所依赖的模块. 表示同时处理依赖选定模块的模块.

Spring Cloud Gateway(限流) | Wind Mt

- -
限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如 nginx 的 limit_conn 模块,用来限制瞬时并发连接数)、限制时间窗口内的平均速率(如 Guava 的 RateLimiter、nginx 的 limit_req 模块,限制每秒的平均速率);其他还有如限制远程接口调用速率、限制 MQ 的消费速率.

快速突击 Spring Cloud Gateway

- - 掘金后端
认识 Spring Cloud Gateway. Spring Cloud Gateway 是一款基于 Spring 5,Project Reactor 以及 Spring Boot 2 构建的 API 网关,是 Spring Cloud 微服务生态的主要组件之一. Spring Cloud Gateway 主要负责接口请求的路由分发,并且支持对请求的安全验证,流量监控和流量控制等扩展操作.

Spring Cloud Gateway2.0实践报告

- - 掘金后端
你的点赞就是对我最大的支持. 原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 本文将从知识拓扑讲起,谈一下api网关的功能,以及spring cloud gateway的使用方法. 一、知识拓扑 (使用和原理) 二、网关的作用 三、Predicate,路由匹配 四、Filter,过滤器编写 五、自定义过滤器 六、常见问题 复制代码.

微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务

- - skaka的博客
之前介绍过 微服务的概念与Finagle框架, 这个系列介绍Spring Cloud.. Spring Cloud还是一个相对较新的框架, 今年(2016)才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比我之前用过的Dubbo和Finagle, Spring Cloud提供的功能最齐全..