专栏首页istioistio 庖丁解牛(一) 组件概览
原创

istio 庖丁解牛(一) 组件概览

作者: 钟华,腾讯云容器团队高级工程师,热衷于容器、微服务、service mesh、istio、devops 等领域技术
个人博客: https://imfox.io

Istio 作为 Service Mesh 领域的集大成者, 提供了流控, 安全, 遥测等模型, 其功能复杂, 模块众多, 有较高的学习和使用门槛, 本文会对istio 1.1 的各组件进行分析, 希望能帮助读者了解istio各组件的职责、以及相互的协作关系.

1. istio 组件构成

以下是istio 1.1 官方架构图:

虽然Istio 支持多个平台, 但将其与 Kubernetes 结合使用,其优势会更大, Istio 对Kubernetes 平台支持也是最完善的, 本文将基于Istio + Kubernetes 进行展开.

如果安装了grafana, prometheus, kiali, jaeger等组件的情况下, 一个完整的控制面组件包括以下pod:

% kubectl -n istio-system get pod
NAME                                          READY     STATUS 
grafana-5f54556df5-s4xr4                      1/1       Running
istio-citadel-775c6cfd6b-8h5gt                1/1       Running
istio-galley-675d75c954-kjcsg                 1/1       Running
istio-ingressgateway-6f7b477cdd-d8zpv         1/1       Running
istio-pilot-7dfdb48fd8-92xgt                  2/2       Running
istio-policy-544967d75b-p6qkk                 2/2       Running
istio-sidecar-injector-5f7894f54f-w7f9v       1/1       Running
istio-telemetry-777876dc5d-msclx              2/2       Running
istio-tracing-5fbc94c494-558fp                1/1       Running
kiali-7c6f4c9874-vzb4t                        1/1       Running
prometheus-66b7689b97-w9glt                   1/1       Running

将istio系统组件细化到进程级别, 大概是这个样子:

查看高清原图

Service Mesh 的Sidecar 模式要求对数据面的用户Pod进行代理的注入, 注入的代理容器会去处理服务治理领域的各种「脏活累活」, 使得用户容器可以专心处理业务逻辑.

从上图可以看出, Istio 控制面本身就是一个复杂的微服务系统, 该系统包含多个组件Pod, 每个组件 各司其职, 既有单容器Pod, 也有多容器Pod, 既有单进程容器, 也有多进程容器, 每个组件会调用不同的命令, 各组件之间会通过RPC进行协作, 共同完成对数据面用户服务的管控.


2. Istio 源码, 镜像和命令

Isito 项目代码主要由以下2个git 仓库组成:

仓库地址

语言

模块

https://github.com/istio/istio

Go

包含istio控制面的大部分组件: pilot, mixer, citadel, galley, sidecar-injector等,

https://github.com/istio/proxy

C++

包含 istio 使用的边车代理, 这个边车代理包含envoy和mixer client两块功能

2.1 istio/istio

https://github.com/istio/istio 包含的主要的镜像和命令:

容器名

镜像名

启动命令

源码入口

Istio_init

istio/proxy_init

istio-iptables.sh

istio/tools/deb/istio-iptables.sh

istio-proxy

istio/proxyv2

pilot-agent

istio/pilot/cmd/pilot-agent

sidecar-injector-webhook

istio/sidecar_injector

sidecar-injector

istio/pilot/cmd/sidecar-injector

discovery

istio/pilot

pilot-discovery

istio/pilot/cmd/pilot-discovery

galley

istio/galley

galley

istio/galley/cmd/galley

mixer

istio/mixer

mixs

istio/mixer/cmd/mixs

citadel

istio/citadel

istio_ca

istio/security/cmd/istio_ca

另外还有2个命令不在上图中使用:

命令

源码入口

作用

mixc

istio/mixer/cmd/mixc

用于和Mixer server 交互的客户端

node_agent

istio/security/cmd/node_agent

用于node上安装安全代理, 这在Mesh Expansion特性中会用到, 即k8s和vm打通.

2.2 istio/proxy

https://github.com/istio/proxy 该项目本身不会产出镜像, 它可以编译出一个name = "Envoy"的二进制程序, 该二进制程序会被ADD到istio的边车容器镜像istio/proxyv2中.

