k8s之istio

发布时间 2023-11-20 18:10:27作者: 烟雨楼台,行云流水

.Istio介绍

Istio是一个开源的服务网格(Service Mesh),为Kubernetes和其他平台上的微服务架构提供了一种统一的、灵活的网络通信和管理方式。具有服务发现、负载均衡、流量管理、故障恢复和安全性功能以下是Istio的一些基本特性:

  1. 代理注入:Istio使用Envoy作为其数据面代理,通过注入Envoy代理到每个微服务的Pod中,实现对流量的控制和管理。这种代理注入的方式无需修改应用代码,提供了一种非侵入式的部署方式。
  2. 服务发现:Istio通过在代理中集成服务注册和发现机制,实现对微服务实例的自动发现和路由。它能够动态地将流量转发到可用的服务实例,并支持多种服务发现的机制 
  3. 负载均衡:Istio提供了丰富的负载均衡策略,可以根据不同的需求进行流量的分发和负载均衡,包括轮询、加权轮询、故障感知等。
  4. 流量管理:Istio可以实现对流量的灵活管理和控制,支持流量切分、A/B测试、金丝雀发布等高级流量管理功能。它可以帮助开发人员更好地控制和管理微服务架构中的流量。
  5. 故障恢复:Istio提供了故障恢复机制,包括超时控制、重试、断路器和熔断等。它能够自动检测和处理微服务中的故障,并提供弹性和可靠性。

安全性:Istio提供了丰富的安全功能,包括流量加密、身份认证和授权、访问控制等。它可以通过自动注入代理,对服务间的通信进行加密和验证,提供了更高层次的安全保障

1.2 Istio流量管理

1.2.1 熔断

当在 KubernetesK8s)集群中使用 Istio 时,可以通过 Istio 提供的熔断功能来增加微服务架构的稳定性和可靠性。熔断是一种故障保护机制,用于在服务之间的通信中防止故障扩散,并提供更好的容错能力。

在微服务架构中,一个应用通常由许多小型的、相互协作的服务组成。当某个服务发生故障或变得不可用时,如果不采取措施,可能会导致连锁反应,影响到整个系统的可用性。熔断机制旨在解决这个问题,其核心思想是在服务之间设置阈值和超时时间,并对请求进行监控。当服务的错误率或响应时间超过预设的阈值时,熔断器会打开,拒绝向该服务发送更多请求,并快速失败返回错误,而不是等待超时。

 

  1. 快速失败返回: 当目标服务不可用时,不再尝试等待请求超时,而是快速返回错误,从而避免资源浪费和潜在的长时间等待。
  2. 故障隔离: 熔断机制阻止故障扩散,使问题局限在出现故障的服务,而不会影响到整个应用程序。
  3. 恢复机制: 熔断器会定期尝试发起一些请求到目标服务,以检查其是否已经恢复。如果服务恢复正常,则熔断器会逐渐关闭,允许流量再次流向目标服务。

 

自动重试: 一旦目标服务恢复,熔断器会逐渐允许一部分流量通过,如果没有再次出现问题,会逐渐恢复到正常状态,否则继续保持熔断状态

 

在微服务架构中,在高并发情况下,如果请求数量达到一定极限(可以自己设置阈值),超出了设置的阈值,断路器会自动开启服务保护功能,然后通过服务降级的方式返回一个友好的提示给客户端。假设10个请求中,有10%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到10s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。

KubernetesK8s)集群中结合 Istio可以使用 Istio 的流量管理功能来控制服务之间的请求超时。超时是指在一定时间内,如果某个请求没有得到及时响应,就会被认为是超时。通过设置请求超时时间,可以对服务之间的通信进行控制,确保请求在合理的时间内得到响应,避免请求无限期地等待导致资源浪费或影响整体系统的响应性能。

Istio 的超时控制允许你为每个服务之间的请求设置最大的等待时间。当某个请求在指定的超时时间内没有得到响应时,Istio 会终止该请求并返回一个错误响应给客户端。这样可以防止请求在后端服务长时间等待,从而避免请求积压,同时提高系统的稳定性和可用性。

超时控制的意义如下:

  1. 防止长时间等待: 通过设置合理的请求超时时间,避免了客户端请求在后端服务长时间等待导致的响应延迟,从而提高了用户体验。
  2. 快速失败机制: 当后端服务无法及时响应请求时,超时控制会快速返回错误响应,而不是让请求无限期地等待,从而避免资源浪费。
  3. 故障隔离: 如果某个服务出现故障或变得不可用,超时控制可以快速终止对该服务的请求,避免故障扩散到其他服务。

