<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>helm | 伪架构师</title>
    <link>/tags/helm/</link>
      <atom:link href="/tags/helm/index.xml" rel="self" type="application/rss+xml" />
    <description>helm</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Thu, 08 Aug 2019 00:57:37 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>helm</title>
      <link>/tags/helm/</link>
    </image>
    
    <item>
      <title>Helm 和 Kustomize：不只是含谷量的区别</title>
      <link>/post/helm-vs-kustomize/</link>
      <pubDate>Thu, 08 Aug 2019 00:57:37 +0800</pubDate>
      <guid>/post/helm-vs-kustomize/</guid>
      <description>

&lt;p&gt;Kustomize 问世的时候，我是比较鄙视的——非要造个谷歌的轮子么？不过最近抽出时间熟悉了一下 Kustomize，发现我还是带了有色眼镜。二者功能虽然有所重叠，但是工作思路的差别还是很大的，下面就简单做一点比较，权当引玉之砖。&lt;/p&gt;

&lt;h2 id=&#34;helm&#34;&gt;Helm&lt;/h2&gt;

&lt;p&gt;Helm 是 Kubernetes 中的第一个对应用程序进行管理的支撑工具，经常会拿来同 Yum、apt 等工具进行类比。Helm 由几个不同的组件构成：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI：客户端工具，有几大功能

&lt;ul&gt;
&lt;li&gt;从 Chart 服务器获取列表、搜索 Chart 项目&lt;/li&gt;
&lt;li&gt;安装 Chart&lt;/li&gt;
&lt;li&gt;构建 Chart&lt;/li&gt;
&lt;li&gt;充当 Chart 服务器&lt;/li&gt;
&lt;li&gt;和 Tiller 协同管理应用生命周期&lt;/li&gt;
&lt;li&gt;渲染 Chart 为 Kubernetes 生成 YAML&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Tiller：需要用特定授权和 API Server 进行通信，Kubernetes 集群内外部署都可以。

&lt;ul&gt;
&lt;li&gt;它是 Helm 的内鬼，负责接收来自 Cli 的指令，完成对集群内应用生命周期的控制。&lt;/li&gt;
&lt;li&gt;3.0 中将取消 Tiller。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Repository：

&lt;ul&gt;
&lt;li&gt;是存储 Helm Chart 的仓库，可以被 Cli 工具缓存、检索，CLI 也可以获取 Chart 进行后续操作。&lt;/li&gt;
&lt;li&gt;和 Tiller 一样，Repository 也不是必要组件，CLI 完全可以仅在本地工作。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;helm-chart&#34;&gt;Helm Chart&lt;/h3&gt;

&lt;p&gt;Helm 使用 Chart 对应用程序进行描述，它使用 Go Template 对应用部署所需的 YAML 进行抽象，形成应用部署模板，在需要进行部署时，可以编写 yaml 为模板中的变量进行赋值，也可以在 Helm CLI 的命令行中使用 &lt;code&gt;--set name=value&lt;/code&gt; 的方式来对简单变量进行赋值，完成赋值之后，可以选择使用 &lt;code&gt;helm template&lt;/code&gt; 指令将 Chart + Value 的组合渲染成为 YAML 供 &lt;code&gt;kubectl&lt;/code&gt; 使用，也可以使用 &lt;code&gt;helm install&lt;/code&gt; 直接通过 Tiller 进行安装。&lt;/p&gt;

&lt;h3 id=&#34;helm-的特色&#34;&gt;Helm 的特色&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;强大的生命周期管理：有 Tiller 的帮助，可以实现对应用程序实例（Release）的查询、安装、卸载、升级、回滚等复杂操作。&lt;/li&gt;
&lt;li&gt;严格的基础版本管控：Chart 是一种模板，Chart 的用户仅能通过对 &lt;code&gt;values&lt;/code&gt; 的控制来定制应用的部署行为，模板中没有提供变量的位置，是无法在下游直接进行变更的。&lt;/li&gt;
&lt;li&gt;方便的命令行：对于简单变量，可以在部署的同时直接指定内容，方便部署。&lt;/li&gt;
&lt;li&gt;插件和工具：Helm 拥趸众多，提供了不少用于 CICD 或者其它方面辅助功能的插件和工具。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;kustomize&#34;&gt;Kustomize&lt;/h2&gt;

&lt;p&gt;Kustomize 是一个新晋选手，只有一个 CLI 工具，在 Kubernetes 1.14 之后，甚至这唯一的工具也成为 kubectl 的一部分，可以说是很轻量级了。&lt;/p&gt;

&lt;h3 id=&#34;base-overlay&#34;&gt;Base + Overlay&lt;/h3&gt;

&lt;p&gt;在 Kustomize 的文档中明确说明：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;kustomize is a command line tool supporting template-free, structured customization of declarative configuration targetted to k8s-style objects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;它放弃了对模板的要求，改用 Base + Overlay 的方式对应用的原始 YAML 进行&lt;code&gt;派生&lt;/code&gt;。&lt;code&gt;Overlay&lt;/code&gt;，顾名思义，就是覆盖。Kustomize 的 Overlay 可以在 Base 的基础上，通过对 &lt;code&gt;resource&lt;/code&gt;、&lt;code&gt;generator&lt;/code&gt;、&lt;code&gt;transformer&lt;/code&gt; 等的定义，形成新的应用定义，不论 Base
还是 Overlay，都可以通过 &lt;code&gt;kustomize build&lt;/code&gt; 生成有效的 YAML。&lt;/p&gt;

&lt;h3 id=&#34;kustomize-的特色&#34;&gt;Kustomize 的特色&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;功能简单清晰，kubectl 直接支持。&lt;/li&gt;
&lt;li&gt;不考虑派生，仅作为应用的 YAML 组织方式也很有帮助。&lt;/li&gt;
&lt;li&gt;也有自己的插件系统。例如可以用简单的 YAML 定义，使用文件生成 Configmap/Secret。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;比较&#34;&gt;比较&lt;/h2&gt;

&lt;p&gt;Kustomize 自称因为去掉了模板语法，更易使用，对此我保留看法，如果仅就入门使用来看，二者差异并不大。&lt;/p&gt;

&lt;p&gt;Tiller 和 Repository 都并非必须，因此在部署上，Kustomize 的优势也不是很大。&lt;/p&gt;

&lt;p&gt;我认为他们的区别主要在工作流程上：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helm 的基础流程比较&lt;code&gt;瀑布&lt;/code&gt;：定义 Chart-&amp;gt;填充-&amp;gt;运行，在 Chart 中没有定义的内容是无法更改的；&lt;/li&gt;
&lt;li&gt;Kustomize 的用法比较&lt;code&gt;迭代&lt;/code&gt;：Base 和 Overlay 都是可以独立运作的，增加新对象，或者对编写 Base 时未预料的内容进行变更，都不在话下。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;例如我们定义了一个很基础的应用，由 Deployment + Service 组成，如果后续部署中需要完成两个变更：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新建 Ingress 对象&lt;/li&gt;
&lt;li&gt;修改镜像地址/名称/TAG&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在 Helm 中需要：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在 Chart 中加入对 Ingress 的定义&lt;/li&gt;
&lt;li&gt;用变量控制 Ingress 是否进行渲染&lt;/li&gt;
&lt;li&gt;Ingress 模板应该包含特定的主机名、注解等变量&lt;/li&gt;
&lt;li&gt;把镜像也定义成变量&lt;/li&gt;
&lt;li&gt;在 Values.yaml 中对这些变量进行赋值。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;而在 Kustomize 中：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;无需对 Base 进行修改&lt;/li&gt;
&lt;li&gt;直接在新的 Overlay 中写入 Ingress Resource&lt;/li&gt;
&lt;li&gt;使用内置的 &lt;code&gt;image transformer&lt;/code&gt; 替换原有镜像&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;要公开发布一个较为复杂的应用，例如 &lt;code&gt;Istio&lt;/code&gt;，编写良好的 Chart 能给用户很大帮助，用户在缺失一点发挥空间的情况下，通过对 &lt;code&gt;values.yaml&lt;/code&gt; 的阅读，就能对这种复杂的部署产生一个较为深入的认识。&lt;/p&gt;

&lt;p&gt;如果是常见的业务应用，因为不同部署之间的差异不大，但是未必可以提前做好变化限制，用 Kustomize 可能会是一个更好的选择。&lt;/p&gt;

&lt;h2 id=&#34;相关链接&#34;&gt;相关链接&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Helm：&lt;code&gt;https://helm.sh/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Kustomize：&lt;code&gt;https://github.com/kubernetes-sigs/kustomize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Helm 3.0：&lt;code&gt;https://helm.sh/blog/helm-3-preview-pt1/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Helm 工具：&lt;code&gt;https://www.infoq.cn/article/UemPsPu_AlzemkGEqb4Z&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Awesome Helm：&lt;code&gt;https://github.com/cdwv/awesome-helm&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <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>
    
    <item>
      <title>Istio Helm Chart 详解 - Mixer</title>
      <link>/post/istio-helm-deep-dive-mixer/</link>
      <pubDate>Mon, 05 Nov 2018 16:37:23 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-mixer/</guid>
      <description>

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

&lt;p&gt;Mixer 是 Istio 的核心组件之一，负责服务网格中的遥测和策略两部分重要功能，因此 Mixer 的部署也分成了 Policy 和 Telemetry 两部分。&lt;/p&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;mixer:
  enabled: true
  replicaCount: 1
  autoscaleMin: 1
  autoscaleMax: 5
  image: mixer

  istio-policy:
    autoscaleEnabled: true
    autoscaleMin: 1
    autoscaleMax: 5
    cpu:
      targetAverageUtilization: 80

  istio-telemetry:
    autoscaleEnabled: true
    autoscaleMin: 1
    autoscaleMax: 5
    cpu:
      targetAverageUtilization: 80

  prometheusStatsdExporter:
    hub: docker.io/prom
    tag: v0.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里看到，和我们前面说到的功能分离相同，Policy 和 Telemetry 两个组件也是分别设置了各自的变量。根据前面几篇的经验看，&lt;code&gt;istio-policy&lt;/code&gt; 和 &lt;code&gt;istio-telemetry&lt;/code&gt; 两部分是用于控制两个部署的自动伸缩。而 &lt;code&gt;prometheusStatsdExporter&lt;/code&gt; 部分则是指定了一个镜像，用于提供 Prometheus 监控使用。而从 &lt;code&gt;enable&lt;/code&gt; 位置来看，两个组件是不推荐单独启用的，但是 HPA 是可以分别设置的。&lt;/p&gt;

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

&lt;p&gt;这里可以看到，Mixer 的两个组件使用的是同一个 &lt;code&gt;istio-mixer-service-account&lt;/code&gt;，根据对 &lt;code&gt;clusterole.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;读写&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;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&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;customresourcedefinitions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;quot;configmaps&amp;quot;, &amp;quot;endpoints&amp;quot;, &amp;quot;pods&amp;quot;, &amp;quot;services&amp;quot;, &amp;quot;namespaces&amp;quot;, &amp;quot;secrets&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;replicasets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读&lt;/td&gt;
&lt;/tr&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;replicasets&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;autoscale-yaml&#34;&gt;&lt;code&gt;autoscale.yaml&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;这里用了一个循环：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;{{- range $key, $spec := .Values }}
{{- if or (eq $key &amp;quot;istio-policy&amp;quot;) (eq $key &amp;quot;istio-telemetry&amp;quot;) }}
{{- if and $spec.autoscaleEnabled $spec.autoscaleMin }}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;分别遍历全局变量中的 &lt;code&gt;mixer.istio-policy&lt;/code&gt; 和 &lt;code&gt;mixer.istio-telemetry&lt;/code&gt;，使用各自的 HPA 参数对伸缩过程进行配置。&lt;/p&gt;

&lt;p&gt;两个 HPA 对象的名字来自上面的循环：&lt;code&gt;istio-policy&lt;/code&gt; 和 &lt;code&gt;istio-telemetry&lt;/code&gt;。引用变量包括这两个分组中的所有变量。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里不难发现 Mixer 中的根级变量 &lt;code&gt;autoscaleMin&lt;/code&gt;、&lt;code&gt;autoscaleMax&lt;/code&gt; 是无用的，该问题在新版本中已经修正。&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;和 HPA 的情况类似，这里用循环的方式生成了两个 Service，分别为 &lt;code&gt;istio-policy&lt;/code&gt; 和 &lt;code&gt;istio-telemetry&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;端口方面，两个服务都开放了 &lt;code&gt;grpc-mixer&lt;/code&gt;、&lt;code&gt;grcp-mixer-mtls&lt;/code&gt; 以及 &lt;code&gt;http-monitoring&lt;/code&gt; 三个端口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grpc-mixer: 9091&lt;/code&gt;：用于 Mixer 的 gRPC API 端口。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grpc-mixer-mtls: 15004&lt;/code&gt;：启用 mtls 的时候使用的 API 端口。如果启用了 controlPlaneAuthPolicy，则使用该端口进行 Mixer API 通信。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http-monitoring&lt;/code&gt;：用于监测 Mixer 存活状态。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外如果是 &lt;code&gt;istio-telemetry&lt;/code&gt;，还多定义了一个端口 &lt;code&gt;prometheus&lt;/code&gt;，Prometheus 可以从这一端口获取遥测数据。&lt;/p&gt;

&lt;p&gt;此处仅引用了 &lt;code&gt;Chart&lt;/code&gt; 和 &lt;code&gt;Release&lt;/code&gt; 的全局变量。&lt;/p&gt;

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

&lt;p&gt;这个组件用来把 Envoy 的 Statsd 指标转换为 Promtheus 指标。这里包含了 Service 和 Deployment 两部分。&lt;/p&gt;

&lt;h3 id=&#34;deployment&#34;&gt;Deployment&lt;/h3&gt;

&lt;p&gt;这里实际上是引用了 Prom 的一个 &lt;a href=&#34;https://github.com/prometheus/statsd_exporter&#34; target=&#34;_blank&#34;&gt;Exporter&lt;/a&gt;，除了引用了 &lt;code&gt;Chart&lt;/code&gt; 和 &lt;code&gt;Release&lt;/code&gt; 全局变量之外，还使用了如下几个变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prometheusStatsdExporter.hub&lt;/code&gt;：镜像仓库的地址。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prometheusStatsdExporter.tag&lt;/code&gt;：镜像版本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.imagePullPolicy&lt;/code&gt;：镜像拉取策略。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prometheusStatsdExporter.resources&lt;/code&gt;：可以定义这一 Pod 的资源使用策略。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodeSelector&lt;/code&gt;：可以根据资源情况，为该 Pod 进行节点选择，避免资源争用。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;除去上面的变量之外，还可以看到如下信息：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;该 Pod 不接受自动注入。&lt;/li&gt;
&lt;li&gt;开放了 TCP 端口 9102 以及 UDP 端口 9125。&lt;/li&gt;
&lt;li&gt;加载一个 ConfigMap：istio-statsd-prom-bridge，用于配置文件。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;上文提到的 Configmap 来自于模板文件 &lt;code&gt;configmap.yaml&lt;/code&gt;，这一文件没有提供任何额外配置。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;service&#34;&gt;Service&lt;/h3&gt;

&lt;p&gt;这里声明了 Exporter 的端口使用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TCP 端口 9102 提供给 Prometheus 进行数据抓取。&lt;/li&gt;
&lt;li&gt;UDP 端口 9125，Envoy 会发送指标进入 Exporter。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;autoscale-yaml-1&#34;&gt;&lt;code&gt;autoscale.yaml&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;这里使用 &lt;code&gt;values.yaml&lt;/code&gt; 中定义的内容，分别给 Telemetry 和 Policy 两个组件定义了各自的自动伸缩。&lt;/p&gt;

&lt;p&gt;缺省情况下，都是最少单副本，最多 5 副本，平均 CPU 用量 80%。&lt;/p&gt;

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

&lt;p&gt;这个文件稍微有点古怪，首先分别定义了 &lt;code&gt;policy_container&lt;/code&gt; 和 &lt;code&gt;telemetry_container&lt;/code&gt; 两个模板，然后在文件尾部进行合并。&lt;/p&gt;

&lt;h3 id=&#34;policy-container&#34;&gt;policy_container&lt;/h3&gt;

&lt;p&gt;这个 Deployment 负责 Mixer 的策略实施功能，其主进程为 &lt;a href=&#34;https://istio.io/docs/reference/commands/mixs/&#34; target=&#34;_blank&#34;&gt;mixs&lt;/a&gt;，并且注入了 Sidecar。除了 Chart 和 Release 之外，引用全局变量包括：&lt;/p&gt;

&lt;ul&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.hub&lt;/code&gt;：镜像仓库。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.tag&lt;/code&gt;：镜像标签。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image&lt;/code&gt;：镜像名称，如果名称中包含 &lt;code&gt;/&lt;/code&gt;，则忽略 &lt;code&gt;global.hub&lt;/code&gt; 和 &lt;code&gt;global.tag&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resource&lt;/code&gt; 和 &lt;code&gt;global.defaultResources&lt;/code&gt;：如果没有特别定义资源限制，则沿用 Chart 设计的缺省限制。&lt;strong&gt;需要注意的是，Policy 和 Telemetry 的两个组件，资源设置是共享的同一套值。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.controlPlaneSecurityEnabled&lt;/code&gt;：根据这个参数来设置 &lt;strong&gt;istio-proxy&lt;/strong&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;：如果没有定义全局的 Proxy 资源限制，也会沿用缺省限制。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;mixs policy&lt;/code&gt; 进程使用了 &lt;code&gt;unix:///sock/mixer.socket&lt;/code&gt; 进行监听，这一点在 Envoy 配置中也有对应的处理。&lt;/p&gt;

&lt;h3 id=&#34;telemetry-container&#34;&gt;telemetry_container&lt;/h3&gt;

