<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>pilot | 伪架构师</title>
    <link>/tags/pilot/</link>
      <atom:link href="/tags/pilot/index.xml" rel="self" type="application/rss+xml" />
    <description>pilot</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Sun, 02 Dec 2018 15:44:38 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>pilot</title>
      <link>/tags/pilot/</link>
    </image>
    
    <item>
      <title>Istio Helm Chart 详解 - Pilot</title>
      <link>/post/istio-helm-deep-dive-pilot/</link>
      <pubDate>Sun, 02 Dec 2018 15:44:38 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-pilot/</guid>
      <description>

&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;

&lt;p&gt;Pilot 也是 Istio 的核心组件，负责以下任务：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;监听注册中心，例如 Kubernetes 中的服务信息变化。&lt;/li&gt;
&lt;li&gt;监听 Istio 的路由相关 CRD 资源。&lt;/li&gt;
&lt;li&gt;两项内容结合，生成 Envoy 可以理解的配置信息发送给 Envoy。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;values-yaml-中的全局变量&#34;&gt;values.yaml 中的全局变量&lt;/h2&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;  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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;image&lt;/code&gt; 字段使用的镜像名为 &lt;code&gt;pilot&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;老生常谈的 HPA 部分和其他组件区别不大，实例数量的上限为 5。&lt;/p&gt;

&lt;p&gt;值得注意的是 Pilot 的资源设置，缺省 CPU 500m，内存 2G，比其它组件来说是比较大的。这里还特意注明，这是针对小负载情况的。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sidecar&lt;/code&gt; 参数看来可以启用或者关闭 Pilot 组件的 Sidecar 注入。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;traceSampling&lt;/code&gt;、&lt;code&gt;PILOT_PUSH_THROTTLE_COUNT&lt;/code&gt; 和 &lt;code&gt;GODEBUG&lt;/code&gt;，目测都是性能向的参数。可以在后面的 Chart 中进行求证。&lt;/p&gt;

&lt;h2 id=&#34;rbac-相关&#34;&gt;RBAC 相关&lt;/h2&gt;

&lt;p&gt;授权部分，Pilot 的 ServiceAccount 为：&lt;code&gt;istio-pilot-service-account&lt;/code&gt;，从 &lt;code&gt;clusterrole.yaml&lt;/code&gt; 可以看到较多门类的权限：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;权限&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;config.istio.io/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mixer 使用此配置对象将数据送入 Adapter。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rbac.istio.io/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只读&lt;/td&gt;
&lt;td&gt;RBAC 相关配置。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;networking.istio.io/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;流量控制相关配置。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;authentication.istio.io&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;认证策略相关配置。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apiextensions.k8s.io/customresourcedefinitions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes CRD。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/thirdpartyresources&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes TPR，1.8 以后已经弃用。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/thirdpartyresources.extensions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TPR 的扩展资源。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions/ingresses&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes Ingress 资源。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;configmaps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读写&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;endpoints&lt;/code&gt;, &lt;code&gt;pods&lt;/code&gt;, &lt;code&gt;services&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;watch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;namespaces&lt;/code&gt;, &lt;code&gt;nodes&lt;/code&gt;, &lt;code&gt;secrets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;watch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;gateway-yaml&#34;&gt;gateway.yaml&lt;/h2&gt;

&lt;p&gt;这个文件中包含了三个 Gateway 对象，用于&lt;a href=&#34;https://istio.io/zh/docs/setup/kubernetes/mesh-expansion/&#34; target=&#34;_blank&#34;&gt;网格扩展功能&lt;/a&gt;。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;istio-autogenerated-k8s-ingress&lt;/code&gt;：在 80 端口提供 http 边缘监听服务。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;meshexpansion-gateway&lt;/code&gt;：用于 MeshExpanshion，如果启用了 &lt;code&gt;global.meshExpansion&lt;/code&gt;，则创建 Gateway，在边缘提供 15011 的 Pilot 访问，以及 8060 的 citadel 组件访问。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;meshexpansion-ilb-gateway&lt;/code&gt;：如果启用了 &lt;code&gt;global.meshExpansionILB&lt;/code&gt;，则创建该对象，在内部网关中公开 Pilot 和 Citadel 的端口。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;istio-autogenerated-k8s-ingress&lt;/code&gt; 对象其实是个 Bug，它使用了 &lt;code&gt;global.k8sIngressSelector&lt;/code&gt; 作为 Gateway 控制器，也就是说只有在 &lt;code&gt;global.ingress.enabled&lt;/code&gt; 为 True 的情况下才有可用的 Gateway 提供服务，这部分应该使用条件判断确定是否包含。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;meshexpansion-yaml&#34;&gt;meshexpansion.yaml&lt;/h2&gt;

&lt;p&gt;这个文件很明显也是用于网格扩展的。事实上这一文件和 &lt;code&gt;gateway.yaml&lt;/code&gt; 是一体的，今后可能会做合并。&lt;/p&gt;

