在kubernetes环境中部署jenkins,jenkins在持续集成中用的是最多的,但是这里把jenkins部署到kubernetes中的目的是为了在多服务下的一个资源节约,举个例子,我的环境里有一千个服务,然后根据三个环境需要在jenkins里配置三千个job,但是在多个服务部署的时候,如果我的jenkins配置较低就会影响到发布时间,但是我把jenkins部署到kubernetes中,根据kubernetes的伸缩性,当需要发布job时,只需要调度jenkins集群,启动pod即可,发布成功后jenkins的pod在资源回收,不但节约资源,还能多任务同时运行。
因为jenkins中的配置数据是不允许丢失的,所以我们这里使用nfs挂载,把jenkins中的数据保存到nfs中,这样就能避免jenkins重启数据丢失的问题了,可以参考:https://www.wulaoer.org/?p=2714,这里已经做好了nfs并且加入到集群中,下面开始部署jenkins集群。
创建jenkins-pvc
前面已经介绍了pv和pvc,这里我们需要先创建个pv,然后在创建pvc
[root@Mater ~]# cat  >jenkins-k8s-pv.yaml<<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-k8s-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-storage   
EOF
[root@Mater ~]# cat  >jenkins-k8s-pvc.yaml<<EOF
kind: PersistentVolumeClaim         #创建PVC资源
apiVersion: v1
metadata:
  name: jenkins-k8s-pvc       #PVC的名称
spec:
  accessModes:            #定义对PV的访问模式,代表PV可以被多个PVC以读写模式挂载
    - ReadWriteMany
  resources:              #定义PVC资源的参数
    requests:             #设置具体资源需求
      storage: 20Gi      #表示申请200MI的空间资源
  storageClassName: nfs-storage          #指定存储类的名称,就指定上面创建的那个存储类。
EOF
[root@Mater ~]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                     STORAGECLASS   REASON   AGE
pvc-18f238d8-c2ab-4c0a-918c-3bf5d654fd1a   20Gi       RWX            Delete           Bound    default/jenkins-k8s-pvc   nfs-storage             40m
pvc-29c5e68b-abd4-4822-a338-440b9e66421e   200Mi      RWX            Delete           Bound    default/nginx-pvc         nfs-storage             3d21h
[root@Mater ~]# kubectl get pvc
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
jenkins-k8s-pvc   Bound    pvc-18f238d8-c2ab-4c0a-918c-3bf5d654fd1a   20Gi       RWX            nfs-storage    40m
nginx-pvc         Bound    pvc-29c5e68b-abd4-4822-a338-440b9e66421e   200Mi      RWX            nfs-storage    3d21h
sa授权
创建完pv和pvc,就可以把jenkins中的master挂载到我们创建的pvc上了,但是创建jenkins之前需要进行授权。这里我使用的是默认命名空间,如果自己想创建指定的命名空间,需要指定一下即可。
[root@Mater ~]# kubectl create sa jenkins-k8s-sa [root@Mater ~]# kubectl create clusterrolebinding jenkins-k8s-sa-cluster --clusterrole=cluster-admin --serviceaccount=default:jenkins-k8s-sa #注意default是默认命名空间,如果想加命名空间需要把default修改后,在jenkins-k8s-sa-cluster后在加一个-n 命名空间 #如果加错了可以直接删除重新添加即可 [root@Mater ~]# kubectl delete clusterrolebinding jenkins-k8s-sa-cluster clusterrolebinding.rbac.authorization.k8s.io "jenkins-k8s-sa-cluster" deleted
创建jenkins
这里需要注意的是,如果你使用的不是默认命名空间需要特别注明。还有就是上面创建的pvc名称。
[root@Mater ~]# cat jenkins-deploy.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins-k8s-sa
      containers:
      - name: jenkins
        image: jenkins/jenkins:2.328
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
        - containerPort: 50000
          name: agent
          protocol: TCP
        resources:
          limits:
            cpu: 1000m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /login
            port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 5
          failureThreshold: 12
        readinessProbe:
          httpGet:
            path: /login
            port: 8080
          initialDelaySeconds: 60
          timeoutSeconds: 5
          failureThreshold: 12
        volumeMounts:
        - name: jenkins-volume
          subPath: jenkins-home
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins-volume
        persistentVolumeClaim:
          claimName: jenkins-k8s-pvc