&lt;p&gt;该容器仅在命令行（&lt;code&gt;args&lt;/code&gt;）上和 &lt;code&gt;policy&lt;/code&gt; Pod 有差别，就无需介绍了。&lt;/p&gt;

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

&lt;p&gt;这里包含了 Mixer 初始配置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/#AttributeManifest&#34; target=&#34;_blank&#34;&gt;attributemanifest&lt;/a&gt;：

&lt;ul&gt;
&lt;li&gt;istioproxy：定义了 Sidecar 中的属性清单。&lt;/li&gt;
&lt;li&gt;kubernetes：Kubernetes 相关的属性清单。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/adapters/stdio/&#34; target=&#34;_blank&#34;&gt;stdio&lt;/a&gt;：定义使用 JSON 格式进行输出的 stdio handler。&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/templates/logentry/&#34; target=&#34;_blank&#34;&gt;logentry&lt;/a&gt;：定义了两个不同用途的日志模板实例，用不同属性组成不同内容，用于记录访问日志：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;accesslog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpaccesslog&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/templates/metric/&#34; target=&#34;_blank&#34;&gt;metric&lt;/a&gt; 对象用于定义遥测数据的结构清单：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requestcount&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requestduration&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requestsize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;responsesize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpbytesent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpbytereceived&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/adapters/prometheus/&#34; target=&#34;_blank&#34;&gt;prometheus&lt;/a&gt; Handler：把前面定义的 &lt;code&gt;metric&lt;/code&gt; 实例逐个映射为 Prometheus 的监控指标。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/adapters/kubernetesenv/&#34; target=&#34;_blank&#34;&gt;kubernetesenv&lt;/a&gt;：该 Handler 为 Mixer 提供 Kubernetes 集群的连接。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/templates/kubernetes/&#34; target=&#34;_blank&#34;&gt;kubernetes&lt;/a&gt;：用于生成 Kubernetes 相关的数据。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/&#34; target=&#34;_blank&#34;&gt;rule&lt;/a&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stdio&lt;/code&gt;：定义一条规则，将 &lt;code&gt;http&lt;/code&gt; 和 &lt;code&gt;grpc&lt;/code&gt; 协议的访问日志，用 &lt;code&gt;accesslog&lt;/code&gt; 的样式输出到 &lt;code&gt;stdio&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stdiotcp&lt;/code&gt;：定义一条规则，将 &lt;code&gt;http&lt;/code&gt; 和 &lt;code&gt;grpc&lt;/code&gt; 协议的访问日志，用 &lt;code&gt;tcpaccesslog&lt;/code&gt; 的样式输出到 &lt;code&gt;stdio&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;promhttp&lt;/code&gt;：将 &lt;code&gt;http&lt;/code&gt; 和 &lt;code&gt;grpc&lt;/code&gt; 协议产生的 &lt;code&gt;requestcount&lt;/code&gt;、&lt;code&gt;requestduration&lt;/code&gt;、&lt;code&gt;requestsize&lt;/code&gt; 以及 &lt;code&gt;responsesize&lt;/code&gt; 四种指标送入前面建立的 Prometheus handler。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;promtcp&lt;/code&gt;：将 &lt;code&gt;tcp&lt;/code&gt; 协议产生的 &lt;code&gt;tcpbytesent&lt;/code&gt; 和 &lt;code&gt;tcpbytereceived&lt;/code&gt; 指标送入前面建立的 Prometheus handler。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubeattrgenrulerule&lt;/code&gt;：将 &lt;code&gt;kubernetesenv&lt;/code&gt; 生成的数据交由 &lt;code&gt;kubernetes&lt;/code&gt; 属性模板处理。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpkubeattrgenrulerule&lt;/code&gt;：将 &lt;code&gt;kubernetesenv&lt;/code&gt; 生成的 tcp 通信相关数据交由 &lt;code&gt;kubernetes&lt;/code&gt; 属性模板处理。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;目标规则：两条规则分别定义了到 policy 和 &lt;code&gt;telemetry&lt;/code&gt;控制器的连接池，如果启用了 &lt;code&gt;controlPlaneSecurityEnabled&lt;/code&gt;，则加入对 15004 端口的 tls 定义。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;在 Istio 中 Mixer 一直是一个备受争议的组件，一方面表达了 Istio 的远大设计目标，另一方面因为自身结构以及众多 Adapter 的缺陷，持续遭到用户诟病，因此也是目前为止部署体系变化最大的一块，相信后续版本中，Mixer 还会做出频繁的好的和坏的变更。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Istio Helm Chart 详解 - Galley</title>
      <link>/post/istio-helm-deep-dive-galley/</link>
      <pubDate>Sat, 27 Oct 2018 15:50:59 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-galley/</guid>
      <description>

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

&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/commands/galley/&#34; target=&#34;_blank&#34;&gt;Galley&lt;/a&gt; 是 Istio 的配置管理组件，根据&lt;a href=&#34;https://preliminary.istio.io/zh/docs/concepts/what-is-istio/#galley&#34; target=&#34;_blank&#34;&gt;官方文档&lt;/a&gt;的描述：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Galley 代表其他的 Istio 控制平面组件，用来验证用户编写的 Istio API 配置。随着时间的推移，Galley 将接管 Istio 获取配置、 处理和分配组件的顶级责任。它将负责将其他的 Istio 组件与从底层平台（例如 Kubernetes）获取用户配置的细节中隔离开来。&lt;/p&gt;
&lt;/blockquote&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;galley:
  enabled: true
  replicaCount: 1
  image: galley
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里看到，Galley 的相关变量只有启用、副本数量以及镜像三个。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;enabled&lt;/code&gt;：负责在 &lt;code&gt;requirements.yaml&lt;/code&gt; 中标识是否启用 Galley 组件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replicaCount&lt;/code&gt;：负责在 &lt;code&gt;deployment.yaml&lt;/code&gt; 中定义副本数量。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image&lt;/code&gt;：负责在 &lt;code&gt;deployment.yaml&lt;/code&gt; 中定义镜像。&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;这里可以看到 Galley 使用 Service Account &lt;code&gt;istio-galley-service-account&lt;/code&gt; 的身份运行。全局变量中如果定义了 &lt;code&gt;imagePullSecrets&lt;/code&gt;，则会在 &lt;code&gt;serviceaccount.yaml&lt;/code&gt; 中进行引用。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;clusterrole.yaml&lt;/code&gt; 模板中定义了 Galley 所需使用的系统资源：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对 &lt;code&gt;admissionregistration.k8s.io&lt;/code&gt; 组中的 &lt;code&gt;validatingwebhookconfigurations&lt;/code&gt; 类型的完全控制。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config.istio.io&lt;/code&gt;： Mixer CRD 的所有资源的读取权限。&lt;/li&gt;
&lt;li&gt;对 &lt;code&gt;istio-galley&lt;/code&gt; Deployment 和 Endpoint 的读取权限。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;clusterrolebinding.yaml&lt;/code&gt; 将上面的两个对象连接起来完成授权。&lt;/p&gt;

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

&lt;p&gt;这里看到为 Galley 开放了两个端口：443 是一个 https 端口，用来提供验证服务；而 9093 是一个用来进行 Galley 自身服务监控的 http 端口。&lt;/p&gt;

&lt;p&gt;该文件只引用了 &lt;code&gt;Release&lt;/code&gt; 内置变量。&lt;/p&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/galley/&#34; target=&#34;_blank&#34;&gt;Galley&lt;/a&gt; 为主进程创建了一个 Deployment 对象。&lt;/p&gt;

&lt;p&gt;在 &lt;code&gt;annotation&lt;/code&gt; 一节中将 &lt;code&gt;sidecar.istio.io/inject&lt;/code&gt; 设置为 &lt;code&gt;false&lt;/code&gt; 来防止自动注入 Sidecar。&lt;/p&gt;

&lt;h3 id=&#34;全局变量&#34;&gt;全局变量&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Chart&lt;/li&gt;
&lt;li&gt;Release&lt;/li&gt;
&lt;li&gt;global.priorityClassName&lt;/li&gt;
&lt;li&gt;global.hub&lt;/li&gt;
&lt;li&gt;global.tag&lt;/li&gt;
&lt;li&gt;global.imagePullPolicy&lt;/li&gt;
&lt;li&gt;模板 nodeaffinity&lt;/li&gt;
&lt;li&gt;global.defaultResources&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;变量使用细节&#34;&gt;变量使用细节&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;部署在 Istio 所属命名空间中。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;_helpers.tpl&lt;/code&gt; 中定义的模板给 App 标签赋值。&lt;/li&gt;
&lt;li&gt;使用 Chart 和 Release 变量生成 Deployment 标签。&lt;/li&gt;
&lt;li&gt;Chart 变量 &lt;code&gt;replicaCount&lt;/code&gt; 确定副本数量。&lt;/li&gt;
&lt;li&gt;如果定义了 &lt;code&gt;global.priorityClassName&lt;/code&gt;，则设置到 Pod 上，提高组件在集群内的优先级。&lt;/li&gt;
&lt;li&gt;使用 global.hub + image + global.tag 的方式设置镜像名称。&lt;/li&gt;
&lt;li&gt;如果 Chart 变量设置了 &lt;code&gt;resource&lt;/code&gt;，则使用独立的资源限制，否则使用缺省的 &lt;code&gt;global.defaultResources&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;使用缺省的节点亲和性定义。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;加载卷&#34;&gt;加载卷&lt;/h3&gt;

&lt;p&gt;加载了一个名为 &lt;code&gt;istio.istio-galley-service-account&lt;/code&gt; 的 Secret，注意这个资源的类型为 &lt;code&gt;istio.io/key-and-cert&lt;/code&gt;，说明是由 Citadel 生成的，其中包含了几个证书，供 &lt;code&gt;--caCertFile&lt;/code&gt;、&lt;code&gt;--tlsCertFile&lt;/code&gt; 和 &lt;code&gt;--tlsKeyFile&lt;/code&gt; 用来提供 https 服务。&lt;/p&gt;

&lt;p&gt;另外加载了一个 ConfigMap，其中的配置文件供 &lt;code&gt;--webhook-config-file&lt;/code&gt; 参数使用，作为 Webhook 的参数。这个 ConfigMap 是由模板 &lt;code&gt;configmap.yaml&lt;/code&gt; 和 &lt;code&gt;validatingwehookconfiguration.yaml.tpl&lt;/code&gt; 生成的，后面将会进行讲解。&lt;/p&gt;

&lt;h2 id=&#34;configmap-yaml-以及-validatingwehookconfiguration-yaml-tpl&#34;&gt;configmap.yaml 以及 validatingwehookconfiguration.yaml.tpl&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;configmap.yaml&lt;/code&gt; 模板中并没有实质内容，主要内容存在于 &lt;code&gt;validatingwehookconfiguration.yaml.tpl&lt;/code&gt; 之中。&lt;/p&gt;

&lt;p&gt;这个模板中定义了一个 &lt;a href=&#34;https://docs.okd.io/latest/rest_api/apis-admissionregistration.k8s.io/v1beta1.ValidatingWebhookConfiguration.html#object-schema&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;ValidatingWebhookConfiguration&lt;/code&gt;&lt;/a&gt; 类型的资源。这种资源用于在不改变资源的情况下，对其进行校验并发出接受或拒绝的决策。&lt;/p&gt;

&lt;h3 id=&#34;引用全局变量&#34;&gt;引用全局变量&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Chart&lt;/code&gt; 和 &lt;code&gt;Release&lt;/code&gt;：用于生成标签和命名空间。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.configValidation&lt;/code&gt;：如果这一变量为 True，才会生成后续内容。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;webhook&#34;&gt;Webhook&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;webhooks&lt;/code&gt; 一节定义了两个元素，分别用于 Pilot 和 Mixer 的校验。以 Mixer 部分为例。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;clientConfig&lt;/code&gt; 一节，定义了这个 Webhook 会调用的校验服务，标准情况下会使用 Istio 所在的命名空间的 &lt;code&gt;istio-galley&lt;/code&gt;，URL 相对路径为 &lt;code&gt;/admitmixer&lt;/code&gt;，其中的 &lt;code&gt;rules&lt;/code&gt; 内容，定义了针对 &lt;code&gt;config.istio.io/v1alpha2&lt;/code&gt; 的一系列对象的创建和更新操作进行校验，如果校验失败，则拒绝创建（&lt;code&gt;failurePolicy: Fail&lt;/code&gt;）。&lt;/p&gt;

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

&lt;p&gt;Galley 目前的文档非常少，主要在&lt;a href=&#34;https://istio.io/zh/docs/reference/commands/galley/&#34; target=&#34;_blank&#34;&gt;参考&lt;/a&gt;和&lt;a href=&#34;https://istio.io/zh/help/ops/setup/validation/&#34; target=&#34;_blank&#34;&gt;运维指南&lt;/a&gt;部分有一点介绍，但 Istio 的配置难度是很著名的，因此推测随着项目的推进和普及，Galley 会持续的增强，并提供更多这方面的文档。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Istio Helm Chart 详解 - SidecarInjectorWebhook</title>
      <link>/post/istio-helm-deep-dive-injector-webhook/</link>
      <pubDate>Sun, 21 Oct 2018 19:56:03 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-injector-webhook/</guid>
      <description>

&lt;blockquote&gt;
&lt;p&gt;《Istio Helm Chart 详解》系列的第五篇，介绍 Chart SidecarInjectorWebhook，负责对工作负载进行自动注入。&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;这个 Chart 负责 Istio Sidecar 的自动注入操作相关配置。&lt;/p&gt;

&lt;p&gt;关于自动注入操作的相关内容，可以参考&lt;a href=&#34;https://preliminary.istio.io/zh/docs/setup/kubernetes/sidecar-injection/&#34; target=&#34;_blank&#34;&gt;官方文档中的相应章节&lt;/a&gt;，简单说来自动注入的两个先决条件：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kubernetes 版本大于 1.9。&lt;/li&gt;
&lt;li&gt;启用了 &lt;code&gt;MutatingAdmissionWebhook&lt;/code&gt; 和 &lt;code&gt;ValidatingAdmissionWebhook&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;还有一点，在 Kubernetes 1.10 版本中的 AlwaysPullImage 会和自动注入功能冲突&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;代码中可以看到，这一 Chart 生成了自动注入所需的 Deployment、Service，运行依赖的 RBAC 资源，以及自定义资源。&lt;/p&gt;

&lt;p&gt;这个 Chart 会生成 &lt;code&gt;MutatingWebhookConfiguration&lt;/code&gt; 类型的自定义资源，根据对命名空间以及 Pod 注解的监控对新生成的 Pod 进行注入。可以通过对这一自定义资源的修改，结合 ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt; 的内容对注入行为进行控制，后面将会进行讲解。&lt;/p&gt;

&lt;h2 id=&#34;values-yaml-中的变量定义&#34;&gt;&lt;code&gt;values.yaml&lt;/code&gt; 中的变量定义&lt;/h2&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;sidecarInjectorWebhook:
  enabled: true
  replicaCount: 1
  image: sidecar_injector
  enableNamespacesByDefault: false
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;chart-yaml-和-helpers-tpl&#34;&gt;Chart.yaml 和 _helpers.tpl&lt;/h2&gt;

&lt;p&gt;都是标准的 Helm Chart 文件，无需说明。&lt;/p&gt;

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

&lt;p&gt;类似其它 Chart，这里也使用 &lt;code&gt;serviceaccount.yaml&lt;/code&gt;、&lt;code&gt;clusterrolebinding.yaml&lt;/code&gt; 和 &lt;code&gt;clusterrole.yaml&lt;/code&gt; 三个文件来进行赋权操作。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;serviceaccount.yaml&lt;/code&gt; 中，引用变量除了 &lt;code&gt;Chart&lt;/code&gt; 和 &lt;code&gt;Release&lt;/code&gt; 两组保留变量之外，还引用到 &lt;code&gt;global.imagePullSecrets&lt;/code&gt;，用于 ServiceAccount 的镜像拉取授权。&lt;/p&gt;

&lt;p&gt;而 &lt;code&gt;clusterrole.yaml&lt;/code&gt; 文件中的 &lt;code&gt;rules&lt;/code&gt; 则表明，这个功能运行需要读取 ConfigMap，以及对前面提到的 &lt;code&gt;MutatingWebhookConfiguration&lt;/code&gt; 资源的读写。&lt;/p&gt;

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

&lt;p&gt;这里创建了一个开放 443 端口的服务。&lt;/p&gt;

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

&lt;p&gt;该文件所生成的 Deployment 是自动注入 Web hook 的主体。&lt;/p&gt;

&lt;p&gt;引用变量大致如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Release.Namespace&lt;/code&gt;：Istio 所在命名空间。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template &amp;quot;sidecar-injector.name&amp;quot; .&lt;/code&gt;：定义在 &lt;code&gt;_helpers.tpl&lt;/code&gt; 中，命名规则基本等同于 Release。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Chart&lt;/code&gt; 以及 &lt;code&gt;Release&lt;/code&gt; 变量：Helm 内置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.tag&lt;/code&gt; 和 &lt;code&gt;global.hub&lt;/code&gt;：镜像的前后缀&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.priorityClassName&lt;/code&gt;：Kubernetes PriorityClass 定义。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.imagePullPolicy&lt;/code&gt;：镜像拉取策略。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replicaCount&lt;/code&gt;：Deployment 的副本数量。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image&lt;/code&gt;：镜像名称，前后缀由全局变量控制，这里&lt;strong&gt;不可直接指定完整镜像地址&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources&lt;/code&gt; 和 &lt;code&gt;global.defaultResources&lt;/code&gt;：优先使用 Chart 资源定义。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodeaffinity&lt;/code&gt;：沿用全局节点亲和性定义。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这里会看到 Pod 模板中带有一个新的注解：&lt;code&gt;sidecar.istio.io/inject: &amp;quot;false&amp;quot;&lt;/code&gt;，该注解用于告知 Webhook，这个 Pod 无需进行注入，具体配置方式会在后面的 ConfigMap 部分解释。&lt;/p&gt;

