Istio实现Kubernetes集群应用金丝雀部署

2024-03-08 17:10

本文主要是介绍Istio实现Kubernetes集群应用金丝雀部署,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Istio实现Kubernetes集群应用金丝雀部署

Istio 是一个开源的服务网格(Service Mesh)平台,它提供了一种连接、保护、控制和观察微服务的方式。作为服务网格,Istio 在应用程序的不同服务之间提供网络代理,这些代理统称为“sidecars”。这些 sidecars 可以控制进出服务的所有通信,而不需要对服务的代码进行任何更改。Istio 主要利用了 Envoy Proxy 来拦截网络通信,并且提供了一系列的网络功能,如动态服务发现、负载均衡、TLS终止、HTTP/2 & gRPC 支持、断路器、健康检查、基于百分比的流量分流以及延迟注入用于故障恢复等。

金丝雀部署

金丝雀部署(Canary Release)是一种软件发布策略,用于减少新版本引入问题的风险,通过逐步替换旧版本来实现软件的滚动更新。在金丝雀部署中,新版本(金丝雀版本)首先被部署到生产环境的一个小部分用户或服务器上。这使得团队能够观察新版本在实际生产条件下的表现,而不会影响到所有用户。

如果新版本运行良好,没有发现重大问题,它将逐步推送给更多的用户,最终替换掉旧版本。如果在金丝雀阶段出现问题,新版本可以快速回滚,从而最小化对用户的影响。

1. Istio安装

Istio安装是相对比较简单,这也是为什么Istio在Kubernetes社区如此受欢迎的原因。如果是纯安装测试,推荐您按照“Istio教程(一)—安装 Istio”方式安装一个demo版本的Istio服务。
Istio官网安装方式
Istio教程(一)—安装 Istio

2. default名字空间设置“sidecars”代理

kubectl label namespace default istio-injection=enabled

istio-injection=enabled:将标签 istio-injection 设置为值 enabled。Istio 的变更准入 Webhook 使用这个标签来决定是否向在这个命名空间中创建的 Pod 中注入 Envoy 边车(sidecars)代理。

3. 创建Deployment

分别创建两个Deployment,分别使用镜像“harbor.example.com/library/version-test:v1”和“harbor.example.com/library/version-test:v2”(镜像下载地址),其中有关version.html的页面访问获得的效果是不同的。请注意为每个Deployment创建的label。

apiVersion: apps/v1
kind: Deployment
metadata:name: appv1labels:app: v1
spec:replicas: 1selector:matchLabels:app: v1apply: canarytemplate:metadata:labels:app: v1apply: canaryspec:containers:- name: nginximage: harbor.example.com/library/version-test:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:name: appv2labels:app: v2
spec:replicas: 1selector:matchLabels:app: v2apply: canarytemplate:metadata:labels:app: v2apply: canaryspec:containers:- name: nginximage: harbor.example.com/library/version-test:v2imagePullPolicy: IfNotPresentports:- containerPort: 80

4. 创建Service

将标签包含“canary”的容器的流量代理出来。

apiVersion: v1
kind: Service
metadata:name: canarylabels:apply: canary
spec:selector:apply: canaryports:- protocol: TCPport: 80targetPort: 80

5. 创建Gateway资源

在Istio中,Gateway 是一个配置资源,它定义了在服务网格的边缘作为入口点的规范。这些规范允许你控制从外部网络到你的网格中的服务的流量。简而言之,Gateway资源是网格中对流量进行管理和入口控制的关键组件。接下来我们会创建一个“ingressgateway”资源对象。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:name: canary-gateway
spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*"

5. 创建DestinationRule和VirtualService资源

在Istio服务网格中,DestinationRuleVirtualService 是定义路由和服务级特性的关键自定义资源。这两种资源协同工作,允许你控制服务之间的流量行为。

VirtualService

VirtualService 用于定义服务的路由规则。它告诉网格流量如何根据指定的匹配条件从一个服务转发到另一个服务。这些路由规则可以基于请求的属性(如HTTP headers、URI等)来匹配流量,并将其重定向或分发到一个或多个服务。

例如,你可以使用 VirtualService 来实现以下功能:

  • 将请求路由到不同版本的服务(用于金丝雀部署或蓝绿部署)。
  • 重写请求路径或重定向请求到另一个地址。
  • 为不同的请求路径配置重试、超时和熔断策略。
  • 对特定的服务调用应用访问控制策略。
DestinationRule

DestinationRule 定义了对于指向特定目标的流量,可以应用哪些策略。这些规则可以包括负载平衡配置、TLS设置、熔断器参数、和子集声明等。

子集是 DestinationRule 的一个关键概念,它允许你为同一个目标服务的不同版本定义策略。这样做可以让 VirtualService 的路由规则将流量定向到这些不同的子集。

以下是一些使用 DestinationRule 的场景:

  • 配置服务之间的mTLS通信。
  • 定义服务的负载均衡策略,比如轮询或最少连接数等。
  • 设置熔断策略来防止故障在服务间蔓延。
  • 通过子集来路由到服务的不同版本。
如何一起工作

VirtualServiceDestinationRule 通常结合使用来实现复杂的路由逻辑。VirtualService 处理流量的入口点和路由方向,而 DestinationRule 定义了流量到达目的地后的具体行为。

这是一个典型的工作流程:

  1. 一个外部请求到达 VirtualService 定义的入口点。
  2. 根据 VirtualService 的路由规则,流量被分配到适当的服务或服务的版本(可能是一个服务的特定子集)。
  3. 一旦选定了目标,DestinationRule 中定义的策略(如负载均衡、TLS等)就会应用于流量。

通过这种分离,VirtualService 提供了强大的路由能力,而 DestinationRule 提供了目标服务级别的控制,使得Istio的流量管理既灵活又强大。

创建资源,VirtualService中定义流量来自“canary-gateway”,同时定义两个“destination”不同的流量权重。DestinationRule中定义“subset: v1”, “subset: v2”,分别对应到两个不同的Deployment,通过标签选择器。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:name: canary
spec:hosts:- "*"gateways:- canary-gatewayhttp:- route:- destination:host: canary.default.svc.cluster.localsubset: v1weight: 90- destination:host: canary.default.svc.cluster.localsubset: v2weight: 10
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:name: canary
spec:host: canary.default.svc.cluster.localsubsets:- name: v1labels:app: v1- name: v2labels:app: v2

6. 检验

查看“istio-ingressgateway”的端口地址。

kubectl get svc -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                      AGE
istio-egressgateway    ClusterIP      10.233.9.96      <none>        80/TCP,443/TCP                                                               5d
istio-ingressgateway   LoadBalancer   10.233.187.217   <pending>     15021:32374/TCP,80:30131/TCP,443:31064/TCP,31400:31267/TCP,15443:31428/TCP   5d
istiod                 ClusterIP      10.233.73.11     <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        5d

集群内任意机器执行如下命令

for i in `seq 1 100`; do curl <集群内任意机器ip地址>:30131/version.html;done > 1.txt

通过查看1.txt,v1标签和v2标签出现的频率在9:1。
在这里插入图片描述

这篇关于Istio实现Kubernetes集群应用金丝雀部署的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/787803

相关文章

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义