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

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter