#部署流程:
(系统:centos7.9)
一、设置存储目录
1、安装 NFS 服务端
2、挂载 NFS 并设置存储文件夹
二、创建 PV & PVC
1、准备 PV & PVC 部署文件
2、创建 PV & PVC
三、创建 ServiceAccount & ClusterRoleBinding
四、创建 Service & Deployment
1、创建 Service & Deployment 部署文件
2、部署 Jenkins
五、获取 Jenkins 生成的 Token(秘钥)
六、启动 Jenkins 进行安装
1、进入Jenkins
2、安装插件(选装)
3、设置用户名、密码
#在 Kubenetes 环境下所起的应用都是一个个 Docker 镜像,为了保证应用重启的情况下数据安全,所以需要将 Jenkins 持久化到存储中。这里用的是 NFS 网络存储,方便在 Kubernetes 环境下应用启动节点转义数据一致。当然也可以选择存储到本地,但是为了保证应用数据一致,需要设置 Jenkins 固定到某一 Kubernetes 节点。
#1,配置NFS:
[20:40:49 root@k8s-master ~]#yum install -y nfs-utils rpcbind
[20:41:02 root@k8s-master ~]#systemctl enable --now nfs rpcbind
#启动nfs
[20:42:18 root@k8s-worker-node1 ~]#systemctl enable --now nfs
[20:42:29 root@k8s-worker-node2 ~]#systemctl enable --now nfs
[20:46:51 root@k8s-master ~]#cat /etc/exports #正常只会用到这台设置了挂载点的nfs服务器,其他node节点为测试!后面需要设置PV时,ip指向这台master节点的nfs服务器!
/nfs/data/ *(rw,no_root_squash,no_all_squash,sync)
#在宿主机上创建出此目录:
[20:47:08 root@k8s-master ~]#mkdir /nfs/data/ -p
[20:43:15 root@k8s-worker-node1 ~]#mkdir /nfs/data/jenkins -p
[20:43:20 root@k8s-worker-node2 ~]#mkdir /nfs/data/jenkins -p
[20:47:25 root@k8s-master ~]#chmod 777 /nfs/data/jenkins
#重启nfs服务:
[20:48:54 root@k8s-master ~]#systemctl restart nfs rpcbind
[20:49:30 root@k8s-worker-node1 ~]#systemctl restart nfs
[20:48:43 root@k8s-worker-node2 ~]#systemctl restart nfs
[20:49:39 root@k8s-worker-node2 ~]#export -a
#查看NFS挂载点:
[20:50:45 root@k8s-worker-node2 ~]#showmount -e 10.0.0.7
Export list for 10.0.0.7:
/nfs/data/jenkins *
#二、创建 PV & PVC:
#创建好名称空间:我这边都用统一的:
[20:58:06 root@k8s-master jenkins]#cat jenkins-ns.yaml
# jenkins-namespace
---
apiVersion: v1
kind: Namespace
metadata:
name: jenkins
#创建 PV 绑定 NFS 创建的 Jenkins 目录,然后创建 PVC 绑定这个 PV,将此 PVC 用于后面创建 Jenkins 服务时挂载的存储。
#注意:一定要确保 PV 的空间大于 PVC,否则无法关联!
# jenkins-pv-pvc.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins
labels:
app: jenkins
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
mountOptions: #NFS挂在选项
- hard
- nfsvers=4.1
nfs: #NFS设置
path: /nfs/data/jenkins
server: 10.0.0.7
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi #生产环境空间一定要设置比较大点
selector:
matchLabels:
app: jenkins
#2,创建 ServiceAccount & ClusterRoleBinding:
# kubernetes 集群用的是 RBAC 安全插件,必须创建权限给一个 ServiceAccount,然后将此 ServiceAccount 绑定到 Jenkins 服务,这样赋予 Jenkins 服务一定权限执行一些操作,为了方便,这里将 cluster-admin 绑定到 ServiceAccount 以保证 Jenkins 能拥有一定的权限!
#jenkins-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin #ServiceAccount名
namespace: jenkins #指定jenkins名称空间
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: jenkins
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
#3 , 创建 Service & Deployment:
部署 Jenkins 服务,创建 Service 与 Deployment,其中 Service 暴露两个接口 8080 与 50000。而 Deployment 里面要注意的是要设置上面创建的 ServiceAccount ,并且设置容器安全策略为“runAsUser: 0”以 Root 权限运行容器,而且暴露8080、50000两个端口。
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: jenkins
labels:
app: jenkins
spec:
type: NodePort #定义为nodeport类型
ports:
- name: http
port: 8080 #服务端口
targetPort: 8080
#nodePort: 30010 #NodePort方式暴露 Jenkins 端口 ,也可以随机生成,我这边按默认
- name: jnlp
port: 50000 #代理端口
targetPort: 50000
#nodePort: 30010
selector:
app: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
labels:
app: jenkins
spec:
selector:
matchLabels:
app: jenkins
replicas: 1
template:
metadata:
labels:
app: 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: "1000m"
requests:
memory: 1Gi
cpu: "500m"
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:
#执行 Kuberctl 命令将 Jenkins 部署到 Kubernetes 集群。
[21:56:48 root@k8s-master data]#kubectl create -f /root/jenkins/
namespace/jenkins created
persistentvolume/jenkins created
persistentvolumeclaim/jenkins created
serviceaccount/jenkins-admin created
clusterrolebinding.rbac.authorization.k8s.io/jenkins-admin created
[21:57:13 root@k8s-master data]#
[21:57:14 root@k8s-master data]#
#JENKINS-DP文件需要单独执行,创建时指定名称空间:
[21:57:14 root@k8s-master data]#kubectl create -f jenkins-dp.yaml -n jenkins
deployment.apps/jenkins created
#页面访问:
http://10.0.0.17:32547/jenkins
#查看nfs共享存储目录情况:
[22:24:00 root@k8s-master data]#cd /nfs/data/jenkins/
[22:24:20 root@k8s-master jenkins]#ls
atomic4065258995463397507tmp identity.key.enc logs queue.xml.bak updates
config.xml jenkins.install.UpgradeWizard.state nodeMonitors.xml secret.key userContent
copy_reference_file.log jenkins.telemetry.Correlator.xml nodes secret.key.not-so-secret users
hudson.model.UpdateCenter.xml jobs plugins secrets war
#看看pvc有没有绑定到pv上面
[22:30:55 root@k8s-master jenkins]#kubectl get pvc -n jenkins
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
jenkins Bound jenkins 10Gi RWO 15m
#因为我们做了NFS共享存储,我们在文件中定义了pvc 且pvc绑定了pv ,而我们pv持久化存储定义的存储路径就是我们nfs共享存储的挂载点。所以我们直接看nfs挂载点目录即可查看到jenkins入口秘钥!
[22:43:45 root@k8s-master jenkins]#ls
atomic4065258995463397507tmp identity.key.enc logs queue.xml.bak updates
config.xml jenkins.install.UpgradeWizard.state nodeMonitors.xml secret.key userContent
copy_reference_file.log jenkins.telemetry.Correlator.xml nodes secret.key.not-so-secret users
hudson.model.UpdateCenter.xml jobs plugins secrets war
#进入secrets目录查看:
[22:43:46 root@k8s-master jenkins]#cd secrets/
[22:47:15 root@k8s-master secrets]#ls
filepath-filters.d master.key whitelisted-callables.d
initialAdminPassword org.jenkinsci.main.modules.instance_identity.InstanceIdentity.KEY
jenkins.model.Jenkins.crumbSalt slave-to-master-security-kill-switch
[22:47:16 root@k8s-master secrets]#cat initialAdminPassword
fee256ceb1804c8896530e96e81b385e #JENKINS入口秘钥
#拿秘钥填进去即可
#完成:
#至此k8s基于nfs(pv+pvc)搭建jenkins部署完成,后续可以改进使用ingress部署,用域名访问!
[22:49:51 root@k8s-master secrets]#kubectl explain ingress
KIND: Ingress
VERSION: extensions/v1beta1
标签:PV,name,kubernetes,PVC,nfs,master,jenkins,k8s,root From: https://www.cnblogs.com/zeng666/p/16633318.html