jenkins部署k8s项目完整流程

admin 2025年9月25日10:51:20评论54 views字数 5423阅读18分4秒阅读模式

前言

目前公司在转向k8s部署服务,因此整理了一下k8s部署的过程,只有了解部署过程,才能知道安全可以哪一步做什么。

CI/CD流水线

CI/CD流水线有下面的几个步骤组成:代码提交,构建,测试,部署。对于 Jenkins、Kubernetes、ArgoCD 的组合,整体架构大致如下:

1)开发者提交代码到代码仓库(如 GitHub 或 GitLab)

2)Jenkins 监控代码变动,并在检测到新的提交时触发构建。

3)Jenkins 使用 Docker 构建容器镜像,然后将镜像推送到容器镜像仓库(如 Docker Hub 或私有仓库)。(在代码中需要dockerfile)

4)ArgoCD 负责监控 Git 仓库,检测到部署配置文件变动后,自动同步变更到 Kubernetes 集群,执行应用部署。(argoCD根据代码中的k8s yaml文件进行操作,也是通过git仓库进行版本控制)

jenkinsfiles文件实现构建流程

Jenkinsfile 是 Jenkins 中用来描述流水线过程的脚本文件,它定义了从代码拉取、构建到测试的全部过程。在本例中,我们将编写一个 Jenkinsfile 文件,用于完成以下步骤:拉取代码。构建 Docker 镜像。推送 Docker 镜像到镜像仓库。通知 ArgoCD 更新配置文件。