&lt;p&gt;如果启用了 &lt;code&gt;global.meshExpansion&lt;/code&gt; 或者 &lt;code&gt;global.meshExpansionILB&lt;/code&gt;，会为 &lt;code&gt;gateway.yaml&lt;/code&gt; 中生成的 Gateway 创建 &lt;code&gt;VirtualService&lt;/code&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;meshexpansion-pilot&lt;/code&gt;：从边缘进入的 Pilot 请求，访问 &lt;code&gt;pilot.istio-system&lt;/code&gt; 主机时，如果端口为 15011，则指向 &lt;code&gt;istio-pilot.istio-system.svc.cluster.local&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ilb-meshexpansion-pilot&lt;/code&gt;：从内部网管进入的请求，访问主机为 &lt;code&gt;meshexpansionilb.istio-system&lt;/code&gt;，将 &lt;code&gt;15011&lt;/code&gt;、&lt;code&gt;15010&lt;/code&gt; 以及 &lt;code&gt;5353&lt;/code&gt; 端口分别转向到 &lt;code&gt;istio-pilot&lt;/code&gt; 明文端口、&lt;code&gt;istio-pilot&lt;/code&gt; mTLS 端口以及 DNS 服务的  53 端口。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;deployment-yaml&#34;&gt;deployment.yaml&lt;/h2&gt;

&lt;p&gt;主进程为 &lt;a href=&#34;https://istio.io/docs/reference/commands/pilot-discovery/&#34; target=&#34;_blank&#34;&gt;Pilot Discovery&lt;/a&gt;。注解部分要求不进行自动注入。&lt;/p&gt;

&lt;p&gt;除了 Chart 和 Release 之外，Pilot 的 Deployment 模板还引用了几个其它的全局变量。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image&lt;/code&gt;：和其它核心组件类似，Pilot 中对 &lt;code&gt;image&lt;/code&gt; 的值如果包含了 &lt;code&gt;/&lt;/code&gt;，则会忽略 &lt;code&gt;hub&lt;/code&gt; 的内容，可以方便的替换为内网镜像。&lt;/li&gt;
&lt;li&gt;模板 &lt;code&gt;istio.configmap.checksum&lt;/code&gt;：来自 &lt;code&gt;templates/_helpers.tpl&lt;/code&gt;，Istio chart 中的 &lt;code&gt;/templates/configmap.yaml&lt;/code&gt; 文件的校验和。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.priorityClassName&lt;/code&gt;：&lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority&#34; target=&#34;_blank&#34;&gt;Pod 优先级&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.imagePullPolicy&lt;/code&gt;：镜像拉取策略。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.oneNamespace&lt;/code&gt;：如果启用了这一参数，则会在主进程参数中加入 &lt;code&gt;-a {{ .Release.Namespace }}&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sidecar&lt;/code&gt;：如果为 &lt;code&gt;True&lt;/code&gt;，会进行如下操作：

&lt;ul&gt;
&lt;li&gt;在 Pod 中注入 &lt;code&gt;istio-proxy&lt;/code&gt; 容器，这一容器会根据 &lt;code&gt;global.controlPlaneSecurityEnabled&lt;/code&gt; 设置，决定 &lt;code&gt;controlPlaneAuthPolicy&lt;/code&gt; 的值为 &lt;code&gt;MUTUAL_TLS&lt;/code&gt; 还是 &lt;code&gt;NONE&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;注入容器的资源设置来自于 &lt;code&gt;global.proxy.resources&lt;/code&gt; 或 &lt;code&gt;global.defaultResources&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sidecar&lt;/code&gt; 如果为 &lt;code&gt;False&lt;/code&gt;，会进行如下操作：

&lt;ul&gt;
&lt;li&gt;设置启动参数 &lt;code&gt;--secureGrpcAddr&lt;/code&gt; 为 &lt;code&gt;15011&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;开放容器端口 &lt;code&gt;15011&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;env&lt;/code&gt;：如果设置了 &lt;code&gt;key: value&lt;/code&gt; 类型的环境变量，此处会发送给 Pilot 进程。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;traceSampling&lt;/code&gt;：跟踪取样率，会被设置到 &lt;code&gt;PILOT_TRACE_SAMPLING&lt;/code&gt; 环境变量中。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodeaffinity&lt;/code&gt; 模板：来自 &lt;code&gt;templates/_affinity.tpl&lt;/code&gt;，用于设置节点亲和性。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;service-yaml&#34;&gt;service.yaml&lt;/h2&gt;

&lt;p&gt;这里并无特殊设置，开放如下几个端口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;15010：gRPC 的 xDS 端口&lt;/li&gt;
&lt;li&gt;15011：mTLS 的 xDS 端口&lt;/li&gt;
&lt;li&gt;8080：传统 http 端口&lt;/li&gt;
&lt;li&gt;9093：监控端口&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;

&lt;p&gt;对 Pilot 的资源设置较大，同时 1.0.0 之后屡次出现 Pilot 内存消耗巨大的 Issue，其中的跟踪采样、GC 调试以及 Sidecar 注入方面应该都还有挖掘的潜力。但是很可惜 Pilot 的环境变量并无文档，须待日后进一步完善。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
