Skip to content

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]。其标准工作流程通常包含以下步骤:

  1. 从 [[Git]] 仓库拉取代码^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  2. 使用 Maven 等工具进行编译构建^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  3. 将构建产物打包生成 [[Docker]] 镜像^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  4. 将镜像推送到 [[Harbor]] 镜像仓库^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  5. 通过资源配置清单将镜像部署到 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]:

  1. pull: 克隆代码并切换到指定分支^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  2. build: 使用 Maven 进行编译^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  3. package: 打包 Jar 文件到指定目录^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  4. 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]