服务网格(service mesh)
首先引入服务网格的概念,服务网格就是service mesh ,在很多年前就被提出来过,但是直到微服务的时代,才开始大展拳脚,istio其实就是关于服务网格概念的一种落地和实现。
服务网格其实就是传统代理的升级版(可以理解为分布式的微服务代理),由原来的一个或者几个代理变成了每个pod常驻一个代理(可以理解为每个pod都在自带了一个小的nginx),负责流量相关的工作,这样所有的流量都被代理接管,用户的业务和控制面板彻底的解耦了。
而控制中心就是负责汇聚整个集群的信息,管理员可以通过服务网格控制面的api来对整个集群做管理。
以下是service1访问service2的时序图:
service1访问serivce2必须通过两次sidercar拦截,而service1和service2直接不会进行直接通信,而是要有各自的sidecar来联系
istio介绍:
Istio是一个用于服务指令的开放平台,弥补了k8s所欠缺的那部分(如动态路由、链路追踪、熔断限流等),大大降低了微服务运维的复杂性,根据Istio官网的介绍,包含了连接、保护、控制和观察服务几大特性,istio为负责的微服务架构减轻了很多的负担,开发者不用关心服务调用的超时、重试的实现,服务之间的安全、授权也自动得到了保证。
- 连接(Connect):智能控制服务之间的调用流量,能够实现灰度升级、AB 测试和红黑部署等功能
- 安全加固(Secure):自动为服务之间的调用提供认证、授权和加密。
- 控制(Control):应用用户定义的 policy,保证资源在消费者中公平分配。
- 观察(Observe):查看服务运行期间的各种数据,比如日志、监控和 tracing,了解服务的运行情况。
架构组成:
istio可以大致分为数据平面和控制平面两个部分
数据平面:
由一组代理组成,接收并实施mixer的策略
proxy:(sidecar 代理)
负责高效转发和策略实现(envoy 类型nginx)
envoy部署在每一个需要管理k8s的pod中,会拦截所有的流量,经过规则校验
会经过本Pod的Enovy代理,Enovy完成规则校验、数据采集、日志等操作后,再转发出去;值得注意的是,请求方Enovy转发出去的流量会发送给接收方的Enovy,之后才有可能到达真正的接收方data-product容器。当然这些操作是Istio的活,我们要做的仅仅是通过配置的形式告诉Istio我们要对哪些流量做什么动作。
控制平面:
Mixer:(上报数据)
是控制面的核心,主要职责是获取注册中心的用户配置信息,在根据用户配置信息来处理envoy端的请求
适配组件,数据平面和控制平面通信,是通过Mixer来完成的,为proxy提供策略和数据上报
telemertry组件:
policy组件:
机制流程和telemetry类似,数据面在转发服务的请求前调用policy的check接口,检查是否允许访问,Mixer会根据配置将请求转发到Adapter做对应检查,给代理返回是否允许访问。
pilot:(服务发现、配置下发)
配置策略组件,为Proxy提供服务发现,智能路由,错误处理等,主要是做流量管理操作,类似于C/S架构中的master服务。
而且还有一个向数据面下发规则的功能,如VirtualService、DestinationRule、Gateway、ServiceEntry等流量治理规则、安全规则等,pilot负责将各种规则转换为Envoy可识别的格式,通过标准的xDs协议发送给Envoy,指导Envoy完成动作。在通信上,Envoy通过gRPC流式订阅pilot的配置资源,Envoy根据该路由规则进行流量转发。
Citadel:(证书、秘钥校验)
核心安全组件,提供加密通信,撤销秘钥和证书等功能,Citadel一直监听Kube-apiservicr,以serect的形式为每个服务都生成证书和秘钥,并在pod在创建时挂载在pod上,代理容器使用这些文件进行服务认证,进而代理两端服务实现双向TLS认证,通道加密、访问授权等安全功能。这样就省去了用户在代码里维护证书秘钥。
Galley:(配置管理)
配置管理,验证,分发,负责配置管理的组件,验证配置信息的格式和内容的正确性
Gateway:(入口,网格外访问网格内的唯一入口)
是网格外网格内的唯一入口,也包含了sidecar
搭建istio平台
参考中文官网:https://istio.io/zh/docs/setup/getting-started/
一. 下载
1.下载istio,如果服务器上下载不下来,可以下载到本地后再上传到服务器
curl -L https://istio.io/downloadIstio | sh -
2.切换到 Istio 包所在目录下。例如:Istio 包名为 istio-1.5.4,则:
cd istio-1.5.4
-
安装目录包含如下内容:
-
install/kubernetes
目录下,有 Kubernetes 相关的 YAML 安装文件 -
samples/
目录下,有示例应用程序 -
bin/
目录下,包含 istioct的客户端文件。istioctl
工具用于手动注入 Envoy sidecar 代理。
-
将 istioctl 客户端路径增加到 path 环境变量中,macOS 或 Linux 系统的增加方式如下:
$ export PATH=$PWD/bin:$PATH
二. 使用 demo 配置文件安装 Istio
- 安装
istioctl manifest apply --set profile=demo
- 为了验证是否安装成功,需要先确保以下 Kubernetes 服务正确部署,然后验证除 jaeger-agent 服务外的其他服务,是否均有正确的 CLUSTER-IP:
$ kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana ClusterIP 172.21.211.123 3000/TCP 2m
istio-citadel ClusterIP 172.21.177.222 8060/TCP,15014/TCP 2m
istio-egressgateway ClusterIP 172.21.113.24 80/TCP,443/TCP,15443/TCP 2m
istio-galley ClusterIP 172.21.132.247 443/TCP,15014/TCP,9901/TCP 2m
istio-ingressgateway LoadBalancer 172.21.144.254 52.116.22.242 15020:31831/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30318/TCP,15030:32645/TCP,15031:31933/TCP,15032:31188/TCP,15443:30838/TCP 2m
istio-pilot ClusterIP 172.21.105.205 15010/TCP,15011/TCP,8080/TCP,15014/TCP 2m
istio-policy ClusterIP 172.21.14.236 9091/TCP,15004/TCP,15014/TCP 2m
istio-sidecar-injector ClusterIP 172.21.155.47 443/TCP,15014/TCP 2m
istio-telemetry ClusterIP 172.21.196.79 9091/TCP,15004/TCP,15014/TCP,42422/TCP 2m
jaeger-agent ClusterIP None 5775/UDP,6831/UDP,6832/UDP 2m
jaeger-collector ClusterIP 172.21.135.51 14267/TCP,14268/TCP 2m
jaeger-query ClusterIP 172.21.26.187 16686/TCP 2m
kiali ClusterIP 172.21.155.201 20001/TCP 2m
prometheus ClusterIP 172.21.63.159 9090/TCP 2m
tracing ClusterIP 172.21.2.245 80/TCP 2m
zipkin ClusterIP 172.21.182.245 9411/TCP
请确保关联的 Kubernetes pod 已经部署,并且 STATUS 为 Running:
$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-f8467cc6-rbjlg 1/1 Running 0 1m
istio-citadel-78df5b548f-g5cpw 1/1 Running 0 1m
istio-egressgateway-78569df5c4-zwtb5 1/1 Running 0 1m
istio-galley-74d5f764fc-q7nrk 1/1 Running 0 1m
istio-ingressgateway-7ddcfd665c-dmtqz 1/1 Running 0 1m
istio-pilot-f479bbf5c-qwr28 1/1 Running 0 1m
istio-policy-6fccc5c868-xhblv 1/1 Running 2 1m
istio-sidecar-injector-78499d85b8-x44m6 1/1 Running 0 1m
istio-telemetry-78b96c6cb6-ldm9q 1/1 Running 2 1m
istio-tracing-69b5f778b7-s2zvw 1/1 Running 0 1m
kiali-99f7467dc-6rvwp 1/1 Running 0 1m
prometheus-67cdb66cbb-9w2hm 1/1 Running 0 1m
三. 后续步骤
1. 自动注入:
当使用 kubectl apply
来部署应用时,如果 pod 启动在标有 istio-injection=enabled
的命名空间中,那么,Istio sidecar 注入器将自动注入 Envoy 容器到应用的 pod 中:
kubectl label namespace istio-injection=enabled
或者
kubectl create -n -f .yaml
2. 手动注入:
在没有 istio-injection
标记的命名空间中,在部署前可以使用istioctl kube-inject
命令将 Envoy 容器手动注入到应用的 pod 中:
istioctl kube-inject -f .yaml | kubectl apply -f -