&lt;p&gt;其中运行的主进程为 &lt;code&gt;sidecar-injector&lt;/code&gt;，官方有提供详细的&lt;a href=&#34;https://preliminary.istio.io/zh/docs/reference/commands/sidecar-injector/#sidecar-injector-probe&#34; target=&#34;_blank&#34;&gt;使用参考&lt;/a&gt;。对比一下会发现，除了显示的 &lt;code&gt;args&lt;/code&gt; 之外，这一命令有一个默认的 443 端口，和前面 Service 的定义一致。&lt;/p&gt;

&lt;p&gt;加载卷：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;istio&lt;/code&gt; ConfigMap：它的内容被加载到 &lt;code&gt;/etc/istio/config&lt;/code&gt;，作为 &lt;code&gt;sidecar-injector&lt;/code&gt; 的 &lt;code&gt;meshConfig&lt;/code&gt; 参数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;istio-sidecar-injector&lt;/code&gt; ConfigMap：被加载到路径 &lt;code&gt;/etc/istio/inject&lt;/code&gt;，它代表的注入配置，用作 &lt;code&gt;injectConfig&lt;/code&gt; 参数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;istio.istio-sidecar-injector-service-account&lt;/code&gt; Secret：来自于前面渲染的 ServiceAccount，会被加载到 &lt;code&gt;/etc/istio/certs&lt;/code&gt;，用作证书使用。&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;这一文件的渲染所生成的资源会对 MutatingWebhook 的执行产生一些影响。&lt;/p&gt;

&lt;p&gt;应用变量除了 Helm 的保留变量之外，使用了本地的 &lt;code&gt;enableNamespacesByDefault&lt;/code&gt;，来确定是否缺省为命名空间启用自动注入。如果启用了缺省注入，那么所有命名空间除非定义了 &lt;code&gt;istio-injection: disabled&lt;/code&gt; 的标签，否则都会进行注入；如果没有启用，则只有被标签 &lt;code&gt;istio-injection: enabled&lt;/code&gt; 的命名空间才会进行自动注入。&lt;/p&gt;

&lt;p&gt;渲染结果是一个 &lt;code&gt;MutatingWebhookConfiguration&lt;/code&gt; 类型的资源，该资源包含了一系列的 &lt;code&gt;webhook&lt;/code&gt; 元素，这里用一个 &lt;code&gt;sidecar-injector.istio.io&lt;/code&gt; webhook 定义了注入过程的触发时机为 Pod 的创建期间，命名空间则用了上面说到的表达式来进行选择。&lt;/p&gt;

&lt;p&gt;这一配置的具体格式可以参考 &lt;a href=&#34;https://docs.okd.io/latest/rest_api/apis-admissionregistration.k8s.io/v1beta1.MutatingWebhookConfiguration.html&#34; target=&#34;_blank&#34;&gt;OKD 官方文档&lt;/a&gt;。&lt;/p&gt;

&lt;h2 id=&#34;sidecar-injector-configmap-yaml&#34;&gt;sidecar-injector-configmap.yaml&lt;/h2&gt;

&lt;p&gt;这个模板的内容，是 Istio Sidecar 自动注入过程中的主要配置。&lt;/p&gt;

&lt;p&gt;首先要查看 &lt;code&gt;global.omitSidecarInjectorConfigMap&lt;/code&gt; 变量，如果这一变量为 &lt;code&gt;true&lt;/code&gt;，则不会生成该配置。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;policy&lt;/code&gt; 字段来自 &lt;code&gt;global.proxy.autoInject&lt;/code&gt;：可选值包括 &lt;code&gt;enabled&lt;/code&gt; 和 &lt;code&gt;disabled&lt;/code&gt;，如果选择 &lt;code&gt;enabled&lt;/code&gt;，那么缺省情况下会进行注入，除非 Pod 中注解 &lt;code&gt;sidecar.istio.io/inject&lt;/code&gt; 为 &lt;code&gt;false&lt;/code&gt;；&lt;code&gt;disabled&lt;/code&gt; 则缺省不注入，除非注解 &lt;code&gt;sidecar.istio.io/inject&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;template&lt;/code&gt; 部分对 &lt;code&gt;istio-init&lt;/code&gt;、&lt;code&gt;enable-core-dump&lt;/code&gt; 以及 &lt;code&gt;istio-proxy&lt;/code&gt; 三个待注入容器进行了渲染。&lt;/p&gt;

&lt;h3 id=&#34;istio-init&#34;&gt;&lt;code&gt;istio-init&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;这个镜像会完成 Istio 的流量劫持过程，其主体进程是一个&lt;a href=&#34;https://github.com/istio/istio/blob/master/tools/deb/istio-iptables.sh&#34; target=&#34;_blank&#34;&gt;用于操作 iptables 的 Shell 脚本&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;如果 &lt;code&gt;global.proxy_init.image&lt;/code&gt; 中包含了 &lt;code&gt;/&lt;/code&gt;，则直接使用该名称；否则使用 &lt;code&gt;global.hub&lt;/code&gt; 和 &lt;code&gt;global.tag&lt;/code&gt; 进行拼装。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ObjectMeta 和 Spec 都来自于 Pod。ProxyConfig 和 MeshConfig 来自 istio-system 命名空间中的 istio ConfigMap。模板可以使用这些数据，对将要注入的容器和卷进行定义。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;global.imagePullPolicy&lt;/code&gt; 则定义了镜像的拉取策略。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;global.proxy.privileged&lt;/code&gt; 定义了初始化容器的特权模式。&lt;/p&gt;

&lt;h3 id=&#34;enable-core-dump&#34;&gt;&lt;code&gt;enable-core-dump&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;如果 &lt;code&gt;global.proxy.enableCoreDump&lt;/code&gt; 设置为 &lt;code&gt;true&lt;/code&gt;，则会生成这一容器。&lt;/p&gt;

&lt;p&gt;容器名称固定为 &lt;code&gt;{{ .Values.global.hub }}/proxy_init:{{ .Values.global.tag }}&lt;/code&gt;。&lt;/p&gt;

&lt;h3 id=&#34;istio-proxy&#34;&gt;&lt;code&gt;istio-proxy&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;这一容器的镜像可以在 Pod 注解 &lt;code&gt;sidecar.istio.io/proxyImage&lt;/code&gt; 中进行优先声明。如果没有该注解，则会使用 &lt;code&gt;{{ .Values.global.hub }}/{{ .Values.global.proxy.image }}:{{ .Values.global.tag }}&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;主进程为 &lt;code&gt;pilot-agent&lt;/code&gt;，官方提供了&lt;a href=&#34;https://istio.io/zh/docs/reference/commands/pilot-agent/&#34; target=&#34;_blank&#34;&gt;详细的命令文档&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;引用 Helm 变量包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;global.imagePullPolicy&lt;/code&gt;：镜像拉取策略。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.proxy.privileged&lt;/code&gt;：Sidecar 特权模式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.envoyStatsd&lt;/code&gt;：监控指标上报相关配置。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关于资源限制：&lt;/p&gt;

&lt;p&gt;可以在容器注解中加入 &lt;code&gt;sidecar.istio.io/proxyCPU&lt;/code&gt; 和 &lt;code&gt;sidecar.istio.io/proxyMemory&lt;/code&gt; 来设置 Sidecar 的 Request Resource，否则会使用 &lt;code&gt;proxy.resources&lt;/code&gt; 进行资源申请。&lt;/p&gt;

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

&lt;p&gt;可以看到，Sidecar 的自动配置过程有很多相关内容，包括命名空间和 Pod 的注解、标签，以及 Helm 中跨越几段的配置数据；而具体的 Sidecar 工作内容，则基本上是由 &lt;code&gt;istio&lt;/code&gt; 这一 ConfigMap 决定的。这部分内容将会延续到 Pilot、Mixer 的相关内容之中。&lt;/p&gt;

&lt;h2 id=&#34;参考文档&#34;&gt;参考文档&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://istio.io/zh/docs/setup/kubernetes/sidecar-injection/&#34; target=&#34;_blank&#34;&gt;Istio sidecar 的注入&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://istio.io/zh/docs/reference/commands/pilot-agent/&#34; target=&#34;_blank&#34;&gt;pilot-agent reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://istio.io/zh/help/ops/setup/injection/&#34; target=&#34;_blank&#34;&gt;Istio Webhook 运维指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://istio.io/zh/help/faq/&#34; target=&#34;_blank&#34;&gt;Istio FAQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Istio Helm Chart 详解 - Ingress</title>
      <link>/post/istio-helm-deep-dive-ingress/</link>
      <pubDate>Tue, 09 Oct 2018 14:25:42 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-ingress/</guid>
      <description>

&lt;blockquote&gt;
&lt;p&gt;这是《Istio Helm Chart 详解》系列的第三篇。开始逐个 Chart 进行阅读。&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;全局变量之后，接下来就是 Ingress 一节了，这个 Chart 只是个兼容选项，为 Istio 提供了传统 Kubernetes Ingress 的功能。&lt;code&gt;ingress.enabled&lt;/code&gt; 变量用于在 &lt;code&gt;requirements.yaml&lt;/code&gt; 中控制该 Chart 是否启用。&lt;/p&gt;

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

&lt;p&gt;元数据文件，无需赘述。&lt;/p&gt;

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

&lt;p&gt;该文件用于处理该模块的 &lt;a href=&#34;https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/&#34; target=&#34;_blank&#34;&gt;HPA 对象&lt;/a&gt;。引用变量如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ingress.autoscaleMin&lt;/strong&gt;：水平伸缩的 Pod 数量下限，另外该变量被赋值的情况下才会渲染 HPA 对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ingress.autoscaleMax&lt;/strong&gt;：水平伸缩的 Pod 数量上限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release.Namespace&lt;/strong&gt;：HPA 对象所在的命名空间，使用 Istio 同一值。Release 是 Helm 的保留字，用于标识该 Release 所在的命名空间。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;代码中我们看到，&lt;code&gt;targetAverageUtilization&lt;/code&gt; 设置为固定值 &lt;code&gt;80&lt;/code&gt;。&lt;/p&gt;

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

&lt;p&gt;这个模板用于为 Pod 生成 Service Account——&lt;code&gt;istio-ingress-service-account&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;其中引用变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;global.imagePullSecrets&lt;/strong&gt;：全局变量定义的数组，提供给 Service Account，在拉取镜像时使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chart&lt;/strong&gt; 和 &lt;strong&gt;Release&lt;/strong&gt; 都是 Helm 的内置对象。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;clusterrole-yaml-和-clusterrolebinding-yaml&#34;&gt;clusterrole.yaml 和 clusterrolebinding.yaml&lt;/h2&gt;

&lt;p&gt;Kubernetes &lt;a href=&#34;https://kubernetes.io/docs/reference/access-authn-authz/rbac/&#34; target=&#34;_blank&#34;&gt;RBAC&lt;/a&gt; 系统使用，这是一个集群范围内生效的 ClusterRole，声明了 Ingress 中需要的两组权限，并最终和 Service Account 进行绑定：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对于 extensions.thirdpartyresources 和 extensions.ingresses 对象的读写权限。&lt;/li&gt;
&lt;li&gt;对 configmaps、pods、endpoints 和 services 对象的读取权限。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其中引用变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio.name&lt;/strong&gt;：定义在 istio 的 &lt;code&gt;_helpers.tpl&lt;/code&gt; 中，如果没有使用 &lt;code&gt;nameOverride&lt;/code&gt; 进行覆盖的话，会使用 Chart 名称。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chart&lt;/strong&gt; 和 &lt;strong&gt;Release&lt;/strong&gt; 都是 Helm 的内置对象。&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;这一模板用于生成 Deployment，主体部分和 Ingress Gateway 类似，使用的都是 &lt;code&gt;istio/proxyv2&lt;/code&gt; 镜像，&lt;a href=&#34;https://istio.io/docs/reference/commands/pilot-agent/#pilot-agent-proxy&#34; target=&#34;_blank&#34;&gt;参数稍有区别&lt;/a&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio-proxy&lt;/strong&gt;：&lt;code&gt;proxy sidecar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ingress&lt;/strong&gt;：&lt;code&gt;proxy ingress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gateways&lt;/strong&gt;：&lt;code&gt;proxy router&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其中引用变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio.name&lt;/strong&gt;：定义在 istio 的 &lt;code&gt;_helpers.tpl&lt;/code&gt; 中，如果没有使用 &lt;code&gt;nameOverride&lt;/code&gt; 进行覆盖的话，会使用 Chart 名称。&lt;/li&gt;
&lt;li&gt;使用 Chart 和 Release 数据生成标签。这里可以看到，固定使用 &lt;code&gt;istio: ingress&lt;/code&gt; 提供给 Gateway  Selector 进行选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global.hub&lt;/strong&gt; 和 &lt;strong&gt;global.tag&lt;/strong&gt;：生成镜像地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replicaCount&lt;/strong&gt;：控制 Pod 数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global.imagePullPolicy&lt;/strong&gt;：拉取策略。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global.priorityClassName&lt;/strong&gt;：&lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;PriorityClass&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global.proxy.envoyStatsd.enabled&lt;/strong&gt;：如果启用，则加入 &lt;code&gt;--statsdUdpAddress&lt;/code&gt; 参数。&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;global.controlPlaneSecurityEnabled&lt;/strong&gt;：根据这一设置确定 &lt;code&gt;controlPlaneAuthPolicy&lt;/code&gt; 设置：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;# 如果启用
- --controlPlaneAuthPolicy
- MUTUAL_TLS
- --discoveryAddress
- istio-pilot:15005
# 如果没启用
- --controlPlaneAuthPolicy
- NONE
- --discoveryAddress
- istio-pilot:8080
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;resources&lt;/strong&gt; 和 &lt;strong&gt;globale.defaultResources&lt;/strong&gt;：优先使用 Chart 自身的资源定义，如果没有则使用缺省定义。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;nodeaffinity&lt;/strong&gt;：包含节点亲和性定义模板。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外这里还包含了对两个 secret 的可选加载：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio.istio-ingress-service-account&lt;/strong&gt;：用于 RBAC 的 Service Account 证书。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;istio-ingress-certs&lt;/strong&gt;：提供 https 服务时使用这一组证书。&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;这个模板用来为 Ingress 生成服务。&lt;/p&gt;

&lt;p&gt;引用变量包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio.name&lt;/strong&gt;：定义在 istio 的 &lt;code&gt;_helpers.tpl&lt;/code&gt; 中，如果没有使用 &lt;code&gt;nameOverride&lt;/code&gt; 进行覆盖的话，会使用 Chart 名称。&lt;/li&gt;
&lt;li&gt;使用 Chart 和 Release 数据生成标签。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;service.loadBalancerIP&lt;/strong&gt;：如果指定了 IP，则使用指定 IP。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;service.type&lt;/strong&gt;：如果没有负载均衡支持，可以考虑采用 NodePort 方式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;service.annotations&lt;/strong&gt;：可以设置一系列的键值对，通过遍历的形式为 Service 对象生成注解。&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;service.ports&lt;/strong&gt;：可以定义其它的非标准端口，以数组形式供 Helm 进行遍历，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;- port: 80
name: http
nodePort: 32000
- port: 443
name: https
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;常用链接&#34;&gt;常用链接&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Helm 内置对象：&lt;a href=&#34;https://docs.helm.sh/chart_template_guide/#built-in-objects&#34; target=&#34;_blank&#34;&gt;https://docs.helm.sh/chart_template_guide/#built-in-objects&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Istio Helm Chart 详解 - 全局变量</title>
      <link>/post/istio-helm-deep-dive-global-var/</link>
      <pubDate>Sun, 07 Oct 2018 10:40:16 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-global-var/</guid>
      <description>

&lt;blockquote&gt;
&lt;p&gt;这是《Istio Helm Chart 详解》系列的第二篇。&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;我们在使用现有 Chart 的时候，通常都不会修改 Chart 的本体，仅通过对&lt;a href=&#34;https://docs.helm.sh/chart_template_guide/#variables&#34; target=&#34;_blank&#34;&gt;变量&lt;/a&gt;的控制来实现对部署过程的定制。Istio Helm Chart 提供了大量的变量来帮助用户进行定制。&lt;/p&gt;

&lt;p&gt;第一篇中我们提到过，Istio Chart 分为父子两层，因此变量也具有&lt;a href=&#34;https://docs.helm.sh/chart_template_guide/#subcharts-and-global-values&#34; target=&#34;_blank&#34;&gt;全局和本地&lt;/a&gt;两级，全局变量使用保留字 &lt;code&gt;global&lt;/code&gt; 来进行定义，子 Chart 可以通过 &lt;code&gt;.Values.global&lt;/code&gt; 的方式引用全局变量，而主 Chart 中也可以用 &lt;code&gt;chart.var&lt;/code&gt; 的方式为子 Chart 指定变量值，本篇会首先讲解一下 &lt;code&gt;values.yaml&lt;/code&gt; 中涉及到的全局变量，也就是 &lt;code&gt;global&lt;/code&gt; 一节；各个 Chart 涉及到的专属变量会留在各个 Chart 的章节中。&lt;/p&gt;

&lt;h2 id=&#34;hub-和-tag&#34;&gt;hub 和 tag&lt;/h2&gt;

&lt;p&gt;缺省值分别为 &lt;code&gt;docker.io/istio&lt;/code&gt; 和 &lt;code&gt;1.0.2&lt;/code&gt;。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里看到版本的控制主要是在镜像层面的，Chart 自身的版本控制并不是很规矩，差评。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;多数情况下，这一配置代表所有镜像的地址，具体名称一般由 &lt;code&gt;{{ .Values.global.hub }}/[component]/:{{ .Values.global.tag }}&lt;/code&gt; 的形式拼接而成。proxy_init、Mixer、Grafana 和 Pilot 中，一旦其 &lt;code&gt;image&lt;/code&gt; 变量中包含了路径符 &lt;code&gt;/&lt;/code&gt;，则会弃用 &lt;code&gt;global.hub&lt;/code&gt;，直接采用 &lt;code&gt;image&lt;/code&gt; 的定义。&lt;/p&gt;

