每一年都奔走在自己de热爱里

愿你天黑有灯,下雨有伞

k8s(kubernetes)基于(NFS+PV+PVC)部署jenkins

#部署流程:
(系统: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

 

posted @ 2022-08-28 18:15  一念6  阅读(632)  评论(0编辑  收藏  举报