目录[-]
在 Kubenetes 环境下所起的应用都是一个个 Docker 镜像,为了保证应用重启的情况下数据安全,所以需要将 Jenkins 持久化到存储中。这里用的是 NFS 网路存储,方便在 Kubernetes 环境下应用启动节点转义数据一致。当然也可以选择存储到本地,但是为了保证应用数据一致,需要设置 Jenkins 固定到某一 Kubernetes 节点。
详情请看 CentOS7 搭建 nfs 服务器 ,这里不过多叙述。
如果不能直接操作 NFS 服务端创建文件夹,需要知道 NFS 服务器地址,然后将其挂在到本地目录,进入其中创建 Jenkins 目录空间。
(1)、挂载 NFS
mount -o vers=4.1 192.168.2.11:/nfs/ /nfs
(2)、创建 Jenkins 存储文件夹
mkdir -p /nfs/data/jenkins
创建 PV 绑定 NFS 创建的 Jenkins 目录,然后创建 PVC 绑定这个 PV,将此 PVC 用于后面创建 Jenkins 服务时挂载的存储。
(1)、jenkins-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
mountOptions: #NFS挂在选项
- hard
- nfsvers=4.1
nfs: #NFS设置
path: /nfs/data/jenkins
server: 192.168.2.11
(2)、创建 PV 命令
$ kubectl create -f jenkins-pv.yaml
(1)、jenkins-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins
namespace: mydlqcloud #PV是全局的,而PVC是跟namespace绑定的,所以需要指定namespace
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
selector:
name: jenkins
(2)、创建 PVC 命令
$ kubectl create -f jenkins-pvc.yaml
此 kubernetes 集群用的是 RBAC 安全插件,必须创建权限给一个 ServiceAccount,然后将此 ServiceAccount 绑定到 Jenkins 服务,这样赋予 Jenkins 服务一定权限执行一些操作。
(1)、jenkins-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin #ServiceAccount名
namespace: mydlqcloud #指定namespace
labels:
name: jenkins
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
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
这里将 cluster-admin 绑定到 ServiceAccount 以保证 Jenkins 能拥有一定的权限。
(2)、创建 RBAC 命令
$ kubectl create -f jenkins-rbac.yaml
这里开始部署 Jenkins 服务,创建 Service 与 Deployment,其中 Service 暴露两个接口 80880 与 50000。而 Deployment 里面要注意的是要设置上面创建的 ServiceAccount ,并且设置容器安全策略为“runAsUser: 0”以 Root 权限运行容器,而且暴露8080、50000两个端口。
(1)、jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: mydlqcloud #指定namespace
labels:
name: jenkins
spec:
type: NodePort
ports:
- name: http
port: 8080 #服务端口
targetPort: 8080
nodePort: 32001
- name: jnlp
port: 50000 #代理端口
targetPort: 50000
nodePort: 32002
selector:
name: jenkins
(2)、创建 RBAC 命令
$ kubectl create -f jenkins-service.yaml
(1)、jenkins-deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: jenkins
namespace: mydlqcloud #指定namespace
spec:
replicas: 1
template:
metadata:
labels:
name: jenkins
spec:
serviceAccountName: jenkins-admin
containers:
- name: jenkins
image: registry.cn-shanghai.aliyuncs.com/mydlq/jenkins:2.172
securityContext:
runAsUser: 0 #设置以ROOT用户运行容器
privileged: true #拥有特权
ports:
- name: http
containerPort: 8080
- name: jnlp
containerPort: 50000
resources:
limits:
memory: 2Gi
cpu: "1200m"
requests:
memory: 1Gi
cpu: "1000m"
env:
- name: "JAVA_OPTS" #设置变量,指定时区和 jenkins slave 执行者设置
value: "
-Duser.timezone=Asia/Shanghai
-Dhudson.slaves.NodeProvisioner.initialDelay=0
-Dhudson.slaves.NodeProvisioner.MARGIN=50
-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
"
- name: "JENKINS_OPTS"
value: "--prefix=/jenkins" #设置路径前缀加上 Jenkins
volumeMounts: #设置要挂在的目录
- name: data
mountPath: /var/jenkins_home
volumes:
- name: data
persistentVolumeClaim:
claimName: jenkins #设置PVC
参数说明:
默认情况下,Jenkins生成代理是保守的。例如,如果队列中有两个构建,它不会立即生成两个执行器。它将生成一个执行器,并等待某个时间释放第一个执行器,然后再决定生成第二个执行器。Jenkins确保它生成的每个执行器都得到了最大限度的利用。如果你想覆盖这个行为,并生成一个执行器为每个构建队列立即不等待,所以使用这些标志在Jenkins启动:
(2)、创建 RBAC 命令
$ kubectl create -f jenkins-deployment.yaml
在安装 Jenkins 时候,它默认生成一段随机字符串,用于安装验证。这里访问它的安装日志,获取它生成的 Token 字符串。
(1)、查看 Jenkins Pod 启动日志
kubectl log $(kubectl get pods -n mydlqcloud | awk '{print $1}' | grep jenkins) -n mydlqcloud
这里“-n”指的是要 namespace,后面跟的 namespace 请替换成你jenkins 启动的 namespace
(2)、查看日志中生成的 Token 字符串
查看日志,默认给的token为:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
3b3e0dda9d6746358ade987775f924ef
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
输入集群地址和 Jenkins Service 提供的 NodePort 端口,访问 Jenkins 进行安装步骤,可以按下一步步执行:
输入集群地址和上面设置的Nodeport方式的端口 32001,然后输入上面获取的 Token 字符串。例如,本人的集群IP为 192.168.2.11 ,所以就可以访问 http://192.168.2.11:32001/jenkins ,进入后可以看到下面的界面。
选择自定义插件来进行安装
安装一些常用的插件,这里可以选择一下,推荐安装下面插件。
确定后可以看到正在安装插件界面
然后进入 Jenkins 界面
如果 Jenkins 安装插件失败,则可以按一下设置
PS:上面地址替换成你们的集群地址及端口。