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

istio在虚拟机vm下的安装方法

建议参考官方文档 https://istio.io/latest/zh/docs/setup/install/virtual-machine/ ,这里提醒大家对于命令中文版部分命令与英文版不一致,请以 英文版 为准。

对于istio在vm上的安装教程主要分为三部分。首先是在k8s的master节点生成vm连接主节点的一些配置信息,其实是在vm上应用这些配置信息,最后也就是验证连接是否成功。

本篇主要介绍“单网络”的情况, 对于”多网络“请自行参考官方文档。

vm环境准备

生成vm通讯配置信息

这里主要介绍一些新手迷惑的部分。如环境变量设置及vm注册的方式

设置环境变量

在设置变量时,对于”单网络“来讲 CLUSTER_NETWORK 和 VM_NETWORK 保留空值即可。如我这里设置如下

$ VM_APP="myapp"
$ VM_NAMESPACE="vm"
$ WORK_DIR="/root/myapp"
$ SERVICE_ACCOUNT="vm-sa"
$ CLUSTER_NETWORK=""
$ VM_NETWORK=""
$ CLUSTER="Kubernetes"

每个环境变量的解释:
VM_APP 表示vm上应用的名称
VM_NAMESPACE 表示应用所在的namespace
WORK_DIR 生成vm配置信息保留的目录,任何位置即可
SERVICE_ACCOUNT 服务运行的账号 ,即yaml文件中的 ServiceAccount 字段
CLUSTER 集群名称,默认为 Kubernetes 即可。

Continue reading

服务网格Istio之服务入口 ServiceEntry

使用服务入口(Service Entry) 来添加一个服务入口到 Istio 内部维护的服务注册中心。添加了服务入口后,Envoy 代理可以向服务发送流量,就好像它是网格内部的服务一样,可参考 https://istio.io/latest/zh/docs/concepts/traffic-management/#service-entries

简单的理解就是允许内网向外网服务发送流量请求,但你可能会说正常情况下在pod里也是可以访问外网的,这两者有什么区别呢?

确实默认情况下,Istio 配置 Envoy 代理可以将请求传递给外部服务。但是无法使用 Istio 的特性来控制没有在网格中注册的目标流量。这也正是 ServiceEntry 真正发挥的作用,通过配置服务入口允许您管理运行在网格外的服务的流量。

此外,可以配置虚拟服务和目标规则,以更精细的方式控制到服务条目的流量,就像为网格中的其他任何服务配置流量一样。

为了更好的理解这一块的内容,我们先看一下普通POD发送请求的流程图

普通 Pod 请求

Continue reading