pipeline卡住主因是jenkins agent与kubernetes集群间权限、网络、镜像未对齐:jnlp容器名须小写且用官方镜像,master地址需集群内可解析,go构建需独立容器模板,harbor推送和kubectl更新须显式凭据与专用serviceaccount。

能直接跑通,但卡在 Waiting for agent 或镜像推不进 Harbor、kubectl apply 报 Forbidden 是最常见的情况——不是流程写错了,而是 Jenkins Agent 和 Kubernetes 集群之间的权限、网络、镜像三者没对齐。
agent 启动失败:jnlp 容器连不上 Jenkins Master
这是 Pipeline 卡住的第一道门槛。Kubernetes 插件创建的 Pod 里必须有一个叫 jnlp 的容器,且它要能反向连接 Jenkins Master 的 JNLP 端口(默认 50000)。
-
jnlp容器名必须全小写,不能写成JNLP或agent - 镜像必须用官方兼容版,比如
jenkins/inbound-agent:4.11-1;自定义 Alpine 基础镜像若没预装glibc或没暴露/bin/sh,会静默失败 - Jenkins Master 的 URL 在 Pod 内必须可访问:如果填的是
http://192.168.11.254:8086,而 Pod 运行在 K8s 内网,DNS 解析不到这个地址,就会超时;应改用集群内服务地址如http://jenkins.devops.svc.cluster.local:8080 - 若 Jenkins 运行在非
default命名空间(如devops),Kubernetes Cloud 配置里的Namespace字段必须填对,否则 Pod 创建请求直接被 API Server 拒绝
Go 编译环境缺失:别信 docker-in-docker 或宿主机共享
用 jenkinsci/blueocean 镜像起 Jenkins,里面没有 go、没有 docker、也没有 kubectl —— 所有构建步骤都会报 command not found。
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- 最稳的方式是:为 Go 构建单独定义一个容器模板,在 Pod YAML 里加一个
golang容器,镜像用golang:1.23-alpine或golang:1.23(非 Alpine 版本省去 libc 兼容问题) - 不要把
go装进jnlp容器:它只负责通信,装太多工具反而增加启动失败概率 - 避免用
docker.sock挂载方式复用宿主机 Docker:Jenkins Pod 在 K8s 上运行时,宿主机的dockerd很可能没开或没授权;改用kaniko或buildkit无守护进程构建更可靠 - 编译命令务必指定目标平台:
CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o app .,否则生成的二进制在 scratch 镜像里跑不起来
镜像推送与 K8s 更新失败:权限和上下文必须显式声明
即使镜像构建成功,推送到 Harbor 或更新 Deployment,仍会因凭据或 RBAC 失败。
- Harbor 推送要用
docker login+ 凭据 ID 绑定:Jenkins 凭据类型选Username with password,ID 记牢(比如叫harbor-creds),Pipeline 里用withCredentials([usernamePassword(credentialsId: 'harbor-creds', usernameVariable: 'USER', passwordVariable: 'PASS')])包裹登录命令 - K8s 更新必须用专用 ServiceAccount:不能依赖
defaultSA;要在devops命名空间下创建jenkins-agent-sa,并绑定editClusterRole(不是view);若部署目标在prod命名空间,ClusterRoleBinding 必须跨命名空间生效 -
kubectl apply -f k8s/deployment.yaml前,确保该 YAML 中的image:字段已动态替换成本次构建的镜像标签(如my-harbor.com/go-service:git-$(GIT_COMMIT)),否则滚动更新不会触发 - 别用
kubectl config use-context切上下文:Pod 里没kubeconfig文件;应通过--server、--token、--certificate-authority显式传参,或让容器挂载ServiceAccount自动注入的 token 和 CA
容易被忽略的 Go 项目细节:静态链接、健康探针、日志输出
自动化跑通只是第一步,服务上线后是否真能被 K8s 正确调度、就绪、持续提供服务,取决于 Go 程序本身是否适配容器生命周期。
- HTTP 服务必须监听
0.0.0.0:8080,不能只绑127.0.0.1;否则 readiness/liveness 探针从 K8s 网络发包会超时 - 建议在 main 函数开头加
log.SetOutput(os.Stdout),避免日志被缓冲或写到文件导致kubectl logs看不到 - Deployment 的
livenessProbe和readinessProbe路径要真实存在,比如/healthz,且 handler 返回 200;否则 K8s 会反复重启容器 - Dockerfile 优先用
FROM scratch:Go 编译出的静态二进制不需要任何系统库,镜像大小可压到 10MB 以内;但前提是编译时加了CGO_ENABLED=0和-ldflags '-extldflags "-static"'
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










