GitLab + Jenkins + Kubernetes 实现 CI/CD 全流程
将 GitLab、Jenkins 和 Kubernetes 结合实现 CI/CD 流程,能够充分发挥各自优势:GitLab 提供代码托管和版本控制,Jenkins 作为自动化构建工具,Kubernetes 提供弹性部署环境。
架构设计
GitLab 作为代码仓库和触发源,通过 Webhook 触发 Jenkins 流水线。Jenkins 负责构建、测试并将镜像推送至镜像仓库(如 GitLab Container Registry)。Kubernetes 接收部署指令,拉取镜像并创建 Pod。
graph LR
A[GitLab代码提交] --> B[Jenkins流水线]
B --> C[构建Docker镜像]
C --> D[推送至镜像仓库]
D --> E[Kubernetes部署]
环境配置
安装并配置必要的工具和插件:
- GitLab Runner 注册到 GitLab
- Jenkins 安装 GitLab 和 Kubernetes 插件
- kubectl 配置 Jenkins 对 Kubernetes 集群的访问权限
# 示例:kubectl 配置
kubectl config set-cluster k8s --server=https://kubernetes.default.svc
kubectl config set-credentials jenkins --token=<service-account-token>
Jenkins 流水线配置
创建 Jenkinsfile 定义完整的 CI/CD 流程,包括构建、测试、打包和部署阶段。使用声明式流水线语法增强可读性。
pipeline {
agent any
environment {
sonarLogin = '2bab7bf7d5af25e2c2ca2f178af2c3c55c64d5d8'
harborUser = 'admin'
harborPassword = 'Harbor12345'
harborHost = '192.168.11.12:8888'
harborRepo = 'repository'
}
stages {
stage('拉取Git代码'){
steps {
checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/lsx.git']]])
}
}
stage('Maven构建代码'){
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
stage('SonarQube检测代码'){
steps {
sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=${sonarLogin}'
}
}
stage('自动化测试脚本'){
steps {
sh 'pip install -r requ.txt'
sh 'pytest run.py'
}
}
stage('制作自定义镜像'){
steps {
sh '''cd docker
mv ../target/*.jar ./
docker build -t ${JOB_NAME}:$tag .
'''
}
}
stage('推送自定义镜像'){
steps {
sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborHost}
docker tag ${JOB_NAME}:$tag ${harborHost}/${harborRepo}/${JOB_NAME}:$tag
docker push ${harborHost}/${harborRepo}/${JOB_NAME}:$tag'''
}
}
stage('通知目标服务器'){
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'centos-docker', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
stage('远程执行kubectl命令')
{
sh '''ssh root@ 192.1.1.2 kubectl apply -f /usr/k8s/pipeline.yml
kubectl rollout restart deployment pipeline -n test'''
}
}
post {
success {
dingtalk (
robot: 'Jenkins-DingDing',
type:'MARKDOWN',
title: "success: ${JOB_NAME}",
text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
)
}
failure {
dingtalk (
robot: 'Jenkins-DingDing',
type:'MARKDOWN',
title: "fail: ${JOB_NAME}",
text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
)
}
}
}
Kubernetes 部署文件
准备 Kubernetes 部署文件定义应用规格,包括 Deployment 和 Service 资源。使用 ConfigMap 和 Secret 管理配置和敏感信息。
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: test
name: pipeline
labels:
app: pipeline
spec:
replicas: 2
selector:
matchLabels:
app: pipeline
template:
metadata:
labels:
app: pipeline
spec:
containers:
- name: pipeline
image: 192.168.11.102:80/repo/pipeline:v4.0.0
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
namespace: test
labels:
app: pipeline
name: pipeline
spec:
selector:
app: pipeline
ports:
- port: 8081
targetPort: 8080
type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: test
name: pipeline
spec:
ingressClassName: ingress
rules:
- host: mashibing.pipeline.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: pipeline
port:
number: 8081
GitLab 集成配置
在 GitLab 项目中设置 Webhook,将 push 事件通知 Jenkins。配置 Jenkins 的 GitLab 插件以接收这些事件并触发相应流水线。
# GitLab Webhook 示例
URL: http://jenkins.example.com/project/myapp
Trigger: Push events
Secret token: secure_token_here
安全与权限管理
配置 RBAC 确保 Jenkins 服务账户在 Kubernetes 集群中具有适当权限。限制 GitLab Runner 的执行环境以增强安全性。
# rbac.yaml 示例
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: jenkins-deploy
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
监控与日志
集成 Prometheus 和 Grafana 监控部署状态和性能指标。使用 EFK 或 Loki 收集和分析日志数据。
# service-monitor.yaml 示例
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: myapp-monitor
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: web
优化建议
使用 Kaniko 或 Buildah 在 Kubernetes 集群内直接构建镜像,避免 Docker-in-Docker 的安全隐患。考虑采用 Argo CD 实现 GitOps 工作流加强部署可观测性。
# kaniko 示例
apiVersion: batch/v1
kind: Job
metadata:
name: kaniko
spec:
template:
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:latest
args: ["--dockerfile=Dockerfile",
"--context=git://github.com/org/repo",
"--destination=gcr.io/my-project/myapp"]
通过以上配置可实现从代码提交到生产部署的完整自动化流程,各组件分工明确又紧密集成,形成高效的 CI/CD 管道。