istio proxy 项目使用的编译方式是Google出品的bazel, bazel可以直接在编译中引入第三方库,加载第三方源码.

这个项目包含了对Envoy源码的引用,还在此基础上进行了扩展,这些扩展是通过Envoy filter(过滤器)的形式来提供,这样做的目的是让边车代理将策略执行决策委托给Mixer,因此可以理解istio proxy 这个项目有2大功能模块:

  1. Envoy: 使用到Envoy的全部功能
  2. mixer client: 测量和遥测相关的客户端实现, 基于Envoy做扩展,通过RPC和Mixer server 进行交互, 实现策略管控和遥测

后续我将对以上各个模块、命令以及它们之间的协作进行探究.


3. Istio Pod 概述

3.1 数据面用户Pod

数据面用户Pod注入的内容包括:

  1. initContainer istio-init: 通过配置iptables来劫持Pod中的流量, 转发给envoy
  2. sidecar container istio-proxy: 包含2个进程, 父进程pliot-agent 初始化并管控envoy, 子进程envoy除了包含原生envoy的功能外, 还加入了mixer client的逻辑. 主要端口:
    • --statusPort status server 端口, 默认为0, 表示不启动, istio启动时通常传递为15020, 由pliot-agent监听
    • --proxyAdminPort 代理管理端口, 默认 15000, 由子进程envoy监听.

3.2 istio-sidecar-injector

包含一个单容器, sidecar-injector-webhook: 启动一个http server, 接受kube api server 的Admission Webhook 请求, 对用户pod进行sidecar注入.

进程为sidecar-injector, 主要监听端口:

  • --port Webhook服务端口, 默认443, 通过k8s serviceistio-sidecar-injector 对外提供服务.

3.3 istio-galley

包含一个单容器 galley: 提供 istio 中的配置管理服务, 验证Istio的CRD 资源的合法性.

进程为galley server ......, 主要监听端口:

  • --server-address galley gRPC 地址, 默认是tcp://0.0.0.0:9901
  • --validation-port https端口, 提供验证crd合法性服务的端口, 默认443.
  • --monitoringPort http 端口, self-monitoring 端口, 默认 15014

以上端口通过k8s serviceistio-galley对外提供服务

3.4 istio-pilot

pilot组件核心Pod, 对接平台适配层, 抽象服务注册信息、流量控制模型等, 封装统一的 API,供 Envoy 调用获取.

包含以下容器:

  1. sidecar container istio-proxy
  2. container discovery: 进程为pilot-discovery discovery ...... 主要监听端口:
    • 15010: 通过grpc 提供的 xds 获取接口
    • 15011: 通过https 提供的 xds 获取接口
    • 8080: 通过http 提供的 xds 获取接口, 兼容v1版本, 另外 http readiness 探针 /ready也在该端口
    • --monitoringPort http self-monitoring 端口, 默认 15014

    以上端口通过k8s serviceistio-pilot对外提供服务

3.5 istio-telemetry 和istio-policy

mixer 组件包含2个pod, istio-telemetry 和 istio-policy, istio-telemetry负责遥测功能, istio-policy 负责策略控制, 它们分别包含2个容器:

  1. sidecar containeristio-proxy
  2. mixer: 进程为 mixs server …… 主要监听端口:
    • 9091: grpc-mixer
    • 15004: grpc-mixer-mtls
    • --monitoring-port: http self-monitoring 端口, 默认 15014, liveness 探针/version

3.7 istio-citadel

负责安全和证书管理的Pod, 包含一个单容器 citadel

启动命令/usr/local/bin/istio_ca --self-signed-ca ...... 主要监听端口:

  • --grpc-port citadel grpc 端口, 默认8060
  • --monitoring-port : http self-monitoring 端口, 默认 15014, liveness 探针/version

以上端口通过k8s serviceistio-citadel对外提供服务


后续将对各组件逐一进行分析.

版权归作者所有, 欢迎转载, 转载请注明出处

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • istio-4:使用istioctl方式部署istio-1.8.3全组件

    2.2.2.安装grafana/jaeger/kiali/prometheus组件

    千里行走
  • 【独家】K8S漏洞报告|近期多个CVE漏洞解读

    安全漏洞CVE-2019-11247/ CVE-2019-11248/ CVE-2019-11249分析

    CNCF
  • VV-安卓布局总汇篇

    layout_constraintHorizontal_bias layout_constraintVertical_bias

    张风捷特烈
  • 技术、艺术与禅道《禅与计算机程序设计艺术》 / 陈光剑

    庖丁放下刀回答说:“我追求的,是道(本为虚词,无特定之意,可解成自然的规律),已经超过一般的技术了。起初我宰牛的时候,眼里看到的是一只完整的牛;三年以后,再未见...

    一个会写诗的程序员
  • istio 庖丁解牛(三) galley

    今天我们来解析istio控制面组件Galley. Galley Pod是一个单容器单进程组件, 没有sidecar, 结构独立, 职责明确.

    钟华
  • 软件开发与生物学

    无意中发现和尝试了 Chrome DevTools 的 Layers 面板,Get 到了庖丁解牛的新视角。不禁感叹 Web 浏览器的巧夺天工,也从此打开了浏览器...

    zgq354
  • 庖丁解词:一键分词 自由重组

    庖丁解词支持将整块文本拆分为若干语义块,并对其进行自由重组,方便对重组结果进行分享和收藏等操作。

    闪闪动听
  • 配置Hanlp自然语言处理进阶

    中文分词中有众多分词工具,如结巴、hanlp、盘古分词器、庖丁解牛分词等;其中庖丁解牛分词仅仅支持java,分词是HanLP最基础的功能,HanLP实现了许多种...

    IT小白龙
  • 全网最通透的“闭包”认知 · 跨越语言

    1. 以面试题 · 投石问路 2. 以C#闭包 · 庖丁解牛 3. 跨越语言 ·追本溯源 • 头等函数 •自由变量 •词法作用域4. ...

    小码甲
  • HashMap庖丁解牛

    感谢erixhao的作品,长文需细品: Code Walkthrough是我们新的一个系列,主要以阅读,分析源代码为主要目的,特此介绍一下。我们先以最经典的JD...

    java达人
  • R语言数据可视化——仿网易数独圆环条形图

    一个案例,告诉你如何灵活的运用ggplot2来制作花样繁多的信息图! 虽然ggplot2的内置图层只有屈指可数的几十个,可是图表组合之后的可能性是无限的。 实际...

    数据小磨坊
  • 庖丁解牛看委托和事件(续)

    上一篇文章:庖丁解牛——深入解析委托和事件之后,以一题面试题来总结事件 using System; using System.Collections.Gener...

    用户1161731
  • 闲话 | 代码的体格

    Steve Yegge在他特立独行的作品《程序员的呐喊》中写道:“我坚信代码最大的敌人就是体格”。不过他过于自大了,以为这只是像他那样牛逼的程序员才拥有的少数派...

    张逸
  • 基于JQuery EasyUI的WebForm控件封装(含源码)

          做WebForm软件的朋友们,对于JQuery EasyUI类库肯定不会陌生,它是基于JQuery类库编写的,据说是国人开发的,真是神人啊.使用此控...

    用户1219352
  • 架构师之路--谈架构师的基本素养和[干货]日志处理

    静儿
  • 11款开放中文分词引擎大比拼

    在逐渐步入DT(DataTechnology)时代的今天,自然语义分析技术越发不可或缺。对于我们每天打交道的中文来说,并没有类似英文空格的边界标志。而理解句子所...

    CDA数据分析师
  • 编程语言学习小结

    学习任何东西,都是一个由表及里的过程。学习一门编程语言也一样。对于一门编程语言来说,“表” 就是基本词汇和语法。 对于基础语法的学习,我们可以看一些简短而又系...

    一个会写诗的程序员
  • 难以持续的SaaS产品如何解救?

    ? 来源:SaaS产品说 作者:李东林 ---- ? 中国目前绝大多数SaaS公司都是销售驱动,客户需求驱动,很难拒绝定制开发,很容易就做成项目了,除非有很强...

    腾讯SaaS加速器
  • 4.1、苏宁百万级商品爬取 代码讲解 索引建立

    Lucene是一款高性能的、可扩展的信息检索(IR)工具库。信息检索是指文档搜索、文档内信息搜索或者文档相关的元数据搜索等操作。

    happlyfox

扫码关注云+社区

领取腾讯云代金券