当前位置:   article > 正文

【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(中)_devops自动化运维平台

devops自动化运维平台

目录

一、基于 Jenkins+k8s+Git+Docker Hub 等技术链构建企业级 DevOps 容器云平台

1.1 安装 Jenkins

1.1.1 安装 nfs 服务

1.1.2 在 kubernetes 中部署 jenkins

1.2 配置 Jenkins

​1.2.1 获取管理员密码

1.2.2 安装插件

1.2.3 创建第一个管理员用户

1.3 测试 jenkins 的 CI/CD

1.3.1 在 Jenkins 中安装 kubernetes 插件

​1.3.2 配置 jenkins 连接到我们存在的 k8s 集群

1.3.3 配置 pod-template

1.3.4 添加 Docker Hub 凭据

1.3.5 测试通过 Jenkins 部署应用发布到 k8s 开发环境、测试环境、生产环境 

1.4 Jenkins 实现 k8s 应用按照指定版本回滚


本篇文章所用到的资料文件下载地址:

【免费】jenkins-jnlp.tar.gz资源-CSDN文库
https://download.csdn.net/download/weixin_46560589/87407377

一、基于 Jenkins+k8s+Git+Docker Hub 等技术链构建企业级 DevOps 容器云平台

  • k8s-v1.23 集群环境

1.1 安装 Jenkins

1.1.1 安装 nfs 服务

  1. #1. 在各节点安装 nfs
  2. yum install nfs-utils -y
  3. systemctl enable nfs --now
  4. #2. 在 master1 上创建一个 nfs 共享目录
  5. [root@k8s-master1 ~]# mkdir -pv /data/v1
  6. [root@k8s-master1 ~]# vim /etc/exports
  7. /data/v1 *(rw,no_root_squash)
  8. #3. 使配置文件生效
  9. [root@k8s-master1 ~]# exportfs -arv
  10. exporting *:/data/v1
  11. [root@k8s-master1 ~]# systemctl restart nfs
  12. [root@k8s-master1 ~]# chmod -R 777 /data/v1/

1.1.2 在 kubernetes 中部署 jenkins

  • 1)创建名称空间
