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   <none>          3000/TCP                                                                                                                                     2m
istio-citadel            ClusterIP      172.21.177.222   <none>          8060/TCP,15014/TCP                                                                                                                           2m
istio-egressgateway      ClusterIP      172.21.113.24    <none>          80/TCP,443/TCP,15443/TCP                                                                                                                     2m
istio-galley             ClusterIP      172.21.132.247   <none>          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   <none>          15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       2m
istio-policy             ClusterIP      172.21.14.236    <none>          9091/TCP,15004/TCP,15014/TCP                                                                                                                 2m
istio-sidecar-injector   ClusterIP      172.21.155.47    <none>          443/TCP,15014/TCP                                                                                                                            2m
istio-telemetry          ClusterIP      172.21.196.79    <none>          9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       2m
jaeger-agent             ClusterIP      None             <none>          5775/UDP,6831/UDP,6832/UDP                                                                                                                   2m
jaeger-collector         ClusterIP      172.21.135.51    <none>          14267/TCP,14268/TCP                                                                                                                          2m
jaeger-query             ClusterIP      172.21.26.187    <none>          16686/TCP                                                                                                                                    2m
kiali                    ClusterIP      172.21.155.201   <none>          20001/TCP                                                                                                                                    2m
prometheus               ClusterIP      172.21.63.159    <none>          9090/TCP                                                                                                                                     2m
tracing                  ClusterIP      172.21.2.245     <none>          80/TCP                                                                                                                                       2m
zipkin                   ClusterIP      172.21.182.245   <none>          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 <namespace> istio-injection=enabled

或者

kubectl create -n <namespace> -f <your-app-spec>.yaml
2. 手动注入:

在没有 istio-injection 标记的命名空间中,在部署前可以使用istioctl kube-inject命令将 Envoy 容器手动注入到应用的 pod 中:

istioctl kube-inject -f <your-app-spec>.yaml | kubectl apply -f -
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355