前言
目前公司在转向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 anyenvironment {git_address = "http://192.168.x.x/y/h.git" // gitlab仓库地址git_auth = "jenkins-to-gitlab" // Jenkins中配置的GitLab凭据IDdocker_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.gitgit 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 -ypython3python3-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: busyboximage: busyboxcommand: ["sleep", "3600"]volumeMounts:- name: host-rootmountPath: /mntvolumes:- name: host-roothostPath: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: trueextensions:- extension:last-update: Thu, 12 Dec 2024 16:33:22 CSTprovider: minikube.sigs.k8s.ioversion: v1.34.0name: cluster_infoserver: https://10.100.6.252:18443name: minikubecontexts:- context:cluster: minikubeextensions:- extension:last-update: Thu, 12 Dec 2024 16:33:22 CSTprovider: minikube.sigs.k8s.ioversion: v1.34.0name: context_infonamespace: defaultuser: minikubename: minikubecurrent-context: minikubekind: Configpreferences: {}users:- name: minikubeuser:client-certificate: C:Usersalex.mo.kube.minikubeprofilesminikubeclient.crtclient-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项目完整流程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-


评论