[root@k8s-master1 ~]# kubectl create namespace jenkins-k8s
  • 2)创建 pv

  1. [root@k8s-master1 ~]# mkdir jenkins
  2. [root@k8s-master1 ~]# cd jenkins/
  3. [root@k8s-master1 jenkins]# vim pv.yaml
  4. apiVersion: v1
  5. kind: PersistentVolume
  6. metadata:
  7. name: jenkins-k8s-pv
  8. spec:
  9. capacity:
  10. storage: 10Gi
  11. accessModes:
  12. - ReadWriteMany
  13. nfs:
  14. server: 192.168.78.143
  15. path: /data/v1
  16. [root@k8s-master1 jenkins]# kubectl apply -f pv.yaml
  17. persistentvolume/jenkins-k8s-pv created
  18. [root@k8s-master1 jenkins]# kubectl get pv
  19. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  20. jenkins-k8s-pv 10Gi RWX Retain Available 5s
  • 3)创建 pvc

  1. [root@k8s-master1 jenkins]# vim pvc.yaml
  2. kind: PersistentVolumeClaim
  3. apiVersion: v1
  4. metadata:
  5. name: jenkins-k8s-pvc
  6. namespace: jenkins-k8s
  7. spec:
  8. resources:
  9. requests:
  10. storage: 10Gi
  11. accessModes:
  12. - ReadWriteMany
  13. [root@k8s-master1 jenkins]# kubectl apply -f pvc.yaml
  14. persistentvolumeclaim/jenkins-k8s-pvc created
  15. [root@k8s-master1 jenkins]# kubectl get pvc -n jenkins-k8s
  16. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  17. jenkins-k8s-pvc Bound jenkins-k8s-pv 10Gi RWX 7s
  • 4)创建一个 sa 账号

  1. [root@k8s-master1 jenkins]# kubectl create sa jenkins-k8s-sa -n jenkins-k8s
  2. serviceaccount/jenkins-k8s-sa created
  3. # 把上面的 sa 账号做 rbac 授权
  4. [root@k8s-master1 jenkins]# kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa
  • 5)通过 deployment 部署 jenkins

  1. # 把 jenkins-2.328.tar.gz 上传到 node1、node2 并解压
  2. [root@k8s-node1 ~]# docker load -i jenkins-2.328.tar.gz
  3. [root@k8s-node2 ~]# docker load -i jenkins-2.328.tar.gz
  4. [root@k8s-master1 jenkins]# vim jenkins-deployment.yaml
  5. kind: Deployment
  6. apiVersion: apps/v1
  7. metadata:
  8. name: jenkins
  9. namespace: jenkins-k8s
  10. spec:
  11. replicas: 1
  12. selector:
  13. matchLabels:
  14. app: jenkins
  15. template:
  16. metadata:
  17. labels:
  18. app: jenkins
  19. spec:
  20. serviceAccount: jenkins-k8s-sa
  21. containers:
  22. - name: jenkins
  23. image: jenkins/jenkins:2.328
  24. imagePullPolicy: IfNotPresent
  25. ports:
  26. - containerPort: 8080
  27. name: web
  28. protocol: TCP
  29. - containerPort: 50000
  30. name: agent
  31. protocol: TCP
  32. resources:
  33. limits:
  34. cpu: 2000m
  35. memory: 2Gi
  36. requests:
  37. cpu: 500m
  38. memory: 512Mi
  39. livenessProbe:
  40. httpGet:
  41. path: /login
  42. port: 8080
  43. initialDelaySeconds: 60
  44. timeoutSeconds: 5
  45. failureThreshold: 12
  46. readinessProbe:
  47. httpGet:
  48. path: /login
  49. port: 8080
  50. initialDelaySeconds: 60
  51. timeoutSeconds: 5
  52. failureThreshold: 12
  53. volumeMounts:
  54. - name: jenkins-volume
  55. subPath: jenkins-home
  56. mountPath: /var/jenkins_home
  57. volumes:
  58. - name: jenkins-volume
  59. persistentVolumeClaim:
  60. claimName: jenkins-k8s-pvc
  61. [root@k8s-master1 jenkins]# kubectl apply -f jenkins-deployment.yaml
  62. [root@k8s-master1 jenkins]# kubectl get pods -n jenkins-k8s -o wide
  63. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  64. jenkins-9db894c8c-j9tr7 1/1 Running 0 2m14s 10.244.169.129 k8s-node2 <none> <none>
  • 6)把 jenkins 前端加上 service 提供外部网络访问

  1. [root@k8s-master1 jenkins]# vim jenkins-service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: jenkins-service
  6. namespace: jenkins-k8s
  7. labels:
  8. app: jenkins
  9. spec:
  10. selector:
  11. app: jenkins
  12. type: NodePort
  13. ports:
  14. - name: web
  15. port: 8080
  16. targetPort: web
  17. nodePort: 30002
  18. - name: agent
  19. port: 50000
  20. targetPort: agent
  21. [root@k8s-master1 jenkins]# kubectl apply -f jenkins-service.yaml
  22. service/jenkins-service created
  23. [root@k8s-master1 jenkins]# kubectl get svc -n jenkins-k8s
  24. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  25. jenkins-service NodePort 10.99.229.21 <none> 8080:30002/TCP,50000:30527/TCP 7s

通过上面可以看到 service 的 8080 端口在物理机映射的端口是 30002

1.2 配置 Jenkins

在浏览器访问 jenkins 的 web 界面:http://192.168.78.143:30002



1.2.1 获取管理员密码

  1. # 在 nfs 服务端,也就是我们的 master1 节点获取密码
  2. [root@k8s-master1 jenkins]# cat /data/v1/jenkins-home/secrets/initialAdminPassword
  3. 081e9ebd3c7243819817c0f6a1adb5d8

把上面获取到的密码拷贝到上面管理员密码下的方框里

点击继续,出现如下界面 

1.2.2 安装插件

选择“安装推荐的插件


插件安装好之后显示如下

1.2.3 创建第一个管理员用户

        用户名和密码都设置成 admin,线上环境需要设置成复杂的密码。修改好之后点击保存并完成,出现如下界面:

不用修改,点击保存并完成,出现如下界面:

点击开始使用 Jenkins,至此 Jenkins 配置完成!

1.3 测试 jenkins 的 CI/CD

1.3.1 在 Jenkins 中安装 kubernetes 插件

  • 1)在 jenkins 中安装 k8s 插件

        点击左边列表中的 Manage Jnekins ------> 插件管理 ------> 可选插件 ------> 搜索 kubernetes ------>出现如下:

        选中 kubernetes 之后 ------> 点击下面的“Download now and install after restart”(下载待重启后安装)------> 勾选“安装之后选择重新启动 jenkins” ---> 重启之后登陆 jenkins,插件即可生效 

  • 2)安装 blueocean 插件

1.3.2 配置 jenkins 连接到我们存在的 k8s 集群

点击“系统管理” -> 系统配置 -> 页面拉到最下 -> 点击“a separate configuration page”

  • 1)新增一个云,在下拉菜单中选择 kubernets

  • 2)填写云 kubernetes 配置内容


https://192.168.78.143:6443

  • 3)测试 jenkins 和 k8s 是否可以通信

Kubernetes 命名空间:jenkins-k8s
Jenkins 地址:http://jenkins-service.jenkins-k8s.svc.cluster.local:8080