&lt;h3 id=&#34;影响范围&#34;&gt;影响范围&lt;/h3&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;charts/certmanager/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;certmanager&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/galley/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-galley&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/gateways/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;所有 Gateway 的 Deployment&lt;/td&gt;
&lt;td&gt;Container：&lt;code&gt;istio-proxy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/grafana/templates/create-custom-resources-job.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Job：&lt;code&gt;istio-grafana-post-install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/grafana/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;grafana&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/ingress/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-ingress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/kiali/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;kiali&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-policy&lt;/code&gt;/&lt;code&gt;istio-telemetry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Container：&lt;code&gt;istio-proxy&lt;/code&gt;/&lt;code&gt;mixer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/statsdtoprom.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-statsd-prom-bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-pilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/prometheus/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;prometheus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/cleanup-secrets.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Job：&lt;code&gt;istio-cleanup-secrets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/create-custom-resources-job.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Job：&lt;code&gt;istio-security-post-install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-citadel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/servicegraph/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;servicegraph&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/sidecarInjectorWebhook/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/tracing/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-tracing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;istio-init&lt;/code&gt;、&lt;code&gt;enable-core-dump&lt;/code&gt;、&lt;code&gt;istio-proxy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;k8singressselector&#34;&gt;k8sIngressSelector&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;ingress&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;这一变量比较 Buggy。原则上讲，他仅在 &lt;code&gt;ingress.enabled&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt; 的时候生效。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-1&#34;&gt;影响范围&lt;/h3&gt;

&lt;h4 id=&#34;charts-pilot-templates-gateway-yaml&#34;&gt;&lt;code&gt;charts/pilot/templates/gateway.yaml&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;这个文件中定义了一个 Gateway - &lt;code&gt;istio-autogenerated-k8s-ingress&lt;/code&gt;，其中的 &lt;code&gt;spec.selector&lt;/code&gt; 是这样设计的：&lt;code&gt;istio: {{ .Values.global.k8sIngressSelector }}&lt;/code&gt;，实际上该文件中并没有针对 &lt;code&gt;ingress.enabled&lt;/code&gt; 开关做出是否生成网关的判断，该网关一定会创建，但是只有在 &lt;code&gt;Ingress&lt;/code&gt; Chart 中才会创建符合该条件的 Deployment，因此在 &lt;code&gt;Ingress&lt;/code&gt; Chart 没有创建的情况下，该网关的 &lt;code&gt;Selector&lt;/code&gt; 就无法匹配成功，也就无法生效了。&lt;/p&gt;

&lt;h4 id=&#34;templates-configmap-yaml&#34;&gt;&lt;code&gt;templates/configmap.yaml&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;这里会引用 &lt;code&gt;ingress.enabled&lt;/code&gt; 进行判断，如果判断成功，则在 &lt;code&gt;istio&lt;/code&gt; ConfigMap 对象中写入 &lt;code&gt;ingressService: istio-{{ .Values.global.k8sIngressSelector }}&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&#34;k8singresshttps&#34;&gt;k8sIngressHttps&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-2&#34;&gt;影响范围&lt;/h3&gt;

&lt;h4 id=&#34;charts-pilot-templates-gateway-yaml-1&#34;&gt;&lt;code&gt;charts/pilot/templates/gateway.yaml&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;如果启用该字段，会给 Gateway 定义中加入 443 端口及其 TLS 配置。&lt;/p&gt;

&lt;p&gt;这段配置中对 &lt;code&gt;/etc/istio/ingress/certs/&lt;/code&gt; 下面的证书文件有依赖，因此需要启用这一选项，首先要启用 &lt;code&gt;ingress.enabled&lt;/code&gt;，从而能够成功创建 &lt;code&gt;ingress&lt;/code&gt; Chart 的 Deployment；另外还需要创建一个命名为 &lt;code&gt;ingress-certs&lt;/code&gt; 的 tls secret，给 &lt;code&gt;istio-ingress&lt;/code&gt; Deployment 进行加载。这些条件如果没有满足，LDS 会拒绝服务，从而无法提供 Ingress 功能。&lt;/p&gt;

&lt;h2 id=&#34;proxy-image&#34;&gt;proxy.image&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;proxyv2&lt;/code&gt;。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-3&#34;&gt;影响范围&lt;/h3&gt;

&lt;h4 id=&#34;istio-templates-sidecar-injector-configmap-yaml&#34;&gt;&lt;code&gt;istio/templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;其中的 ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt; 中的注入部分会使用该值作为 &lt;code&gt;istio-proxy&lt;/code&gt; 的镜像名。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-plain&#34;&gt;image: {{ &amp;quot;[[ if (isset .ObjectMeta.Annotations \&amp;quot;sidecar.istio.io/proxyImage\&amp;quot;) -]]&amp;quot; }}
{{ &amp;quot;\&amp;quot;[[ index .ObjectMeta.Annotations \&amp;quot;sidecar.istio.io/proxyImage\&amp;quot; ]]\&amp;quot;&amp;quot; }}
{{ &amp;quot;[[ else -]]&amp;quot; }}
{{ .Values.global.hub }}/{{ .Values.global.proxy.image }}:{{ .Values.global.tag }}
{{ &amp;quot;[[ end -]]&amp;quot; }}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这段代码表明，首先会判断 Pod 的 &lt;code&gt;sidecar.istio.io/proxyImage&lt;/code&gt; 注解，如果注解不存在，才会使用这一变量，拼接方式为：&lt;code&gt;{{ .Values.global.hub }}/{{ .Values.global.proxy.image }}:{{ .Values.global.tag }}&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&#34;proxy-resources&#34;&gt;proxy.resources&lt;/h2&gt;

&lt;p&gt;这里为 Sidecar 定义了资源分配的方案。根据官方的&lt;a href=&#34;https://preliminary.istio.io/zh/docs/concepts/performance-and-scalability/#scalability-and-sizing-guide&#34; target=&#34;_blank&#34;&gt;伸缩性和规模调整指南&lt;/a&gt;：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;开启访问日志（默认开启）时，为 Sidecar 每分配 1 个 vCPU 能够负担 1000 qps 的访问峰值，没有开启则 0.5 vCPU 即可负担同样峰值，节点上的 fluentd 由于需要捕获和上传日志，是主要的性能消耗者。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;影响范围-4&#34;&gt;影响范围&lt;/h3&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;charts/mixer/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-policy&lt;/code&gt;/&lt;code&gt;istio-telemetry&lt;/code&gt; Container：&lt;code&gt;istio-proxy&lt;/code&gt;/&lt;code&gt;mixer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-pilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;会注入到所有 Pod&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;proxy-concurrency&#34;&gt;proxy.concurrency&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;0&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;Proxy worker 线程数量，如果设置为 0，则根据 CPU 线程/核的数量进行分配。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-5&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;istio/templates/configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;proxy-accesslogfile&#34;&gt;proxy.accessLogFile&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;/dev/stdout&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;Sidecar 的访问日志位置，如果设置为空字符串，则关闭访问日志功能。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-6&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;proxy-privileged&#34;&gt;proxy.privileged&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;istio-init&lt;/code&gt;、&lt;code&gt;istio-proxy&lt;/code&gt; 的特权模式开关。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-7&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;proxy-enablecoredump&#34;&gt;proxy.enableCoreDump&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;如果打开，新注入的 Sidecar 会启动 CoreDump 功能，加入初始化容器 &lt;code&gt;enable-core-dump&lt;/code&gt;。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-8&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;proxy-includeipranges&#34;&gt;proxy.includeIPRanges&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;&amp;quot;*&amp;quot;&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/tasks/traffic-management/egress.html#calling-external-services-directly&#34; target=&#34;_blank&#34;&gt;劫持白名单&lt;/a&gt;，仅劫持该 CIDR 范围内的 IP。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-9&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;修改 &lt;code&gt;istio-init&lt;/code&gt; 的 &lt;code&gt;-i&lt;/code&gt; 参数，等价的 Pod Annotation 为 &lt;code&gt;traffic.sidecar.istio.io/includeOutboundIPRanges&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&#34;proxy-excludeipranges&#34;&gt;proxy.excludeIPRanges&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;CIDR 范围之外的所有 IP 都会被劫持。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-10&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;修改 &lt;code&gt;istio-init&lt;/code&gt; 的 &lt;code&gt;-x&lt;/code&gt; 参数，等价的 Pod Annotation 为 &lt;code&gt;traffic.sidecar.istio.io/excludeOutboundIPRanges&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&#34;proxy-includeinboundports&#34;&gt;proxy.includeInboundPorts&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;&amp;quot;*&amp;quot;&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;进入端口的劫持白名单，所有从范围内端口进入 Pod 的流量会被劫持。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-11&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;修改 &lt;a href=&#34;https://github.com/istio/istio/blob/master/tools/deb/istio-iptables.sh&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;istio-init&lt;/code&gt;&lt;/a&gt; 的 &lt;code&gt;-b&lt;/code&gt; 参数，等价的 Pod Annotation 为 &lt;code&gt;traffic.sidecar.istio.io/includeInboundPorts&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&#34;proxy-excludeinboundports&#34;&gt;proxy.excludeInboundPorts&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;进入端口的劫持黑名单，所有从范围外端口进入 Pod 的流量会被劫持。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-12&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;修改 &lt;a href=&#34;https://github.com/istio/istio/blob/master/tools/deb/istio-iptables.sh&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;istio-init&lt;/code&gt;&lt;/a&gt; 的 &lt;code&gt;-d&lt;/code&gt; 参数，等价的 Pod Annotation 为 &lt;code&gt;traffic.sidecar.istio.io/excludeOutboundIPRanges&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&#34;proxy-autoinject&#34;&gt;proxy.autoInject&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;enabled&lt;/code&gt;。用于指定 Sidecar 注入器的策略。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-13&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;proxy-envoystatsd&#34;&gt;proxy.envoyStatsd&lt;/h2&gt;

&lt;p&gt;缺省值为：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;enabled: true
host: istio-statsd-prom-bridge
port: 9125
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;设置 Envoy 的 statsd 目标，也就是 Envoy 的 &lt;code&gt;&amp;quot;--statsdUdpAddress&lt;/code&gt; 参数。某些情况下（例如没有安装 Mixer）可以关闭。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-14&#34;&gt;影响范围&lt;/h3&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;charts/ingress/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-ingress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;templates/configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;istio-init&lt;/code&gt;、&lt;code&gt;enable-core-dump&lt;/code&gt;、&lt;code&gt;istio-proxy&lt;/code&gt; 三个容器的镜像&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;proxy-init-image&#34;&gt;proxy_init.image&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;proxy_init&lt;/code&gt;，指定初始化镜像。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;前面提到过，如果这里使用一个带有路径符号 &lt;code&gt;/&lt;/code&gt; 的镜像名称，会忽略前面的 &lt;code&gt;global.hub/tag&lt;/code&gt; 的设置。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;影响范围-15&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;imagepullpolicy&#34;&gt;imagePullPolicy&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;IfNotPresent&lt;/code&gt;。镜像的拉取策略。&lt;/p&gt;

&lt;h2 id=&#34;影响范围-16&#34;&gt;影响范围&lt;/h2&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;charts/certmanager/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;certmanager&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/galley/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-galley&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/gateways/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;所有 Gateway 的 Deployment&lt;/td&gt;
&lt;td&gt;Container：&lt;code&gt;istio-proxy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/grafana/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;grafana&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/ingress/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-ingress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-policy/istio-telemetry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Container：&lt;code&gt;istio-proxy&lt;/code&gt;/&lt;code&gt;mixer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/statsdtoprom.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-statsd-prom-bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-pilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/prometheus/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;prometheus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-citadel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/servicegraph/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;servicegraph&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/sidecarInjectorWebhook/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/tracing/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-tracing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;templates/sidecar-injector-configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Container：&lt;code&gt;istio-init&lt;/code&gt;，&lt;code&gt;istio-proxy&lt;/code&gt;，&lt;code&gt;enable-core-dump&lt;/code&gt; 未受影响&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;controlplanesecurityenabled&#34;&gt;controlPlaneSecurityEnabled&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;false&lt;/code&gt;。控制面是否启用 mTLS。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-17&#34;&gt;影响范围&lt;/h3&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;charts/ingress/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-ingress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;控制 Ingress 参数 &lt;code&gt;--controlPlaneAuthPolicy&lt;/code&gt; 的取值，&lt;code&gt;MUTUAL_TLS&lt;/code&gt; 或者 &lt;code&gt;NONE&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/config.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DestinationRule: &lt;code&gt;istio-policy&lt;/code&gt; 和  DestinationRule: &lt;code&gt;istio-telemetry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;为端口 &lt;code&gt;15004&lt;/code&gt; 启用 &lt;code&gt;ISTIO_MUTUAL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-policy&lt;/code&gt;/&lt;code&gt;istio-telemetry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;控制 Sidecar &lt;code&gt;istio-proxy&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;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-pilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;控制 Sidecar &lt;code&gt;istio-proxy&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;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;templates/configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;控制 Sidecar &lt;code&gt;istio-proxy&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;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;disablepolicychecks&#34;&gt;disablePolicyChecks&lt;/h2&gt;

&lt;p&gt;缺省值 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;禁用 Mixer 策略检查。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-18&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;enabletracing&#34;&gt;enableTracing&lt;/h2&gt;

&lt;p&gt;缺省值 &lt;code&gt;true&lt;/code&gt;。&lt;/p&gt;

&lt;p&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;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;templates/configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&#34;影响范围-19&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap &lt;code&gt;istio&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;mtls-enabled&#34;&gt;mtls.enabled&lt;/h2&gt;

&lt;p&gt;缺省值 &lt;code&gt;false&lt;/code&gt;。服务间 mTLS 的缺省设置，可以使用目标规则或者服务注解进行覆盖。这一开关会控制生成一系列的 Job、ConfigMap 以及 Kubernetes RBAC 的相关内容，详情将会在 Security Chart 中讲解。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-20&#34;&gt;影响范围&lt;/h3&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;charts/security/templates/configmap.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ConfigMap：&lt;code&gt;istio-security-custom-resources&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/create-custom-resources-job.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;istio-security-post-install-account&lt;/code&gt; ClusterRole: &lt;code&gt;istio-security-post-install-istio-system&lt;/code&gt; ClusterRoleBinding: &lt;code&gt;istio-security-post-install-role-binding-istio-system&lt;/code&gt; Job：&lt;code&gt;istio-security-post-install&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;imagepullsecrets&#34;&gt;imagePullSecrets&lt;/h2&gt;

&lt;p&gt;缺省为空。&lt;/p&gt;

&lt;p&gt;用于为 ServiceAccount 分配镜像拉取过程所需的凭证。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-21&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;charts/certmanager/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;certmanager&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/galley/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;istio-galley-service-account&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/gateways/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;所有 Gateways 自动生成的 ServiceAccount&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/ingress/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;istio-ingress-service-account&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/kiali/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;kiali-service-account&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;istio-mixer-service-account&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;istio-pilot-service-account&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/prometheus/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;prometheus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;istio-citadel-service-account&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/sidecarInjectorWebhook/templates/serviceaccount.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ServiceAccount: &lt;code&gt;istio-sidecar-injector-service-account&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;arch&#34;&gt;arch&lt;/h2&gt;

&lt;p&gt;缺省值：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;amd64: 2
s390x: 2
ppc64le: 2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;用于 Kubernetes 的节点亲和性调度过程。&lt;/p&gt;

&lt;p&gt;这里列出了几种支持的服务器架构，并给出了优先级。详情请参看本文系列第一篇。&lt;/p&gt;

&lt;h2 id=&#34;onenamespace&#34;&gt;oneNamespace&lt;/h2&gt;

&lt;p&gt;缺省值 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;如果设置为 &lt;code&gt;true&lt;/code&gt;，会对控制面管理的应用命名空间进行限制。如果没有设置，则监控所有命名空间。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-22&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;charts/pilot/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-pilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;设置 &lt;a href=&#34;https://istio.io/docs/reference/commands/pilot-discovery/#pilot-discovery-discovery&#34; target=&#34;_blank&#34;&gt;Pilot discovery 的 &lt;code&gt;-a&lt;/code&gt; 参数&lt;/a&gt;。这一参数取值为监控的命名空间名称，目前会选用 Istio 所在的命名空间。&lt;/p&gt;

&lt;h2 id=&#34;configvalidation&#34;&gt;configValidation&lt;/h2&gt;

&lt;p&gt;缺省值 &lt;code&gt;ture&lt;/code&gt;。用于配置是否开启服务端的配置验证。该选项开启之后，会生成一个 ValidatingWebhookConfiguration 对象，并被包含到 Galley 的配置之中，从而启用校验功能。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-23&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;charts/galley/templates/validatingwehookconfiguration.yaml.tpl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ValidatingWebhookConfiguration: &lt;code&gt;istio-galley&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;meshexpansion&#34;&gt;meshExpansion&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;false&lt;/code&gt;。如果启用，Pilot 和 Citadel 会在 Ingress Gateway 上公开服务。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-24&#34;&gt;影响范围&lt;/h3&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;charts/pilot/templates/gateway.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gateway：&lt;code&gt;meshexpansion-gateway&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用于公开服务的 Gateway&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/meshexpansion.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VirtualService：&lt;code&gt;meshexpansion-pilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pilot 的 VirtualService&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/meshexpansion.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VirtualService：&lt;code&gt;meshexpansion-citadel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Citadel 的  的 VirtualService&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;meshexpansionilb&#34;&gt;meshExpansionILB&lt;/h2&gt;

