前言
Pilot 也是 Istio 的核心组件,负责以下任务:
- 监听注册中心,例如 Kubernetes 中的服务信息变化。
- 监听 Istio 的路由相关 CRD 资源。
- 两项内容结合,生成 Envoy 可以理解的配置信息发送给 Envoy。
values.yaml 中的全局变量
enabled: true
replicaCount: 1
autoscaleMin: 1
autoscaleMax: 5
image: pilot
sidecar: true
traceSampling: 1.0
# Resources for a small pilot install
resources:
requests:
cpu: 500m
memory: 2048Mi
env:
PILOT_PUSH_THROTTLE_COUNT: 100
GODEBUG: gctrace=2
cpu:
targetAverageUtilization: 80
image 字段使用的镜像名为 pilot。
老生常谈的 HPA 部分和其他组件区别不大,实例数量的上限为 5。
值得注意的是 Pilot 的资源设置,缺省 CPU 500m,内存 2G,比其它组件来说是比较大的。这里还特意注明,这是针对小负载情况的。
sidecar 参数看来可以启用或者关闭 Pilot 组件的 Sidecar 注入。
traceSampling、PILOT_PUSH_THROTTLE_COUNT 和 GODEBUG,目测都是性能向的参数。可以在后面的 Chart 中进行求证。
RBAC 相关
授权部分,Pilot 的 ServiceAccount 为:istio-pilot-service-account,从 clusterrole.yaml 可以看到较多门类的权限:
| 名称 | 权限 | 说明 |
|---|---|---|
config.istio.io/* |
* |
Mixer 使用此配置对象将数据送入 Adapter。 |
rbac.istio.io/* |
只读 | RBAC 相关配置。 |
networking.istio.io/* |
* |
流量控制相关配置。 |
authentication.istio.io |
* |
认证策略相关配置。 |
apiextensions.k8s.io/customresourcedefinitions |
* |
Kubernetes CRD。 |
extensions/thirdpartyresources |
* |
Kubernetes TPR,1.8 以后已经弃用。 |
extensions/thirdpartyresources.extensions |
* |
TPR 的扩展资源。 |
extensions/ingresses |
* |
Kubernetes Ingress 资源。 |
configmaps |
读写 | |
endpoints, pods, services
|
get, list, watch
|
|
namespaces, nodes, secrets
|
get, list, watch
|
gateway.yaml
这个文件中包含了三个 Gateway 对象,用于网格扩展功能。
-
istio-autogenerated-k8s-ingress:在 80 端口提供 http 边缘监听服务。 -
meshexpansion-gateway:用于 MeshExpanshion,如果启用了global.meshExpansion,则创建 Gateway,在边缘提供 15011 的 Pilot 访问,以及 8060 的 citadel 组件访问。 -
meshexpansion-ilb-gateway:如果启用了global.meshExpansionILB,则创建该对象,在内部网关中公开 Pilot 和 Citadel 的端口。
istio-autogenerated-k8s-ingress对象其实是个 Bug,它使用了global.k8sIngressSelector作为 Gateway 控制器,也就是说只有在global.ingress.enabled为 True 的情况下才有可用的 Gateway 提供服务,这部分应该使用条件判断确定是否包含。
meshexpansion.yaml
这个文件很明显也是用于网格扩展的。事实上这一文件和 gateway.yaml 是一体的,今后可能会做合并。
如果启用了 global.meshExpansion 或者 global.meshExpansionILB,会为 gateway.yaml 中生成的 Gateway 创建 VirtualService:
-
meshexpansion-pilot:从边缘进入的 Pilot 请求,访问pilot.istio-system主机时,如果端口为 15011,则指向istio-pilot.istio-system.svc.cluster.local。 -
ilb-meshexpansion-pilot:从内部网管进入的请求,访问主机为meshexpansionilb.istio-system,将15011、15010以及5353端口分别转向到istio-pilot明文端口、istio-pilotmTLS 端口以及 DNS 服务的 53 端口。
deployment.yaml
主进程为 Pilot Discovery。注解部分要求不进行自动注入。
除了 Chart 和 Release 之外,Pilot 的 Deployment 模板还引用了几个其它的全局变量。
-
image:和其它核心组件类似,Pilot 中对image的值如果包含了/,则会忽略hub的内容,可以方便的替换为内网镜像。 - 模板
istio.configmap.checksum:来自templates/_helpers.tpl,Istio chart 中的/templates/configmap.yaml文件的校验和。 -
global.priorityClassName:Pod 优先级。 -
global.imagePullPolicy:镜像拉取策略。 -
global.oneNamespace:如果启用了这一参数,则会在主进程参数中加入-a {{ .Release.Namespace }}。 -
sidecar:如果为True,会进行如下操作:- 在 Pod 中注入
istio-proxy容器,这一容器会根据global.controlPlaneSecurityEnabled设置,决定controlPlaneAuthPolicy的值为MUTUAL_TLS还是NONE。 - 注入容器的资源设置来自于
global.proxy.resources或global.defaultResources。
- 在 Pod 中注入
-
sidecar如果为False,会进行如下操作:- 设置启动参数
--secureGrpcAddr为15011。 - 开放容器端口
15011。
- 设置启动参数
-
env:如果设置了key: value类型的环境变量,此处会发送给 Pilot 进程。 -
traceSampling:跟踪取样率,会被设置到PILOT_TRACE_SAMPLING环境变量中。 -
nodeaffinity模板:来自templates/_affinity.tpl,用于设置节点亲和性。
service.yaml
这里并无特殊设置,开放如下几个端口:
- 15010:gRPC 的 xDS 端口
- 15011:mTLS 的 xDS 端口
- 8080:传统 http 端口
- 9093:监控端口
总结
对 Pilot 的资源设置较大,同时 1.0.0 之后屡次出现 Pilot 内存消耗巨大的 Issue,其中的跟踪采样、GC 调试以及 Sidecar 注入方面应该都还有挖掘的潜力。但是很可惜 Pilot 的环境变量并无文档,须待日后进一步完善。
文章来源于互联网:Istio Helm Chart 详解 – Pilot