Connected to Kubernetes v1.23.1 说明测试成功,Jenkins 可以和 k8s 进行通信!

1.3.3 配置 pod-template

  • 1)添加一个模板

按如下配置:

  • 2)添加容器

        Docker 镜像:使用 jenkins-jnlp.tar.gz 解压出来的镜像 xianchao/jenkins-jnlp:v1,把这个镜像压缩包上传到 k8s 的各工作节点并手动解压:

  1. # 解压出来的镜像是 xianchao/jenkins-jnlp:v1
  2. [root@k8s-node1 ~]# docker load -i jenkins-jnlp.tar.gz
  3. [root@k8s-node2 ~]# docker load -i jenkins-jnlp.tar.gz

在每一个 pod template 右下脚都有一个高级,点击高级:

        往下拉,在 Service Account 处输入 jenkins-k8s-sa,这个 sa 就是我们最开始安装 jenkins 时创建的 sa:

  • 3)添加两个卷

添加卷 ------> 选择 Host Path Volume 

/var/run/docker.sock

/var/run/docker.sock

/root/.kube

/home/jenkins/.kube

上面配置好之后,点击 Apply(应用) ------> Save(保存) 

1.3.4 添加 Docker Hub 凭据

注意:如果没有 Docker Hub 账号则需要先去注册 Docker

        首页 ------> 系统管理 Manage Credentials(管理凭据)------> 点击 Stores scoped to Jenkins下的第一行 jenkins 后面的全局,显示如下

点击添加凭据(也可以添加阿里云私有镜像仓库账户),出现如下

1.3.5 测试通过 Jenkins 部署应用发布到 k8s 开发环境、测试环境、生产环境 

        开发提交代码到代码仓库 gitlab -> jenkins 检测到代码更新 -> 调用 k8s api 在 k8s 中创建jenkins slave pod:

        Jenkins slave pod 拉取代码 -> 通过 maven 把拉取的代码进行构建成 war 包或者 jar 包 ---> 上传代码到 Sonarqube 进行静态代码扫描 --> 基于 war 包构建 docker image --> 把镜像上传到阿里云(或者 harbor)镜像仓库 --> 基于镜像部署应用到开发环境 --> 部署应用到测试环境 ---> 部署应用到生产环境。

  • 1)创建名称空间

  1. [root@k8s-master1 ~]# kubectl create ns devlopment
  2. [root@k8s-master1 ~]# kubectl create ns production
  3. [root@k8s-master1 ~]# kubectl create ns qatest
  • 2)在 jenkins 创建任务

回到首页,开始创建一个新任务

输入一个任务名称:jenkins-variable-test-deploy -> 选择流水线 -> 确定

在 Pipeline script 处输入如下内容

  1. node('test') { // 基于前面创建的 pod 模板创建 jenkins slave pod
  2. stage('Clone') {
  3. echo "1.Clone Stage" // 第一步克隆代码
  4. git url: "https://github.com/loveyou2333/jenkins-sample.git" // 自己的项目地址
  5. script {
  6. build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
  7. } // 检测代码是否有更新,如有则生成随机数字
  8. }
  9. stage('Test') {
  10. echo "2.Test Stage" // 第二步测试
  11. }
  12. stage('Build') { // 第三步构建镜像
  13. echo "3.Build Docker Image Stage"
  14. sh "docker build -t fuhxxx/jenkins-demo:${build_tag} ." // Docker Hub 账户地址
  15. }
  16. stage('Push') { // 第四步推送镜像到仓库
  17. echo "4.Push Docker Image Stage"
  18. withCredentials([usernamePassword(credentialsId: 'DockerHub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
  19. sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}" // 自动获取 docker hub 的用户和密码;'DockerHub' 为前面创建的凭据 id
  20. sh "docker push fuhxxx/jenkins-demo:${build_tag}" // 修改为自己的账户
  21. }
  22. }
  23. stage('Deploy to dev') { // 部署应用到开发环境
  24. echo "5. Deploy DEV"
  25. sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev.yaml"
  26. sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev.yaml"
  27. // sh "bash running-devlopment.sh"
  28. sh "kubectl apply -f k8s-dev.yaml --validate=false"
  29. }
  30. stage('Promote to qa') { // 部署项目到测试环境
  31. def userInput = input(
  32. id: 'userInput',
  33. message: 'Promote to qa?',
  34. parameters: [
  35. [
  36. $class: 'ChoiceParameterDefinition',
  37. choices: "YES\nNO", // 手动判断是否部署
  38. name: 'Env'
  39. ]
  40. ]
  41. )
  42. echo "This is a deploy step to ${userInput}"
  43. if (userInput == "YES") {
  44. sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa.yaml"
  45. sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa.yaml"
  46. // sh "bash running-qa.sh"
  47. sh "kubectl apply -f k8s-qa.yaml --validate=false"
  48. sh "sleep 6"
  49. sh "kubectl get pods -n qatest"
  50. } else {
  51. //exit
  52. }
  53. }
  54. stage('Promote to pro') { // 部署项目到生成环境
  55. def userInput = input(
  56. id: 'userInput',
  57. message: 'Promote to pro?',
  58. parameters: [
  59. [
  60. $class: 'ChoiceParameterDefinition',
  61. choices: "YES\nNO",
  62. name: 'Env'
  63. ]
  64. ]
  65. )
  66. echo "This is a deploy step to ${userInput}"
  67. if (userInput == "YES") {
  68. sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod.yaml"
  69. sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod.yaml"
  70. // sh "bash running-production.sh"
  71. sh "cat k8s-prod.yaml"
  72. sh "kubectl apply -f k8s-prod.yaml --record --validate=false"
  73. }
  74. }
  75. }

        把 GitHub - luckylucky421/jenkins-sample 项目 fork 到自己的 GitHub 上,并修改 k8s-dev.yaml、k8s-qa.yaml、k8s-prod.yaml 三个文件里的镜像名称:

  • 3)构建任务