&lt;p&gt;缺省值为 &lt;code&gt;false&lt;/code&gt;。Pilot 和 Citadel 的 mTLS 和明文端口会在内部网关进行公开。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-25&#34;&gt;影响范围&lt;/h3&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;charts/pilot/templates/gateway.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gateway：&lt;code&gt;meshexpansion-ilb-gateway&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用于公开服务的 Gateway&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/meshexpansion.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VirtualService：&lt;code&gt;ilb-meshexpansion-pilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pilot 的 VirtualService&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/meshexpansion.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VirtualService：&lt;code&gt;meshexpansion-ilb-citadel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Citadel 的  的 VirtualService&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;defaultresources&#34;&gt;defaultResources&lt;/h2&gt;

&lt;p&gt;缺省值：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;requests:
  cpu: 10m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;为 Istio 组件提供一个最小的资源定义，以便 HPA 工作方便，每个组件可以定义自己的资源定义进行覆盖。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-26&#34;&gt;影响范围&lt;/h3&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;charts/galley/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-galley&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/gateways/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;所有网关创建的 Deployment&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/grafana/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;grafana&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/ingress/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-ingress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/kiali/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;kiali&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-policy&lt;/code&gt;/&lt;code&gt;istio-telemetry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Container：&lt;code&gt;istio-proxy&lt;/code&gt;/&lt;code&gt;mixer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/statsdtoprom.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-statsd-prom-bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-pilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Container：&lt;code&gt;istio-proxy&lt;/code&gt;/&lt;code&gt;discovery&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/prometheus/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;prometheus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-citadel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/servicegraph/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;servicegraph&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/sidecarInjectorWebhook/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deploymet: &lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/tracing/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-tracing&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;hyperkube&#34;&gt;hyperkube&lt;/h2&gt;

&lt;p&gt;缺省值：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;hub: quay.io/coreos
tag: v1.7.6_coreos.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;用于创建 CRD 的容器镜像。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-27&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;charts/grafana/templates/create-custom-resources-job.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Job：&lt;code&gt;istio-grafana-post-install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/cleanup-secrets.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Job：&lt;code&gt;istio-cleanup-secrets&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/create-custom-resources-job.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Job：&lt;code&gt;istio-security-post-install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;priorityclassname&#34;&gt;priorityClassName&lt;/h2&gt;

&lt;p&gt;Kubernetes 1.11.0 以上有两个 &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;PriorityClass&lt;/code&gt;&lt;/a&gt;，用这种方式创建 Istio 组件 Pod，可以防止因较低的优先级被杀掉。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-28&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;charts/certmanager/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;certmanager&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/galley/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-galley&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/gateways/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;所有网管创建的 Deployment&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/grafana/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;grafana&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/ingress/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-ingress&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/kiali/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;kiali&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-policy/istio-telemetry&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-pilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/prometheus/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;prometheus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-citadel&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/servicegraph/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;servicegraph&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/sidecarInjectorWebhook/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/tracing/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-tracing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;crds&#34;&gt;crds&lt;/h2&gt;

&lt;p&gt;缺省值 &lt;code&gt;true&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;如果使用的是 Helm 2.10 以上的 &lt;code&gt;helm install&lt;/code&gt;，或者是 &lt;code&gt;helm template&lt;/code&gt; 方式的安装，应该设置为 &lt;code&gt;true&lt;/code&gt;；如果 Helm 版本小于 2.9，必须设置为 &lt;code&gt;false&lt;/code&gt;，并手工执行 &lt;code&gt;kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml&lt;/code&gt; 来首先创建 CRD。&lt;/p&gt;

&lt;h3 id=&#34;影响范围-29&#34;&gt;影响范围&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;templates/crds.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;随这一开关确定是否创建所有 CRD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

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

&lt;p&gt;本节中很多涉及到下层 Chart 的内容并未深入，会在子 Chart 的相关章节中尝试进一步说明。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Istio Helm Chart 详解 - 概述</title>
      <link>/post/istio-helm-deep-dive-overview/</link>
      <pubDate>Sat, 06 Oct 2018 12:55:00 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-overview/</guid>
      <description>

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

&lt;p&gt;Helm 是目前 Istio 官方推荐的安装方式，除去安装之外，还可以利用对输入值的一些调整，完成对 Istio 的部分配置工作。官方提供了 &lt;a href=&#34;https://preliminary.istio.io/zh/docs/setup/kubernetes/helm-install/&#34; target=&#34;_blank&#34;&gt;Istio 的 Helm 部署方式&lt;/a&gt;，侧重于快速启动，而这一组文章将会采用由上至下的顺序，基于 Istio 1.0.2 版本的 Helm Chart 做一系列的讲解。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Istio 的 Helm Chart 分为两个大分支：istio 和 istio-remote，后者为多集群部署方式，这里暂不涉及，后面的内容围绕 istio 展开。&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Istio Chart 是一个总分结构，其分级结构和设计结构是一致的，这里做一个简单的说明。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/istio-overview.png&#34; alt=&#34;arch&#34; /&gt;&lt;/p&gt;

&lt;h3 id=&#34;chart-yaml&#34;&gt;Chart.yaml&lt;/h3&gt;

&lt;p&gt;Chart 的基础信息，这里看到 1.0.2 的 Release 中，&lt;code&gt;version&lt;/code&gt; 的值还是 1.0.1；要求的 Tiller 版本要大于等于 &lt;code&gt;2.7.2-0&lt;/code&gt;。&lt;/p&gt;

&lt;h3 id=&#34;values-yaml&#34;&gt;values-*.yaml&lt;/h3&gt;

&lt;p&gt;这里提供了一组 values 文件，提供 Istio 在各种场景下的关键配置范本。对 Istio 的定制可以从 &lt;code&gt;values.yaml&lt;/code&gt; 的改写开始，完成后可以使用 &lt;code&gt;helm template&lt;/code&gt; 命令来生成最终的部署文件供 &lt;code&gt;kubectl&lt;/code&gt; 使用。&lt;code&gt;values.yaml&lt;/code&gt; 文件的一些细节可以参考&lt;a href=&#34;https://docs.helm.sh/chart_best_practices/values/&#34; target=&#34;_blank&#34;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;values-istio-auth-galley.yaml&lt;/strong&gt;：启用控制面 mTLS；缺省打开网格内的 mTLS；启用 Galley。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-auth-multicluster.yaml&lt;/strong&gt;：多集群配置；启用控制面 mTLS；缺省打开网格内的 mTLS；禁用自签署证书。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-auth.yaml&lt;/strong&gt;：启用控制面 mTLS；缺省打开网格内的 mTLS。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-demo-auth.yaml&lt;/strong&gt;：启用控制面 mTLS；缺省打开网格内的 mTLS；激活 Grafana、Jaeger、ServiceGraph 以及 Galley；允许自动注入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-demo.yaml&lt;/strong&gt;：激活 Grafana、Jaeger、ServiceGraph 以及 Galley；允许自动注入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-galley.yaml&lt;/strong&gt;：启用 Galley 和 Prometheus。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-gateways.yaml&lt;/strong&gt;：这是一个样例，可以用这种形式定义新的 Gateway。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-multicluster.yaml&lt;/strong&gt;：多集群配置，禁用自签发证书。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-one-namespace-auth.yaml&lt;/strong&gt;：&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio-one-namespace.yaml&lt;/strong&gt;：启用控制面 mTLS；缺省打开网格内的 mTLS；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values-istio.yaml&lt;/strong&gt;：oneNameSpace 设置为 True，让 Pilot 只监控单一的 Namespace，目前的情况是只监控 Istio 的部署命名空间。此处的 istiotesting 似乎是个 Issue。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;values.yaml&lt;/strong&gt;：罗列了（可能）所有变量，也是我们做定制的基础。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;requiremtens-yaml&#34;&gt;requiremtens.yaml&lt;/h3&gt;

&lt;p&gt;这个文件用于管理 Chart 的&lt;a href=&#34;https://docs.helm.sh/developing_charts/#chart-dependencies&#34; target=&#34;_blank&#34;&gt;依赖关系&lt;/a&gt;，Istio 的各个组件就是在这里定义的，并且可以通过变量进行控制。&lt;/p&gt;

&lt;h3 id=&#34;templates&#34;&gt;templates&lt;/h3&gt;

&lt;h4 id=&#34;affinity-tpl&#34;&gt;_affinity.tpl&lt;/h4&gt;

&lt;p&gt;该文件会生成一组&lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity-beta-feature&#34; target=&#34;_blank&#34;&gt;节点亲和/互斥&lt;/a&gt;元素，供各个组件在渲染 YAML 时候使用。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;nodeAffinityRequiredDuringScheduling&lt;/code&gt;：仅在本文件中使用。这里规定了对节点的要求，&lt;code&gt;values.yaml&lt;/code&gt; 中的 &lt;code&gt;global.arch&lt;/code&gt; 变量中列出了一系列的主机架构，只有出现在这一列表中，且对应值大于 &lt;code&gt;0&lt;/code&gt; 的节点，才会将 Pod 调度到该节点上。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;code&gt;nodeAffinityPreferredDuringScheduling&lt;/code&gt;：仅在本文件中使用。这里规定了调度优先级，为各种架构的节点分配了权重。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;code&gt;nodeaffinity&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;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/galley/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-galley&lt;/code&gt;。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/gateways/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;所有 gateways Chart 生成的 Deployment。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/grafana/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;grafana&lt;/code&gt;。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/ingress/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-ingress&lt;/code&gt;。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/mixer/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-policy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/pilot/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-pilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/prometheus/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;prometheus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/security/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-citadel&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/servicegraph/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;servicegraph&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/sidecarInjectorWebhook/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-sidecar-injector&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;charts/tracing/templates/deployment.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployment：&lt;code&gt;istio-tracing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&#34;helpers-tpl&#34;&gt;_helpers.tpl&lt;/h4&gt;

&lt;p&gt;这个文件并不特别，创建了四个变量，供 Helm 使用。&lt;/p&gt;

&lt;h4 id=&#34;sidecar-injector-configmap-yaml&#34;&gt;sidecar-injector-configmap.yaml&lt;/h4&gt;

&lt;p&gt;这里定义了 ConfigMap 对象 &lt;code&gt;istio-sidecar-injector&lt;/code&gt;，为 &lt;code&gt;sidecarInjectorWebhook&lt;/code&gt; 提供配置支持，在全局变量 &lt;code&gt;omitSidecarInjectorConfigMap&lt;/code&gt; 为 &lt;code&gt;False&lt;/code&gt; 的时候进行渲染，这一参数会用在生成新的 Gateway 之类的调整功能上，防止创建多余的 ConfigMap。这里可以看到使用各种变量拼装而成的注入模板，用于为被注入 Pod 提供初始化和 Sidecar 容器的支持。其中涉及的变量会在后文中进行讲解。&lt;/p&gt;

&lt;h4 id=&#34;configmap-yaml&#34;&gt;configmap.yaml&lt;/h4&gt;

&lt;p&gt;这个文件定义了 ConfigMap 对象 &lt;code&gt;istio&lt;/code&gt;，该对象会随 Pilot 一同创建，也就是说它是 Pilot 的依赖项。其中所涉变量也同样会在其他文章中进行讲解。&lt;/p&gt;

&lt;h3 id=&#34;charts&#34;&gt;charts&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;certmanager&lt;/code&gt;：一个基于 &lt;a href=&#34;https://github.com/jetstack/cert-manager&#34; target=&#34;_blank&#34;&gt;Jetstack Cert-Manager 项目&lt;/a&gt;的 ACME 证书客户端，用于自动进行证书的申请、获取以及分发&lt;/li&gt;
&lt;li&gt;&lt;code&gt;galley&lt;/code&gt;：Istio 利用 &lt;a href=&#34;https://istio.io/zh/docs/reference/commands/galley/&#34; target=&#34;_blank&#34;&gt;Galley&lt;/a&gt; 进行配置管理工作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateways&lt;/code&gt;：使用 Gateways 一节的配置，可以实现多个 Gateway Controller&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grafana&lt;/code&gt;：&lt;a href=&#34;https://grafana.com&#34; target=&#34;_blank&#34;&gt;图形化的 Istio Dashboard&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ingress&lt;/code&gt;：一个遗留设计，缺省关闭，v1alpha3 之后建议弃用。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kiali&lt;/code&gt;：带有分布式跟踪、配置校验等多项功能的 Dashboard。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mixer&lt;/code&gt;：&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pilot&lt;/code&gt;：&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prometheus&lt;/code&gt;：&lt;/li&gt;
&lt;li&gt;&lt;code&gt;security&lt;/code&gt;：&lt;/li&gt;
&lt;li&gt;&lt;code&gt;servicegraph&lt;/code&gt;：&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sidecarInjectorWebhook&lt;/code&gt;：自动注入 Webhook 的相关配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tracing&lt;/code&gt;：&lt;a href=&#34;https://github.com/jaegertracing&#34; target=&#34;_blank&#34;&gt;Jaeger&lt;/a&gt; 的分布式跟踪相关配置。&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;本篇主要讲述的是整体结构以及顶层对象的一些内容。后面将会分几篇文章讲讲各种变量的应用以及各个 Chart 的配置。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>换马甲：十分钟 Helm 变 Operator</title>
      <link>/post/helm-to-operator/</link>
      <pubDate>Thu, 30 Aug 2018 10:41:42 +0800</pubDate>
      <guid>/post/helm-to-operator/</guid>
      <description>

&lt;p&gt;&lt;a href=&#34;https://blog.fleeto.us/post/operator-for-kubernetes/&#34; target=&#34;_blank&#34;&gt;Operator 是一种将传统运维思路转换为 Kubernetes CRD 控制的方法&lt;/a&gt;，利用 CRD 对软件部署和配置进行定义，整个部署和管理过程在 Kubernetes 角度上来看，都是一个可见、可审计的行为，这无疑对运维工作是大有裨益的。&lt;a href=&#34;https://github.com/operator-framework&#34; target=&#34;_blank&#34;&gt;CoreOS 也提供了 Operator Framwork&lt;/a&gt; 用于进行 Operator 的开发，不过门槛还是稍高的。如果放低要求，是否能有一个折衷方案？&lt;/p&gt;

&lt;p&gt;CoreOS 为&lt;a href=&#34;https://www.helm.sh/helm-enters-the-cncf/index.html&#34; target=&#34;_blank&#34;&gt;最近加入 CNCF 的 Helm&lt;/a&gt; 提供了一个小工具，可以无需编程操作，较为方便的将 Helm Chart 转换为 Operator，并将原有的 &lt;code&gt;values.yaml&lt;/code&gt; 更替为 CR 资源进行操作，对于无状态应用的部署流程，可以说是比较便利了。下面就随便举个例子，看看这马甲是怎么换的。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;目前版本相当幼稚，看看就好了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;准备工作&#34;&gt;准备工作&lt;/h2&gt;

&lt;p&gt;首先是一个可操作的 Kubernetes 集群，要求版本为 1.9+。
接下来要有一个可操作的 Helm 客户端（无需 Tiller 部署），用于下载 Chart。&lt;/p&gt;

&lt;p&gt;使用 git 获取 &lt;a href=&#34;https://github.com/operator-framework/helm-app-operator-kit&#34; target=&#34;_blank&#34;&gt;Helm app operator kit&lt;/a&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ git clone https://github.com/operator-framework/helm-app-operator-kit.git
Cloning into &#39;helm-app-operator-kit&#39;...
...
Resolving deltas: 100% (58/58), done.
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;镜像构建&#34;&gt;镜像构建&lt;/h2&gt;

