Kubernetes部署Jenkins实现CI/CD

小柒博客 评论8982字数 1222阅读4分4秒阅读模式

一、系统环境

IP

角色

主机名

Pod

192.168.2.198

Master

k8s-master1

192.168.2.199

Master

k8s-master2

192.168.2.200

Master

k8s-master3

192.168.2.195

Node

k8s-node1

Jenkins

192.168.2.196

Node

k8s-node2

Jenkins

192.168.2.197

Node

k8s-node3

Jenkins

192.168.2.201

NFS

k8s-nfs

注:本教程使用kubernetes v1.27.6版本,其他版本请自行测试。

二、部署NFS

1、安装NFS

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

2、创建共享目录

[root@k8s-nfs ~]# mkdir -p /data/jenkins

3、配置exports

[root@k8s-nfs ~]# cat >>/etc/exports <<EOF

/data/jenkins 192.168.2.0/24(rw,no_root_squash,no_all_squash,sync)

EOF

4、启动rpcbind、nfs服务

[root@k8s-nfs ~]# systemctl start rpcbind

[root@k8s-nfs ~]# systemctl start nfs

[root@k8s-nfs ~]# systemctl enable rpcbind

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

5、查看共享目录

[root@k8s-nfs ~]# showmount -e 192.168.2.201

Export list for 192.168.2.201:

/data/jenkins 192.168.2.0/24

三、创建StorageClass、Namespace

1、创建StorageClass

[root@k8s-master1 ~]# mkdir kube-devops && cd kube-devops

[root@k8s-master1 kube-devops]# vim kube-devops-storageclass.yaml

  1. kind: StorageClass
  2. apiVersion: storage.k8s.io/v1
  3. metadata:
  4. name: devops-storage
  5. provisioner: kubernetes.io/no-provisioner
  6. volumeBindingMode: WaitForFirstConsumer

[root@k8s-master1 kube-devops]# kubectl apply -f kube-devops-storageclass.yaml

storageclass.storage.k8s.io/devops-storage created

2、创建Namespace

[root@k8s-master1 kube-devops]# vim kube-devops-namespace.yaml

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: kube-devops
  5. labels:
  6. app: devops

[root@k8s-master1 kube-devops]# kubectl apply -f kube-devops-namespace.yaml

namespace/kube-devops created

3、Node节点安装nfs-utils

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

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

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

四、部署Jenkins

1、创建PV、PVC

[root@k8s-master1 kube-devops]# vim kube-devops-nfs.yaml

  1. ---
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5. name: jenkins-pv
  6. spec:
  7. capacity:
  8. storage: 5Gi
  9. accessModes:
  10. - ReadWriteMany
  11. persistentVolumeReclaimPolicy: Delete
  12. nfs:
  13. server: 192.168.2.201
  14. path: /data/jenkins
  15. ---
  16. apiVersion: v1
  17. kind: PersistentVolumeClaim
  18. metadata:
  19. name: jenkins-pvc
  20. namespace: kube-devops
  21. spec:
  22. accessModes:
  23. - ReadWriteMany
  24. resources:
  25. requests:
  26. storage: 5Gi

[root@k8s-master1 kube-devops]# kubectl apply -f kube-devops-nfs.yaml

persistentvolume/jenkins-pv unchanged

persistentvolumeclaim/jenkins-pvc created

2、创建角色授权

[root@k8s-master1 kube-devops]# vim kube-devops-rbac.yaml

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: jenkins-admin
  5. namespace: kube-devops
  6. labels:
  7. name: jenkins
  8. ---
  9. kind: ClusterRoleBinding
  10. apiVersion: rbac.authorization.k8s.io/v1
  11. metadata:
  12. name: jenkins-admin
  13. labels:
  14. name: jenkins
  15. subjects:
  16. - kind: ServiceAccount
  17. name: jenkins-admin
  18. namespace: kube-devops
  19. roleRef:
  20. kind: ClusterRole
  21. name: cluster-admin
  22. apiGroup: rbac.authorization.k8s.io

[root@k8s-master1 kube-devops]# kubectl apply -f kube-devops-rbac.yaml

serviceaccount/jenkins-admin created

clusterrolebinding.rbac.authorization.k8s.io/jenkins-admin created

3、创建Deployment

