tkn命令找不到是因未安装客户端二进制,需从github releases下载对应架构的tkn并加入path;go测试失败主因是workingdir未设为module根目录;github_token须通过serviceaccount绑定secret安全注入;ko构建更适配tekton,因其无需dockerd且默认生成distroless镜像。

tekton-pipeline 安装后 tkn 命令找不到怎么办
不是环境变量没配,大概率是没装客户端。Tekton 的 tkn 是独立二进制,不随 tekton-pipelines CRD 一起部署。
- 用
kubectl get pods -n tekton-pipelines确认控制器已就绪,但tkn不在集群内,它只运行在本地终端 - 别用
go install装旧版(比如 v0.2x),Go 模块签名和 CLI 协议已变更,v0.30+ 才支持 PipelineRun 日志流式输出 - 从 GitHub releases 页面 下载对应系统架构的
tkn二进制,chmod +x 后放进$PATH - 验证:运行
tkn version,输出中Client version和Pipeline version应尽量对齐(允许小版本差 1)
写 Task 时为什么 go test 总是失败,但本地能过
Go 测试依赖 GOPATH、module root、go.sum 校验三者一致,而 Tekton 默认工作目录是 /workspace,没有自动识别 module 边界。
- Task 中必须显式设置
workingDir: /workspace/source(假设 git clone 到source目录),否则go test会报no Go files in /workspace - 别直接用
golang:1.21镜像——它不含git,导致go mod download在私有模块场景下卡住;改用golang:1.21-git或自己加apk add --no-cache git - 若项目含 cgo 依赖(如
net包 DNS 解析),需在 Task spec 中加env: [{name: CGO_ENABLED, value: "1"}],否则测试里http.Get可能静默超时 - 示例片段:
steps: - name: test image: golang:1.21-git workingDir: /workspace/source env: - name: CGO_ENABLED value: "1" command: [sh, -c] args: ["go test -v ./..."]
PipelineRun 中如何安全传入 GITHUB_TOKEN 而不硬编码
Token 写进 PipelineRun YAML 就等于明文泄露,哪怕用了 Secret,也要防误挂载或日志打印。
- 必须用
Secret类型的Volume挂载,而不是envFrom.secretRef——后者会让 token 进入容器环境变量,被ps aux或错误日志捕获 - 挂载路径设为
/var/run/secrets/github/token,然后在 Task step 里用git config --global credential.helper 'store --file=/tmp/git-cred'配合 echo 写入凭证文件 - 更稳妥的做法是:用 Tekton 的
ServiceAccount绑定Secret,再通过serviceAccountName字段注入,避免在 PipelineRun 中暴露任何 secret 名称 - 注意:GitHub App Token 和 PAT 权限不同,CI 场景推荐用 GitHub App + private key,比 PAT 更细粒度可控
Go 构建镜像时为什么 ko 比 docker build 更适合 Tekton
不是因为快,而是因为 ko 天然适配 Tekton 的无守护进程构建模型,且规避了 Docker-in-Docker 权限问题。
立即学习“go语言免费学习笔记(深入)”;
-
ko不依赖dockerd,所有构建在用户态完成,Task 中只需一个普通 ServiceAccount +imagePullSecrets,无需privileged: true - 默认生成 distroless 镜像,Go 二进制直接运行在
gcr.io/distroless/static:nonroot上,比自建 alpine 基础镜像少 90% 攻击面 - 必须指定
KO_DOCKER_REPO环境变量,值为镜像仓库地址(如us-east1-docker.pkg.dev/my-proj/my-repo),否则ko resolve会 fallback 到index.docker.io并失败 - 示例:
steps: - name: build-and-push image: ko://ghcr.io/google/ko env: - name: KO_DOCKER_REPO value: us-east1-docker.pkg.dev/my-proj/my-repo command: [sh, -c] args: ["ko apply -f config/"]
真正麻烦的是跨平台构建——ko 默认只生成 linux/amd64,要支持 arm64 得额外加 --platform=linux/arm64,而且 base 镜像也得是多架构的,这点容易漏。










