istio组件介绍和启动流程

Istio各个Deployment包含的容器组件

Deployment 名称 Container和Port Container和Port
istio-pilot pilot: 8080,15010 proxyv2: 15003,15005,15007
istio-galley galley: 443,9093
istio-egressgateway proxyv2: 80,443,15090
istio-ingressgateway proxyv2: 80,443,31400,15011,8060,853,15030,15031,15090
grafana grafana: 3000
istio-policy mixer: 9093,42422 proxyv2: 9091,15004,15090
istio-telemetry mixer: 9093,42422 proxyv2: 9091,15004,15090
prometheus prometheus: 9090
istio-citadel citadel: 8086
istio-sidecar-injector sidecar-injector
istio-tracing jaegertracing/all-in-one: 9411,16686 UDP:5775,6832,6831
istio-ingress proxyv2: 80,443

其中,流量的走向如下图所示:

说明:红色线表示控制流,黑色线表示数据流,蓝色部分为Envoy和pilot相关组件

Istio核心组件与功能

istio主要有两部分组成: 控制面和数据面。

  • 数据面被称为Sidecar: 会在业务Pod中注入一个容器,劫持业务应用容器的流量,并接受控制组件的控制,同时会向控制组件输出日志,跟踪及监控数据。
  • 控制面是Istio的核心,管理Istio的所有功能。

Pilot: Istio的核心流量控制组件,主要负责流量管理。Pilot管理了所有Envoy的代理实例(Sidecar),主要有以下功能:

  • 从K8S或者其它平台注册中心回去服务信息,完成服务发现
  • 读取Istio的各项控制配置,在进行装换后将其发给数据组件进行实施。
  • 数据组件Sidecar根据Pilot指令,完成 路由、服务、监听、集群等配置。

Mixer: 主要是预检查和汇报工作,策略控制,监控,和日志收集等。主要工作流程如下:

  • 用户将Mixer配置发送到Kubernetes集群中
  • Mixer通过对集群资源的监听,获取配置的变化。
  • 网格中的服务每次在调用前,都会向Mixer发出预检请求,查看是否允许执行。在服务完成调用后,会向Mixer发出报告信息,汇报在调用过程中产生的监控跟踪数据。
  • Mixer 中包含多个Adapter的组件,这些组件来处理在Mixer中接收的预检报告数据,完成Mixer的各项功能。

Citadel: 主要用于证书管理和身份认证。

Sidecar(Envoy): Istio中的数据面,负责控制对服务网格控制的实际执行。

  • Istio中默认的Sidecar是由Envoy派生出的,实际理论上只要支持Envoy的xDS协议(x descovery service 各类服务发现的总称),其他类似的反向代理软件就能替代Envoy来担当此角色。
  • Istio 利用istio-init初始化容器中的iptables指令,对所在Pod的流量进行劫持,从而接管Pod应用中的通信。
  • Sidecar在注入到Pod之后,将原有的源容器 -> 目标容器的通信方式改变为 源容器 -> Sidecar -> Sidecar -> 目标容器。

数据面组件

Istio通过K8s的Admission webhook[9]机制实现了sidecar的自动注入,Mesh中的每个微服务pod会被加入Envoy相关的容器。
除了微服务自身的容器外,istio还在Pod中注入proxy_initproxyv2 两个容器。其中proxyv2容器中运行的两个进程是数据面的核心。

proxy_init

proxy_init是一个initContainer, 主要用于在启动Pod前做一些初始化的工作,只有当InitContainer执行成功之后,才会启动Pod中的其他container。

可以通过docker inspect 命令,来获取此容器镜像的元数据:

...
           "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) COPY file:1e5fc95e10f8888f4cae33f7e0ea42b5aff9d18d36280ae288a0fee948dc18e1 in / "
            ],
            "ArgsEscaped": true,
            "Image": "sha256:e261e1418e2ed94d1de1742d80997cc58f96aa3c4bfc56cd50e7f2848bf5bcf6",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/usr/local/bin/istio-iptables.sh"
            ],

...

从上面的命令行输出可以看到,Proxy_init中执行的命令是istio-iptables.sh脚本,脚本具体内容可以直接从已存在的容器拷贝出来进行查看:

docker cp cbbaf5413d04:/usr/local/bin/istio-iptables.sh ./

这个脚本主要设置了Istio sidecar的iptables端口转发规则。

proxyv2

伴随着业务容器长久运行的注入容器是istio-proxy,这个容器负责截取POD中所有流入流出的流量。
通过如下命令,可以看到在此容器中运行的进程:

