Service Mesh
Service Mesh 的中文译为 “服务网格” ,是一 个用于处理服务和服务之间通信的基础设施层,它 负责为构建复杂的云原生应用传递可靠的网络请求, 并为服务通信实现了微服务所需的基本组件功能, 例如服务发现、负载均衡、监控、流量管理、访问 控制等。在实践中,服务网格通常实现为一组和应 用程序部署在一起的轻量级的网络代理,但对应用 程序来说是透明的。
所以说服务网格是一个概念 而不是一个产品,代表产品有Istio、Envoy、Linkerd等
Isito是Service Mesh的产品化落地,是目前最受欢迎的服务网格,功能丰富、成熟度高。 Linkerd是世界上第一个服务网格类的产品。
Service Mesh 部署网络结构图
如果使用服务网格,那么将遵循以下的通讯逻辑:
-
微服务之间调用不会直接通讯,而是通过代理程序。
-
服务网格内置服务发现、熔断、超时等相关网络控制高级功能。
-
服务网格与编程语言无关。
-
服务之间的通信局部故障可以由服务网格处理。
服务网格的特点
- 治理能力独立(Sidecar)
- 应用程序无感知
- 服务通信的基础设施层
- 解耦应用程序的重试/超时、监控、追踪和服务发现

从上图可以得知,所有应用的流量都是需要通过Sidecar,然后经过Sidecar进行转发流量。
istio 概述
istio的功能可以总结为以下几点
• 连接(Connect):流量管理、负载均衡、灰度发布
• 安全(Secure):认证、鉴权
• 控制(Control):限流、ACL
• 观察(Observe):监控、调用链
官网:https://istio.io/
Isito 架构与组件
数据平面:由一组代理组成,这些代理微服务所 有网络通信,并接收和实施来自Mixer的策略。 • Proxy:负责高效转发与策略实现(envoy).
控制平面:管理和配置代理来路由流量。此外, 通过mixer实施策略与收集来自边车代理的数据。
- Mixer:适配组件,数据平面与控制平面通 过它交互,为Proxy提供策略和数据上报。
- Pilot:策略配置组件,为Proxy提供提供服务发现、流量管理以及弹性功能,比如:A/B测试、金丝雀发布、超时、重试、熔断等。
- Citadel:Citadel是Istio的核心安全组件,负责服务的密钥和数字证书管理,用于提供自动生成、分发、轮换及撤销密钥和数据证书的功能。
- Galley:Galley负责向Istio的其它组件提供支撑功能,它用于校验进入网络配置信息的格式内容正确性,并将这些配置信息提供给Pilot。
Istio 基本概念
Istio 有 4 个配置资源,落地所有流量管理需求:
- VirtualService:实现服务请求路由规则的功能。(VirtualService类似于nginx的虚拟主机server)
- DestinationRule:实现目标服务的负载均衡、服务发现、故障处理和故障注入的功能。
- Gateway:让服务网格内的服务,可以被全世界看到。
- ServiceEntry :让服务网格内的服务,可以看到外面的世界。
在 Kubernetes 部署 Istio
目前最新版本为1.9.1
wget https://github.com/istio/istio/releases/download/1.9.1/istio-1.9.1-linux-amd64.tar.gz
我去, 安装的时候发现1.9.1的版本最低支持k8s的版本都是1.17,只能重新下载低版本,我们选择1.4.2版本
wget https://github.com/istio/istio/releases/download/1.4.2/istio-1.4.2-linux.tar.gz
解压安装
tar zxvf istio-1.4.2-linux.tar.gz
cd istio-1.4.2 mv bin/istioctl /usr/bin
#部署istiod的命令
istioctl manifest apply --set profile=demo
查看istio相关的资源
[root@master ~]# kubectl get pod -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-6b65874977-zjg5j 1/1 Running 3 18h
istio-citadel-86dcf4c6b-bx5rr 1/1 Running 3 18h
istio-egressgateway-68f754ccdd-4qlz6 1/1 Running 2 6h25m
istio-galley-5fc6d6c45b-56kl7 1/1 Running 3 18h
istio-ingressgateway-6d759478d8-r9f24 1/1 Running 2 6h25m
istio-pilot-5c4995d687-qpvnc 1/1 Running 2 6h25m
istio-policy-57b99968f-6hg7t 1/1 Running 30 6h15m
istio-sidecar-injector-746f7c7bbb-xnn87 1/1 Running 3 18h
istio-telemetry-854d8556d5-scdjf 1/1 Running 31 6h15m
istio-tracing-c66d67cd9-m2mth 1/1 Running 5 17h
kiali-8559969566-flrg2 1/1 Running 3 17h
prometheus-66c5887c86-x8ghf 1/1 Running 3 18h
pod解释:
grafana:
提供istio的一些监控指标
istio-citadel:
- 用于安全相关功能,为服务和用户提供认证和鉴权、管理凭据和 RBAC,挂掉则会导致认证,安全相关功能失效
- –set security.enabled=false 如果要禁能则通过设置security,它对应的镜像就是citadel
- 如果前期不使用安全相关的功能可以禁能,不会影响整体使用
- 如果部署了 istio-citadel,则 Envoy 每 15 分钟会进行一次重新启动来刷新证书
istio-egressgateway:
- 出口网关,可选的,根据自身业务形态决定
istio-ingressgateway:
- 入口网关,必须的
- 对外流量入口,所有从外部访问集群内部的服务都需要经过入口网关ingressgateway。需要多实例、防止单点;同时要保证多实例进行负载均衡;
- 如果异常则导致整个流量入口异常
- 承担相对较大的并发和高峰流量
istio-galley:
- istio API配置的校验、各种配置之间统筹,为 Istio 提供配置管理服务,包含有Kubernetes CRD资源的listener,通过用Kubernetes的Webhook机制对Pilot 和 Mixer 的配置进行验证
- 这个服务挂掉会导致配置校验异常,是一个必须的组件, 比如创建gateway、virtualService等资源,就会需要校验,如果不想校验,可以通过设置helm 的选项参数–set global.configValidation=false来关闭校验
istio-pilot:
- 控制sidecar中envoy的启动与参数配置
- 如果异常则envoy无法正常启动,应用服务的流量无法进行拦截和代理,所有配置、流量规则、策略无法生效
- 必要组件
istio-policy:
- Mixer相关组件,用于与envoy交互,check需要上报的数据,确定缓存内容,挂掉会影响check相关功能,除非设置为不进行check
- 不能直接关闭或者说禁能这个策略组件,因为默认请求都是要去policy pods进行check检测的,如果失败则会导致请求失败,通过安装参数–set mixer.enabled=false禁用
istio-sidecar-injector:
- sidecar自动注入功能组件
- 对应的设置是选项是sidecarInjectorWebhook.enabled,sidecarInjectorWebhook.image对应就是sidecar_injector
- 这个只是对自动注入Sidecar有影响,如果是通过手动注入kubectl kube-inject命令参数执行的没有影响,不管使能这个前还是后,都对手动注入Sidecar没有影响
- 如果异常则会导致sidecar无法自动注入;如果注入策略设置为必须注入(policy为Fail),则会导致新创建的应用服务(Pod)无法启动,因为无法注入 Sidecar
istio-telemetry:
- 9093端口是Mixer组件本身的prometheus暴露的端口,这个是istio-policy 组件提供的
- 42422是所有 Mixer 生成的网格指标,这个是istio-telemetry 组件提供的
- Mixer相关组件的Service,用于采集envoy上报的遥测数据
- 高并发下会有性能影响,会间接导致整体性能下降,业界针对这个有较多探讨;可以禁能
为提高性能,需要设置为多实例,防止单点;均衡流量 - 暴露9091、9093、15004、42422端口
- 通过安装参数–set mixer.enabled=false禁能
- 如果异常,则通过Mixer进行上报的一些监控采集数据无法采集到,并不影响整体流程
istio-tracing:
主要用于链路追踪
kiali:
- Kiali 为网格管理和可观察性提供了良好的用户体验的可视化工具;
- Kiali 为我们提供了查看相关服务与配置提供了统一化的可视化界面,并且能在其中展示他们的关联;同时他还提供了界面让我们可以很方便的验证 istio 配置与错误提示;
prometheus:
- 暴露9090端口
- prometheus组件的Service
- 如果采用外部的prometheus则不用
- 其他组件如jaeger、grafana则同样采用外部系统,因此可以不用和istio一起安装
如果出现类似pod没正常起来
istio-egressgateway-68f754ccdd-4qlz6 0/1 Running 2 61m
istio-ingressgateway-6d759478d8-r9f24 0/1 Running 2 61m
我们可以查看其日志,可以发现错误
lookup istio-galley.istio-system on 10.10.10.2:53: read udp 172.17.134.19:56…
其实这是我们istio pod 访问不到svc错误,请检查K8S 上dns服务是否正常,我们去测试一下
kubectl exec -ti centoschao -- nslookup kube-dns.kube-system
结果还真有问题,不能正确的解析到地址,我的解决方案是再kubelet中强行加了一行配置指定dns的svc地址。
--cluster-dns=10.0.0.2 \
重启kubelet问题解决。到此istio安装完毕。
本文详细介绍了服务网格的概念,重点讲解了Istio作为服务网格的代表,包括其功能、架构和组件。Istio提供连接、安全、控制和观察四大能力,用于管理微服务间的通信。在Kubernetes环境中部署Istio,涉及到如Sidecar、Mixer、Pilot等关键组件。文中还提到了部署过程中可能遇到的问题及解决方案,例如DNS解析问题。

3161

被折叠的 条评论
为什么被折叠?



