Jenkins 与 Kubernetes 的 CI 与 CD & Git + Maven + Docker+Kubectl

本文详细介绍了如何在Kubernetes上部署Jenkins,包括NFS存储卷的配置、ServiceAccount与ClusterRoleBinding的创建、Service与Deployment的设置,以及获取Jenkins Token。接着,文章讨论了Jenkins中所需插件的安装,如Git、Docker、Kubernetes插件等,并配置了相关凭据。此外,文章还涵盖了如何编写Pipeline脚本,使用各种插件,创建模板任务,以及如何从模板任务复制配置。最后,文章通过创建并执行Pipeline任务进行了测试,验证了整个CI/CD流程的可行性。
摘要由CSDN通过智能技术生成

目录[-]


系统环境:

  • Jenkins 版本:2.199
  • Kubernetes 版本:1.15.3

参考地址:

CI/CD 流程图:

 

整个流程:

  • (1)、介绍了如何在 Kubernetes 部署 Jenkins。
  • (2)、介绍 Jenkins 中需要安装什么相关插件。
  • (3)、配置凭据,例如 Docker 仓库凭据、K8S 连接凭据、Git 认证凭据。
  • (4)、在 Jenkins 中存储执行流水线过程中的脚本,例如 Docker 的 Dockerfile、Maven 的 Settings.xml。
  • (5)、简介描述了如何写 “脚本式” 的流水线脚本,以及脚本中如何使用各种常用插件。
  • (6)、创建一个用于当做模板的 Job,对其进行一些参数化构建变量配置,方便后续全部的 Job 通过复制该模板 Job 来新建。
  • (7)、写流水线脚本,将分为 Git、Maven、Docker、Kubectl、Http 等几个阶段。写完脚本后放置到上面创建模板 Job 的脚本框框中。
  • (8)、通过复制模板 Job 来新创建用于测试的项目 Job,并且修改其中从模板 Job 复制过来的变量的参数,将其改成适用于该测试项目的参数值。
  • (9)、执行上面创建的测试项目的 Job,观察它是否能够正常执行完整个脚本,并且结果为成功。

一、Kubernetes 部署 Jenkins

下面是以 NFS 为存储卷的示例,将在 NFS 存储卷上创建 Jenkins 目录,然后创建 NFS 类型的 PV、PVC。

1、NFS 存储卷创建 Jenkins 目录

进入 NFS Server 服务器,然后再其存储目录下创建 Jenkins 目录,并且确保目录对其它用户有读写权限。

$ mkdir /nfs/data/jenkins

2、创建 Jenkins 用于存储的 PV、PVC

创建 Kubernetes 的 PV、PVC 资源,其中 PV 用于与 NFS 关联,需要设置 NFS Server 服务器地址和挂载的路径,修改占用空间大小。而 PVC 则是与应用关联,方便应用与 NFS 绑定挂载,下面是 PV、PVC 的资源对象 yaml 文件。

jenkins-storage.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins
  labels:
    app: jenkins
spec:
  capacity:          
    storage: 50Gi
  accessModes:       
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain  
  mountOptions:         #NFS挂载选项
    - hard
    - nfsvers=4.1    
  nfs:                  #NFS设置
    path: /nfs/data/jenkins   
    server: 192.168.2.11
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi     #存储空间大小
  selector:
    matchLabels:
      app: jenkins

将 PV 与 PVC 部署到 Kubernetes 中:

  • -n:指定 namespace
$ kubectl apply -f jenkins-storage.yaml -n public

3、创建 ServiceAccount & ClusterRoleBinding

Kubernetes 集群一般情况下都默认开启了 RBAC 权限,所以需要创建一个角色和服务账户,设置角色拥有一定权限,然后将角色与 ServiceAccount 绑定,最后将 ServiceAccount 与 Jenkins 绑定,这样来赋予 Jenkins 一定的权限,使其能够执行一些需要权限才能进行的操作。这里为了方便,将 cluster-admin 绑定到 ServiceAccount 来保证 Jenkins 拥有足够的权限。

  • 注意: 请修改下面的 Namespace 参数,改成部署的 Jenkins 所在的 Namespace。

