ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kubernetes 部署持久化jenkins

2021-09-08 17:58:57  阅读:154  来源: 互联网

标签:持久 name kubernetes namespace NFS Jenkins jenkins public


kubernetes 部署持久化jenkins
系统环境:
系统版本:CentOs8.1
k8s版本:v1.21.3
containerd版本:ctr containerd.io 1.4.3
jenkins 版本:2.172

一、设置存储目录
将 Jenkins 持久化到存储中。这里用的是 NFS 网路存储,方便在 Kubernetes 环境下应用启动节点转义数据一致。当然也可以选择存储到本地,但是为了保证应用数据一致,需要设置 Jenkins 固定到某一 Kubernetes 节点。

1、安装 NFS 服务端
详情请看 CentOS8.1 搭建 nfs 服务器 ,略。

2、挂载 NFS 并设置存储文件夹
如果不能直接操作 NFS 服务端创建文件夹,需要知道 NFS 服务器地址,然后将其挂在到本地目录,进入其中创建 Jenkins 目录空间。

(1)、挂载 NFS

mount -t nfs 192.168.43.152:/data/k8s /data/k8s

(2)、在 NFS 共享存储文件夹下创建存储 Jenkins 数据的文件夹

mkdir -p /data/k8s/jenkins

二、创建 PV 和 PVC
创建 PV 绑定 NFS 创建的 Jenkins 目录,然后创建 PVC 绑定这个 PV,将此 PVC 用于后面创建 Jenkins 服务时挂载的存储。

1、准备 PV & PVC 部署文件

vim jenkins-pv-pvc.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins
  namespace: kube-public
  labels:
    app: jenkins
spec:
  capacity:          
    storage: 100Gi
  accessModes:       
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain  
  mountOptions:   #NFS挂在选项
    - hard
    - nfsvers=4.1    
  nfs:            #NFS设置
    path: /data/k8s/jenkins   
    server: 192.168.43.152
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: jenkins
  namespace: kube-public
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 90Gi			#生产环境空间一定要设置大点(经验值200G,具备扩容能力)
  selector:
    matchLabels:
      app: jenkins

2、创建 PV 和 PVC
注意 PV 的空间不能小于 PVC,否则无法关联

kubectl apply -f jenkins-pv-pvc.yaml

查看

[root@ck8s1 jenkins]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
jenkins   5Gi        RWO            Retain           Bound    kube-public/jenkins                           3m14s
[root@ck8s1 jenkins]# kubectl get pvc -n kube-public
NAME           STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-mysql-0   Pending                                       nfs            31d
jenkins        Bound     jenkins   5Gi        RWO                           3m21s

三、创建 ServiceAccount & ClusterRoleBinding
此 kubernetes 集群用的是 RBAC 安全插件,必须创建权限给一个 ServiceAccount,然后将此 ServiceAccount 绑定到 Jenkins 服务,这样赋予 Jenkins 服务一定权限执行一些操作,为了方便,这里将 cluster-admin 绑定到 ServiceAccount 以保证 Jenkins 能拥有一定的权限。

(1)、jenkins-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-admin       #ServiceAccount名
  namespace: kube-public    #指定namespace,一定要修改成你自己的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

(2)、创建 RBAC 命令

 kubectl create -f jenkins-rbac.yaml

四、创建 Service & Deployment
部署 Jenkins 服务,创建 Service 与 Deployment,其中 Service 暴露两个接口 8080 与 30008。而 Deployment 里面要注意的是要设置上面创建的 ServiceAccount ,并且设置容器安全策略为“runAsUser: 0”以 Root 权限运行容器,而且暴露8080、30008两个端口。

1、创建 Service & Deployment 部署文件
jenkins-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: kube-public
  labels:
    app: jenkins
spec:
  type: NodePort
  ports:
  - name: http
    port: 8080          #服务端口
    targetPort: 8080
    nodePort: 30008   #NodePort方式暴露 Jenkins 端口
  - name: jnlp
    port: 8099         #代理端口
    targetPort: jnlp
    nodePort: 30009
  selector:
    app: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: kube-public
  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: 8099
        resources:
          limits:
            memory: 2Gi
            cpu: "1000m"
          requests:
            memory: 1Gi
            cpu: "500m"
        env:
        - name: LIMITS_MEMORY
          valueFrom:
            resourceFieldRef:
              resource: limits.memory
              divisor: 1Mi
        - name: "JAVA_TOOL_OPTIONS"
          value: "
                  -Dfile.encoding=UTF-8
                  -Dsun.jnu.encoding=UTF-8
                 "      
        - 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: jenkins
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins
        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

2、部署 Jenkins
执行 Kuberctl 命令将 Jenkins 部署到 Kubernetes 集群。

注意:将“-n”后面的 namespace 换成你自己的 namespace

 kubectl create -f jenkins-deployment.yaml

查看运行状态

[root@ck8s1 jenkins]# kubectl get pod -n kube-public
NAME                       READY   STATUS    RESTARTS   AGE
jenkins-7f65b7ffb4-n7jnl   1/1     Running   0          3m6s

五、获取 Jenkins 生成的 Token
在安装 Jenkins 时候,它默认生成一段随机字符串,用于安装验证。这里访问它的安装日志,获取它生成的 Token 字符串。

(1)、查看 Jenkins Pod 启动日志

注意:这里“-n”指的是要 namespace,后面跟的 namespace 请替换成你jenkins 启动的 namespace

 kubectl logs -f $(kubectl get pods -n kube-public | awk '{print $1}' | grep jenkins) -n kube-public

(2)、查看日志中生成的 Token 字符串

查看日志,默认给的token为:

Sep 08, 2021 5:19:10 PM jenkins.install.SetupWizard init
INFO: 

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

5b21658579c747a28ab4329ccb1f406e

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

六、启动 Jenkins 进行安装
输入集群地址和 Jenkins Service 提供的 NodePort 端口,访问 Jenkins 进行安装步骤,可以按下一步步执行:

1、进入Jenkins
输入集群地址和上面设置的Nodeport方式的端口 30008,然后输入上面获取的 Token 字符串。
访问 http://192.168.43.152:30008/jenkins
在这里插入图片描述
安装插件
在这里插入图片描述
在这里插入图片描述
安装插件略过。。。。
设置密码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完成

标签:持久,name,kubernetes,namespace,NFS,Jenkins,jenkins,public
来源: https://blog.csdn.net/tongzidane/article/details/120185220

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有