点击应用 ------> 保存 ------> 立即构建 -> 在 #1 的 Console Output 可看到构建过程:

在 Console Output 如果看到如下,点击 Input requested:

点击继续

从上面可以看到已经把应用部署到 dev 环境了,点击 Input requested

通过上面可以看到把应用部署到了 pro 环境了 。

  • 4)验证

验证是否在 devlopment 和 production 名称空间下有应用:

  1. [root@k8s-master1 ~]# kubectl get pods -n devlopment
  2. NAME READY STATUS RESTARTS AGE
  3. jenkins-demo-5f6c587df5-jlxhz 1/1 Running 0 12m
  4. [root@k8s-master1 ~]# kubectl get pods -n qatest
  5. NAME READY STATUS RESTARTS AGE
  6. jenkins-demo-5f6c587df5-9wnph 1/1 Running 0 3m10s
  7. [root@k8s-master1 ~]# kubectl get pods -n production
  8. NAME READY STATUS RESTARTS AGE
  9. jenkins-demo-5f6c587df5-rhcn6 1/1 Running 0 2m25s

通过上面可以看到 jenkins 对接 k8s,可以把应用发布到 k8s 集群的开发、测试、生产环境了。

打开 blue ocean 会看到如下流程,你也可以尝试重新运行构建,手动点击确认部署流程: 

1.4 Jenkins 实现 k8s 应用按照指定版本回滚

        回到首页 -> 新建一个任务 ------> 输入一个任务名称:jenkins-variable-test-deploy-rollout ------> 流水线 ------> 确定 ------> 在 Pipeline script 处输入如下内容:

  1. node('test') {
  2. stage('git clone') {
  3. git url: "https://github.com/loveyou2333/jenkins-rollout.git"
  4. sh "ls -al"
  5. sh "pwd"
  6. }
  7. stage('select env') {
  8. def envInput = input(
  9. id: 'envInput',
  10. message: 'Choose a deploy environment',
  11. parameters: [
  12. [
  13. $class: 'ChoiceParameterDefinition',
  14. choices: "devlopment\nqatest\nproduction",
  15. name: 'Env'
  16. ]
  17. ]
  18. )
  19. echo "This is a deploy step to ${envInput}"
  20. sh "sed -i 's/<namespace>/${envInput}/' getVersion.sh"
  21. sh "sed -i 's/<namespace>/${envInput}/' rollout.sh"
  22. sh "bash getVersion.sh"
  23. // env.WORKSPACE = pwd()
  24. // def version = readFile "${env.WORKSPACE}/version.csv"
  25. // println version
  26. }
  27. stage('select version') {
  28. env.WORKSPACE = pwd()
  29. def version = readFile "${env.WORKSPACE}/version.csv"
  30. println version
  31. def userInput = input(id: 'userInput',
  32. message: '选择回滚版本',
  33. parameters: [
  34. [
  35. $class: 'ChoiceParameterDefinition',
  36. choices: "$version\n",
  37. name: 'Version'
  38. ]
  39. ]
  40. )
  41. sh "sed -i 's/<version>/${userInput}/' rollout.sh"
  42. }
  43. stage('rollout deploy') {
  44. sh "bash rollout.sh"
  45. }
  46. }

点击应用 -> 保存 -> 立即构建(三角符)

在构建过程中即可选择需要回滚的环境和指定的版本!

上一篇文章:【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(上)_Stars.Sky的博客-CSDN博客

下一篇文章:【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(下)_Stars.Sky的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/48583?site
推荐阅读
相关标签
  

闽ICP备14008679号