[root@k8s-master1 kube-devops]# vim kube-devops-deployment.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: jenkins
  5. namespace: kube-devops
  6. labels:
  7. app: jenkins
  8. spec:
  9. selector:
  10. matchLabels:
  11. app: jenkins
  12. replicas: 1
  13. template:
  14. metadata:
  15. labels:
  16. app: jenkins
  17. spec:
  18. serviceAccountName: jenkins-admin
  19. containers:
  20. - name: jenkins
  21. image: jenkins/jenkins:lts
  22. securityContext:
  23. runAsUser: 0
  24. privileged: true
  25. ports:
  26. - name: http
  27. containerPort: 8080
  28. - name: jnlp
  29. containerPort: 50000
  30. resources:
  31. limits:
  32. memory: 2Gi
  33. cpu: "1000m"
  34. requests:
  35. memory: 1Gi
  36. cpu: "500m"
  37. env:
  38. - name: LIMITS_MEMORY
  39. valueFrom:
  40. resourceFieldRef:
  41. resource: limits.memory
  42. divisor: 1Mi
  43. - name: "JAVA_OPTS"
  44. value: "
  45. -Xmx$(LIMITS_MEMORY)m
  46. -XshowSettings:vm
  47. -Dhudson.slaves.NodeProvisioner.initialDelay=0
  48. -Dhudson.slaves.NodeProvisioner.MARGIN=50
  49. -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
  50. -Duser.timezone=Asia/Shanghai
  51. "
  52. volumeMounts:
  53. - name: data
  54. mountPath: /var/jenkins_home
  55. volumes:
  56. - name: data
  57. persistentVolumeClaim:
  58. claimName: jenkins-pvc

[root@k8s-master1 kube-devops]# kubectl apply -f kube-devops-deployment.yaml

deployment.apps/jenkins created

4、创建Service

[root@k8s-master1 kube-devops]# vim kube-devops-service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: jenkins
  5. namespace: kube-devops
  6. labels:
  7. app: jenkins
  8. spec:
  9. type: NodePort
  10. ports:
  11. - name: http
  12. port: 8080
  13. targetPort: 8080
  14. nodePort: 32001
  15. - name: jnlp
  16. port: 50000
  17. targetPort: 50000
  18. nodePort: 32002
  19. selector:
  20. app: jenkins

[root@k8s-master1 kube-devops]# kubectl apply -f kube-devops-service.yaml

service/jenkins created

5、查看Pod和Service

[root@k8s-master1 kube-devops]# kubectl get pod,svc -n kube-devops

Kubernetes部署Jenkins实现CI/CD-图片1

6、访问Jenkins

1)浏览器输入http://192.168.2.198:32001,如下图所示

2)获取Jenkins初始化生成密码

[root@k8s-master1 kube-devops]# kubectl logs -n kube-devops jenkins-6dd7dddb8-kkgr9

3)登录Jenkins

4)安装推荐插件

5)使用admin登录

6)实例配置

7)进入Jenkins界面

8)修改密码

9)重启Jenkins加载中文插件

# 浏览器输入http://192.168.2.198:32001,如下图所示

10)使用新密码重新登录Jenkins

五、部署CI/CD

# 这里采用脚本部署,也可以在Jenkins上安装Kubernetes插件

1、Pipeline简介

Pipeline,简单来说,就是一套运行在Jenkins上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。

Jenkins Pipeline有几个核心概念:

  • Node:节点,一个Node就是一个Jenkins节点,Master或者Agent,是执行Step的具体运行环境,比如我们之前动态运行的Jenkins Slave就是一个Node节点
  • Stage:阶段,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作,比如:Build、Test、Deploy,Stage 是一个逻辑分组的概念,可以跨多个Node
  • Step:步骤,Step是最基本的操作单元,可以是打印一句话,也可以是构建一个Docker镜像,由各类Jenkins插件提供,比如命令:sh 'make',就相当于我们平时shell终端中执行make命令一样。

Pipeline的使用:

  • Pipeline脚本是由Groovy语言实现的
  • Pipeline支持两种语法:Declarative(声明式)和Scripted Pipeline(脚本式)语法
  • Pipeline也有两种创建方法:可以直接在Jenkins的Web UI界面中输入脚本;也可以通过创建一个Jenkinsfile脚本文件放入项目源码库中
  • 一般我们都推荐在Jenkins中直接从源代码控制(SCMD)中直接载入 Jenkinsfile Pipeline这种方法
2、创建Pipeline任务


脚本内容:

  1. node {
  2. stage('Clone') {
  3. echo "1.Clone Stage"
  4. }
  5. stage('Test') {
  6. echo "2.Test Stage"
  7. }
  8. stage('Build') {
  9. echo "3.Build Stage"
  10. }
  11. stage('Deploy') {
  12. echo "4. Deploy Stage"
  13. }
  14. }
3、执行Pipeline任务

# 构建结果,如下图

4、部署完整应用

部署应用的流程如下:

1)拉取代码

2)编译打包

3)编写Dockerfile

4)构建Docker镜像

5)推送Docker镜像到镜像仓库

6)编写Kubernetes YAML文件

7)更改yaml文件中Docker镜像tag号

8)执行kubectl工具部署应用

9)测试人员验证

10)完整应用部署流程,如下图所示

Kubernetes部署Jenkins实现CI/CD-图片2

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
微信号已复制
微信公众号
微信扫一扫,关注我!
weinxin
公众号已复制
小柒博客
  • 本文由 小柒博客 发表于 2023年10月14日 15:49:05
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/9770.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证
加载中...