高级 Helm chart 自定义

先决条件

在开始之前,请检查以下先决条件:

  1. 下载 Istio 发行版
  2. 执行任何必要的特定于平台的设置
  3. 检查 Pod 和 Service 的请求
  4. 使用 helm 进行 Istio 安装
  5. Helm 版本支持后期渲染。(>= 3.1)
  6. kubectl 或 kustomize。

高级 Helm chart 自定义

Istio 的 Helm chart 尝试结合用户满足其特定需求所需的大部分属性。 然而,它并不包含了所有您可能想要调整 Kubernetes 值。 虽然建立这样的机制并不实际,但在本文档中,我们将演示一种方法, 该方法允许您进行一些高级 Helm chart 自定义, 而无需直接修改 Istio 的 Helm chart。

使用 Helm 和 kustomize 对 Istio Chart 文件进行后期渲染

使用 Helm post-rendererpost-renderer 功能,您可以轻松地调整安装清单以满足您的要求。 Post-rendering 可在 Helm 安装前灵活地操作、配置、和/或验证已渲染的清单。 这使得具有高级配置需求的用户可以使用像 Kustomize 这样的工具来应用配置更改, 而不需要原始 Chart 维护人员提供的任何额外支持。

向现有图表添加值

在本例中,我们将为 Istio 的 ingress-gateway 部署添加一个 sysctl 值。我们需要:

  1. 创建 sysctl Deployment 自定义补丁模板。
  2. 使用 Helm 应用补丁 post-rendering
  3. 验证 sysctl 补丁是否已正确应用到 Pod 中。

创建 Kustomization

首先,我们创建一个 sysctl 补丁文件,向 ingress-gateway Pod 添加一个 securityContext 并附加属性:

  1. $ cat > sysctl-ingress-gw-customization.yaml <<EOF
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: istio-ingress
  6. namespace: istio-ingress
  7. spec:
  8. template:
  9. spec:
  10. securityContext:
  11. sysctls:
  12. - name: net.netfilter.nf_conntrack_tcp_timeout_close_wait
  13. value: "10"
  14. EOF

下面的 shell 脚本有助于弥补 Helm post-renderer 和 Kustomize 之间的差距, 因为前者适用 stdin/stdout,而后者适用于文件。

  1. $ cat > kustomize.sh <<EOF
  2. #!/bin/sh
  3. cat > base.yaml
  4. exec kubectl kustomize # 如果您安装了它,您也可以使用 "kustomize build ."。
  5. EOF
  6. $ chmod +x ./kustomize.sh

最后,让我们创建 kustomization yaml 文件,这是 kustomize 的一组资源和相关定制细节的输入。

  1. $ cat > kustomization.yaml <<EOF
  2. resources:
  3. - base.yaml
  4. patchesStrategicMerge:
  5. - sysctl-ingress-gw-customization.yaml
  6. EOF

应用自定义

现在 Kustomization 文件已经准备好了,让我们使用 Helm 来确保它被正确应用。

为 Istio 添加 Helm 存储库

  1. $ helm repo add istio https://istio-release.storage.googleapis.com/charts
  2. $ helm repo update

使用 Helm 模板进行渲染和验证

我们可以在 Helm 安装之前使用 Helm post-renderer 来验证渲染的清单。

  1. $ helm template istio-ingress istio/gateway --namespace istio-ingress --post-renderer ./kustomize.sh | grep -B 2 -A 1 netfilter.nf_conntrack_tcp_timeout_close_wait

在输出中,检查 ingress-gateway Pod 中新增的 sysctl 属性:

  1. securityContext:
  2. sysctls:
  3. - name: net.netfilter.nf_conntrack_tcp_timeout_close_wait
  4. value: "10"

使用 Helm 应用补丁 Post-Renderer

使用以下命令来安装 Istio 入口网关,使用 Helm 来应用我们的自定义 post-renderer

  1. $ kubectl create ns istio-ingress
  2. $ helm upgrade -i istio-ingress istio/gateway --namespace istio-ingress --wait --post-renderer ./kustomize.sh

验证自定义

检查 ingress-gateway Deployment,您将看到新增的 sysctl 值:

  1. $ kubectl -n istio-ingress get deployment istio-ingress -o yaml
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: istio-ingress
  5. namespace: istio-ingress
  6. spec:
  7. template:
  8. metadata:
  9. spec:
  10. securityContext:
  11. sysctls:
  12. - name: net.netfilter.nf_conntrack_tcp_timeout_close_wait
  13. value: "10"

附加信息

有关本文档中描述的概念和技术的更多详细信息,请参阅:

  1. IstioOperator - 自定义安装
  2. 高级 Helm 技术
  3. 自定义