关于 k8s-kaniko-job
k8s-kaniko-job 是一个用于 Kubernetes 沙箱的构建技能,可在没有 Docker daemon 的环境中构建并推送 Linux/amd64 镜像。它通过 Kaniko Job 和临时构建上下文存储完成流程,并返回镜像摘要。
主要功能
- 01在 Kubernetes 命名空间内构建镜像
- 02通过 Kaniko Job 执行构建
- 03将构建上下文传至 VersityGW S3
- 04推送镜像并捕获摘要
- 05失败时输出状态与日志尾部
适用场景
- 01在无 Docker daemon 的沙箱构建镜像
- 02将提交版本镜像推送至 GHCR
- 03获取摘要固定的镜像引用用于部署
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ norberia/ sealos-skills-next --skill k8s-kaniko-job安装后在 Claude Code 中输入/k8s-kaniko-job确认已加载。
附带文件scripts/kaniko-build.py
详细介绍
K8s Kaniko Job
当 Kubernetes 命名空间中没有 Docker 守护进程时,在其中构建 linux/amd64 镜像。整个流程由一个脚本负责——不要自行编写 Job 或 Secret:
python3 scripts/kaniko-build.py --image ghcr.io/<owner>/<repo>:<tag> \
[--context <dir>] [--dockerfile <path-relative-to-context>] \
[--build-arg KEY=value ...]
将 scripts/ 解析为相对于此技能所在目录的路径。从项目工作区运行脚本,以便它能找到 .sealos/build-runtime.json。
工作原理
tar the context (excludes .git/.sealos/.versitygw-*)
→ DevBox-local VersityGW S3 store (POSIX dir, served on port 1319)
→ Kaniko Job in the current namespace pulls s3://... via the
Job-reachable endpoint from .sealos/build-runtime.json
→ pushes the tagged image to ghcr.io with a build-only registry Secret
→ digest captured from the pod termination message
所有配置都会按顺序自动解析:CLI 标志 → .sealos/build-runtime.json(由控制平面写入:Job 可访问的 s3Endpoint、S3 secretKeyRef、构建截止时间)→ DevBox 运行时环境(KANIKO_CONTEXT_POSIX_DIR、S3_ENDPOINT、SEALOS_DEVBOX_JWT_SECRET 等)→ 默认值。Job 使用 backoffLimit: 0 运行,活动截止时间最长为 1800s,ttlSecondsAfterFinished: 3600,并使用当前 ServiceAccount。
前提条件
kubectl指向沙箱命名空间(注入的 kubeconfig;脚本不会选择区域、工作区或其他命名空间)。- 具有
write:packages权限范围的GITHUB_TOKEN。目标镜像的所有者必须与令牌的登录名(小写)一致:ghcr.io/<login>/<repo>:<tag>。使用提交 SHA 或时间戳作为标签,绝不要使用latest。 - 命名空间权限:创建 Job/Secret,以及读取 Pod/日志。
- 构建上下文中有 Dockerfile(若缺失,请先编写——规则见
../use-sealos/references/build.md§1;该文件中关于 buildx/注册表的部分不适用于此处)。
查看结果
成功时,标准输出为包含 digest 和 image_ref 的 JSON(ghcr.io/<owner>/<repo>@sha256:...)。部署清单中优先使用 image_ref——摘要固定不受标签变更影响。如果 digest 为 null(较少见:终止消息丢失),则回退到 image 中的标签引用。
pull 会报告下游拉取行为:
-
anonymous— 软件包为公开状态;无需拉取 Secret。 -
private— GHCR 软件包默认是私有的。在命名空间中创建拉取 Secret,并在工作负载中引用它(imagePullSecrets: [{name: <app>-pull}],固定字面名称):kubectl create secret docker-registry <app>-pull \ --docker-server=ghcr.io --docker-username=<login> \ --docker-password="$GITHUB_TOKEN" \ --dry-run=client -o yaml | kubectl apply -f - -
indeterminate— 观察首个 Pod 的拉取情况;如果出现ErrImagePull,则添加拉取 Secret。
故障排查
发生故障时,脚本会打印 Job 状态、Pod 状态和 Kaniko 日志末尾内容。
| 症状 | 原因 → 解决方法 |
|---|---|
Job Pod 在执行器镜像上出现 ImagePullBackOff | 集群无法拉取 gcr.io/kaniko-project/executor → 报告此问题;没有本地回退方案 |
Kaniko 日志:error uploading context / S3 连接被拒绝 | Job 无法访问 VersityGW 端点 → 检查 .sealos/build-runtime.json.s3Endpoint;绝不要将 Job 指向 127.0.0.1 |
Kaniko 日志:推送时出现 401/403 | 令牌权限范围或所有者不匹配 → 脚本的预检输出会显示已通过身份验证的登录名 |
| Dockerfile 构建错误 | 修复工作区中的 Dockerfile 并重新运行;每次运行都会创建新的 Job |
| Job 超过截止时间 | 构建太慢 → 精简上下文(.dockerignore),使用更小的基础镜像 |
仅用于构建的 Secret(use-sealos-ghcr-auth-*)仅限命名空间使用,且没有 TTL;Job 本身会在一小时后被垃圾回收。除非用户提出要求,否则将清理工作留给沙箱拆除流程。
绝不要打印 GITHUB_TOKEN、S3 凭据或 Secret 负载。绝不要通过 --build-arg 传递密钥——构建参数在 Job 规格中可见。