[[email protected] ~]# kubectl exec reviews-v3-748456d47b-6jvsp -c istio-proxy -- ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
istio-p+     1     0  0 02:26 ?        00:00:00 /usr/local/bin/pilot-agent proxy sidecar --configPath /etc/istio/proxy --binaryPath /usr/local/bin/envoy --serviceCluster reviews --drainDuration 45s --parentShutdownDuration 1m0s --discoveryAddress istio-pilot.istio-system:15007 --discoveryRefreshDelay 1s --zipkinAddress zipkin.istio-system:9411 --connectTimeout 10s --proxyAdminPort 15000 --controlPlaneAuthPolicy NONE
istio-p+    16     1  0 02:26 ?        00:03:37 /usr/local/bin/envoy -c /etc/istio/proxy/envoy-rev0.json --restart-epoch 0 --drain-time-s 45 --parent-shutdown-time-s 60 --service-cluster reviews --service-node sidecar~10.2.53.61~reviews-v3-748456d47b-6jvsp.default~default.svc.cluster.local --max-obj-name-len 189 --allow-unknown-fields -l warn --v2-config-only
istio-p+    39     0  0 13:07 ?        00:00:00 ps -ef

这个容器中主要运行了两个进程:

  • pilot-agent: 负责生成Envoy启动所需的配置文件,指定了连接istio控制面的服务和端口,并负责启动Envoy进程。
  • envoy:其中指定的/etc/istio/proxy/envoy-rev0.json文件是当前pod的网络流量的核心配置,通过此文件获取pilot的地址,其中记录了当前的POD信息和流量的转发规则,pilot会与其建立长连接,并向其推送最新更新的网络策略。

通过对envoy-rev0.json文件进行分析,我们可以发现其主要包含了如下几个部分:

  • node: 包含了当前Pod信息,包括ID,IP,servicename,namespace等。
  • stats_config:定义了一些命名规则和对应的正则参数
  • admin:给出了一组本地IP 127.0.0.1和15000管理端口,可以登录此容器执行curl http://127.0.0.1:15000/help 获取当前POD的接口和状态信息
  • dynamic_resources:定义了xDS的服务发现配置
  • static_resources:定义了连接控制面的信息,包括连接pilot组件的服务地址,以及超时时间设置和连接数限制等配置信息。
  • tracing:主要定义了zipkin的接口等信息,用于追踪业务流量的走向。

登录istio-proxy查看监听的端口,其中80端口为业务容器提供服务的端口:

$ netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:15001           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:15090           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 127.0.0.1:15000         0.0.0.0:*               LISTEN      13/envoy
tcp6       0      0 :::15020                :::*                    LISTEN      1/pilot-agent  
  • 15001: Envoy的入口监听器,iptable会将pod的流量导入该端口中由Envoy进行处理
  • 15000: Envoy管理端口,该端口绑定在本地环回地址上,只能在Pod内访问。

数据面组件启动流程

流程图示:

  1. initContainer执行初始化脚本,为Pod添加iptables规则
  2. Pilot-agent根据启动参数和K8S API Server中的配置信息生成Envoy的初始配置文件envoy-rev0.json,该文件告诉Envoy从xDS server中获取动态配置信息,并配置了xDS server的地址信息,即控制面的Pilot。
  3. Pilot-agent使用envoy-rev0.json启动Envoy进程。
  4. Envoy根据初始配置获得Pilot地址,采用xDS接口从Pilot获取到Listener,Cluster,Route等d动态配置信息。
  5. Envoy根据获取到的动态配置启动Listener,并根据Listener的配置,结合Route和Cluster对拦截到的流量进行处理。

Envoy配置文件结构

Envoy中实际生效的配置是由初始化配置文件中的静态配置和从Pilot获取的动态配置一起组成的。因此只对envoy-rev0 .json进行分析并不能看到Mesh中流量管理的全貌。那么有没有办法可以看到Envoy中实际生效的完整配置呢?答案是可以的,我们可以通过Envoy的管理接口来获取Envoy的完整配置:

 kubectl -n yak exec yak-files-7d48cd48f-tf75f -c istio-proxy curl http://127.0.0.1:15000/config_dump > config_dump

查看此文件的结构:

{
    "configs":[
        {
            "@type":"type.googleapis.com/envoy.admin.v2alpha.BootstrapConfigDump",
            "bootstrap":Object{...},
            "last_updated":"2019-05-08T08:07:28.221Z"
        },
        {
            "@type":"type.googleapis.com/envoy.admin.v2alpha.ClustersConfigDump",
            "version_info":"2019-05-09T08:36:01Z/4",
            "static_clusters":Array[3],
            "dynamic_active_clusters":Array[96]
        },
        {
            "@type":"type.googleapis.com/envoy.admin.v2alpha.ListenersConfigDump",
            "version_info":"2019-05-09T08:36:01Z/4",
            "static_listeners":Array[1],
            "dynamic_active_listeners":Array[57]
        },
        {
            "@type":"type.googleapis.com/envoy.admin.v2alpha.RoutesConfigDump",
            "static_route_configs":Array[3],
            "dynamic_route_configs":Array[17]
        }
    ]
}

