istio是什么?怎么搭建?

服务网格(service mesh)

首先引入服务网格的概念,服务网格就是service mesh ,在很多年前就被提出来过,但是直到微服务的时代,才开始大展拳脚,istio其实就是关于服务网格概念的一种落地和实现。
服务网格其实就是传统代理的升级版(可以理解为分布式的微服务代理),由原来的一个或者几个代理变成了每个pod常驻一个代理(可以理解为每个pod都在自带了一个小的nginx),负责流量相关的工作,这样所有的流量都被代理接管,用户的业务和控制面板彻底的解耦了。
而控制中心就是负责汇聚整个集群的信息,管理员可以通过服务网格控制面的api来对整个集群做管理。

服务网格架构图

以下是service1访问service2的时序图:
service1访问serivce2必须通过两次sidercar拦截,而service1和service2直接不会进行直接通信,而是要有各自的sidecar来联系

image.png

istio介绍:

Istio是一个用于服务指令的开放平台,弥补了k8s所欠缺的那部分(如动态路由、链路追踪、熔断限流等),大大降低了微服务运维的复杂性,根据Istio官网的介绍,包含了连接、保护、控制和观察服务几大特性,istio为负责的微服务架构减轻了很多的负担,开发者不用关心服务调用的超时、重试的实现,服务之间的安全、授权也自动得到了保证。


istio的官网说明
  • 连接(Connect):智能控制服务之间的调用流量,能够实现灰度升级、AB 测试和红黑部署等功能
  • 安全加固(Secure):自动为服务之间的调用提供认证、授权和加密。
  • 控制(Control):应用用户定义的 policy,保证资源在消费者中公平分配。
  • 观察(Observe):查看服务运行期间的各种数据,比如日志、监控和 tracing,了解服务的运行情况。

架构组成:

istio架构图

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
  1. 安装目录包含如下内容:

    • install/kubernetes 目录下,有 Kubernetes 相关的 YAML 安装文件
    • samples/ 目录下,有示例应用程序
    • bin/ 目录下,包含 istioct的客户端文件。istioctl 工具用于手动注入 Envoy sidecar 代理。
  2. 将 istioctl 客户端路径增加到 path 环境变量中,macOS 或 Linux 系统的增加方式如下:

$ export PATH=$PWD/bin:$PATH

二. 使用 demo 配置文件安装 Istio

  1. 安装
istioctl manifest apply --set profile=demo
  1. 为了验证是否安装成功,需要先确保以下 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 -

你可能感兴趣的:(istio是什么?怎么搭建?)