mcpField
K
k8s-kaniko-job

k8s-kaniko-job

github.com/norberia云与 DevOps0269 次安装8 周前更新
代码仓库

关于 k8s-kaniko-job

k8s-kaniko-job 是一个用于 Kubernetes 沙箱的构建技能,可在没有 Docker daemon 的环境中构建并推送 Linux/amd64 镜像。它通过 Kaniko Job 和临时构建上下文存储完成流程,并返回镜像摘要。

主要功能

  1. 01在 Kubernetes 命名空间内构建镜像
  2. 02通过 Kaniko Job 执行构建
  3. 03将构建上下文传至 VersityGW S3
  4. 04推送镜像并捕获摘要
  5. 05失败时输出状态与日志尾部

适用场景

  1. 01在无 Docker daemon 的沙箱构建镜像
  2. 02将提交版本镜像推送至 GHCR
  3. 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 规格中可见。

评论

支持 Markdown