目录[-]
- . 一、Kubernetes 部署 Jenkins
- . 1、NFS 存储卷创建 Jenkins 目录
- . 2、创建 Jenkins 用于存储的 PV、PVC
- . 3、创建 ServiceAccount & ClusterRoleBinding
- . 4、创建 Service & Deployment
- . 5、获取 Jenkins 生成的 Token
- . 6、启动 Jenkins 进行初始化
- . 二、Jenkins 安装相关插件
- . 三、配置相关凭据
- . 1、添加 Git 认证凭据
- . 2、添加 Kubernetes Token 凭据
- . 3、添加 Docker 仓库认证凭据
- . 四、Jenkins 配置 Kubernetes 插件
- . 1、Kubernetes Plugin 基本配置
- . 2、Kubernetes 插件 Pod 模板配置
- . 3、Kubernetes 插件 Container 配置
- . 4、Container 存储挂载配置
- . 五、创建相关文件
- . 1、新增 Maven 配置文件
- . 2、新增 Dockerfile 文件
- . 3、新增 Kubernetes 部署文件
- . 六、如何写流水线脚本和使用插件
- . 1、脚本中设置全局超时时间
- . 2、脚本中使用 Git 插件
- . 3、脚本中使用 Kubernetes 插件
- . 4、脚本中使用 Docker 镜像
- . 5、脚本中引入 Jenkins 中预先存储的文件
- . 6、脚本创建文件
- . 7、脚本中使用 Http Rrequest 插件
- . 8、脚本中使用 Kubernetes Cli 插件
- . 9、脚本中操作字符串替换值
- . 10、脚本中读取 pom.xml 参数
- . 11、脚本中使用 Docker 插件构建与推送镜像
- . 七、在 Jenkins 创建模板任务
- . 1、创建 Pipeline 任务
- . 2、配置项目构建基本参数
- . 3、配置 Git 变量
- . 4、配置 Maven 变量
- . 5、配置 Docker 变量
- . 6、配置 Kubernetes 变量
- . 7、配置 HTTP 变量
- . 八、创建 Pipeline 脚本
- . 1、脚本中使用 Kubernetes 插件及设置超时时间
- . 2、脚本中 Git 拉取项目阶段
- . 3、脚本中 Maven 编译项目阶段
- . 4、脚本中读取 pom.xml 参数阶段
- . 5、脚本中 Docker 镜像构建与推送模块
- . 6、Kubernetes 模块
- . 7、HTTP 健康检查模块
- . 8、完整脚本
- . 九、创建任务从模板任务复制配置
- . 1、创建新的 Job 并复制模板项目配置
- . 2、修改新建 Job 的部分配置项
- . 十、执行 pipeline 任务进行测试
系统环境:
- Jenkins 版本:2.199
- Kubernetes 版本:1.15.3
参考地址:
- Jenkins 官方网址
- Jenkins Github 网址
- Jenkins Kubernetes 插件 Github 网址
- 示例的配置与部署文件的 Github 地址:https://github.com/my-dlq/blog-example/tree/master/jenkins/jenkins-ci&cd
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 启动日志