Istio 中,超时控制是通过配置请求超时策略来实现的。你可以为每个服务定义超时时间,也可以为整个服务部署或命名空间设置默认的超时时间。这样,Istio 会根据配置中的超时时间来对请求进行限制,保证请求在规定时间内得到响应。

 

nginx 服务设置了超时时间为3秒,如果超出这个时间就不在等待,返回超时错误

 

httpd 服务设置了响应时间延迟5秒,任何请求都需要等待5秒后才能返回

 

client 通过访问 nginx 服务去反向代理 httpd 服务,由于 httpd 服务需要5秒后才能返回,但nginx 服务只等待3秒,所以客户端会提示超时错误。

istio 重试机制就是如果调用服务失败,Envoy 代理尝试连接服务的最大次数。而默认情况下,Envoy 代理在失败后并不会尝试重新连接服务

客户端调用 nginx,nginx 将请求转发给 tomcat。tomcat 通过故障注入而中止对外服务,nginx 设置如果访问 tomcat 失败则会重试 3 次。

2.Istio架构

1、数据平面由一组以Sidecar方式部署的智能代理容器组成。这些代理承载并控制微服务之间的所有网络通信,管理入口和出口流量,类似于一线员工。 Sidecar 一般和业务容器运行在一个pod里,来劫持业务应用容器的流量,并接受控制面组件的控制,同时会向控制面输出日志、跟踪及监控数据。
2、控制平面负责管理和配置代理来路由流量。
istio1.5+中使用了一个全新的部署模式,重建了控制平面,将原有的多个组件整合为一个单体结构istiod,这个组件是控制平面的核心,管理Istio的所有功能,主要包括Pilot、Mixer、Citadel等服务组件。
istiod是新版本中最大的变化,以一个单体组件替代了原有的架构,降低了复杂度和维护难度,但原有的多组件并不是被完全移除,而是在重构后以模块的形式整合在一起组成了istiod。

3.1 Pilot
Pilot 是 Istio 控制平面的组件,在istio系统中,Pilot 完成以下任务:(管理者把事情做正确,领导者做正确的事。)
它从服务注册中心(如Kubernetes的etcd或Consul)获取服务和实例的信息,并为Envoy生成配置,Envoy 根据 Pilot 发过来的配置里的内容,完成具体流量的转发。
Pilot可以被认为是团队的领导。它负责监督和指导队伍中的每个Envoy。Pilot知道整个团队中每个服务的位置,以及它们应该如何相互协作。当有新队员加入或者队员的位置变化时,Pilot会负责通知每个队员,确保大家都知道最新的情况,不会出现迷路或者错过重要信息,会把要做的事形成文件下发到每个envoy队员里

 


3.2 Envoy (员工管理)
Envoy是Istio中的代理,我们如果开启了istio功能,会在pod里自动注入Envoy代理容器,它负责处理服务之间的所有网络通信,拦截并转发所有的HTTP、TCP和gRPC流量。Envoy提供强大的流量控制和管理功能,如路由、重试、超时和故障注入等。

3.3 Citadel

1、Citadel负责Istio中的身份和凭据管理,提供安全性相关的功能。
2、它用于为服务生成和分发TLS证书,以实现服务之间的安全通信。
Citadel可以被视为团队中的保密专员。它负责确保团队成员之间的通信是安全的,别人无法窃听或者假冒。Citadel会为每个队员提供一个保密的通信渠道,确保他们之间的交流是私密的,就像用密码和密钥加密信息一样。

3.4 Galley
Galley是Istio的配置管理组件,负责验证、转换和分发配置给其他Istio组件。
它监听Kubernetes的配置更改,例如Service、Deployment等,然后根据规则和策略生成Istio所需的配置,并将其提供给Pilot和其他组件。
Galley可以被看作是团队中的文件管理员。它负责管理团队中所有的文件和信息,确保每个队员都能得到正确的信息和文件。当有新的文件产生或者文件发生变化时,Galley会及时通知团队中的每个成员,确保大家都使用的是最新的文件,不会出现信息不同步的问题。

