Jenkins 在 K3s 上安装笔记(使用 Helm 离线包 + DaoCloud 镜像加速)
一、前置条件
-
K3s 集群正常运行(节点状态
Ready) -
Helm 已安装并能连接集群(建议配置好 kubeconfig)
-
已下载 Jenkins Helm Chart 离线包(例如
jenkins-5.9.16.tgz) -
确定可用的镜像仓库地址(例如 DaoCloud 镜像加速器
docker.m.daocloud.io)
二、准备 values 配置文件
创建 my-values.yaml,注意 init 容器和主容器的镜像都需要指定,否则 init 容器仍会使用 Chart 默认的镜像(可能导致拉取失败)。
yaml
controller:
# 主容器镜像配置
image:
registry: docker.m.daocloud.io # 镜像仓库地址
repository: jenkins/jenkins # 镜像名称
tag: lts-jdk21 # 标签(可用 lts-jdk11 或 lts-jdk17)
pullPolicy: IfNotPresent
# init 容器镜像配置(关键,必须与主容器一致)
initContainerImage:
registry: docker.m.daocloud.io
repository: jenkins/jenkins
tag: lts-jdk21
pullPolicy: IfNotPresent
serviceType: NodePort # 对外暴露 NodePort
persistence:
storageClass: local-path # K3s 默认的本地存储
为什么需要单独配置 initContainerImage?
Jenkins Helm Chart 使用 init 容器完成一些初始化工作(例如安装插件、配置权限等)。如果只配置
controller.image,init 容器仍会使用 Chart 默认的镜像(例如jenkins/jenkins:2.555.2-jdk21),如果默认镜像不存在或网络不通,就会导致 Pod 卡在Init:ImagePullBackOff。
三、安装 Jenkins
bash
# 创建命名空间(如果未存在)
kubectl create namespace jenkins --dry-run=client -o yaml | kubectl apply -f -
# 安装
helm install myjenkins ./jenkins-5.9.16.tgz \
--namespace jenkins \
-f my-values.yaml
如果需要升级或重新安装:
bash
# 如果已存在且需要升级配置
helm upgrade myjenkins ./jenkins-5.9.16.tgz -n jenkins -f my-values.yaml
# 如果需要彻底删除后重装(会丢失数据,谨慎)
helm uninstall myjenkins -n jenkins
# 可选:删除 PVC 以清理所有数据
kubectl delete pvc -n jenkins jenkins-home-myjenkins-0
# 然后重新执行 install
四、验证安装
1. 查看 Pod 状态
bash
kubectl get pods -n jenkins -w
等待 Pod 状态变为 Running(通常需要 2-5 分钟,取决于镜像拉取速度)。
2. 检查使用的镜像是否正确
bash
kubectl get pod myjenkins-0 -n jenkins -o jsonpath='{range .spec.initContainers[*]}{.image}{"\n"}{end}'
kubectl get pod myjenkins-0 -n jenkins -o jsonpath='{range .spec.containers[*]}{.image}{"\n"}{end}'
应输出类似 docker.m.daocloud.io/jenkins/jenkins:lts-jdk21。
五、首次登录
1. 获取初始管理员密码
bash
kubectl exec --namespace jenkins -it svc/myjenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo
2. 获取访问端口
bash
kubectl get svc -n jenkins myjenkins
输出示例:myjenkins NodePort 10.43.x.x 8080:31234/TCP,其中 31234 即为 NodePort。
3. 浏览器访问
text
http://<K3s节点IP>:<NodePort>
例如:http://172.19.172.4:31234
使用用户名 admin 和上面获得的密码登录,按向导完成初始化(推荐安装默认插件)。
六、常见问题排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
Pod 卡在 Init:ImagePullBackOff |
init 容器镜像配置错误或镜像不存在 | 检查 my-values.yaml 中的 controller.initContainerImage 是否正确;手动 crictl pull 测试镜像是否存在 |
Pod 卡在 ContainerCreating 很长时间 |
镜像拉取慢、存储卷挂载失败 | 配置镜像加速器(如 /etc/rancher/k3s/registries.yaml),检查 PVC 状态 |
| 访问 Jenkins 页面加载异常 | NodePort 被防火墙阻止 | 检查节点防火墙是否开放该端口 |
| 忘记初始密码 | 无 | 执行密码获取命令重新获取,或进入 Pod 修改 /var/jenkins_home/secrets/initialAdminPassword |
七、附:镜像加速配置(可选但推荐)
如果集群拉取 Docker Hub 镜像仍然缓慢,可以在 K3s 节点上配置镜像加速:
bash
sudo mkdir -p /etc/rancher/k3s
sudo tee /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
docker.io:
endpoint:
- "https://docker.m.daocloud.io"
- "https://docker.nju.edu.cn"
- "https://hub-mirror.c.163.com"
EOF
sudo systemctl restart k3s
注意:该配置会影响所有 Pod 的镜像拉取,优先级高于 values 中的
registry设置。
下载jenkins离线安装包(国内网络环境太糟糕下载不成功只能离线安装)
wget https://github.com/jenkinsci/helm-charts/releases/download/jenkins-5.9.16/jenkins-5.9.16.tgz
helm install 报错(不要指定set)
helm install myjenkins ./jenkins-5.9.16.tgz \
--namespace jenkins \
--set controller.serviceType=NodePort \
--set persistence.storageClass=local-path \
--set controller.image=registry.cn-hangzhou.aliyuncs.com/acs/jenkins \
--set controller.tag=2.555.2-jdk21-alpine
level=INFO msg="warning: cannot overwrite table with non table for jenkins.controller.image (mappullPolicy:Always registry:docker.io repository:jenkins/jenkins tagLabel:jdk21)"
Error: INSTALLATION FAILED: jenkins/templates/tests/jenkins-test.yaml:34:24
executing "jenkins/templates/tests/jenkins-test.yaml" at <.Values.controller.image.registry>:
can't evaluate field registry in type interface {}
docker pull 验证镜像是否存在

笔记结束。以上步骤已在实际环境中验证,可顺利完成 Jenkins 部署。