专业的编程技术博客社区

网站首页 > 博客文章 正文

Kubernetes(K8s)+ GitLab + Jenkins 实现CI/CD

baijin 2025-05-11 14:04:21 博客文章 8 ℃ 0 评论


当我们推送代码到Gitlab时,Gitlab会主动地通知Jenkins对应的任务,它会通过设置的源码管理去拉取Gitlab上对应地址的代码。

然后执行我们预先设置好的构建的脚本(脚本是我们在之前做的构建镜像以及推送到阿里云)。

接着再通过我们上面Publish over SSH配置好的信息登陆到Kubernetes的部署节点。

最后执行部署脚本进行部署,更新pod。

系统组件准备

组件

说明

GitLab

源码管理工具,支持 Webhook

Jenkins

持续集成工具,触发构建和部署流程

Docker

构建容器镜像

Kubernetes

运行生产环境容器

Harbor(可选)

私有镜像仓库,替代 DockerHub

Helm(推荐)

Kubernetes 的包管理工具

CI/CD 流程触发示意

  1. 开发者 Push 代码到 GitLab。
  2. GitLab Webhook 通知 Jenkins。
  3. Jenkins 拉取代码 → 构建镜像 → 推送镜像 → 更新 K8s 应用部署。
  4. K8s 滚动更新,应用上线。

详细部署流程

1 Jenkins 安装及配置(在 K8s 或物理机)

  • 安装 Jenkins(可用 Helm chart 安装在 K8s 上):
helm repo add jenkins https://charts.jenkins.io 
helm repo update 
helm install jenkins jenkins/jenkins --set controller.adminPassword=admin
  • 安装插件(必须):
    • GitLab Plugin
    • Kubernetes CLI Plugin
    • Docker Pipeline
    • Git Parameter Plugin
    • SSH Agent Plugin
  • 配置 GitLab 凭据(SSH / Access Token)

2 GitLab 配置 Webhook(推送时触发 Jenkins)

在 GitLab 项目中:

  • Settings → Webhooks
  • 添加 Jenkins 触发地址,例如:
http://<jenkins-ip>/project/<job-name>

3 Jenkinsfile 编写(放入 GitLab 仓库)

Jenkinsfile 示例:构建并部署到 K8s

pipeline {
    agent any

    environment {
        IMAGE_NAME = "registry.example.com/myapp:${BUILD_NUMBER}"
    }

    stages {
        stage('Clone') {
            steps {
                git 'git@gitlab.com:yourgroup/yourrepo.git'
            }
        }

        stage('Build Docker Image') {
            steps {
                script {
                    docker.build("${IMAGE_NAME}")
                }
            }
        }

        stage('Push to Registry') {
            steps {
                script {
                    docker.withRegistry('https://registry.example.com', 'harbor-credentials') {
                        docker.image("${IMAGE_NAME}").push()
                    }
                }
            }
        }

        stage('Deploy to Kubernetes') {
            steps {
                sh '''
                kubectl set image deployment/myapp myapp=${IMAGE_NAME} --namespace=default
                '''
            }
        }
    }
}

4 K8s 中部署 Helm 应用或 YAML 文件

  • 示例 YAML(Deployment):
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: registry.example.com/myapp:latest
        ports:
        - containerPort: 8080
  • 初始部署方式:
kubectl apply -f deployment.yaml

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表