3.5 Ingressgateway
istio-ingressgateway是Istio服务网格中的一个特殊网关,它作为整个网格的入口,接收外部请求,并将它们引导到内部的服务。可以将它比作一个大门保安,负责接收外部人员的访问请求,然后根据配置的规则将请求分发给网格内部的服务。简单来说,当有外部的请求访问Istio服务网格时,它们会先被送到istio-ingressgateway。这个网关会检查请求,并根据一些规则判断该请求应该交给哪个服务来处理。然后,它将请求转发给网格内部的相应服务,从而实现外部请求与内部服务的连接。
3.5 egressgateway
istio-egressgateway是Istio服务网格中的另一个特殊网关,它负责处理网格内部服务对外部服务的访问请求。可以将它看作是一个网格内部的出口,负责将内部服务需要访问的外部服务请求发送到外部。以将istio-egressgateway比作一个秘书,它会代表网格内部的服务,帮助它们联系外部的服务。当网格内部的服务需要访问外部服务时,它们会将请求交给istio-egressgateway,然后由这个网关将请求发送给外部服务。

 

 

 

安装

[root@k8s-master istio]# tar xf istio-1.18.2-linux-amd64.tar.gz 
[root@k8s-master istio]# ls
istio-1.18.2  istio-1.18.2-linux-amd64.tar.gz
[root@k8s-master istio]# cd istio-1.18.2/
[root@k8s-master istio-1.18.2]# ls
bin  LICENSE  manifests  manifest.yaml  README.md  samples  tools
[root@k8s-master istio-1.18.2]# ls
bin  LICENSE  manifests  manifest.yaml  README.md  samples  tools
您在 /var/spool/mail/root 中有新邮件
[root@k8s-master istio-1.18.2]# ls bin/
istioctl
[root@k8s-master istio-1.18.2]# cp bin/istioctl /usr/bin/
[root@k8s-master istio-1.18.2]# istioctl  install --set profile=demo -y
? Istio core installed                                                                                                                                                                                           
? Istiod installed                                                                                                                                                                                               
? Egress gateways installed                                                                                                                                                                                      
? Ingress gateways installed                                                                                                                                                                                     
? Installation complete                                                                                                                                                                                          
Making this installation the default for injection and validation.

  查看启动的pod

[root@k8s-master istio-1.18.2]# kubectl get ns
NAME              STATUS   AGE
default           Active   43d
istio-system      Active   109s
kube-node-lease   Active   43d
kube-public       Active   43d
kube-system       Active   43d
[root@k8s-master istio-1.18.2]# kubectl get pod -n istio-system
NAME                                    READY   STATUS    RESTARTS   AGE
istio-egressgateway-6cf4f6489d-ps5zg    1/1     Running   0          112s
istio-ingressgateway-7b84b459d6-8ggxm   1/1     Running   0          112s
istiod-8498fbd896-m6dp5                 1/1     Running   0          2m3s
[root@k8s-master istio-1.18.2]# kubectl get pod -n istio-system -owide
NAME                                    READY   STATUS    RESTARTS   AGE    IP             NODE        NOMINATED NODE   READINESS GATES
istio-egressgateway-6cf4f6489d-ps5zg    1/1     Running   0          117s   10.244.36.68   k8s-node1   <none>           <none>
istio-ingressgateway-7b84b459d6-8ggxm   1/1     Running   0          117s   10.244.36.69   k8s-node1   <none>           <none>
istiod-8498fbd896-m6dp5                 1/1     Running   0          2m8s   10.244.36.67   k8s-node1   <none>           <none>

  

  • demo适用于生产环境,包含istiodingressgatewayegressgateway
  • default:这是一个最小配置,仅包含最基本的组件,istiodingressgateway 
  • minimal:这个配置相对更加精简,只包含了必需的组件,适用于资源受限或轻量级的环境。只会安装istiod

5、在k8s集群部署在线书店,启动istio功能

5.1 在线书店功能介绍

在线书店-bookinfo

该应用由四个单独的微服务构成这个应用模仿在线书店的一个分类,显示一本书的信息页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

 

Bookinfo应用分为四个单独的微服务

1productpage这个微服务会调用details和reviews两个微服务,用来生成页面

2)details这个微服务中包含了书籍的信息

3)reviews这个微服务中包含了书籍相关的评论它还会调用ratings微服务

4)ratings这个微服务中包含了由书籍评价组成的评级信息。

 

reviews微服务3个版本

1)v1版本不会调ratings服务

2)v2版本会调用ratings服务,并使用1到5个黑色星形图标来显示评分信息

3)v3版本会调用ratings服务,并使用1到5个红色星形图标来显示评分信息。