&lt;p&gt;下载一个实验 Chart &lt;strong&gt;并解压&lt;/strong&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ helm fetch stable/memcached
$ tar xf memcached-2.2.0.tgz
$ ls -la
...
-rw-r--r--   1 dustise  wheel    680  8 30 11:50 Dockerfile
...
drwxr-xr-x  10 dustise  wheel    320  8 30 11:50 helm-app-operator
drwxr-xr-x   7 dustise  wheel    224  8 30 11:52 memcached
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里的 Dockerfile 可以略微关注一下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-dockerfile&#34;&gt;FROM golang:1.10 as builder
...
RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
...
RUN CGO_ENABLED=0 GOOS=linux go build -o bin/operator cmd/helm-app-operator/main.go
...
FROM alpine:3.6
...
COPY --from=builder /go/src/github.com/operator-framework/helm-app-operator-kit/helm-app-operator/bin/operator /operator
...
CMD [&amp;quot;/operator&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;一个典型的分段构建过程。在 Go 环境中生成可执行文件用于最终镜像的执行。&lt;/p&gt;

&lt;p&gt;使用 Dockerfile 进行构建：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;docker build -t your-repo:25000/helm/memcached-operator \
    --build-arg HELM_CHART=memcached \
    --build-arg API_VERSION=anywhere.io/v1alpha1 \
    --build-arg KIND=memcached .
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HELM_CHART&lt;/strong&gt;：我们之前解压的 Chart 目录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API_VERSION&lt;/strong&gt;：即将用到的自定义资源的 API 组和版本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KIND&lt;/strong&gt;：自定义资源名称。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker 构建完成之后，将新镜像 Push 到 Kubernetes 可访问的镜像库中。&lt;/p&gt;

&lt;h2 id=&#34;operator-部署&#34;&gt;Operator 部署&lt;/h2&gt;

&lt;p&gt;构建成功之后，进入 &lt;code&gt;helm-app-operator/deploy&lt;/code&gt; 目录，要部署 Operator，首先要修改几个文件。&lt;/p&gt;

&lt;h3 id=&#34;rbac-yaml&#34;&gt;rbac.yaml&lt;/h3&gt;

&lt;p&gt;这是 Operator 运行所需的权限设置文件，根据前面的配置，我们需要给他加入两个权限：namespace 以及新建的 CRD 的操作权限。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里的 RoleBinding 只是绑定到了 default 命名空间的 default ServiceAccount，如果要给 Operator Pod 单独赋权，就要对 &lt;code&gt;subject&lt;/code&gt; 进行修改。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;文件编辑结束后，就可以使用 &lt;code&gt;kubectl apply&lt;/code&gt; 提交到集群运行。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: helm-app-operator
rules:
...
  - secrets
  - namespaces
  verbs:
  - &amp;quot;*&amp;quot;
- apiGroups:
  - apps
  resources:
  - deployments
  - daemonsets
  - replicasets
  - statefulsets
  verbs:
  - &amp;quot;*&amp;quot;
...
- apiGroups:
  - anywhere.io
  resources:
  - &amp;quot;*&amp;quot;
  verbs:
  - &amp;quot;*&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;crd-yaml&#34;&gt;crd.yaml&lt;/h3&gt;

&lt;p&gt;接下来就是自定义资源的定义了。这里需要和前面我们制定的 API 结构相吻合&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: memcacheds.anywhere.io # 资源名 + 组名
spec:
  group: anywhere.io # 组
  names:
    kind: memcached # 对象
    listKind: memcachedList #列表
    plural: memcacheds # 复数形式
    singular: memcached # 单数形式
  scope: Namespaced
  version: v1alpha1 # 版本
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;同样的，使用 &lt;code&gt;kubectl apply&lt;/code&gt; 提交这一定义给 Kubernetes 集群。&lt;/p&gt;

&lt;h3 id=&#34;operator-yaml&#34;&gt;operator.yaml&lt;/h3&gt;

&lt;p&gt;这个文件很简单，是一个 Deployment 对象定义，修改一下镜像名即可，如果 &lt;code&gt;rbac.yaml&lt;/code&gt; 中修改了绑定账号，这里也需要修改 Operator 的运行账号。&lt;/p&gt;

&lt;p&gt;最后，用 &lt;code&gt;kubectl apply deploy/operator.yaml&lt;/code&gt;，即可启动 Operator 的运行了。可以使用 &lt;code&gt;kubectl get po -w&lt;/code&gt; 获取运行状况。&lt;/p&gt;

&lt;h2 id=&#34;创建应用实例&#34;&gt;创建应用实例&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;deploy&lt;/code&gt; 目录中还有另外一个文件：&lt;code&gt;cr.yaml&lt;/code&gt;，就是我们的自定义资源实例文件。过去需要在 Chart 的 &lt;code&gt;values.yaml&lt;/code&gt; 中编写的内容，现在需要在这里完成了。通过 &lt;code&gt;helm inspect stable/memcached&lt;/code&gt; 命令，可以看到其中支持的参数列表。这里我们可以设置一下，用来创建一个 3 实例的集群：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: anywhere.io/v1alpha1
kind: memcached
metadata:
  name: memcached-yy
  labels:
    app: example-app
spec:
  replicaCount: 3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;使用 &lt;code&gt;kubectl apply&lt;/code&gt; 提交之后，可以看到集群上开始创建这一实例：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ kubectl get po
...
helm-app-operator-memcached-yy-0      1/1       Running            0          10h
helm-app-operator-memcached-yy-1      1/1       Running            0          10h
helm-app-operator-memcached-yy-2      1/1       Running            0          10h
...
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;这里 Operator Pod 可能会崩溃，删除即可正常工作😄。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;查询实例情况&#34;&gt;查询实例情况：&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;$ kubectl get memcached
NAME           CREATED AT
memcached-r    10h
memcached-yy   10h
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;删除实例&#34;&gt;删除实例&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;$ kubectl delete memcached memcached-yy
memcached.anywhere.io &amp;quot;memcached-yy&amp;quot; deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;再次使用 &lt;code&gt;kubectl get po&lt;/code&gt;，会发现对应 Pod 已经删除。&lt;/p&gt;

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

&lt;p&gt;CoreOS 再次提供了一个有趣的方向，有效的降低了 Operator 的入门门槛。但是这一方案除了成熟度相当不足之外，Helm 本身对运维的支持其实也是非常弱的，对有状态应用是无论如何不能使用这种方式来进行运维的。——马甲，只是马甲。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Draft vs Gitkube vs Helm vs Ksonnet vs Metaparticle vs Skaffold</title>
      <link>/post/draft-vs-gitkube-vs-helm-vs-ksonnet-vs-metaparticle-vs-skaffold/</link>
      <pubDate>Tue, 26 Jun 2018 11:29:18 +0800</pubDate>
      <guid>/post/draft-vs-gitkube-vs-helm-vs-ksonnet-vs-metaparticle-vs-skaffold/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://blog.hasura.io/draft-vs-gitkube-vs-helm-vs-ksonnet-vs-metaparticle-vs-skaffold-f5aa9561f948&#34; target=&#34;_blank&#34;&gt;Draft vs Gitkube vs Helm vs Ksonnet vs Metaparticle vs Skaffold&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作者：&lt;a href=&#34;https://blog.hasura.io/@shahidh&#34; target=&#34;_blank&#34;&gt;Shahidh K Muhammed&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;tl-dr&#34;&gt;TL;DR&lt;/h2&gt;

&lt;h3 id=&#34;draft-https-draft-sh&#34;&gt;&lt;a href=&#34;https://draft.sh/&#34; target=&#34;_blank&#34;&gt;Draft&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;向 K8S 集群部署代码（自动“构建-推送-部署”）。&lt;/li&gt;
&lt;li&gt;使用 &lt;a href=&#34;https://github.com/Azure/draft/tree/master/packs&#34; target=&#34;_blank&#34;&gt;Draft 打包支持的语言&lt;/a&gt; 的代码可以不编写 Dockerfile 或者 K8S 元数据文件直接进行部署。&lt;/li&gt;
&lt;li&gt;需要 draft 以及 helm 客户端，集群要部署 tiller，本地 Docker，Docker 仓库。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;gitkube-https-gitkube-sh&#34;&gt;&lt;a href=&#34;https://gitkube.sh/&#34; target=&#34;_blank&#34;&gt;Gitkube&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;向 K8S 集群部署代码（自动“构建-推送-部署”）。&lt;/li&gt;
&lt;li&gt;Git 推送触发部署，本机无依赖。&lt;/li&gt;
&lt;li&gt;Git 仓库中需要提供 Dockerfile 以及 K8S 元数据文件，集群中需部署 gitkube。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;helm-https-helm-sh&#34;&gt;&lt;a href=&#34;https://helm.sh/&#34; target=&#34;_blank&#34;&gt;Helm&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;在 K8S 集群上对 Chart（其中包含一个应用的所有 K8S 资源定义文件）进行部署和管理。&lt;/li&gt;
&lt;li&gt;提供了很多通用应用（例如 MySQL、Mediawiki 等）的 Chart。&lt;/li&gt;
&lt;li&gt;客户端需要 Helm，服务端需要 Tiller，Chart 定义可以在本地也可以在仓库中保存。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;ksonnet-https-ksonnet-io&#34;&gt;&lt;a href=&#34;https://ksonnet.io/&#34; target=&#34;_blank&#34;&gt;Ksonnet&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;在 jsonnet 上定义 K8S 元数据文件，然后进行部署。&lt;/li&gt;
&lt;li&gt;可以对通用模式（例如 Deployment + Service）和应用栈（例如 Redis）进行复用。&lt;/li&gt;
&lt;li&gt;需要 jsonnet 知识，安装 ksonnet 客户端。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;metaparticle-https-metaparticle-io&#34;&gt;&lt;a href=&#34;https://metaparticle.io/&#34; target=&#34;_blank&#34;&gt;Metaparticle&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;使用 &lt;a href=&#34;https://metaparticle.io/&#34; target=&#34;_blank&#34;&gt;Metaparticle 支持的语言&lt;/a&gt; 编写代码，然后部署到 K8S 集群（自动“构建-推送-部署”）&lt;/li&gt;
&lt;li&gt;在应用的代码中直接定义容器化和 K8S 相关内容，傻瓜化的编写过程，无需编写 Dockerfile 或者 Yaml。&lt;/li&gt;
&lt;li&gt;需要本地 Docker 部署，需要相关语言的库。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;skaffold-https-github-com-googlecloudplatform-skaffold&#34;&gt;&lt;a href=&#34;https://github.com/GoogleCloudPlatform/skaffold&#34; target=&#34;_blank&#34;&gt;Skaffold&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;向 K8S 集群部署代码（自动“构建-推送-部署”）。&lt;/li&gt;
&lt;li&gt;监控源代码变更，变更发生后就会触发“构建-推送-部署”过程，Pipeline 可配置。&lt;/li&gt;
&lt;li&gt;需要 Skaffold 客户端、Dockerfile、K8S 元数据文件、Skaffold 元数据文件，本地 Docker 以及私库。&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;下面进入一点细节。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;img/1*eBG8XpHztwns7GR9qtz0Pg.png&#34; alt=&#34;Brands&#34; /&gt;&lt;/p&gt;

&lt;p&gt;当今的 Kubernetes 炙手可热，用户们寻求更多的方式和流程来进行 Kubernetes 集群上的应用部署。&lt;code&gt;kubectl&lt;/code&gt; 已经成为底层工具，用户需要更易用的流程。Draft、Gitkube、Helm、Ksonnet、MetaParticle 以及 Skaffold 都是用来帮助开发人员在 Kubernetes 上进行应用构建和部署的工具。&lt;/p&gt;

&lt;p&gt;Draft、Gitkube 和 Skaffold 减轻了开发人员的负担，在构建应用的过程中，能够更快的在 Kubernetes 上运行起来。Helm 和 Ksonnet 提供了定义应用、更新版本、选择不同集群等功能，在应用构建完成，进入发布就绪状态之后，这两个工具可以提高部署能力。Metaparticle 是比较独特的一个，他把包含 yaml、dockerfile 这些东西集成到业务代码之中。&lt;/p&gt;

&lt;p&gt;所以用户自身的用例中如何进行选择？&lt;/p&gt;

&lt;h2 id=&#34;正文&#34;&gt;正文&lt;/h2&gt;

&lt;h3 id=&#34;draft-https-draft-sh-1&#34;&gt;&lt;a href=&#34;https://draft.sh/&#34; target=&#34;_blank&#34;&gt;Draft&lt;/a&gt;&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;在任何 Kubernetes 集群上简化应用的开发和部署。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;顾名思义，Draft 让面向 Kubernetes 的应用开发变得简单。官方宣称，对于运行在 Kubernetes 上的应用，Draft 这一工具是帮助开发过程而非部署的。Draft 文档中推荐使用 Helm 进行应用部署。&lt;/p&gt;

&lt;p&gt;他的目标是：开发人员还在开发调试之中的本地的代码，不经提交到版本控制系统，直接运行到 Kubernetes 集群上。开发人员对 Draft 发布的应用变更满意之后，才提交给版本控制系统。&lt;/p&gt;

&lt;p&gt;Draft 不是用来在生产环境上进行部署的，他的用意就是在于快速推进面向 Kubernetes 环境的开发过程。他内部使用 Helm 来进行变更，因此他和 Helm 的集成是非常紧密的。&lt;/p&gt;

&lt;h4 id=&#34;架构&#34;&gt;架构&lt;/h4&gt;

&lt;p&gt;&lt;img src=&#34;img/1*kV56ClDz_rrMg5wT4lpQ5Q.png&#34; alt=&#34;Draft architecture&#34; /&gt;&lt;/p&gt;

&lt;p&gt;如上图所示，&lt;code&gt;Draft&lt;/code&gt; 客户端是一个关键组件。它感知代码的变化，然后从 &lt;code&gt;Repo&lt;/code&gt; 中获取对应的 &lt;code&gt;Pack&lt;/code&gt;。&lt;code&gt;Pack&lt;/code&gt; 是一个 Dockerfile 和 Helm chart 的合体，他们一起定义了应用的运行环境。&lt;code&gt;Pack&lt;/code&gt; 定义之后保存在 &lt;code&gt;Repo&lt;/code&gt; 中。用户可以定义自己的 &lt;code&gt;Pack&lt;/code&gt; 和 &lt;code&gt;Repo&lt;/code&gt;，这两个对象可以保存在本地，也可以在 Git 仓库之中。&lt;/p&gt;

&lt;p&gt;只要有对应的 &lt;code&gt;Pack&lt;/code&gt;，任何一个包含源码的目录都可以进行部署。使用 &lt;code&gt;draft create&lt;/code&gt; 处理目录之后，会在目录中添加 Dockerfile、Helm chart 以及 draft.toml 文件，&lt;code&gt;draft up&lt;/code&gt; 能够构建 Docker 镜像，推送到私库，然后使用 Helm Chart 部署应用。每次代码变更之后，再次执行这一命令，就会产生一个新的部署。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;draft connect&lt;/code&gt; 命令能够进行端口转发，以此在本地获取容器的日志。他还能够和 &lt;code&gt;nginx-ingress&lt;/code&gt; 集成，为上面部署的应用提供域名。&lt;/p&gt;

&lt;h4 id=&#34;从-0-到-kubernetes&#34;&gt;从 0 到 Kubernetes&lt;/h4&gt;

&lt;p&gt;下面是一个用 Draft 把 Python 应用运行到 K8S 集群上的步骤。可以从&lt;a href=&#34;https://github.com/Azure/draft/blob/master/docs/getting-started.md&#34; target=&#34;_blank&#34;&gt;官方文档&lt;/a&gt;获得更详细的指导。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;先决条件&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes 集群（包括 kubectl）&lt;/li&gt;
&lt;li&gt;Helm 客户端&lt;/li&gt;
&lt;li&gt;Draft 客户端&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Docker 镜像库&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ helm init
$ draft init
$ draft config set registry docker.io/myusername
$ git clone https://github.com/Azure/draft
$ cd draft/examples/example-python
$ draft create
$ draft up
## 代码修改
$ draft up
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&#34;用例&#34;&gt;用例&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;开发运行在 Kubernetes 上的应用。&lt;/li&gt;
&lt;li&gt;用于在提交到版本控制之前的“内部流程”。&lt;/li&gt;
&lt;li&gt;预 CI：应用完成 Draft 过程之后，可以由 CI/CD 接管。&lt;/li&gt;
&lt;li&gt;不应该用在生产环境部署环节。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;gitkube-https-gitkube-sh-1&#34;&gt;&lt;a href=&#34;https://gitkube.sh/&#34; target=&#34;_blank&#34;&gt;Gitkube&lt;/a&gt;&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;使用 git push 构建 Docker 镜像并在 Kubernetes 上进行部署。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gitkube 是一个用来构建 Docker 镜像并向 Kubernetes 上部署的工具，他的起点就是 &lt;code&gt;git push&lt;/code&gt;，不像 Draft，他不需要客户端，只需在集群上独立运行。&lt;/p&gt;

&lt;p&gt;任何带有 Dockerfile 的代码仓库，都可以使用 gitkube 进行部署。Gitkube 安装和部署在集群之上，开发人员可以获取一个包含 git URL 的 CRD。开发人员推送到仓库的代码，会触发集群一端的 Docker Build 以及 Kubectl 发布流程。可以使用 kubectl 或 helm 等类似工具给应用创建应用元数据。&lt;/p&gt;

&lt;p&gt;Gitkube 的重点是即插即用的安装过程，以及沿用既有的知名工具（git 以及 kubectl）。对需要部署的仓库没有什么假设。Docker build 的上下文以及 Dockerfile 所在路径，都可以进行配置。Git 连接认证是通过 SSH 公钥进行的。任何时候代码发生变更、提交和推送，都会触发后面的构建和部署过程。&lt;/p&gt;

&lt;h4 id=&#34;架构-1&#34;&gt;架构&lt;/h4&gt;

&lt;p&gt;&lt;img src=&#34;img/1*n9Il4vKaq9gHC5qQyF-9Tg.png&#34; alt=&#34;Gitkube Architecture&#34; /&gt;&lt;/p&gt;

&lt;p&gt;集群侧有三个组件，一个远程 CRD 可以定义针对一个远端 URL 发生 Push 的时候如何应对，&lt;code&gt;gitkubed&lt;/code&gt; 构建 Docker 镜像并更新部署，&lt;code&gt;gitkube-controller&lt;/code&gt; 会监控 CRD，随变化更新 &lt;code&gt;gitkubed&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;在集群上创建这些对象之后，开发者就可以使用 kubectl 来创建应用的定义了。创建一个 &lt;code&gt;remote&lt;/code&gt; 对象，告诉 gitkube，当 git push 发生时该做什么。Gitkube 把远程 url 写回到 &lt;code&gt;remote&lt;/code&gt; 对象的状态字段中。&lt;/p&gt;

&lt;h4 id=&#34;从-0-到-kubernetes-1&#34;&gt;从 0 到 Kubernetes&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;先决条件

&lt;ul&gt;
&lt;li&gt;Kubernetes 集群（包括 kubectl）。&lt;/li&gt;
&lt;li&gt;git。&lt;/li&gt;
&lt;li&gt;集群上安装好 gitkube （&lt;code&gt;kubectl create&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面是将应用提交到 Kubernetes 的步骤，也包含了 gitkube 的安装过程。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;已经过时&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ git clone https://github.com/hasura/gitkube-example
$ cd gitkube-example
$ kubectl create -f k8s.yaml
$ cat ~/.ssh/id_rsa.pub | awk &#39;$0=&amp;quot;  - &amp;quot;$0&#39; &amp;gt;&amp;gt; &amp;quot;remote.yaml&amp;quot;
$ kubectl create -f remote.yaml
$ kubectl get remote example -o json | jq -r &#39;.status.remoteUrl&#39;
$ git remote add example [remoteUrl]
$ git push example master
## 编辑代码
## 提交和推送
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;用例-1&#34;&gt;用例&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;使用 Git 进行简单的部署，无需 Docker Build。&lt;/li&gt;
&lt;li&gt;在 Kubernetes 上开发应用。&lt;/li&gt;
&lt;li&gt;开发过程中，WIP 分支可以多次提交，迅速反馈。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;helm-https-helm-sh-1&#34;&gt;&lt;a href=&#34;https://helm.sh/&#34; target=&#34;_blank&#34;&gt;Helm&lt;/a&gt;&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Kubernetes 的包管理系统。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Helm 使用一种称为 &lt;code&gt;Chart&lt;/code&gt; 的形式，来管理 Kubernetes 上的应用。Helm 为应用创建 YAML 并进行版本化操作，这样可以对包含 Deployment 在内的所有对象进行回滚。Chart 可以包含 Deployment、Service 以及 Configmap 等。Chart 的模板允许用户方便的修改部署细节，另外还支持带有依赖关系的复杂应用。&lt;/p&gt;

&lt;p&gt;Helm 的主要目标是在生产环境中部署和管理应用程序。对比 Draft 和 Gitkube，Helm 不是用来开发的，而是用来部署的。另外现在有大量的预构建 &lt;code&gt;Chart&lt;/code&gt; 可以供 Helm 使用。&lt;/p&gt;

&lt;h4 id=&#34;架构-2&#34;&gt;架构&lt;/h4&gt;

&lt;p&gt;&lt;img src=&#34;img/1*Nsme583Ut1TY6IDZjKl27w.png&#34; alt=&#34;Helm architecture&#34; /&gt;&lt;/p&gt;

&lt;p&gt;首先看看 Chart。我们之前说过，Chart 之中包含一系列的信息，这些信息是部署应用到 Kubernetes 中的必要条件。其中可能包含 Deployment、Service、Configmap、Secret 以及 Ingress 等。所有的定义都是以 Yaml 文件模板的形式出现，另外还包含嵌套的依赖 Chart。Chart 可以在 Chart 仓库中发布。&lt;/p&gt;

&lt;p&gt;Helm 有两个主要组件，分别是 Helm 客户端和 Tiller 服务器。客户端用于管理 Chart 和仓库，并且和 Tiller 服务器进行通信，来完成对 Chart 的部署和管理。&lt;/p&gt;

&lt;p&gt;Tiller 组件运行在集群上，和 Kubernetes API 服务器打交道，进行对象的实际操作。&lt;/p&gt;

&lt;p&gt;Helm 不处理源码，用户需要使用 CI/CD 系统来构建镜像，然后用 Helm 来部署合适的镜像。&lt;/p&gt;

&lt;h4 id=&#34;从-0-到-kubernetes-2&#34;&gt;从 0 到 Kubernetes&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;先决条件

&lt;ul&gt;
&lt;li&gt;Kubernetes 集群&lt;/li&gt;
&lt;li&gt;Helm 客户端&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;接下来是一个在 Kubernetes 集群上使用 Helm 部署 Wordpress 博客的例子：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ helm init
$ helm repo update
$ helm install stable/wordpress
## 更新版本
$ helm upgrade [release-name] [chart-name]
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;用例-2&#34;&gt;用例&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;打包：包含多个 Kubernetes 对象的复杂应用可以集中在一起。&lt;/li&gt;
&lt;li&gt;可复用的 Chart 仓库。&lt;/li&gt;
&lt;li&gt;可以轻易部署在多个环境上。&lt;/li&gt;
&lt;li&gt;可嵌套的结构，能够解决依赖关系。&lt;/li&gt;
&lt;li&gt;参数化的模板。&lt;/li&gt;
&lt;li&gt;容易复用。&lt;/li&gt;
&lt;li&gt;持续交付的最后一公里。&lt;/li&gt;
&lt;li&gt;只能部署已经构建完成的镜像。&lt;/li&gt;
&lt;li&gt;具备生命周期管理能力，可以管理多个 Kubernetes 对象的升级和回滚。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;ksonnet-https-ksonnet-io-1&#34;&gt;&lt;a href=&#34;https://ksonnet.io/&#34; target=&#34;_blank&#34;&gt;Ksonnet&lt;/a&gt;&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;一个支持客户按操作的框架，提供可扩展的 Kubernetes 配置。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ksonnet 是为 Kubernetes 定义应用配置的另一种方法。它并没有使用 Kubernetes 世界中常用的 YAML 语言，改用一种称为 Jsonnet 的 JSON 模板语言。Ksonnet 客户端最终会渲染出 YAML 文件并提交给集群。&lt;/p&gt;

&lt;p&gt;这一系统的主要功能就是定义可复用的组件，并利用该工具渐进式的进行程序构建。&lt;/p&gt;

&lt;h4 id=&#34;架构-3&#34;&gt;架构&lt;/h4&gt;

&lt;p&gt;&lt;img src=&#34;img/1*mvkdIs0QOGp8xoTMOacM9g.png&#34; alt=&#34;Ksonnet 架构&#34; /&gt;&lt;/p&gt;

&lt;p&gt;基础的构建单位被称为 &lt;code&gt;part&lt;/code&gt;，&lt;code&gt;part&lt;/code&gt; 可以协作构成 &lt;code&gt;prototype&lt;/code&gt;。一个 &lt;code&gt;prototype&lt;/code&gt; 配合参数之后，就成为了一个 &lt;code&gt;component&lt;/code&gt;，&lt;code&gt;component&lt;/code&gt; 可以聚合在一起，成为一个 &lt;code&gt;application&lt;/code&gt;。&lt;code&gt;application&lt;/code&gt; 可以部署到多个 &lt;code&gt;environment&lt;/code&gt; 之中。&lt;/p&gt;

&lt;p&gt;最基础的流程就是使用 &lt;code&gt;ks init&lt;/code&gt; 命令创建一个应用目录，使用 &lt;code&gt;ks generate&lt;/code&gt; 生成（或者也可以自行编写）&lt;code&gt;component&lt;/code&gt; 的元数据文件，使用 &lt;code&gt;ks apply &amp;lt;env&amp;gt;&lt;/code&gt; 命令可以把应用部署到集群/环境之中。可以用 &lt;code&gt;ks env&lt;/code&gt; 命令来管理不同的环境。&lt;/p&gt;

&lt;p&gt;简而言之，Ksonnet 帮助用户定义和管理应用，他把应用视作一系列使用 Jsonnet 的组件进行管理，并部署在不同的 Kubernetes 集群上。&lt;/p&gt;

&lt;p&gt;跟 Helm 类似，Ksonnet 不和源码发生关系，他是一个使用 Jsonnet 为 Kubernetes 定义应用的工具。&lt;/p&gt;

&lt;h4 id=&#34;从-0-到-kubernetes-3&#34;&gt;从 0 到 Kubernetes&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;先决条件

&lt;ul&gt;
&lt;li&gt;Kubernetes 集群&lt;/li&gt;
&lt;li&gt;ksonnet 客户端&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;接下来是一个留言板例子：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ ks init
$ ks generate deployed-service guestbook-ui \
     --image gcr.io/heptio-images/ks-guestbook-demo:0.1 \
     --type ClusterIP
$ ks apply default
## 变更
$ ks apply default
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;用例-3&#34;&gt;用例&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;使用 Jsonnet 编写配置很有弹性。&lt;/li&gt;
&lt;li&gt;打包：复杂配置可以用匹配组件的方式集成起来。&lt;/li&gt;
&lt;li&gt;可复用的组件和原型库：避免重复。&lt;/li&gt;
&lt;li&gt;方便的多环境部署。&lt;/li&gt;
&lt;li&gt;CD 的最后一步。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;metaparticle-https-metaparticle-io-1&#34;&gt;&lt;a href=&#34;https://metaparticle.io/&#34; target=&#34;_blank&#34;&gt;Metaparticle&lt;/a&gt;&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;为容器和 Kubernetes 而生的云原生标准库。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Metaparticle 将自己定位于云原生应用的标准库，他内置了经过验证的分布式系统模式，而开发人员可以用习惯的编程语言通过原语的方式方便的采用这些先进模式。&lt;/p&gt;

&lt;p&gt;他提供了简易的语言接口，帮助用户构建可以容器化并部署到 Kubernetes 上的应用，这些应用会直接兼容负载均衡等基础设施。无需自行编写 Dockerfile 或者 Kubernetes 元数据文件，所有相关内容都在代码中的用原语来体现。&lt;/p&gt;

&lt;p&gt;例如一个 Python Web 应用，可以给 main 函数加入一个叫做 &lt;code&gt;containerize&lt;/code&gt; 的 Decorator（从 metaparticle 中 import）。当执行这段 Python 代码的时候，会构建 Docker 镜像并部署到 Decorator 参数中提到的 Kubernetes 集群上。缺省集群定义来自 kubectl 上下文。所以切换环境就和切换当前上下文是等价的。&lt;/p&gt;

&lt;p&gt;在 NodeJS、Java 以及 .NET 上也提供了类似的原语。另外还正在开发更多的语言支持。&lt;/p&gt;

&lt;h4 id=&#34;架构-4&#34;&gt;架构&lt;/h4&gt;

&lt;p&gt;各种语言的 &lt;code&gt;metaparticle&lt;/code&gt; 库都包含所需的原语，绑定了构建 Docker 镜像、推送到私库、创建 Kubenretes yaml 文件并在集群上部署的代码。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/metaparticle-io/package&#34; target=&#34;_blank&#34;&gt;Metaparticle 包&lt;/a&gt;中内置了各种语言用来构建容器的支持。而 &lt;a href=&#34;https://github.com/metaparticle-io/sync&#34; target=&#34;_blank&#34;&gt;Metaparticle Sync&lt;/a&gt; 则包含了在不同机器上运行的不同容器进行同步的能力。&lt;/p&gt;

&lt;p&gt;目前支持的语言包括：JavaScript/NodeJS、Python、Java 以及 .NET。&lt;/p&gt;

&lt;h4 id=&#34;从-0-到-kubernetes-4&#34;&gt;从 0 到 Kubernetes&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;先决条件

&lt;ul&gt;
&lt;li&gt;Kubernetes 集群。&lt;/li&gt;
&lt;li&gt;特定语言的 Metaparticle 库。&lt;/li&gt;
&lt;li&gt;Docker。&lt;/li&gt;
&lt;li&gt;Docker 私库。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一个只包含相关内容的 Python 例子，可以使用这些代码构建 Docker 镜像，并在 Kubernetes 上进行部署。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;@containerize(
    &#39;docker.io/your-docker-user-goes-here&#39;,
    options={
        &#39;ports&#39;: [8080],
        &#39;replicas&#39;: 4,
        &#39;runner&#39;: &#39;metaparticle&#39;,
        &#39;name&#39;: &#39;my-image&#39;,
        &#39;publish&#39;: True
    })
def main():
    Handler = MyHandler
    httpd = SocketServer.TCPServer((&amp;quot;&amp;quot;, port), Handler)
    httpd.serve_forever()
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;用例-4&#34;&gt;用例&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;只想开发应用，不想担心 Kubernetes YAML 或者 Dockerfile。&lt;/li&gt;
&lt;li&gt;不想掌握多种工具和文件格式，又想搭上容器和 Kubernetes 快车的开发人员。&lt;/li&gt;
&lt;li&gt;快速开发可复制可负载均衡的服务。&lt;/li&gt;
&lt;li&gt;在多个分布式副本之间进行同步，例如加锁、或者选举操作。&lt;/li&gt;
&lt;li&gt;简单开发云原生模式的应用，例如分片系统。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;skaffold-https-github-com-googlecloudplatform-skaffold-1&#34;&gt;&lt;a href=&#34;https://github.com/GoogleCloudPlatform/skaffold&#34; target=&#34;_blank&#34;&gt;Skaffold&lt;/a&gt;&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;简单可重复的 Kubernetes 开发。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Skaffold 能够处理构建镜像、推送镜像以及在 Kubernetes 上进行部署。跟 Gitkube 类似，任何包含 Dockerfile 的目录都可以用 Skaffold 部署到 kubernetes 集群上。&lt;/p&gt;

&lt;p&gt;Skaffold 会在本地构建 Docker 镜像，推送到私库，然后使用 &lt;code&gt;skaffold&lt;/code&gt; 客户端进行部署。他还会监测目录，如此一来，目录中的代码一旦发生变化，就会触发重新构建和部署。这个过程还会从容器中获取日志。&lt;/p&gt;

&lt;p&gt;可以使用 YAML 文件来构建、推送、部署的 Pipeline，所以开发者可以混合使用合适的工具，例如 Docker build 和 Google Container Builder，Kubectl 和 Helm 等。&lt;/p&gt;

&lt;h4 id=&#34;架构-5&#34;&gt;架构&lt;/h4&gt;

&lt;p&gt;&lt;img src=&#34;img/1*elRwOUeoOJvGOK9JdHZIrA.png&#34; alt=&#34;Skaffold 概览&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Skaffold 客户端做了所有的工作。他会查找一个叫做 &lt;code&gt;skaffold.yaml&lt;/code&gt; 的文件，其中包含了必须完成的任务。一个典型的例子就是在 &lt;code&gt;skaffold dev&lt;/code&gt; 运行的目录中查找 Dockerfile 构建 Docker 镜像，并使用 sha256 进行标记，推送镜像，把镜像设置到 Kubernetes 元数据文件之中，最后发布到集群上。这一系列动作会被目录中的变更所触发。来自部署容器的日志会出现在同一个 Watch 窗口中。&lt;/p&gt;

&lt;p&gt;Skaffold 和 Draft 和 Gitkube 很像，但是更具弹性，如上图所示，他能管理不同的“构建-推送-部署”流程。&lt;/p&gt;

&lt;h4 id=&#34;从-0-到-kubernetes-5&#34;&gt;从 0 到 Kubernetes&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;先决条件

&lt;ul&gt;
&lt;li&gt;Kubernetes 集群&lt;/li&gt;
&lt;li&gt;Skaffold 客户端&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker 镜像库&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面的步骤，部署一个 Go 编写的 Hello World 应用：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ git clone https://github.com/GoogleCloudPlatform/skaffold
$ cd examples/getting-started
## 编辑 skaffold.yaml，加入 Docker 仓库
$ skaffold dev
## 打开新终端: 编辑代码
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;用例-5&#34;&gt;用例&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;方便部署。&lt;/li&gt;
&lt;li&gt;迭代构建——持续的构建-发布流程。&lt;/li&gt;
&lt;li&gt;为 Kubernetes 开发应用。&lt;/li&gt;
&lt;li&gt;在 CICD 流程中定义“构建-推送-部署”流程。&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Istio 0.8 的 Helm Chart 解析</title>
      <link>/post/istio-0.8.0-helm/</link>
      <pubDate>Mon, 04 Jun 2018 09:39:10 +0800</pubDate>
      <guid>/post/istio-0.8.0-helm/</guid>
      <description>

&lt;p&gt;儿童节期间，拖拉了一个多月的 Istio 0.8 正式发布了，这可能是 Istio 1.0 之前的最后一个 LTS 版本，意义重大。&lt;/p&gt;

&lt;p&gt;新版本中，原来的 Kubernetes 安装文件 &lt;code&gt;install/kubernetes/istio.yaml&lt;/code&gt;，变成了 &lt;code&gt;install/kubernetes/istio-demo.yaml&lt;/code&gt;，是的，你没看错，这个 LTS 的安装文件名字叫 demo。查看了一下文档，大概察觉到不靠谱的 Istio 发布组的意图了：这个项目的组件相对比较复杂，原有的一些选项是靠 ConfigMap 以及 istioctl 分别调整的，现在通过重新设计的 Helm Chart，安装选项用 values.yml 或者 helm 命令行的方式来进行集中管理了。下面就由看看 Istio 的 Helm Chart 的安装部署及其结构。&lt;/p&gt;

&lt;h2 id=&#34;使用-helm-安装-istio&#34;&gt;使用 Helm 安装 Istio&lt;/h2&gt;

&lt;p&gt;安装包内的 Helm 目录中包含了 Istio 的 Chart，官方提供了两种方法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;用 Helm 生成 istio.yaml，然后自行安装。&lt;/li&gt;
&lt;li&gt;用 Tiller 直接安装。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;很明显，两种方法并没有什么本质区别。例如第一个命令：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;helm template install/kubernetes/helm/istio \
    --name istio --namespace  \
    istio-system &amp;gt; $HOME/istio.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里说的是使用 &lt;code&gt;install/kubernetes/helm/istio&lt;/code&gt; 目录中的 Chart 进行渲染，生成的内容保存到 &lt;code&gt;$HOME/istio.yaml&lt;/code&gt; 文件之中。而第二个命令&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;helm template install/kubernetes/helm/istio \
    --name istio --namespace istio-system \
    --set sidecarInjectorWebhook.enabled=false &amp;gt; $HOME/istio.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;只是设置了 Chart 中的一个变量 &lt;code&gt;sidecarInjectorWebhook.enabled&lt;/code&gt; 为 False。从而禁止自动注入属性生效。&lt;/p&gt;

&lt;p&gt;我们照猫画虎，看看命令二的结果提交到 Kubernetes 中会发生什么事情。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-sh&#34;&gt;helm template install/kubernetes/helm/istio --name istio \
--namespace istio-system --set sidecarInjectorWebhook.enabled=false &amp;gt; $HOME/istio.yaml

kubectl create namespace istio-system
kubectl create -f $HOME/istio.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;根据不同的网络情况，可能需要几分钟的等待，最后会看到这些 Pod 在运行：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;istio-citadel-ff5696f6f-h4rdz
istio-cleanup-old-ca-rp5p6
istio-egressgateway-58d98d898c-5jnpz
istio-ingress-6fb78f687f-wsl5q
istio-ingressgateway-6bc7c7c4bc-hhrh7
istio-mixer-post-install-d2kl5
istio-pilot-6c5c6b586c-dqv2w
istio-policy-5c7fbb4b9f-xmv6f
istio-statsd-prom-bridge-6dbb7dcc7f-27tx7
istio-telemetry-54b5bf4847-9gpr7
prometheus-586d95b8d9-gb846
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;过去的 istio-ca 现已更名 istio-citadel。&lt;/li&gt;
&lt;li&gt;istio-cleanup-old-ca 是一个 job，用于清理过去的 Istio 遗留下来的 CA 部署（包括 sa、deploy 以及 svc 三个对象）。&lt;/li&gt;
&lt;li&gt;istio-mixer-post-install 同样也是一个 job，和上面的 Job 一样，简单的调用 kubectl 创建第三方资源，从而避免了之前的 CDR 需要重复创建的尴尬状况。&lt;/li&gt;
&lt;li&gt;egressgateway、ingress 以及 ingressgateway，可以看出边缘部分的变动很大，以后会另行发文。&lt;/li&gt;
&lt;li&gt;和从前不同，缺省已经打开了监控界面。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;helm-chart-的安装配置&#34;&gt;Helm Chart 的安装配置&lt;/h3&gt;

&lt;p&gt;下面的配置项目，都可以使用 helm 的 &lt;code&gt;--set key=value&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;global.hub&lt;/td&gt;
&lt;td&gt;绝大部分镜像所在的镜像库地址&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker.io/istionightly&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.tag&lt;/td&gt;
&lt;td&gt;Istio 使用的绝大部分镜像的 Tag&lt;/td&gt;
&lt;td&gt;&lt;code&gt;circleci-nightly&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.proxy.image&lt;/td&gt;
&lt;td&gt;指定 Proxy 的镜像名称&lt;/td&gt;
&lt;td&gt;&lt;code&gt;proxyv2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.imagePullPolicy&lt;/td&gt;
&lt;td&gt;镜像拉取策略&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IfNotPresent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.controlPlaneSecurityEnabled&lt;/td&gt;
&lt;td&gt;控制面是否启动 mTLS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.mtls.enabled&lt;/td&gt;
&lt;td&gt;服务间是否缺省启用 mTLS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.mtls.mtlsExcludedServices&lt;/td&gt;
&lt;td&gt;禁用 mTLS 的 FQDN 列表&lt;/td&gt;
&lt;td&gt;&lt;code&gt;- kubernetes.default.svc.cluster.local&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.rbacEnabled&lt;/td&gt;
&lt;td&gt;是否创建 RBAC 规则&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.refreshInterval&lt;/td&gt;
&lt;td&gt;Mesh 发现间隔&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.arch.amd64&lt;/td&gt;
&lt;td&gt;amd64 架构中的调度策略，0：never；1: least preferred；2：no preference；3：most preferred&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.arch.s390x&lt;/td&gt;
&lt;td&gt;amd64 架构中的调度策略，0：never；1: least preferred；2：no preference；3：most preferred&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;global.arch.ppc64le&lt;/td&gt;
&lt;td&gt;amd64 架构中的调度策略，0：never；1: least preferred；2：no preference；3：most preferred&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;galley.enabled&lt;/td&gt;
&lt;td&gt;是否安装 Galley 用于进行服务端的配置验证，需要 1.9 版本以上的 Kubernetes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;上面的内容来自&lt;a href=&#34;https://istio.io/docs/setup/kubernetes/helm-install/&#34; target=&#34;_blank&#34;&gt;官方文档&lt;/a&gt;，其实这是不符合实际情况的（Istio 用户的日常）。在 &lt;code&gt;install/kubernetes/helm/istio/values.yaml&lt;/code&gt; 中，包含这一发行版本中的所有的缺省值。可以直接修改或者新建 values.yaml，并在 helm 命令行使用 &lt;code&gt;-f my-values.yaml&lt;/code&gt; 参数来生成自行定制的 &lt;code&gt;istio.yaml&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&#34;解读-istio-helm-chart-中的模块&#34;&gt;解读 Istio Helm Chart 中的模块&lt;/h2&gt;

&lt;p&gt;打开 Istio 的 Chart 之后，发现其中并没有任何组件的内容，只有两个 Configmap 对象的模板。其安装主体再次很非主流的通过依赖 Chart 的方式实现了完全的模块化。因此这个 Chart 的主体，实际上是 &lt;code&gt;requirements.yaml&lt;/code&gt;，打开这个文件，会看到规规矩矩的列出很多模块，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;  - name: sidecarInjectorWebhook
    version: 0.8.0
    # repository: file://../sidecarInjectorWebhook
    condition: sidecarInjectorWebhook.enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这表明在 &lt;code&gt;sidecarInjectorWebhook&lt;/code&gt; 取值为 &lt;code&gt;enabled&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;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;egressgateway&lt;/td&gt;
&lt;td&gt;外发流量网关&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;galley&lt;/td&gt;
&lt;td&gt;在 K8S 服务端验证 Istio 的 CRD 资源的合法性&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;grafana&lt;/td&gt;
&lt;td&gt;Dashboard&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;ingress&lt;/td&gt;
&lt;td&gt;Ingress Controller&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;ingressgateway&lt;/td&gt;
&lt;td&gt;Ingress Gateway&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;mixer&lt;/td&gt;
&lt;td&gt;Mixer&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;pilot&lt;/td&gt;
&lt;td&gt;Pilot&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;prometheus&lt;/td&gt;
&lt;td&gt;Prometheus&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;security&lt;/td&gt;
&lt;td&gt;安全相关内容&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;servicegraph&lt;/td&gt;
&lt;td&gt;调用关系图&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;sidecarInjectorWebhook&lt;/td&gt;
&lt;td&gt;自动注入&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;tracing&lt;/td&gt;
&lt;td&gt;Zipkin Jeager 的跟踪服务&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;下面逐一做一下简要说明&lt;/p&gt;

&lt;h3 id=&#34;egressgateway&#34;&gt;egressgateway&lt;/h3&gt;

&lt;p&gt;外发通信的网关。&lt;/p&gt;

&lt;p&gt;他的设置保存在 &lt;code&gt;values.yaml&lt;/code&gt; 的 &lt;code&gt;egressgateway&lt;/code&gt; 一节中（都是保存在同名分支下，后面不再重复）。部署内容包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment 和 Service：一个 proxy。&lt;/li&gt;
&lt;li&gt;HPA&lt;/li&gt;
&lt;li&gt;RBAC 相关内容&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;可定制项目包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;服务端口和类型&lt;/li&gt;
&lt;li&gt;HPA 实例数量上下限&lt;/li&gt;
&lt;li&gt;资源限制&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;galley&#34;&gt;galley&lt;/h3&gt;

&lt;p&gt;之前的 istio 版本中，只能通过 istioctl 验证 Istio 相关 CRD 的有效性，这个模块提供一个在服务端验证 CRD 的方法，他的部署内容包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployement 和 Service。&lt;/li&gt;
&lt;li&gt;RBAC 相关&lt;/li&gt;
&lt;li&gt;用于 CRD 校验的 ValidatingWebhookConfiguration 对象。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;校验目标包含 Pilot（例如 destinationpolicies 和 routerules） 和 Mixer（例如 memquotas 和 prometheuses） 两类 CRD。&lt;/p&gt;

&lt;h3 id=&#34;grafana&#34;&gt;grafana&lt;/h3&gt;

&lt;p&gt;一个带有 Istio 定制 Dashboard 的 Grafana 封装。&lt;/p&gt;

&lt;p&gt;实际上将其镜像中的 Dashboard 复制出来就可以在其他 Grafana 实例上运行了。&lt;/p&gt;

&lt;p&gt;定制内容的 &lt;code&gt;grafana.ingress.*&lt;/code&gt; 中包含 Ingress 的配置，用于外网访问。&lt;/p&gt;

&lt;h3 id=&#34;ingress&#34;&gt;ingress&lt;/h3&gt;

&lt;p&gt;Istio 的 Ingress Controller&lt;/p&gt;

&lt;p&gt;具体部署内容和 egresscontroller 基本一致。&lt;/p&gt;

&lt;h3 id=&#34;ingressgateway&#34;&gt;ingressgateway&lt;/h3&gt;

&lt;p&gt;0.8.0 新增功能，为 Ingress 通信提供 Istio rules/destination 等特性。&lt;/p&gt;

&lt;p&gt;部署内容和 ingress 类似。&lt;/p&gt;

&lt;h3 id=&#34;mixer&#34;&gt;mixer&lt;/h3&gt;

&lt;p&gt;Mixer 负责的是遥测和前置检查，他的 Chart 相对比较复杂，部署内容包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;和前面的版本不同，Mixer 的部署分成了两个部分，分别是 Policy 和 Telemetry 两个 Deployment 对象。&lt;/li&gt;
&lt;li&gt;Service 也同样分成两个，其中 telemetry service 多了一个 prometheus 端口&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crds.yaml&lt;/code&gt; 中包含了 mixer 所支持的所有 crd 定义（例如 memquotas 和 prometheuses）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create-custom-resources-job.yaml&lt;/code&gt; 中包含了用于创建 crd 的 Job 对象。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;pilot&#34;&gt;pilot&lt;/h3&gt;

&lt;p&gt;Pilot 承上启下，负责服务发现和向 Proxy 下发配置。除了常规的 Deployment 和 Service 之外，还包含了 &lt;code&gt;crds.yaml&lt;/code&gt;，用于声明 CRD 资源类型（例如 destinationpolicies 和 routerules）。&lt;/p&gt;

&lt;h3 id=&#34;prometheus&#34;&gt;prometheus&lt;/h3&gt;

&lt;p&gt;这个组件跟前面的 Grafana 类似，也是一个预定义的镜像。这个模板中的 Configmap 就是 Prometheus 的抓取配置，可以直接用到其他的 Prometheus 实例之中。&lt;/p&gt;

&lt;h3 id=&#34;security&#34;&gt;security&lt;/h3&gt;

&lt;p&gt;旧版本中的 Istio-ca&lt;/p&gt;

&lt;p&gt;Security 部分的部署内容包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RBAC&lt;/li&gt;
&lt;li&gt;Job：使用 kubectl 清理旧版本 istio-ca 实例。&lt;/li&gt;
&lt;li&gt;Deployment，原 CA。&lt;/li&gt;
&lt;li&gt;Service：开放两个端口，分别服务于 http 和 gRPC。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;servicegraph&#34;&gt;servicegraph&lt;/h3&gt;

&lt;p&gt;Service Graph 支持，和 Grafana 基本一致。&lt;/p&gt;

&lt;h3 id=&#34;sidecarinjectorwebhook&#34;&gt;sidecarInjectorWebhook&lt;/h3&gt;

&lt;p&gt;这一部分的功能是自动为 K8S 对象注入 Envoy。主要包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment 和 Service&lt;/li&gt;
&lt;li&gt;RBAC 相关&lt;/li&gt;
&lt;li&gt;一个 &lt;code&gt;MutatingWebhookConfiguration&lt;/code&gt; 对象，会监听 Pod 的创建事件，用于自动注入。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;tracing&#34;&gt;tracing&lt;/h3&gt;

&lt;p&gt;Jeager 的跟踪支持，总体情况跟 Prometheus 和 Grafana 等监控组件类似，配置项和暴露服务方面稍有区别：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;配置中包含 Jaeger 的环境变量的控制。&lt;/li&gt;
&lt;li&gt;开启 jaeger 开关，会启用 Jaeger 的几个服务端口。&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Helm 简介</title>
      <link>/post/helm-introducing/</link>
      <pubDate>Thu, 30 Mar 2017 08:47:48 +0800</pubDate>
      <guid>/post/helm-introducing/</guid>
      <description>

&lt;h2 id=&#34;概念&#34;&gt;概念&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chart：一个 Helm 包，其中包含了运行一个应用所需要的工具、资源定义等，还可能包含 Kubernetes 集群中的服务定义，类似 Homebrew 中的 formula，APT 的 dpkg 或者 Yum 的 RPM 文件，&lt;/li&gt;
&lt;li&gt;Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上，一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart，如果想在服务器上运行两个数据库，就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release，会有自己的 Release 名称。&lt;/li&gt;
&lt;li&gt;Repository：用于存放和共享 Chart 的仓库。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;简单说来，Helm 整个系统的主要任务就是，在仓库中查找需要的 Chart，然后把 Chart 以 Release 的形式安装到 Kubernetes 之中&lt;/p&gt;

&lt;h2 id=&#34;组件&#34;&gt;组件&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Helm Client：客户端，具有对 Repository、Chart、Release 等对象的管理能力。&lt;/li&gt;
&lt;li&gt;Tiller Server：负责客户端指令和 Kubernetes 集群之间的沟通，根据 Chart 定义，生成和管理各种相对应的 API Object。&lt;/li&gt;
&lt;li&gt;Repository：Chart 的仓库，基本上就是索引文件 + Chart 压缩包的一个存储托管。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;

&lt;h3 id=&#34;环境要求&#34;&gt;环境要求&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;可用的 Kubernetes 集群&lt;/li&gt;
&lt;li&gt;正确的可用的 kubectl config&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;简单做法&#34;&gt;简单做法&lt;/h3&gt;

&lt;p&gt;只要一个简单的 &lt;code&gt;helm init&lt;/code&gt; 命令，就可以自动完成 Tiller 的安装，以及 Helm 本地设置。&lt;/p&gt;

&lt;h3 id=&#34;手工做法&#34;&gt;手工做法&lt;/h3&gt;

&lt;p&gt;在一个网络不通，或者受控网络里面，init 可能无法正常工作，所以我们需要手工完成 Init 工作。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;客户端：&lt;code&gt;helm init -c&lt;/code&gt;，会跳过 Tiller 部分，仅进行客户端的安装。

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.helm&lt;/code&gt; 中保存了对 Repository 的定义，各个 Repository 的索引的缓存，以及 Chart 压缩包的缓存。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Tiller：下面是 Tiller 的运行 YML：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: &amp;quot;1&amp;quot;
generation: 1
labels:
app: helm
name: tiller
name: tiller-deploy
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
  app: helm
  name: tiller
strategy:
rollingUpdate:
  maxSurge: 1
  maxUnavailable: 1
type: RollingUpdate
template:
metadata:
  creationTimestamp: null
  labels:
    app: helm
    name: tiller
spec:
  containers:
  - env:
    - name: TILLER_NAMESPACE
      value: kube-system
    image: gcr.io/kubernetes-helm/tiller:v2.2.3
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 3
      httpGet:
        path: /liveness
        port: 44135
        scheme: HTTP
      initialDelaySeconds: 1
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1
    name: tiller
    ports:
    - containerPort: 44134
      name: tiller
      protocol: TCP
    readinessProbe:
      failureThreshold: 3
      httpGet:
        path: /readiness
        port: 44135
        scheme: HTTP
      initialDelaySeconds: 1
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1
  dnsPolicy: ClusterFirst
  restartPolicy: Always
  securityContext: {}
  terminationGracePeriodSeconds: 30
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Service&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2017-03-27T15:06:49Z
  labels:
    app: helm
    name: tiller
  name: tiller-deploy
  namespace: kube-system
spec:
  clusterIP: 10.3.251.197
  ports:
  - name: tiller
    port: 44134
    protocol: TCP
    targetPort: tiller
  selector:
    app: helm
    name: tiller
  sessionAffinity: None
  type: ClusterIP
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;注意楼上的 Service 代码表明 Tiller 并没有用 NodePort 或者 Ingress/Loadbalancer 等方式暴露端口，因此这里&lt;strong&gt;推测&lt;/strong&gt; Helm 同 Tiller 的通信可能是利用 kubectl proxy 完成的。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;常用操作&#34;&gt;常用操作&lt;/h2&gt;

&lt;p&gt;下面列举了一个简单的安装数据库的操作过程：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;helm search mysql #搜索
helm inspect stable/mariadb #查看
helm install stable/mariadb #安装
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;很明显，上面的命令没有对 Chart 的而运行做任何指导，实际上没什么用，我们可以利用 &lt;code&gt;--set&lt;/code&gt; 或者 &lt;code&gt;--value&lt;/code&gt; 参数，来指定在我们 Inspect 命令中看到的变量的值，就可以完成对变量的设置了。&lt;/p&gt;

&lt;p&gt;除了利用简单的模板功能来生成和控制 pvc/secret 等各种对象之外， Chart 还具有很重要的依赖管理功能。&lt;/p&gt;

&lt;h2 id=&#34;自建-chart&#34;&gt;自建 Chart&lt;/h2&gt;

&lt;p&gt;简单的一个 &lt;code&gt;helm create&lt;/code&gt; 命令就可以初始化一个 chart。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;├── Chart.yaml # Chart 的文件主要信息
├── charts # 依赖的 Chart
├── templates # 模板目录，用 gotpl 编写 Kubernetes 运行 App 所需的各种对象定义
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml # 缺省值定义
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;编写完成之后，使用 &lt;code&gt;helm package&lt;/code&gt; 命令可以将 chart 打包为 tgz 格式。&lt;/p&gt;

&lt;p&gt;最后可以运行 &lt;code&gt;helm install ./some.chart.tgz&lt;/code&gt; 来运行本地的 Chart。&lt;/p&gt;

&lt;h2 id=&#34;自建-repository&#34;&gt;自建 Repository&lt;/h2&gt;

&lt;p&gt;很明显的，我们需要一个自建仓库，不过幸运的是，Helm 仓库并不像 Docker Image Registry 之类的东西那么麻烦。只要一个能相应 GET 请求并提供 YAML 和 TAR 文件的 HTTP 服务器就可以了。&lt;/p&gt;

&lt;p&gt;最简单的，可以用 &lt;code&gt;helm serve&lt;/code&gt; 命令就可以了：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;首先创建一个文件夹用于保存 Chart&lt;/li&gt;
&lt;li&gt;把上面我们 &lt;code&gt;helm package&lt;/code&gt; 生成的压缩包复制进去&lt;/li&gt;
&lt;li&gt;&lt;code&gt;helm serve --repo-path repo&lt;/code&gt; 就会运行一个简单的 HTTP Server 提供 Helm chart 仓库的服务了。&lt;/li&gt;
&lt;li&gt;运行&lt;code&gt;helm repo add some-repo http://repo-url&lt;/code&gt; 命令，添加仓库到系统中。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外可以利用 github 以及各种 HTTP 服务器来提供这一服务。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
