# Istio Helm Chart 详解 - Galley

## 前言

[Galley](https://istio.io/docs/reference/commands/galley/) 是 Istio 的配置管理组件，根据[官方文档](https://preliminary.istio.io/zh/docs/concepts/what-is-istio/#galley)的描述：

> Galley 代表其他的 Istio 控制平面组件，用来验证用户编写的 Istio API 配置。随着时间的推移，Galley 将接管 Istio 获取配置、 处理和分配组件的顶级责任。它将负责将其他的 Istio 组件与从底层平台（例如 Kubernetes）获取用户配置的细节中隔离开来。

## values.yaml 中的相关变量

```yaml
galley:
  enabled: true
  replicaCount: 1
  image: galley
```

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

* `enabled`：负责在 `requirements.yaml` 中标识是否启用 Galley 组件。
    
* `replicaCount`：负责在 `deployment.yaml` 中定义副本数量。
    
* `image`：负责在 `deployment.yaml` 中定义镜像。
    

## RBAC 相关内容

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

`clusterrole.yaml` 模板中定义了 Galley 所需使用的系统资源：

* 对 `admissionregistration.k8s.io` 组中的 `validatingwebhookconfigurations` 类型的完全控制。
    
* `config.istio.io`： Mixer CRD 的所有资源的读取权限。
    
* 对 `istio-galley` Deployment 和 Endpoint 的读取权限。
    

`clusterrolebinding.yaml` 将上面的两个对象连接起来完成授权。

## service.yaml

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

该文件只引用了 `Release` 内置变量。

## deployment.yaml

这里以 [Galley](https://istio.io/docs/reference/commands/galley/) 为主进程创建了一个 Deployment 对象。

在 `annotation` 一节中将 `sidecar.istio.io/inject` 设置为 `false` 来防止自动注入 Sidecar。

### 全局变量

* Chart
    
* Release
    
* global.priorityClassName
    
* global.hub
    
* global.tag
    
* global.imagePullPolicy
    
* 模板 nodeaffinity
    
* global.defaultResources
    

### 变量使用细节

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

### 加载卷

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

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

## configmap.yaml 以及 validatingwehookconfiguration.yaml.tpl

`configmap.yaml` 模板中并没有实质内容，主要内容存在于 `validatingwehookconfiguration.yaml.tpl` 之中。

这个模板中定义了一个 [`ValidatingWebhookConfiguration`](https://docs.okd.io/latest/rest_api/apis-admissionregistration.k8s.io/v1beta1.ValidatingWebhookConfiguration.html#object-schema) 类型的资源。这种资源用于在不改变资源的情况下，对其进行校验并发出接受或拒绝的决策。

### 引用全局变量

* `Chart` 和 `Release`：用于生成标签和命名空间。
    
* `global.configValidation`：如果这一变量为 True，才会生成后续内容。
    

### Webhook

`webhooks` 一节定义了两个元素，分别用于 Pilot 和 Mixer 的校验。以 Mixer 部分为例。

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

## 结论

Galley 目前的文档非常少，主要在[参考](https://istio.io/zh/docs/reference/commands/galley/)和[运维指南](https://istio.io/zh/help/ops/setup/validation/)部分有一点介绍，但 Istio 的配置难度是很著名的，因此推测随着项目的推进和普及，Galley 会持续的增强，并提供更多这方面的文档。