pipeline {    agent any    environment {        git_address = "http://192.168.x.x/y/h.git"    // gitlab仓库地址        git_auth = "jenkins-to-gitlab"     // Jenkins中配置的GitLab凭据ID        docker_build_host = "192.168.x.x"    // 构建镜像主机        branch_name = "master"        // BUILD_NUMBER 是 Jenkins 的内置环境变量,代表当前构建的编号(递增)        // 例如第一次构建为 1,第二次为 2,用于版本号控制    }    stages {        stage('清空工作目录') {            steps {                echo '清理工作目录...'                deleteDir()            }        }        stage('拉取代码') {            steps {                checkout([$class: 'GitSCM',                    branches: [[name: "*/${branch_name}"]],                    doGenerateSubmoduleConfigurations: false,                    extensions: [],                    submoduleCfg: [],                    userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]                ])            }        }        stage('代码打包') {            steps {                sh "mvn -U clean package -Dmaven.test.skip=true"            }        }        stage('传输 Jar 包到 Docker 主机') {            steps {                sh """                    scp -rp h-main/target/h-main.jar root@${docker_build_host}:/root/docker-build/h/                """            }        }        stage('Docker 主机构建镜像并上传到harbor') {            steps {                sh """                    ssh root@${docker_build_host} '                        cd /root/docker-build/h &&                        docker build -t harbor.local/k8s/h:v1.0.${BUILD_NUMBER} . &&                        docker push harbor.local/k8s/h:v1.0.${BUILD_NUMBER}                    '                """            }        }stage('更新 YAML 并提交 Git') {steps {script {def newTag = "v1.0.${BUILD_NUMBER}"def yamlPath = "k8s/h/h-deploy.yaml"    // gitlab仓库中存放K8s资源文件的目录def imageLine = "image: harbor.local/k8s/h:${newTag}"// 修改 YAML 镜像地址sh "sed -i 's|image: harbor.local/k8s/hwj:.*|${imageLine}|' ${yamlPath}"                    // 使用凭据进行 Git 提交和推送                    withCredentials([usernamePassword(credentialsId: "${git_auth}", usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PASS')]) {                        sh """                            git config user.name 'h'                            git config user.email '[email protected]'                            git remote set-url origin http://$GIT_USER:[email protected]/yw/h.git                            git add ${yamlPath}                            git commit -m '更新镜像版本为 ${newTag}' || echo "No changes to commit"                            git push origin HEAD:${branch_name}                        """}}}}    }}

dockerfile文件

# 1. 指定基础镜像(必须放在第一行)FROM ubuntu:22.04# 2. 设置元数据(非必须)LABEL maintainer="[email protected]"# 3. 设置工作目录(后续命令的相对路径)WORKDIR /app# 4. 复制本地文件到镜像COPY ./src /app/src# 5. 安装系统依赖(每行RUN生成一个镜像层!)RUN apt-get update && apt-get install -y     python3     python3-pip# 6. 安装应用依赖(利用层缓存优化)COPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt# 7. 暴露容器端口EXPOSE 8000# 8. 设置默认启动命令CMD ["python3", "app.py"]

k8s配置文件

apiVersion: v1kind: Podmetadata:  name: host-root-mount-demospec:  containers:  - name: busybox    image: busybox    command: ["sleep", "3600"]    volumeMounts:    - name: host-root      mountPath: /mnt  volumes:  - name: host-root    hostPath:      path: /      type: Directory

持续集成与持续部署的结合:一个实例分析

为了更好地理解 Jenkins、Kubernetes 和 ArgoCD 的组合是如何协同工作的,我们可以来看一个实际的案例。

设想有一个开发团队,他们负责维护一款电商网站。每次开发者向主分支提交新代码后,Jenkins 会自动拉取代码,并进行构建和单元测试。如果测试通过,Jenkins 会将新版本的 Docker 镜像推送到镜像仓库。

在 Jenkins 中,构建过程结束后,构建脚本会自动修改存储在 Git 仓库中的 Kubernetes 部署配置文件,将容器镜像的标签更新为新的版本号。由于 ArgoCD 正在监控这个 Git 仓库,配置文件一旦变更,ArgoCD 会立即检测到,并自动更新 Kubernetes 集群中的应用。

这种工作流程实现了真正的持续集成与持续部署:开发人员只需提交代码,其余的步骤均由流水线自动完成。这不仅提高了开发的效率,同时也减少了人为操作可能带来的风险。

实现过程中的最佳实践与注意事项

在使用 Jenkins、Kubernetes 和 ArgoCD 搭建 CI/CD 流水线时,有一些最佳实践和注意事项需要遵循,以确保流程的高效与安全性。

Jenkins 安全配置

由于 Jenkins 通常会直接与代码仓库、镜像仓库等敏感资源交互,建议对 Jenkins 的访问进行严格的权限控制。可以启用基于角色的访问控制(Role-Based Access Control),并为不同的用户分配不同的权限,确保敏感操作只有被授权的用户可以执行。

镜像管理

在构建 Docker 镜像时,建议对基础镜像的选择和使用进行谨慎管理。可以使用经过信任的基础镜像,并定期更新镜像,确保其包含最新的安全补丁。此外,推送到 Docker 仓库的镜像应包含唯一的标签,例如使用构建号作为标签,防止因标签覆盖导致的问题。

GitOps 模式下的版本控制

在 GitOps 模式下,Git 仓库作为唯一可信的配置来源,所有变动都应通过 Git 进行追踪。这意味着每次部署的变更都应创建一个新的提交,以确保所有部署历史都可以回溯。通过这种方式,可以实现应用版本的回滚与配置变更的审计。

ArgoCD 与 Jenkins 的集成

Jenkins 和 ArgoCD 的集成可以通过修改 Git 仓库中的配置文件来实现,但在实际项目中,可以使用 Webhook 或 API 调用来增强灵活性。例如,可以在 Jenkins 中配置一个步骤,构建结束后通过调用 ArgoCD 的 API 来触发同步操作,以实现更精细的控制。

省流版

通过 Jenkins、Kubernetes 和 ArgoCD 的结合,构建了一个完整的 CI/CD 流水线,实现了从代码提交到应用部署的全自动化流程。这种流水线的优势在于其高效、可重复性以及自动化管理能力,适用于大多数现代软件开发项目。

Jenkins 负责自动化构建与测试,确保每个版本的代码质量;Kubernetes 提供强大的容器编排和管理能力,使得应用在不同环境中具有一致的行为;而 ArgoCD 则利用 GitOps 模式,实现了应用的声明式部署与持续交付。

未来,随着 DevOps 工具链的不断发展,可能会有更多的工具和技术加入到 CI/CD 的生态中来。例如,结合服务网格(Service Mesh)可以实现更加精细的流量管理,或者引入自动化安全扫描工具以进一步提高系统的安全性。而这一切的目标,都是为了让软件开发的过程更加高效、更加安全、更加智能化。

apiVersion: v1clusters:- cluster:    insecure-skip-tls-verify: true    extensions:    - extension:        last-update: Thu, 12 Dec 2024 16:33:22 CST        provider: minikube.sigs.k8s.io        version: v1.34.0      name: cluster_info    server: https://10.100.6.252:18443  name: minikubecontexts:- context:    cluster: minikube    extensions:    - extension:        last-update: Thu, 12 Dec 2024 16:33:22 CST        provider: minikube.sigs.k8s.io        version: v1.34.0      name: context_info    namespace: default    user: minikube  name: minikubecurrent-context: minikubekind: Configpreferences: {}users:- name: minikube  user:    client-certificate: C:Usersalex.mo.kube.minikubeprofilesminikubeclient.crt    client-key:  C:Usersalex.mo.kube.minikubeprofilesminikubeclient.key

参考链接

https://www.zhihu.com/question/768884868/answer/47903330994

https://blog.csdn.net/wfcxhit/article/details/147730874

原文始发于微信公众号(信安路漫漫):jenkins部署k8s项目完整流程

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年9月25日10:51:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   jenkins部署k8s项目完整流程http://cn-sec.com/archives/4513337.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息