首页 > 代码库 > [系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源

[系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源

基于kubernetes 部署 jenkins master 比较简单,难点是为 jenkins 动态分配资源。基于kubernetes 为 jenkins 动态分配资源需要实现下述功能:

  1. 资源分配:jenkins 根据任务属性自动创建临时 docker 容器,并作为 slave 节点加入 jenkins 集群,实现资源的分配;
  2. 资源释放:任务执行结束后,jenkins 自动删除相关节点,并销毁相关 docker 容器,实现资源的释放;

整个资源分配和资源释放过程对用户来说是透明的,用户只需要创建好任务就可以了,不需要操作节点;对于jenkins来说,slave 节点(容器)是临时的,任务一结束就会销毁。

为了实现数据持久化,建议把需要持久化的数据挂载到 NFS 或 glusterfs卷上。 

1. 准备 docker 镜像

#jenkins master

jenkins:2.7.2

#jenkins slave

jenkinsci/jnlp-slave:2.52

2. 部署 jenkins master

分别部署 controller, service, ingress,controller 控制 master 容器,ingress 提供用户访问入口。

 1 kind: Deployment 2 metadata: 3   name: jenkins 4 spec: 5   replicas: 1 6   strategy: 7     type: RollingUpdate 8     rollingUpdate: 9       maxSurge: 210       maxUnavailable: 011   template:12     metadata:13       labels:14         app: jenkins15     spec:16       imagePullSecrets:17       - name: myregistrykey18       containers:19       - name: jenkins20         image: registry.gkkxd.com/jenkins:2.7.221         imagePullPolicy: IfNotPresent22         ports:23         - containerPort: 808024           name: web25           protocol: TCP26         - containerPort: 5000027           name: agent28           protocol: TCP29         volumeMounts:30         - name: jenkinshome31           mountPath: /var/jenkins_home32         env:33         - name: JAVA_OPTS34           value: "-Duser.timezone=Asia/Shanghai"35       volumes:36       - name: jenkinshome37         nfs:38           server: 172.31.17.7439           path: "/var/nfsshare/k8s/jenkins/home"
 1 kind: Service 2 apiVersion: v1 3 metadata: 4   labels: 5       app: jenkins 6   name: jenkins 7 spec: 8   ports: 9   - port: 808010     targetPort: 808011     name: web12   - port: 5000013     targetPort: 5000014     name: agent15   selector:16     app: jenkins
 1 kind: Ingress 2 metadata: 3   name: jenkins 4 spec: 5   tls: 6   - hosts: 7     - jenkins.gkkxd.com 8     secretName: jenkins-secret 9   rules:10   - host: jenkins.gkkxd.com11     http:12       paths:13       - backend:14           serviceName: jenkins15           servicePort: 808016         path: /

3. 安装 jenkins Kubernetes 插件

登录 jenkins master,根据页面提示,输入 /home/jenkins_home/下的密钥文件里的密钥,进入插件安装界面,选择 Kubernetes Plugin 安装。

4. 创建 jenkins Kubernetes 云

jenkins-系统管理-系统设置-云-Kubernetes:

Name: k8s_cluster
Kubernetes URL: https://kubernetes.default
Kubernetes Namespace: default
Jenkins URL: http://jenkins.default:8080

images - Kubernetes Pod Template:
Name: jnlp-slave
Labels: jnlp-slave
Docker image: registry.gkkxd.com/jenkinsci/jnlp-slave:2.52
Jenkins slave root directory: /home/jenkins

技术分享

5. 查看无任务状态

5.1 jenkins 

节点中只有一个master,没有 slave节点

技术分享

5.2 kubernetes

只有 jenkins master pod

技术分享

6. 创建测试任务

该任务选择标签为 jnlp-slave 的镜像作为执行任务的容器的镜像,构建动作是 ping www.baidu.com 

技术分享

建好后执行该任务

7. 查看任务执行状态

7.1 jenkins

jenkins 自动创建了一个slave节点

技术分享

7.2 kubernetes

kubernetes pod中多出一个jnlp-slave-开头的pod

技术分享

8. 结束任务

结束任务后,刚才看到的slave 节点被自动删除,在kubernetes 中的 jnlp-slave 开头的 pod 也消失了。

[系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源