Jenkins容器化部署¶
Jenkins容器化部署是指将 Jenkins CI/CD 工具部署在 Kubernetes 集群中,以实现自动化构建、打包和发布流程的实践^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
部署架构¶
在典型的 K8S 结合 CI/CD 架构中,Jenkins 扮演核心构建角色^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。其标准工作流程通常包含以下步骤:
- 从 [[Git]] 仓库拉取代码^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- 使用 Maven 等工具进行编译构建^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- 将构建产物打包生成 [[Docker]] 镜像^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- 将镜像推送到 [[Harbor]] 镜像仓库^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- 通过资源配置清单将镜像部署到 Kubernetes 集群^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
基础镜像制作¶
为了使 Jenkins 容器具备构建 Docker 镜像的能力,需要在基础镜像中集成 Docker CLI 以及访问 Git 仓库的 SSH 密钥^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。以下是基于 harbor.od.com/public/jenkins:v2.190.3 制作自定义镜像的 Dockerfile 示例^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:
FROM harbor.od.com/public/jenkins:v2.190.3
USER root
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo 'Asia/Shanghai' >/etc/timezone
ADD id_rsa /root/.ssh/id_rsa
ADD config.json /root/.docker/config.json
ADD get-docker.sh /get-docker.sh
RUN echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&\
/get-docker.sh
- id_rsa: 用于免密登录 Git 仓库的私钥^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- config.json: Docker 登录 Harbor 仓库的认证文件^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- get-docker.sh: Docker 官方安装脚本^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
构建并推送镜像的命令如下^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:
docker build . -t harbor.od.com/infra/jenkins:v2.190.3
docker push harbor.od.com/infra/jenkins:v2.190.3
资源配置清单¶
Jenkins 在 K8S 中的部署需要定义 Deployment、Service 和 Ingress 资源^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
Deployment 配置¶
dp.yaml 示例^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: jenkins
namespace: infra
labels:
name: jenkins
spec:
replicas: 1
selector:
matchLabels:
name: jenkins
template:
metadata:
labels:
app: jenkins
name: jenkins
spec:
volumes:
- name: data
nfs:
server: hdss7-200
path: /data/nfs-volume/jenkins_home
- name: docker
hostPath:
path: /run/docker.sock
type: ''
containers:
- name: jenkins
image: harbor.od.com/infra/jenkins:v2.190.3
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
protocol: TCP
env:
- name: JAVA_OPTS
value: -Xmx512m -Xms512m
volumeMounts:
- name: data
mountPath: /var/jenkins_home
- name: docker
mountPath: /run/docker.sock
imagePullSecrets:
- name: harbor
securityContext:
runAsUser: 0
关键配置点说明:
- NFS 存储: 使用 NFS 持久化
/var/jenkins_home目录,确保 Pod 重启后数据不丢失^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。 - Docker Socket: 挂载宿主机的
/run/docker.sock,使容器内的 Jenkins 可以直接执行 Docker 命令(Docker-outside-of-Docker 模式)^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。 - Java Opts: 调整 JVM 内存参数以适应容器资源^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- Security Context: 设置
runAsUser: 0以 root 用户运行容器,便于操作 Docker Socket^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
Service 和 Ingress¶
svc.yaml 示例^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:
kind: Service
apiVersion: v1
metadata:
name: jenkins
namespace: infra
spec:
ports:
- protocol: TCP
port: 80
targetPort: 8080
selector:
app: jenkins
ingress.yaml 示例^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:
kind: [Ingress](<./ingress.md>)
apiVersion: extensions/v1beta1
metadata:
name: jenkins
namespace: infra
spec:
rules:
- host: jenkins.od.com
http:
paths:
- path: /
backend:
serviceName: jenkins
servicePort: 80
流水线构建原理¶
Jenkins 通过 Pipeline (流水线) 实现自动化构建[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。一个典型的构建流程包含以下阶段[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:
- pull: 克隆代码并切换到指定分支^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- build: 使用 Maven 进行编译^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- package: 打包 Jar 文件到指定目录^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
- image: 根据 Dockerfile 构建镜像并推送到 Harbor^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
Sources¶
^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]