kpt 回到视野:用包的方式管理 Kubernetes 配置

2026-07-02 35 预计阅读时间: 1 分钟
来源: cncf.io AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:7 分钟

kpt 的定位很明确:它不是另一个只会 kubectl apply 的包装器,而是一套以“包”为中心的基础设施自动化工具链。它面向 Kubernetes 平台和 KRM,也就是 Kubernetes Resource Model 驱动的配置,把配置编写、自动化处理和交付流程放进同一个工作流里。

对于已经在用 YAML、Kustomize、GitOps 或平台工程流水线的团队来说,kpt 值得重新看一眼的原因在于:它试图让配置管理更接近“所见即所得”。你编辑的是普通资源文件,自动化逻辑围绕这些资源运行,而不是把所有意图藏进模板语言里。

“包中心”意味着什么

kpt 文档里的关键词是 package-centric toolchain。这里的“包”不是应用二进制包,而是一组可版本化、可复用、可分发的 KRM 配置。

一个 kpt 包通常可以包含:

  • Kubernetes YAML,例如 DeploymentServiceNamespace
  • 包元数据,例如 Kptfile
  • 用于修改、校验或生成配置的函数流水线。
  • 面向交付的目录结构和版本边界。

这和“复制一堆 YAML 到新项目”最大的差别是:包有边界,有元数据,也可以被工具链理解。平台团队可以发布一个基础包,业务团队拉取后按需改动,再通过自动化函数完成统一处理。

WYSIWYG 配置编写:少一点模板黑盒

很多基础设施配置工具都会走向模板化:变量、条件、循环、继承层层叠加。模板很强,但问题也明显:最终落到集群里的 YAML 经常不是人眼正在编辑的文件。

kpt 强调 WYSIWYG authoring,核心想法是让开发者直接面对 KRM 资源。自动化可以存在,但它应该围绕真实资源做变换,而不是把资源完全藏在渲染阶段之后。

这对协作很有价值:

  • Code review 看到的是接近最终形态的 Kubernetes 对象。
  • 平台规则可以通过函数批量注入,例如标签、命名空间、安全约束。
  • 交付流水线可以继续消费标准 YAML,而不是绑定到某个私有 DSL。

边界也要说清楚:如果团队高度依赖复杂条件渲染,kpt 不一定会让所有模板需求消失。更现实的做法是把它用于 KRM 包分发、配置整理和自动化处理,而不是强行替代所有现有工具。

可以这样实践:创建一个最小 kpt 包

下面示例用于演示“把 Kubernetes 配置当作包管理”的基本形态。运行前需要安装 kpt,并确保本机已有 kubectl 可用。示例不会直接部署到集群,最后一步只渲染和查看配置。

mkdir -p hello-kpt
cd hello-kpt

kpt pkg init . --description "Minimal kpt package for a demo app"

cat > namespace.yaml <<'EOF'
apiVersion: v1
kind: Namespace
metadata:
  name: hello-kpt
  labels:
    app.kubernetes.io/managed-by: kpt
EOF

cat > deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
  namespace: hello-kpt
  labels:
    app.kubernetes.io/name: hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: hello
  template:
    metadata:
      labels:
        app.kubernetes.io/name: hello
    spec:
      containers:
        - name: hello
          image: nginx:1.27
          ports:
            - containerPort: 80
EOF

cat > service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: hello
  namespace: hello-kpt
spec:
  selector:
    app.kubernetes.io/name: hello
  ports:
    - port: 80
      targetPort: 80
EOF

kpt pkg tree .
kpt fn render .

如果你想把它接入交付流程,可以在 CI 中先运行 kpt fn render .,再运行校验工具,最后交给 GitOps 控制器或 kubectl apply。例如一个非常朴素的检查脚本可以这样写:

#!/usr/bin/env bash
set -euo pipefail

PACKAGE_DIR="${1:-.}"

kpt fn render "$PACKAGE_DIR"
kubectl apply --dry-run=client -f "$PACKAGE_DIR"

保存为 validate-kpt-package.sh 后执行:

chmod +x validate-kpt-package.sh
./validate-kpt-package.sh ./hello-kpt

这段脚本的重点不是“生产级流水线”,而是展示一个实用边界:kpt 负责包和函数处理,kubectl 负责 Kubernetes API 语义层面的客户端校验。

放进平台工程时,该怎么取舍

kpt 适合的场景通常有几个共同点:团队已经围绕 Kubernetes YAML 工作;基础设施对象需要复用和分发;平台团队希望把标准配置、标签、策略、目录结构沉淀成可管理的包。

采用时可以按这个清单推进:

  • 从一个低风险平台组件开始,例如命名空间基线、监控 sidecar 配置或通用 RBAC。
  • 保持包内 YAML 可读,不要把所有变化都塞进难以审查的自动化函数。
  • 在 CI 中固定 kpt 版本,避免工具升级导致渲染结果漂移。
  • kpt fn render 后的结果纳入 review 或校验,让团队看见自动化实际改了什么。
  • 明确它和 Kustomize、Helm、GitOps 控制器的边界,不要一开始就追求“大一统”。

kpt 的价值不在于让 YAML 消失,而在于承认 Kubernetes 生态已经围绕 KRM 运转,然后给这些资源一个更清晰的包、自动化和交付模型。对平台工程团队来说,这往往比再发明一套模板语言更容易落地。


相关推荐