pilot-agent 源码分析

文源码版本为 istio-v1.11.3

架构

pilot 共分两个主要模块,一个是 pilot-agent用来提供 pod 中的服务发现客户端,另一个是 polot-discovery 提供服务发现服务端。

其中 envoyIstio 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 这个代理程序。

Continue reading