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

相关文章

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien