文源码版本为 istio-v1.11.3
架构
pilot 共分两个主要模块,一个是 pilot-agent
用来提供 pod 中的服务发现客户端,另一个是 polot-discovery
提供服务发现服务端。

其中 envoy
和 Istio Agent
就是我们上面所讲的 pilot-agent
模块,而 Istiod
则为控制面,模块对应源码见 https://github.com/istio/istio/tree/1.11.3/pilot/cmd
pilot-agent
对于 polot-agent
它运行在每个pod中 ,并以 sidecar 方式与应用容器运行在同一个pod中,如果你使用的是 vm 的话,则可以看到vm的进程视图
# pstree -pu 24530
su(24530)───pilot-agent(24611,istio-proxy)─┬─envoy(24619)─┬─{envoy}(24620)
│ ├─{envoy}(24621)
│ ├─{envoy}(24622)
│ ├─{envoy}(24623)
│ ├─{envoy}(24624)
│ ├─{envoy}(24625)
│ ├─{envoy}(24627)
│ ├─{envoy}(24628)
│ ├─{envoy}(24629)
│ ├─{envoy}(24630)
│ └─{envoy}(24635)
├─{pilot-agent}(24612)
├─{pilot-agent}(24613)
├─{pilot-agent}(24614)
├─{pilot-agent}(24615)
├─{pilot-agent}(24616)
├─{pilot-agent}(24617)
├─{pilot-agent}(24618)
├─{pilot-agent}(24626)
└─{pilot-agent}(24698)
从进程关系可以看到,envoy
属于 pilot-agent
的子进程,当前进程以 istio-proxy
用户身份运行。
在istio中,如果应用是以容器方式部署的话,则对象为pod
,如果是以vm部署的话,则对象为 wordloadEntry
。下面我们看一下容器部署的情况。
在安装 istio 应用后,每个启用注入的 pod
里都会多出一来一个名叫 istio-proxy
的容器
Containers:
nginx:
Container ID: docker://dea2fa5b051f74f1d5f867693543b2d9858b01b1713d70cfb1470268bb1987c9
Image: nginx:1.23
Image ID: docker-pullable://nginx@sha256:63b44e8ddb83d5dd8020327c1f40436e37a6fffd3ef2498a6204df23be6e7e94
Port: 80/TCP
Host Port: 0/TCP
...
istio-proxy:
Container ID: docker://eb8eb3efee0aa35306fe248b19cfe3983ab896309e365ad4afac5bc4d5d8ae4b
Image: docker.io/istio/proxyv2:1.11.2
Image ID: docker-pullable://istio/proxyv2@sha256:0354daaaa62d064c046119035c20ea8a48b8e5824772110656a3898f9170969e
Port: 15090/TCP
Host Port: 0/TCP
...
这个容器是由 docker.io/istio/proxyv2:1.11.2
镜像提供的,其镜像是通过 /pilot/docker/Dockerfile.proxyv2
文件生成的的,容器里运行的是一个叫 pilot-agent
进程。而这个进程里启用了 envoy
这个代理程序。