Skip to main content

Command Palette

Search for a command to run...

Istio 0.8 的 Helm Chart 解析

Updated
3 min read

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

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

使用 Helm 安装 Istio

安装包内的 Helm 目录中包含了 Istio 的 Chart,官方提供了两种方法:

  • 用 Helm 生成 istio.yaml,然后自行安装。
  • 用 Tiller 直接安装。

很明显,两种方法并没有什么本质区别。例如第一个命令:

helm template install/kubernetes/helm/istio \
    --name istio --namespace  \
    istio-system > $HOME/istio.yaml

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

helm template install/kubernetes/helm/istio \
    --name istio --namespace istio-system \
    --set sidecarInjectorWebhook.enabled=false > $HOME/istio.yaml

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

我们照猫画虎,看看命令二的结果提交到 Kubernetes 中会发生什么事情。

helm template install/kubernetes/helm/istio --name istio \
--namespace istio-system --set sidecarInjectorWebhook.enabled=false > $HOME/istio.yaml

kubectl create namespace istio-system
kubectl create -f $HOME/istio.yaml

根据不同的网络情况,可能需要几分钟的等待,最后会看到这些 Pod 在运行:

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

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

Helm Chart 的安装配置

下面的配置项目,都可以使用 helm 的 --set key=value 来设置,可以重复使用,用来设置多个值。

选项说明缺省值
global.hub绝大部分镜像所在的镜像库地址docker.io/istionightly
global.tagIstio 使用的绝大部分镜像的 Tagcircleci-nightly
global.proxy.image指定 Proxy 的镜像名称proxyv2
global.imagePullPolicy镜像拉取策略IfNotPresent
global.controlPlaneSecurityEnabled控制面是否启动 mTLSfalse
global.mtls.enabled服务间是否缺省启用 mTLSfalse
global.mtls.mtlsExcludedServices禁用 mTLS 的 FQDN 列表- kubernetes.default.svc.cluster.local
global.rbacEnabled是否创建 RBAC 规则true
global.refreshIntervalMesh 发现间隔10s
global.arch.amd64amd64 架构中的调度策略,0:never;1: least preferred;2:no preference;3:most preferred2
global.arch.s390xamd64 架构中的调度策略,0:never;1: least preferred;2:no preference;3:most preferred2
global.arch.ppc64leamd64 架构中的调度策略,0:never;1: least preferred;2:no preference;3:most preferred2
galley.enabled是否安装 Galley 用于进行服务端的配置验证,需要 1.9 版本以上的 Kubernetesfalse

上面的内容来自官方文档,其实这是不符合实际情况的(Istio 用户的日常)。在 install/kubernetes/helm/istio/values.yaml 中,包含这一发行版本中的所有的缺省值。可以直接修改或者新建 values.yaml,并在 helm 命令行使用 -f my-values.yaml 参数来生成自行定制的 istio.yaml

解读 Istio Helm Chart 中的模块

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

  - name: sidecarInjectorWebhook
    version: 0.8.0
    # repository: file://../sidecarInjectorWebhook
    condition: sidecarInjectorWebhook.enabled

这表明在 sidecarInjectorWebhook 取值为 enabled 的时候,就渲染这一模板。因此这里可以看做是模块的启用停用的控制点。这里列出的模块包括:

模块描述
egressgateway外发流量网关
galley在 K8S 服务端验证 Istio 的 CRD 资源的合法性
grafanaDashboard
ingressIngress Controller
ingressgatewayIngress Gateway
mixerMixer
pilotPilot
prometheusPrometheus
security安全相关内容
servicegraph调用关系图
sidecarInjectorWebhook自动注入
tracingZipkin Jeager 的跟踪服务

下面逐一做一下简要说明

egressgateway

外发通信的网关。

他的设置保存在 values.yamlegressgateway 一节中(都是保存在同名分支下,后面不再重复)。部署内容包括:

  • Deployment 和 Service:一个 proxy。
  • HPA
  • RBAC 相关内容

可定制项目包括:

  • 服务端口和类型
  • HPA 实例数量上下限
  • 资源限制

galley

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

  • Deployement 和 Service。
  • RBAC 相关
  • 用于 CRD 校验的 ValidatingWebhookConfiguration 对象。

校验目标包含 Pilot(例如 destinationpolicies 和 routerules) 和 Mixer(例如 memquotas 和 prometheuses) 两类 CRD。

grafana

一个带有 Istio 定制 Dashboard 的 Grafana 封装。

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

定制内容的 grafana.ingress.* 中包含 Ingress 的配置,用于外网访问。

ingress

Istio 的 Ingress Controller

具体部署内容和 egresscontroller 基本一致。

ingressgateway

0.8.0 新增功能,为 Ingress 通信提供 Istio rules/destination 等特性。

部署内容和 ingress 类似。

mixer

Mixer 负责的是遥测和前置检查,他的 Chart 相对比较复杂,部署内容包括:

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

pilot

Pilot 承上启下,负责服务发现和向 Proxy 下发配置。除了常规的 Deployment 和 Service 之外,还包含了 crds.yaml,用于声明 CRD 资源类型(例如 destinationpolicies 和 routerules)。

prometheus

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

security

旧版本中的 Istio-ca

Security 部分的部署内容包括:

  • RBAC
  • Job:使用 kubectl 清理旧版本 istio-ca 实例。
  • Deployment,原 CA。
  • Service:开放两个端口,分别服务于 http 和 gRPC。

servicegraph

Service Graph 支持,和 Grafana 基本一致。

sidecarInjectorWebhook

这一部分的功能是自动为 K8S 对象注入 Envoy。主要包含:

  • Deployment 和 Service
  • RBAC 相关
  • 一个 MutatingWebhookConfiguration 对象,会监听 Pod 的创建事件,用于自动注入。

tracing

Jeager 的跟踪支持,总体情况跟 Prometheus 和 Grafana 等监控组件类似,配置项和暴露服务方面稍有区别:

  • 配置中包含 Jaeger 的环境变量的控制。
  • 开启 jaeger 开关,会启用 Jaeger 的几个服务端口。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts