当前位置:   article > 正文

基于Jenkins+Kubernetes+GitLab+Harbor构建CICD平台

基于Jenkins+Kubernetes+GitLab+Harbor构建CICD平台

1. 实验环境 

1.1 k8s环境

1)Kubernetes 集群版本是 1.20.6

2)k8s控制节点:

IP:192.168.140.130

主机名:k8s-master 

配置:4C6G

3)k8s工作节点

节点1:

IP:192.168.140.131

主机名:k8s-node1 

配置:4C7.5G

节点2:

IP:192.168.140.132

主机名:k8s-node2

配置:4C11G

1.2  GitLab 环境

地址:http://192.168.140.132:8001/

代码仓库地址: http://192.168.140.132:8001/root/jenkins-sample.git

代码下载链接:https://pan.baidu.com/s/1xbW-zUf23tu0YSV-5c1dew?pwd=lmzf 
提取码:lmzf

GitLab安装过程参考:Yum一键安装GitLab_yum gitlab-CSDN博客

1.3 Harbor环境

IP:192.168.140.132

1.4  Jenkins环境

版本:Jenkins 2.394

对应的jnlp软件下载地址如下:

链接:https://pan.baidu.com/s/1bNYiZCHWT099eOEdhDmJ3Q?pwd=lmzf 
提取码:lmzf

备注:docker  load   -i   jenkins-slave-latest.tar.gz 镜像即为jenkins-slave-latest:v1

2. 安装环境

2.1 安装 nfs 服务

1)三个节点分别安装nfs服务,k8s-master作为服务端

[root@k8s-master ~]#  yum  -y  install nfs-utils 

[root@k8s-master ~]#  systemctl enable  nfs  --now

[root@k8s-node1 ~]#  yum  -y  install nfs-utils 

[root@k8s-node1 ~]#  systemctl enable  nfs  --now

[root@k8s-node2 ~]# yum  -y  install nfs-utils 

[root@k8s-node2 ~]#  systemctl enable  nfs  --now

2)k8s-master上创建共享目录

[root@k8s-master ~]#  mkdir /data/v2 -p
[root@k8s-master ~]#  vim /etc/export

/data/v2 192.168.140.0/24(rw,no_root_squash)

[root@k8s-master ~]#   exportfs -arv
[root@k8s-master ~]#   systemctl restart nfs

2.2 在 kubernetes 中部署 jenkins

1)创建名称空间

[root@k8s-master ~]#   kubectl create namespace jenkins-k8s

2)创建 pv

[root@k8s-master ~]#   kubectl apply -f pv.yaml

  1. # pv.yaml文件
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5. name: jenkins-k8s-pv
  6. spec:
  7. capacity:
  8. storage: 10Gi
  9. accessModes:
  10. - ReadWriteMany
  11. nfs:
  12. server: 192.168.140.130
  13. path: /data/v2

3)创建pvc

[root@k8s-master ~]#   kubectl apply -f pvc.yaml

  1. # 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

4)查看 pvc 是否创建成功

[root@k8s-master ~]#  kubectl get pvc -n jenkins-k8

  1. [root@k8s-master ~]# kubectl get pvc -n jenkins-k8s
  2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  3. jenkins-k8s-pvc Bound jenkins-k8s-pv 10Gi RWX 8h

5)创建一个 sa 账号

[root@k8s-master ~]#  kubectl create sa jenkins-k8s-sa -n jenkins-k8s

6)把上面的 sa 账号做 rbac 授权

[root@k8s-master ~]#  kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa

7)Jenkins文件夹授权

[root@k8s-master ~]# chown -R 1000.1000 /data/v2

8)deployment 部署 jenkins

[root@k8s-master ~]# kubectl apply -f jenkins-deployment.yaml 
  1. # jenkins-deployment.yaml文件
  2. kind: Deployment
  3. apiVersion: apps/v1
  4. metadata:
  5. name: jenkins
  6. namespace: jenkins-k8s
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: jenkins
  12. template:
  13. metadata:
  14. labels:
  15. app: jenkins
  16. spec:
  17. serviceAccount: jenkins-k8s-sa
  18. containers:
  19. - name: jenkins
  20. image: jenkins/jenkins:2.394
  21. imagePullPolicy: IfNotPresent
  22. ports:
  23. - containerPort: 8080
  24. name: web
  25. protocol: TCP
  26. - containerPort: 50000
  27. name: agent
  28. protocol: TCP
  29. resources:
  30. limits:
  31. cpu: 1000m
  32. memory: 1Gi
  33. requests:
  34. cpu: 500m
  35. memory: 512Mi
  36. livenessProbe:
  37. httpGet:
  38. path: /login
  39. port: 8080
  40. initialDelaySeconds: 60
  41. timeoutSeconds: 5
  42. failureThreshold: 12
  43. readinessProbe:
  44. httpGet:
  45. path: /login
  46. port: 8080
  47. initialDelaySeconds: 60
  48. timeoutSeconds: 5
  49. failureThreshold: 12
  50. volumeMounts:
  51. - name: jenkins-volume
  52. subPath: jenkins-home
  53. mountPath: /var/jenkins_home
  54. volumes:
  55. - name: jenkins-volume
  56. persistentVolumeClaim:
  57. claimName: jenkins-k8s-pvc
  58. nodeName: k8s-node1