jenkins-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-admin       #ServiceAccount名
  namespace: mydlqcloud     #指定namespace,一定要修改成你自己的namespace
  labels:
    name: jenkins
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins-admin
  labels:
    name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins-admin
    namespace: mydlqcloud
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

将 Jenkins 的 RBAC 部署到 Kubernetes 中:

  • -n:指定 namespace
$ kubectl apply -f jenkins-rbac.yaml -n public

4、创建 Service & Deployment

在 Kubernetes 中部署服务需要部署文件,这里部署 Jenkins 需要创建 Service 与 Deployment 对象,其中两个对象需要做一些配置,如下:

  • Service:Service 暴露两个接口 8080 与 50000,其中 8080 是 Jenkins API 和 UI 的端口,而 50000 则是供代理使用的端口。
  • Deployment: Deployment 中,需要设置容器安全策略为 runAsUser: 0 赋予容器以 Root 权限运行,并且暴露 8080 与 50000 两个端口与 Service 对应,而且还要注意的是,还要设置上之前创建的服务账户 “jenkins-admin”。

jenkins-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: jenkins
  labels:
    app: jenkins
spec:
  type: NodePort
  ports:
  - name: http
    port: 8080                      #服务端口
    targetPort: 8080
    nodePort: 32001                 #NodePort方式暴露 Jenkins 端口
  - name: jnlp
    port: 50000                     #代理端口
    targetPort: 50000
    nodePort: 32002
  selector:
    app: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  labels:
    app: jenkins
spec:
  selector:
    matchLabels:
      app: jenkins
  replicas: 1
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccountName: jenkins-admin
      containers:
      - name: jenkins
        image: jenkins/jenkins:2.199
        securityContext:                     
          runAsUser: 0                      #设置以ROOT用户运行容器
          privileged: true                  #拥有特权
        ports:
        - name: http
          containerPort: 8080
        - name: jnlp
          containerPort: 50000
        resources:
          limits:
            memory: 2Gi
            cpu: "2000m"
          requests:
            memory: 2Gi
            cpu: "2000m"
        env:
        - name: LIMITS_MEMORY
          valueFrom:
            resourceFieldRef:
              resource: limits.memory
              divisor: 1Mi
        - name: "JAVA_OPTS"                 #设置变量,指定时区和 jenkins slave 执行者设置
          value: " 
                   -Xmx$(LIMITS_MEMORY)m 
                   -XshowSettings:vm 
                   -Dhudson.slaves.NodeProvisioner.initialDelay=0
                   -Dhudson.slaves.NodeProvisioner.MARGIN=50
                   -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
                   -Duser.timezone=Asia/Shanghai
                 "    
        - name: "JENKINS_OPTS"
          value: "--prefix=/jenkins"         #设置路径前缀加上 Jenkins
        volumeMounts:                        #设置要挂在的目录
        - name: data
          mountPath: /var/jenkins_home
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: jenkins                 #设置PVC

参数说明:

  • JAVA_OPTS: JVM 参数设置
  • JENKINS_OPTS: Jenkins 参数设置
  • 其它参数: 默认情况下,Jenkins 生成代理是保守的。例如,如果队列中有两个构建,它不会立即生成两个执行器。它将生成一个执行器,并等待某个时间释放第一个执行器,然后再决定生成第二个执行器。Jenkins 确保它生成的每个执行器都得到了最大限度的利用。如果你想覆盖这个行为,并生成一个执行器为每个构建队列立即不等待,所以在 Jenkins 启动时候添加这些参数:
-Dhudson.slaves.NodeProvisioner.initialDelay=0
-Dhudson.slaves.NodeProvisioner.MARGIN=50
-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85

有了上面的部署文件后,再将 Jenkins 部署到 Kuberntes 中:

  • -n:指定应用启动的 namespace
$ kubectl create -f jenkins-deployment.yaml -n mydlqcloud

5、获取 Jenkins 生成的 Token

在安装 Jenkins 时候,它默认生成一段随机字符串在控制台日志中,用于安装时验证。这里需要获取它输出在控制台中的日志信息,来获取 Token 字符串。

查看 Jenkins Pod 启动日志

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青年夏日科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值