本文主要是介绍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服务网格中,DestinationRule
和 VirtualService
是定义路由和服务级特性的关键自定义资源。这两种资源协同工作,允许你控制服务之间的流量行为。
VirtualService
VirtualService
用于定义服务的路由规则。它告诉网格流量如何根据指定的匹配条件从一个服务转发到另一个服务。这些路由规则可以基于请求的属性(如HTTP headers、URI等)来匹配流量,并将其重定向或分发到一个或多个服务。
例如,你可以使用 VirtualService
来实现以下功能:
- 将请求路由到不同版本的服务(用于金丝雀部署或蓝绿部署)。
- 重写请求路径或重定向请求到另一个地址。
- 为不同的请求路径配置重试、超时和熔断策略。
- 对特定的服务调用应用访问控制策略。
DestinationRule
DestinationRule
定义了对于指向特定目标的流量,可以应用哪些策略。这些规则可以包括负载平衡配置、TLS设置、熔断器参数、和子集声明等。
子集是 DestinationRule
的一个关键概念,它允许你为同一个目标服务的不同版本定义策略。这样做可以让 VirtualService
的路由规则将流量定向到这些不同的子集。
以下是一些使用 DestinationRule
的场景:
- 配置服务之间的mTLS通信。
- 定义服务的负载均衡策略,比如轮询或最少连接数等。
- 设置熔断策略来防止故障在服务间蔓延。
- 通过子集来路由到服务的不同版本。
如何一起工作
VirtualService
和 DestinationRule
通常结合使用来实现复杂的路由逻辑。VirtualService
处理流量的入口点和路由方向,而 DestinationRule
定义了流量到达目的地后的具体行为。
这是一个典型的工作流程:
- 一个外部请求到达
VirtualService
定义的入口点。 - 根据
VirtualService
的路由规则,流量被分配到适当的服务或服务的版本(可能是一个服务的特定子集)。 - 一旦选定了目标,
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集群应用金丝雀部署的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!