备注:

a. image:  jenkins/jenkins:2.394 通过在k8s-node1节点直接下载获取

[root@k8s-node1 ~]# docker   pull   jenkins/jenkins:2.394

 b. nodeName: k8s-node1: 本文指定部署在node1j节点

9)查看 jenkins 是否创建成功,如下所示表明创建成功

  1. [root@k8s-master ~]# kubectl get pods -n jenkins-k8s
  2. NAME READY STATUS RESTARTS AGE
  3. jenkins-5558b49ff5-dqhz5 1/1 Running 2 9h

10)把 jenkins 前端加上 service,提供外部网络访问

[root@k8s-master ~]#  kubectl apply -f jenkins-service.yaml
  1. # 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

2.3 配置 Jenkins

1)浏览器访问Jenkins页面:http://192.168.140.132:30002/

2)获取管理员密码

[root@k8s-master ~]#  cat  /data/v2/jenkins-home/secrets/initialAdminPassword

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

点击继续,出现如下界面

3)安装推荐的插件

插件安装好之后显示需要创建用户

4)创建管理员用户

点击保存并完成,出现如下界面

点击保存并完成,出现如下界面

2.4 测试Jenkins的CICD

1)在 Jenkins 中安装 kubernetes 和blueocean插件

Manage Jnekins------>插件管理------>可选插件------>搜索 kubernetes------>出现如下
 

选中 kubernetes 之后------>点击下面的直接安装------>安装之后选择重新启动 jenkins--->
http://192.168.40.180:30002/restart-->重启之后登陆 jenkins,插件即可生效
备注:blueocean插件安装流程和安装kubernetes插件一致

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

访问地址 http://192.168.140.130:30002/configureClouds/,新增一个云,在下拉菜单中选择 kubernets 并添加

3)填写kubenetes信息

kubenetes地址:https://192.168.140.130:6443

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

点击连接测试,如果显示 Connection test successful 或者Connected to Kubernetes v1.20.6,说明测试成功, Jenkins 可以和 k8s 进行通信。

 Jenkins地址:http://jenkins-service.jenkins-k8s.svc.cluster.local:8080

配置 k8s 集群的时候 jenkins 地址需要写上面域名的形式,配置之后执行如下:应用------>保存

5)配置pod template

访问地址 http://192.168.140.130:30002/configureClouds/,

 按照如下配置:

6)在上面的 pod template 下添加容器

添加容器------>Container Template------>按如下配置

备注:Docker镜像jenkins-slave-latest:v1为 docker  load   -i   jenkins-slave-latest.tar.gz获取,jenkins-slave-latest.tar.gz需要上传到工作节点。

7)在每一个 pod template 右下脚都有一个高级,点击高级,出现如下

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

8)给上面的 pod template 添加卷

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

/var/run/docker.sock
/var/run/docker.sock
/root/.kube
/home/jenkins/.kube

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

9)添加docker harbor凭证

首页------>系统管理→Manage Credentials(管理凭据) 

用户名:admin

密码:Harbor12345

ID:dockerharbor

2.5  Jenkins 部署应用发布到 k8s 开发环境、测试环境

1)在 k8s-master 的控制节点创建名称空间:

  1. [root@ks-master ~]# kubectl create ns devlopment
  2. [root@ks-master ~]# kubectl create ns qatest
  3. [root@ks-master ~]# kubectl create ns production

 2) jenkins创建任务

pipeline文件

  1. node('lmzf') {
  2. stage('Clone') {
  3. echo "1.Clone Stage"
  4. git url: "http://192.168.140.132:8001/root/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 192.168.140.132/jenkins-demo/jenkins-demo:${build_tag} ."
  15. }
  16. stage('Push') {
  17. echo "4.Push Docker Image Stage"
  18. withCredentials([usernamePassword(credentialsId: 'dockerharbor', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
  19. sh "docker login 192.168.140.132 -u ${dockerHubUser} -p ${dockerHubPassword}"
  20. sh "docker push 192.168.140.132/jenkins-demo/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-harbor.yaml"
  26. sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev-harbor.yaml"
  27. // sh "bash running-devlopment.sh"
  28. sh "kubectl apply -f k8s-dev-harbor.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-harbor.yaml"
  45. sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa-harbor.yaml"
  46. // sh "bash running-qa.sh"
  47. sh "kubectl apply -f k8s-qa-harbor.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-harbor.yaml"
  69. sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod-harbor.yaml"
  70. // sh "bash running-production.sh"
  71. sh "cat k8s-prod-harbor.yaml"
  72. sh "kubectl apply -f k8s-prod-harbor.yaml --record --validate=false"
  73. }
  74. }
  75. }

3)立即构建--->点击左下角进度条---->Console Output

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

闽ICP备14008679号