- 云原生
- 容器编排
【免费下载链接】charts
Bitnami Helm Charts
本篇技术指南以当前仓库 bitnami/kafka/CHANGELOG.md 为主线,结合 Chart.yaml、values.yaml 与 templates/ 目录下的实际模板源码,系统梳理 Bitnami Kafka Helm Chart 自 32.x 系列以来的关键演进:KRaft 模式落地、Kafka 4.0 升级、安全加固(seccomp/TLS/SASL)、网络策略、HPA 与自动扩缩容、Provisioning 自动化等。读者将掌握每个版本变更背后的配置项含义、升级注意事项,以及如何基于 values 参数在 Kubernetes 上部署与运维高可用的 Kafka 集群。
一、Chart 概况与版本脉络
当前仓库中的 Bitnami Kafka Chart 以kafka为名(Chart.yaml),appVersion为4.0.0,即随 Chart 一起分发的是Apache Kafka 4.0.0容器镜像(docker.io/bitnami/kafka:4.0.0-debian-12-r10),同时附带jmx-exporter、kubectl、os-shell等辅助镜像。Chart 依赖common子库(oci://registry-1.docker.io/bitnamicharts,版本 2.x.x),大量复用其标签、命名、安全上下文等公共模板能力。
从 CHANGELOG.md 的完整记录看,该 Chart 自 2018 年的0.0.1(Kafka 1.1.1)一路演进到今天的32.5.0,跨越了 Kafka 1.x → 2.x → 3.x → 4.0 的整个生命周期。近一年内的变更集中在几个方向:
- 32.0.0(2025-03-25):升级到 Kafka 4.0.0,并同步更新 32.0.0 的 breaking changes 说明(32.2.9 再次补充);
- 32.3.0(2025-06-27):新增
kraftVersion参数,用于在静态仲裁(kraftVersion=0)与动态仲裁(kraftVersion=1)之间切换; - 32.4.0(2025-08-13):网络策略改为条件化实现(conditional implementation of network policy);
- 32.4.5(2026-09-08):为 controller、broker、provisioning 与 metrics.jmx 增加
seccompProfile支持,并修复podSecurityContext中 seccompProfile 的拼写错误。
后续小节将逐项展开这些变更对应的配置参数、模板实现与运维含义。
二、KRaft 模式与 Kafka 4.0:Chart 架构的根本性变化
2.1 从 ZooKeeper 到 KRaft
CHANGELOG 早期的条目(如 2018-2023 年间)大量出现 "Zookeeper"、"zookeeper dependency" 等字样,例如历史版本曾通过requirements.lock/Chart.lock依赖独立的 ZooKeeper Chart。而当前版本已经不再默认部署 ZooKeeper——CHANGELOG 中 29.3.6(2024-07-02)专门修复了 "Mount kafka_jaas.conf in controller statefulset for kraft migration",即控制器 StatefulSet 在 KRaft 迁移场景下的 JAAS 配置挂载问题。
Kafka 4.0 是首个完全移除 ZooKeeper 支持的主版本,这也正是 32.0.0 升级被标注为 breaking change 的根本原因。当前 values.yaml 中与 KRaft 直接相关的参数包括:
## @param clusterId Kafka KRaft cluster ID. If not set, a random one will be generated clusterId: "" ## @param existingKraftSecret Name of the secret containing the Kafka KRaft Cluster ID and one directory ID per controller replica existingKraftSecret: "" ## @param kraftVersion Kraft version to be used. It determines whether static quorum (kraftVersion=0) or dynamic quorum (kraftVersion=1) will be used. ## NOTE: Kafka 4.0 does not yet support switching kraft version. This setting was added for backward-compatibility with 3.x clusters. kraftVersion: 12.2 kraftVersion 与仲裁模式切换
kraftVersion是 32.3.0 引入的配置(对应 CHANGELOG 条目 "Add kraftVersion value to set static/dynamic quorum")。其语义如下:
kraftVersion=0:使用静态仲裁(static quorum),控制器节点列表在配置文件中固定声明,适用于节点数量稳定的集群;kraftVersion=1:使用动态仲裁(dynamic quorum),控制器节点集合可在运行期通过 KRaft API 动态增删,默认值即1。
values.yaml 中特别注明:Kafka 4.0 尚不支持在运行期切换 kraft version,该参数主要为与 3.x 集群的向后兼容而保留。升级场景下,若集群由 Kafka 3.x 迁移而来且旧集群使用了静态仲裁,需要在升级前确认kraftVersion与已有meta.properties一致,避免仲裁节点无法互相发现。
2.3 Cluster ID 与 Secret 的一致性约束
CHANGELOG 中多个 bugfix 都围绕 KRaft 元数据一致性展开:
- 32.1.3(2025-04-01):"recompute secret checksum on Kafka kraft secret changes",即当 KRaft Secret 变化时重新计算校验和,确保 StatefulSet 模板中的注解(通常用于触发 Pod 滚动重启)同步更新;
- 32.0.2(2025-03-26):"conditions to create Kraft secret",修正了创建 KRaft Secret 的条件判断;
- 32.1.1(2025-03-26):"upgrade issue due to secret lookup",修复升级过程中对 Secret 的查找逻辑。
values.yaml 对此有明确的运维提示:若复用已有 PVC,必须保证clusterId与 PVC 内/bitnami/kafka/data/meta.properties中记录的集群 ID 一致,否则新节点将无法加入集群;若 Secret 中存储的 Cluster ID 与meta.properties不一致,需要删除 Secret 并以正确值重新执行升级。这正是 templates/controller-eligible/config-secrets.yaml 与 templates/secrets.yaml 所渲染 Secret 的核心职责。
三、安全加固演进:seccomp、TLS 与 SASL
3.1 seccompProfile:32.4.5 的安全基线
最新版本 32.4.5(2026-09-08)的变更为:为 controller、broker、provisioning 与 metrics.jmx 的containerSecurityContext增加seccompProfile配置,同时修复两处文档/配置错误——重复的runAsGroup文档行,以及podSecurityContext中 seccompProfile 的拼写错误(typo)。
在 values.yaml 中可以看到对应的四级 seccomp 配置落点:
## @param controller.containerSecurityContext.seccompProfile.type Set Kafka containers' Security Context seccomp profile controller: containerSecurityContext: seccompProfile: type: "" ## @param broker.containerSecurityContext.seccompProfile.type Set Kafka pod's Security Context seccomp profile broker: podSecurityContext: seccompProfile: type: ""同样的配置还覆盖到defaultInitContainers.volumePermissions、defaultInitContainers.prepareConfig、defaultInitContainers.autoDiscovery等初始化容器的containerSecurityContext.seccompProfile.type。这意味着从运行容器到 init 容器,均可通过type: RuntimeDefault或type: Localhost+localhostProfile收紧系统调用面,满足 Pod Security Standards(PSS)的 restricted 级别要求。
3.2 TLS 证书链路的持续修复
CHANGELOG 中 TLS 相关修复贯穿始终,代表性条目:
- 32.3.8(2025-07-25):"Fix kafka-client-certs volume mount and improve TLS key handling",并引用 PKCS#8 问题——修复客户端证书卷挂载并改进私钥格式(PKCS#8)处理;
- 30.0.5(2024-08-23):"Fix pem auth with custom encrypted private key",修复使用自定义加密私钥时的 PEM 认证;
- 29.3.0(2024-06-12):"Custom SANs for auto-generated TLS certificates",支持为自动生成的 TLS 证书指定自定义 SAN。
对应的 values 配置位于listeners.tls区块,支持JKS与PEM两种证书格式。以 provisioning Job 为例,values.yaml 中provisioning.auth.tls.certificatesSecret的说明明确了两种 PEM 用法:提供 CA 证书 + 公钥 + 私钥(走caCert分支),或提供 PEM 格式的 truststore/keystore;同时passwordsSecret承载keystore-password、truststore-password、key-password三个键以解锁受密码保护的 JKS 或 PEM 私钥。
3.3 SASL 与密钥管理的边界条件
- 32.1.2(2025-03-27):"relax conditions under SASL secret must be mounted as volume",放宽了 SASL Secret 必须以卷(volume)方式挂载的条件判断——意味着在满足特定配置(如启用 K8s 原生 Secret 支持)时不再强制卷挂载,避免不必要地暴露文件系统路径;
- 29.3.1(2024-06-13):"Fix 'sasl.client.passwords' not working during chart upgrade",修复升级过程中
sasl.client.passwords不生效的问题; - 29.2.3 前的旧版本中还修复了 "issue on how to provision access to all topics / groups"(29.3.11),即通过 ACL 脚本为
*topic / group 授权时参数拼接错误。
这些条目说明 SASL 认证与 ACL 授权是生产集群最常踩坑的区域,升级时务必关注sasl相关参数的渲染分支是否与自身配置(如sasl.client.users/sasl.client.passwords)匹配。
四、网络策略与外部访问:32.4.0 的条件化实现
4.1 NetworkPolicy 从"全量渲染"到"条件渲染"
32.4.0(2025-08-13)"feat: conditional implementation of network policy"是近半年较重要的功能性变更:此前 NetworkPolicy 模板在 Chart 渲染时无条件参与渲染逻辑,仅由enabled开关控制是否产出;条件化实现则让 NetworkPolicy 的生成完全受控于networkPolicy.enabled及其他联动条件,减少在关闭网络策略时遗留的无效模板输出与 RBAC/标签误判。
在 values.yaml 中,网络策略参数如下:
networkPolicy: ## Specifies whether a NetworkPolicy should be created enabled: true ## Don't require client label for connections ## When set to false, only pods with the correct client label will have network access to the port Kafka is listening on. allowExternal: true ## Allow the pod to access any range of port and all destinations. allowExternalEgress: true ## Allow access from pods with client label set to "true". Ignored if allowExternal is true. addExternalClientAccess: true ## Add extra ingress rules to the NetworkPolicy extraIngress: [] ## Add extra egress rules to the NetworkPolicy extraEgress: []模板实现位于 templates/controller-eligible/networkpolicy.yaml 与 templates/broker/networkpolicy.yaml。运维实践要点:
- 当
allowExternal: false且addExternalClientAccess: true时,仅带app.kubernetes.io/component: ...+ 客户端标签(client label)的 Pod 可访问 Kafka 监听端口,实现最小化南北向暴露; extraIngress/extraEgress用于向既有策略追加自定义规则(如允许 Prometheus 抓取端口、允许特定命名空间访问)。
更早的 30.1.0(2024-09-13)"NetworkPolicy review"与 29.1.1(2024-05-28)"Fixed Network-Policies for jmx metrics export"分别对应网络策略整体重构与 JMX 指标端口的放行修复,说明 metrics 与网络策略的联动一直是迭代重点。
4.2 外部访问的多个修复与增强
- 32.3.1(2025-06-30):"Add ClusterIP and loadBalancerNames check for using external access hosts list",在使用外部访问主机列表时增加 ClusterIP / LoadBalancer 名称校验,防止错误的主机名进入
advertised.listeners; - 32.2.0(2025-04-15):新增
topologyKey参数(controller 与 broker 均有,values.yaml 中controller.topologyKey/broker.topologyKey),用于覆盖 common 库默认的kubernetes.io/hostname,例如设为topology.kubernetes.io/zone可将副本均匀分布到不同可用区; - 31.5.0(2025-03-06):Service 支持
ipFamilies与ipFamilyPolicy配置,适配 IPv4/IPv6 双栈集群(外部访问 Service 的ipFamilies/ipFamilyPolicy同样可配)。
外部访问 Service 模板集中在 templates/controller-eligible/svc-external-access.yaml 与 templates/broker/svc-external-access.yaml,支持LoadBalancer、NodePort、ClusterIP三种类型,并配套externalIPs、useHostIPs、usePodIPs、domain、nodePorts等控制项。
4.3 监听器渲染的正确性
32.3.2(2025-07-03)"Fix extraListeners rendering to avoid malformed YAML"修复了listeners.extraListeners渲染产生畸形 YAML 的问题;29.3.14(2024-08-01)则将extraListeners正确并入kafka.listeners模板变量。当前 values.yaml 中listeners.extraListeners为数组结构,可追加自定义监听器对象;同时 226 行附近明确注明:一旦设置了listeners.extraListeners或listeners.controller/interbroker/client/external,将覆盖基于上述值自动生成的监听器配置——这是定制监听器时必须注意的优先级规则。
五、资源规划与自动扩缩容
5.1 heapOpts 与 JVM 内存策略的演进
CHANGELOG 中多次调整默认堆内存参数:
- 30.1.5(2024-10-07):"Update default value of heapOpts to fit Kafka pod RAM limit while utilize its increased default",将默认堆参数调整为在 Pod RAM limit 范围内更充分的利用;
- 32.3.6(2025-07-18):"Update default controller.heapOpts to fit default RAM limit",为 controller-eligible 节点单独调整默认堆参数。
当前 values.yaml 的默认值统一为:
## @param heapOpts Kafka Java Heap configuration heapOpts: -XX:InitialRAMPercentage=75 -XX:MaxRAMPercentage=75broker-only 节点(broker.heapOpts)与 controller 节点(controller.heapOpts)均为-XX:InitialRAMPercentage=75 -XX:MaxRAMPercentage=75。这种"基于可用内存百分比"的写法意味着:只要容器内存 limit 设置合理,JVM 堆会自动按比例分配,无需为不同规格节点手工换算-Xmx/-Xms。若自定义镜像或非标准内存配置,需同步覆盖这两项。
5.2 HPA 与仲裁引导的联动修复
32.2.12(2025-06-03)"Fix HPA controller logic to use maxReplicas to build controller.quorum.bootstrap.servers"是一个值得关注的联动修复:当 controller 启用 HPA 时,StatefulSet 的replicas不再直接取值,而是由 HPA 决定(见 templates/controller-eligible/hpa.yaml 中maxReplicas: {{ .Values.controller.autoscaling.hpa.maxReplicas }});但 KRaft 动态仲裁要求controller.quorum.bootstrap.servers必须列出全部可能的控制器节点。若按replicas构建该列表,HPA 扩容时新增副本将无法被仲裁发现。该修复改为以 HPA 的maxReplicas构建仲裁引导列表,保证扩容后的新 controller 副本能正常加入仲裁。
更早的 32.2.7(2025-05-19)"Update controller and broker configuration when enabling ..."也涉及启用某些特性时 controller/broker 配置的同步更新,同样属于控制器与代理配置联动范畴。
5.3 存储与数据持久化
- 29.3.9(2024-07-18):"Global StorageClass as default value",使全局
global.defaultStorageClass成为持久卷的默认 StorageClass,values.yaml 顶部global.defaultStorageClass即此入口,controller 与 broker 的persistence.storageClass均可被其覆盖; - 32.1.0(2025-03-26):"add missing persistentVolumeClaimRetentionPolicy",为 StatefulSet 补充
persistentVolumeClaimRetentionPolicy配置,可在删除 Pod 时保留或回收 PVC,避免误删数据。
六、Provisioning:集群资源的自动化供给
CHANGELOG 中 Provisioning 相关的修复非常密集,说明它是生产接入的关键模块:
- 32.0.3(2025-03-26):"use kafka-broker-api-versions.sh to wait for Kafka on provisioning",改用
kafka-broker-api-versions.sh等待 Kafka 就绪,替代之前的等待方式; - 32.3.9(2025-07-29):"Fix provisioning postScript",修复
postScript执行逻辑; - 32.3.7(2025-07-23):"Fix typo in initContainers",修复 provisioning init 容器中的拼写错误。
模板位于 templates/provisioning/job.yaml,values.yaml 中provisioning区块的完整参数如下:
provisioning: enabled: false waitForKafka: true useHelmHooks: true automountServiceAccountToken: false numPartitions: 1 replicationFactor: 1 topics: [] nodeSelector: {} tolerations: [] extraProvisioningCommands: [] parallel: 1 preScript: "" postScript: ""典型用法是同时配置topics与extraProvisioningCommands:
provisioning: enabled: true topics: - name: orders partitions: 3 replicationFactor: 3 config: max.message.bytes: 1048576 retention.ms: 604800000 extraProvisioningCommands: - | /opt/bitnami/kafka/bin/kafka-acls.sh \ --bootstrap-server $KAFKA_SERVICE \ --command-config /shared/client.properties \ --add \ --allow-principal User:user \ --consumer --topic '*' postScript: | echo "post provisioning check"其中/shared/client.properties是 Chart 预置的客户端配置挂载点,$KAFKA_SERVICE指向集群 Service;parallel控制并行执行的 provisioning 命令数,preScript/postScript用于在 topic 创建前后执行自定义 bash。结合 32.0.3 的修复可知,Job 中的 init 容器会先通过kafka-broker-api-versions.sh探测 Broker 版本接口,确认集群可用后再执行创建逻辑,避免"Job 已启动但集群未就绪"的竞态。
七、可观测性:JMX、Prometheus 与告警
CHANGELOG 中可观测性相关条目贯穿多代版本:
- 31.2.0(2025-01-08):"chore(jmx-exporter): Upgrade image and change args",升级 jmx-exporter 镜像并调整启动参数;
- 29.3.8(2024-07-16):"fix jmx-servicemonitor by using JMX Exporter's default metrics path",修正 ServiceMonitor 使用默认指标路径
/metrics; - 29.3.7(2024-07-08):"Fix jmx-exporter scrape path",修复抓取路径;
- 31.1.0(2024-12-10):为各 Chart 统一补充 "Prometheus metrics" 文档章节,本 Chart 亦在列。
当前模板目录 templates/metrics/ 包含jmx-configmap.yaml、jmx-svc.yaml、jmx-servicemonitor.yaml、prometheusrule.yaml四个文件。values 侧对应metrics.jmx开关与metrics.serviceMonitor区块:
metrics: jmx: enabled: false serviceMonitor: enabled: false # 需同时开启 metrics.jmx namespace: "" path: /metrics interval: "" scrapeTimeout: "" labels: {} selector: {} relabelings: [] metricRelabelings: [] honorLabels: false jobLabel: "" prometheusRule: enabled: false groups: []开启链路为:metrics.jmx.enabled: true→ 在 Kafka Pod 中注入 jmx-exporter sidecar(Chart 注解镜像docker.io/bitnami/jmx-exporter:1.4.0-debian-12-r0,见 Chart.yaml)→metrics.serviceMonitor.enabled: true生成 Prometheus Operator 的 ServiceMonitor(默认路径/metrics)→ 可选prometheusRule.groups定义 Kafka 告警规则。注意 ServiceMonitor 与 PrometheusRule 均依赖 jmx exporter 开启,且 29.0.0 起已弃用独立的 Kafka Exporter(见下节)。
八、弃用项与破坏性变更清单
CHANGELOG 是追踪破坏性变更的第一手来源,升级前务必核对以下条目:
| 版本 | 变更类型 | 说明 |
|---|---|---|
| 32.0.0(2025-03-25) | Breaking | 升级至 Kafka 4.0.0,彻底移除 ZooKeeper 依赖,全量迁移 KRaft;32.2.9(2025-05-28)再次补充 breaking changes 说明 |
| 31.0.0(2024-11-12) | Breaking | 大版本发布,31.1.0 同步补充升级说明(upgrade notes) |
| 30.0.0(2024-08-05) | Breaking | 大版本发布,配套升级说明(30.0.1) |
| 29.0.0(2024-05-24) | Deprecation | 弃用 Kafka Exporter(metrics.kafka相关),29.0.3 修复相应 linter 规则 |
| 30.1.6(2024-10-18) | Deprecation | 弃用--broker-list选项,改用--bootstrap-server |
| 22.x 时代 | Breaking | TLS Secret 相关破坏性变更,后续版本(26.x)补充缺失的升级说明 |
两条实战提示:
- Kafka 4.0 升级:32.0.0 的破坏性变更源于上游移除 ZooKeeper。若从旧版本(Kafka 3.x / 依赖 ZooKeeper 的 Chart 版本)升级,需要先完成 KRaft 迁移、确认
kraftVersion与集群 ID 一致,再升级 Chart 版本; - 弃用项替换:所有 ACL / 管理类命令脚本中的
--broker-list一律替换为--bootstrap-server(如 provisioning 的extraProvisioningCommands示例所示),否则在 Kafka 4.0 上无法执行。
九、版本发布节奏与依赖治理
从 CHANGELOG 可以看到该 Chart 遵循"频繁的依赖引用更新 + 定期功能性/破坏性大版本"的双轨节奏:
- 依赖引用更新(
:zap: :arrow_up: Update dependency references)几乎每月出现多次(如 32.3.11~32.3.14、32.4.1~32.4.3 均为同一周内的依赖更新),用于锁定bitnami/common子库与辅助镜像版本,保证安全补丁及时跟进; - 全仓统一变更(
[bitnami/*]前缀)说明该 Chart 与仓库内其他 100+ Chart 保持同步演进,例如 32.3.6 的 BSI(Bitnami Secure Images)欢迎语、31.1.0 的 "Backup & Restore" 文档章节、32.2.6 的 CNAB(Azure Marketplace)链接、32.2.3 移除 Kubernetes < 1.23 的兼容引用等。
对使用者而言,这意味着:无需过度追逐每个 patch 版本,但应在功能性小版本(如 32.3.0 的 kraftVersion)和破坏性大版本(如 32.0.0)发布后及时评估升级;patch 版本主要解决安全与依赖问题,建议保持跟进。
十、基于 CHANGELOG 的升级决策清单
综合全文,可沉淀出以下可直接落地的升级/运维检查清单:
- 版本映射确认:核对 Chart.yaml 中
version(当前 32.5.0)与appVersion(4.0.0)的对应关系,确认目标 Kafka 版本; - KRaft 一致性:升级前检查
clusterId/existingKraftSecret与 PVC 中meta.properties的 Cluster ID 是否一致(对应 32.1.1、32.1.3 修复); - 仲裁配置:若使用 HPA 扩容 controller,确认
controller.autoscaling.hpa.maxReplicas覆盖全部预期控制器节点(对应 32.2.12 修复); - 安全基线:为
controller、broker、provisioning、metrics.jmx的containerSecurityContext统一设置seccompProfile.type(对应 32.4.5); - 网络策略:确认
networkPolicy.allowExternal/addExternalClientAccess组合符合预期,并检查extraIngress是否放行 Prometheus 抓取端口(对应 32.4.0、29.1.1); - 脚本兼容:全文替换
--broker-list为--bootstrap-server(对应 30.1.6); - 可观测性:按需开启
metrics.jmx+serviceMonitor+prometheusRule,确认抓取路径为/metrics(对应 29.3.7、29.3.8); - 存储:确认
global.defaultStorageClass与persistence.storageClass的覆盖关系,并按需配置persistentVolumeClaimRetentionPolicy(对应 29.3.9、32.1.0)。
以上每一条都可追溯到本仓库 CHANGELOG.md 中的具体条目,并在 values.yaml 与 templates/ 中找到对应的参数与模板实现——这份变更记录本身就是一份"生产级 Kafka on Kubernetes"的运维实践地图。
- 云原生
- 容器编排
【免费下载链接】charts
Bitnami Helm Charts
相关推荐
Bitnami Consul Helm Chart 版本演进深度解析:从 CHANGELOG 看功能、安全与运维实践
Bitnami Consul Helm Chart 版本演进深度解析:从 CHANGELOG 看功能、安全与运维实践 本文以仓库中 bitnami/consul
云原生容器编排Bitnami ASP.NET Core Helm Chart 全解析:从版本演进看架构设计与生产级部署实践
Bitnami ASP.NET Core Helm Chart 全解析:从版本演进看架构设计与生产级部署实践 ASP.NET Core 是微软推出的开源跨平台
云原生容器编排Bitnami Apache Helm Chart 演进全解:从 CHANGELOG 看 11.x 特性、安全加固与生产实践
Bitnami Apache Helm Chart 演进全解:从 CHANGELOG 看 11.x 特性、安全加固与生产实践 Apache HTTP Serve
云原生容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考