【玩转服务网格】深入理解Envoy内幕

646 阅读2分钟

学习笔记:istio-insider.mygraphql.com/zh_CN/lates…

Istio 整体架构

Istio架构

  • Proxy作为数据面最重要的组件,也是本篇文章的重点。它里面有两个组件:
    • pilot-agent:pilot派驻到本地的代理管理员。
    • envoy proxy:本地执行者,也就是本篇的重点。
  • Istiod
    • 控制面大脑。

一些概念

Upstream & Downstream

【downstream】-〉envoy-〉【upstream】 个人理解,上下游是从资源输出的角度来看的,上游接收到下游的请求从而输出资源到下游

Inbound & Outbound

  • inbound: 有人译为入站。而在现实的 k8s + istio 环境中,可以理解为流量从 pod 外部进入 pod。即服务的被调用流量
  • outbound: 有人译为出站。而在现实的 k8s + istio 环境中,可以理解为流量从 pod 内部输出到 pod 外部。

Istio 端口与组件

Istio每个组件都监听一堆端口。在这里说明下各组件的通信端口和相关的功能。 istio-ports-components.drawio.png 转自详细版本:app.diagrams.net/?ui=sketch#…

  • istio-proxy容器与应用容器共享同一个linux network namespace。
  • network namespace是内核内用于隔离多个不同网络配置的技术。

Envoy Proxy

Envoy 架构

一些历史

envoy是由在Lyft工作的matt Klein创建,设计时,其定位就是作为service mesh中的代理。在envoy初期,matt klein本人与google的istio开发团队一直保持着很好的合作。

为什么使用C++语言

Matt Klein回答是:这是envoy开始时最好的选择了。其实envoy使用C++ 11的风格已经很Java了。代码清晰易懂。

L1架构

L1架构

Envoy配置说明

envoy 查看envoy的配置:

kubectl exec fortio-server -c istio-proxy  -- \
curl 'localhost:15000/config_dump?include_eds' | \
yq eval -P > envoy@istio-conf-eg-inbound.envoy_conf.yaml

Inbound 数据流

envoy@istio-conf-eg-inbound.drawio.png app.diagrams.net/#Htaotaoo%2…

用日志验证

  • 修改provider端的日志级别
k exec fortio-server -c istio-proxy -- curl -XPOST http://localhost:15000/logging
k exec fortio-server -c istio-proxy -- curl -XPOST curl -XPOST 'http://localhost:15000/logging?level=debug'
k logs -f fortio-server -c istio-proxy
  • 向provider发起请求,查看创建连接的过程。

小技巧
如果你的环境中发现已经有连接,那么,强制断开它。因为后面要分析一下建立新连接的日志。这里有个 强制断开连接的 ss 命令的秘技:
k exec -it netshoot -- ss -K 'dst 172-21-206-230.fortio-server.mark.svc.cluster.local'

  • 查看连接
$ k exec -it netshoot -- ss -trn | grep fortio
  • 这时,在之前打开的 监控日志终端窗口 中,应该可以看到日志