# Istio Helm Chart 详解 - 概述

## 前言

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

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

## 总体结构

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1746324565170/263aa51e-3c6a-4066-ae1f-9b980a98834c.png align="center")

### Chart.yaml

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

### values-\*.yaml

这里提供了一组 values 文件，提供 Istio 在各种场景下的关键配置范本。对 Istio 的定制可以从 `values.yaml` 的改写开始，完成后可以使用 `helm template` 命令来生成最终的部署文件供 `kubectl` 使用。`values.yaml` 文件的一些细节可以参考[官方文档](https://docs.helm.sh/chart_best_practices/values/)。

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

### requiremtens.yaml

这个文件用于管理 Chart 的[依赖关系](https://docs.helm.sh/developing_charts/#chart-dependencies)，Istio 的各个组件就是在这里定义的，并且可以通过变量进行控制。

### templates

#### \_affinity.tpl

该文件会生成一组[节点亲和/互斥](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity-beta-feature)元素，供各个组件在渲染 YAML 时候使用。

* `nodeAffinityRequiredDuringScheduling`：仅在本文件中使用。这里规定了对节点的要求，`values.yaml` 中的 `global.arch` 变量中列出了一系列的主机架构，只有出现在这一列表中，且对应值大于 `0` 的节点，才会将 Pod 调度到该节点上。
    
* `nodeAffinityPreferredDuringScheduling`：仅在本文件中使用。这里规定了调度优先级，为各种架构的节点分配了权重。
    
* `nodeaffinity`：包含了上面谈到的两个模板，合成为一个节点亲和性的代码段，供外部文件使用，影响范围包括：
    
    | 文件名 | 涉及对象 |
    | --- | --- |
    | `charts/galley/templates/deployment.yaml` | Deployment：`istio-galley`。 |
    | `charts/gateways/templates/deployment.yaml` | 所有 gateways Chart 生成的 Deployment。 |
    | `charts/grafana/templates/deployment.yaml` | Deployment：`grafana`。 |
    | `charts/ingress/templates/deployment.yaml` | Deployment：`istio-ingress`。 |
    | `charts/mixer/templates/deployment.yaml` | Deployment：`istio-policy` |
    | `charts/pilot/templates/deployment.yaml` | Deployment：`istio-pilot` |
    | `charts/prometheus/templates/deployment.yaml` | Deployment：`prometheus` |
    | `charts/security/templates/deployment.yaml` | Deployment：`istio-citadel` |
    | `charts/servicegraph/templates/deployment.yaml` | Deployment：`servicegraph` |
    | `charts/sidecarInjectorWebhook/templates/deployment.yaml` | Deployment：`istio-sidecar-injector` |
    | `charts/tracing/templates/deployment.yaml` | Deployment：`istio-tracing` |
    

#### \_helpers.tpl

这个文件并不特别，创建了四个变量，供 Helm 使用。

#### sidecar-injector-configmap.yaml

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

#### configmap.yaml

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

### charts

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

## 小结

本篇主要讲述的是整体结构以及顶层对象的一些内容。后面将会分几篇文章讲讲各种变量的应用以及各个 Chart 的配置。