配置中主要包含了如下几部分:

  • bootstrap:文件中的内容和之前介绍的envoy-rev0.json是一致的
  • clusters: 是一个服务集群,包含一个到多个endpoint,每个endpoint都可以提供服务,Envoy根据负载均衡算法将请求发送到这些endpoint中。
    • static_clusters: 是来自于envoy-rev0.json的xDS server和zipkin server信息。
    • dynamic_active_clusters : 是通过xDS接口从Istio控制面获取的动态服务信息。
  • listeners: Envoy采用listener来接收并处理downstream发过来的请求,listener的处理逻辑是插件式的,可以通过配置不同的filter来插入不同的处理逻辑。
    • static_listeners
    • dynamic_active_listeners
  • routes: 配置Envoy的路由规则。Istio下发的缺省路由规则中对每个端口设置了一个路由规则,根据host来对请求进行路由分发。
    • static_route_configs
    • dynamic_route_configs

官方bookinfo服务调用示意图:

参考链接:https://zhaohuabing.com/post/2018-09-25-istio-traffic-management-impl-intro/

原文地址:https://blog.51cto.com/tryingstuff/2391885

时间: 2024-08-29 23:24:14

istio组件介绍和启动流程的相关文章

《鸟哥的Linux私房菜》读书笔记:X window介绍及启动流程

X Window System简介 X Window System是跨网络和操作系统的,其是一个软件. 1.主要组件 X Server:硬件管理.屏幕绘制和提供字型功能. X Client:负责 X Server要求的事件处理.X Client最重要的工作就是处理来自X Server的动作,将该动作处理成为绘图数据, 再将这些绘图数据传回给X Server.客户端用的是什么操作系统在Linux主机端是不在乎的. X Window Manager(GNOME.KDE.twm.XFCE):特殊的X

idou老师教你学Istio 29:Envoy启动流程

功能概述 Envoy启动时,会启动一个进程,并在这个进程中启动很多线程,这样,可以启动很多worker线程,一般worker线程数与核心数相同,每个worker线程处理所有已配置的listener上的请求,管理连接并处理filterchain,非阻塞:同时,在这个进程中会启动一个主线程,它负责启动和停止envoy,也是通过API提供配置管理的线程,同时它收集不同的指标,管理其它线程,也是非阻塞的. 重要数据结构定义 2.1 Filter 过滤器,包括listener filter.network

“无处不在” 的系统核心服务 —— ActivityManagerService 启动流程解析

本文基于 Android 9.0 , 代码仓库地址 : android_9.0.0_r45 系列文章目录: Java 世界的盘古和女娲 -- Zygote Zygote 家的大儿子 -- SystemServer Android 世界中,谁喊醒了 Zygote ? 文中相关源码链接: SystemServer.java ActivityManagerService.java 之前介绍 SystemServer 启动流程 的时候说到,SystemServer 进程启动了一系列的系统服务,Activ

u-boot启动流程分析(2)_板级(board)部分

转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global data介绍以及背后的思考 5. 前置的板级初始化操作 6. u-boot的relocation 7. 后置的板级初始化操作 1. 前言 书接上文(u-boot启动流程分析(1)_平台相关部分),本文介绍u-boot启动流程中和具体版型(board)有关的部分,也即board_init_f/board_i

RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍

RDIFramework.NET ━ .NET快速信息化系统开发框架 工作流程组件介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 1.RDIFramework.NET框架介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开发系统提供了强大的支持,开发人员不需要开发系统的基础功能和公共模块,框架自身提供了强大的函数库和开发包,开发人员只须集中精力专注于业

Tomcat源码分析之—具体启动流程分析

从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息.Catalina.base信息,在initClassLoaders方法中初始化类加载器,然后通过反射初始化org.apache.catalina.startup.Catalina作为catalina守护进程: 一.load Bootstrap中load流程: 反射调用Catalina的load方法

ARM Linux从Bootloader、kernel到filesystem启动流程

转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesystem.bootloader 是一上电就拿到cpu 的控制权的,而bootloader实现了硬件的初始化.bootloader俨然就成了Power on 之后”第一个吃螃蟹”的代码. 谈到这就得想到硬件机制是如何满足这个功能的了.CPU内部一般都集成小容量的SRAM (又叫stapping stone,垫脚石),

【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boot 源码 : http://download.csdn.net/detail/han1202012/8342761 -- S3C2440 文档 : http://download.csdn.net/detail/han1202012/8342701 -- S5PV210_iROM_Applicati

Activity的启动流程分析

Activity是Android应用程序的四大组件之一,负责管理Android应用程序的用户界面,一般一个应用程序中包含很多个Activity,他们可能运行在一个进程中,也可能运行在不同的进程中. 我们主要通过启动在不同进程中的Activity,来分析Activity的启动流程及AMS对Activity的管理逻辑. 有两个应用程序App1和App2,在App1的Activity A中点击button 启动 App2中的Activity B. 通过分析以上ActivityB的启动过程来了解AMS对