必须配置PVC挂载到/var/jenkins_home,否则Pod重启或迁移会导致job配置、插件、凭证全部丢失;需绑定ReadWriteOnce类型PV,配全RBAC权限(含pods/services/secrets的create/list/delete),并用专用ServiceAccount。

直接部署 Jenkins Pod 会丢数据,必须配 PVC
不挂载持久卷的 Jenkins Pod 一旦重启或迁移,所有 job 配置、插件、凭证全丢。Kubernetes 默认是无状态的,而 Jenkins 是强状态服务。
关键点:不能只写一个 Deployment 就完事,必须显式声明 PersistentVolumeClaim 并绑定到容器的 /var/jenkins_home 路径。
-
PV类型优先选ReadWriteOnce(多数存储后端如 NFS、Ceph RBD、云盘都支持),避免用ReadWriteMany增加运维复杂度 -
storageClassName必须和集群中实际存在的 StorageClass 名称一致,比如rook-ceph-block或alicloud-disk-ssd - 不要把
jenkins-home目录映射到emptyDir或hostPath,前者重启即失,后者在多节点集群中不可靠
ServiceAccount 和 RBAC 权限不配全,Kubernetes 插件连不上集群
后续要用 Kubernetes 插件动态起 Agent Pod,Jenkins 主体必须有权限创建、删除 Pod 和 Service。光给 cluster-admin 太危险,应最小化授权。
典型缺失权限现象:Failed to list *v1.Pod: pods is forbidden 或插件配置页测试连接始终显示 “Connection failed”。
- 创建专用
ServiceAccount,比如叫jenkins-sa - 绑定
ClusterRole(非Role),至少包含pods、services、secrets的create/delete/list权限 - 在
Deployment的spec.template.spec.serviceAccountName字段明确指定该 SA
用 Helm 部署比手写 YAML 更稳,但得关掉默认的 admin 密码硬编码
Helm Chart(如 jenkinsci/blueocean 或官方 jenkins/jenkins)已预置 PV/PVC/SA/RBAC,省去大量手工调试。但默认值有安全隐患。
常见坑:adminPassword 写死在 values.yaml 里,导致密码明文泄露在 Git 或 CI 日志中。
- 把
controller.adminSecret设为true,让 Helm 自动生成并存为Secret - 用
kubectl get secret -n <ns> jenkins -o jsonpath='{.data.jenkins-admin-password}' | base64 -d提取密码 - 若需固定密码,改用
existingSecret引用已存在的 Secret,而非直接填值
Agent 动态创建失败,大概率是 Pod 模板镜像没权限或网络不通
装好 Kubernetes 插件后,在 Jenkins 系统配置里填了 Kubernetes URL 和凭据,但新建 Pipeline 时仍卡在 “Waiting for agent”,说明 Agent Pod 启不来。
查 kubectl get pod -n <jenkins-ns> 会看到 Pending 或 CrashLoopBackOff 状态的 Pod。
- 检查 Agent 镜像是否含
jnlp客户端,推荐用官方镜像如jenkins/inbound-agent:4.11-2,别自己瞎改基础镜像 - 确认 Agent Pod 所在命名空间能访问 Kubernetes API(默认
default可能没权限,建议统一用jenkins命名空间) - 如果 Jenkins Master 在集群外,Agent Pod 的 DNS 必须能解析
kubernetes.default.svc.cluster.local,否则连不上 API Server
ca-certificates 包,都会让整个流水线卡在最不起眼的地方。


