[root@Mater ~]# kubectl apply -f jenkins-deploy.yaml
deployment.apps/jenkins created
创建了jenkins的pod,为了方便直接访问,我们需要给jenkins加一个nodeport,方便直接访问。
[root@Mater ~]# cat jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  type: NodePort
  ports:
  - name: web
    port: 8080
    targetPort: web
    nodePort: 30002
  - name: agent
    port: 50000
    targetPort: agent
[root@Mater ~]# kubectl get svc
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                          AGE
jenkins-service   NodePort    10.102.54.88   <none>        8080:30002/TCP,50000:30254/TCP   51m
kubernetes        ClusterIP   10.96.0.1      <none>        443/TCP                          65d
创建后,就会在nfs中创建文件,这个时候需要稍等一下,jenkins创建成功后,在nfs文件中找到jenkins的挂载目录。
[root@wulaoer.org ~]# cd /nfs/data/default-jenkins-k8s-pvc-pvc-18f238d8-c2ab-4c0a-918c-3bf5d654fd1a/jenkins-home/secrets/ [root@wulaoer.org secrets]# cat initialAdminPassword 74eb0f94edfd4a04935c734c84d3c266
安装成功后,我们需要安装kubernetes插件,让jenkins连接kubernetes后,能够配置pod模版,让jenkins自动创建pod,安装后需要重启。这里还需要安装一下Blue Ocean,方便后期管理job流水线。
jenkins配置连接kubernetes
登录jenkins后,在【系统管理】---【系统配置】最后一行有一个【Cloud】
选择kubernetes,然后保存。
先配置kubernetes,这里要注意如果不是默认的命名空间,一定要和sa中设置的一样。
测试通过,保存并应用即可。并把jenkins的地址添加一下即可。
配置容器
因为slave中需要用到docker,需要这里使用的是宿主机的,利用卷进行挂载。
到此,jenkins集群部署到kubernetes配置完成了,下面就创建一个job,测试一下,是否会在job构建时,起一个新的pod,并且在构建成功后,pod自动回收,这样环境就是我们需要的了。
创建job
我这里为了简单,就直接执行一个shell命令,不会的可以看看pipeline的使用方法,后期有时间也会单独写一章关于pipeline是如何使用的。我这里创建了一个test job,只执行这段即可。其他的都不做配置,我这里创建的是流水线。
node('testhan') {
//node()不写,不会指定jenkins标签的节点
    sh 'sleep 200'
}
这里的testhan是我构建slave的pod标签,一定要和设置的一样,要不执行不了。创建成功后我多执行几个。
这里是创建job时增加的节点,也就是新创建的pod。
[root@Mater ~]# kubectl get pod NAME READY STATUS RESTARTS AGE centos7 1/1 Running 5 (5h25m ago) 37d jenkins-cdf9869f6-mmgm7 1/1 Running 0 3h6m nfs-client-provisioner-7949fd6786-8wszc 1/1 Running 173 (77m ago) 3d23h redis-leader-d6b84c8c5-gwqbm 1/1 Running 3 (5h25m ago) 9d test-6l8dm 2/2 Running 0 2m1s test-7319x 0/2 ContainerCreating 0 29s test-h4ws2 2/2 Running 0 30s test-kq8h3 2/2 Running 0 48s test-nc6p5 2/2 Running 0 3m27s test-xs7ts 0/2 Pending 0 18s test-z54s7 2/2 Running 0 58s [root@Mater ~]# kubectl get pod --show-labels | grep testhan test-sdnn3 2/2 Running 0 9s jenkins/label-digest=ea530a482329fd24c70bf97789d7079206c561d3,jenkins/label=testhan,jenkins=slave
前面设置的标签是pod的标签不是node节点的标签,这个标签是可以随意定义的,至此,jenkins的集群构建方法测试结束,这里说明一下test开头的pod不需要在意,这个是在设置的时候定义的,也可以进行修改,但是在pipeline中定义的项目打包等等操作都是在pipeline里定义好,然后在test开头的pod中执行的,也可以映射pod的yaml文件并上传到指定的仓库中,然后在拉取仓库中的yaml文件并执行,也可以在项目中写好yaml的模版用脚本映射即可,这个根据自己的环境定义。没有了,看看其他的吧。











您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