专栏首页我的小碗汤这是我看过最详细的k8s中部署Jenkins教程

这是我看过最详细的k8s中部署Jenkins教程

原文地址:http://www.mydlq.club/article/6/

前几天发过一篇部署Jenkins的文章:

5分钟搞定在k8s上部署jenkins,并提供域名访问

使用的HostPath的方式,今天看到一篇用NFS做存储,且更为详细的文章推荐给大家。

目录[-]

一、设置存储目录

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、设置用户名、密码

七、其他

1、插件因网络问题安装失败


系统环境:

  • kubernetes 版本:1.14.0
  • jenkins 版本:2.172
  • jenkins 部署示例文件 Github 地址:https://github.com/my-dlq/blog-example/tree/master/jenkins-deploy

一、设置存储目录

在 Kubenetes 环境下所起的应用都是一个个 Docker 镜像,为了保证应用重启的情况下数据安全,所以需要将 Jenkins 持久化到存储中。这里用的是 NFS 网路存储,方便在 Kubernetes 环境下应用启动节点转义数据一致。当然也可以选择存储到本地,但是为了保证应用数据一致,需要设置 Jenkins 固定到某一 Kubernetes 节点。

1、安装 NFS 服务端

详情请看 CentOS7 搭建 nfs 服务器 ,这里不过多叙述。

2、挂载 NFS 并设置存储文件夹

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

(1)、挂载 NFS

$ mount -o vers=4.1 192.168.2.11:/nfs/ /nfs

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

$ mkdir -p /nfs/data/jenkins

二、创建 PV & PVC

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

1、准备 PV & PVC 部署文件

一定要确保 PV 的空间大于 PVC,否则无法关联

jenkins-pv-pvc.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins
  labels:
    app: jenkins
spec:
  capacity:          
    storage: Gi
  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: Gi			#生产环境空间一定要设置比较大点
  selector:
    matchLabels:
      app: jenkins

2、创建 PV & PVC

提前将 namespace 修改成你自己的 namespace

  • -n:指定 namespace
$ kubectl apply -f jenkins-pv-pvc.yaml -n public

三、创建 ServiceAccount & ClusterRoleBinding

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

注意:请提前修改 yaml 中的 namespace

(1)、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/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 暴露两个接口 80880 与 50000。而 Deployment 里面要注意的是要设置上面创建的 ServiceAccount ,并且设置容器安全策略为“runAsUser: 0”以 Root 权限运行容器,而且暴露8080、50000两个端口。

1、创建 Service & Deployment 部署文件

jenkins-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: jenkins
  labels:
    app: jenkins
spec:
  type: NodePort
  ports:
  - name: http
    port:           #服务端口
    targetPort: 
    nodePort: 		#NodePort方式暴露 Jenkins 端口
  - name: jnlp
    port:          #代理端口
    targetPort: 
    nodePort: 
  selector:
    app: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  labels:
    app: jenkins
spec:
  selector:
    matchLabels:
      app: jenkins
  replicas: 
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccountName: jenkins-admin
      containers:
      - name: jenkins
        image: registry.cn-shanghai.aliyuncs.com/mydlq/jenkins:2.172
        securityContext:                     
          runAsUser:        #设置以ROOT用户运行容器
          privileged: true   #拥有特权
        ports:
        - name: http
          containerPort: 
        - name: jnlp
          containerPort: 
        resources:
          limits:
            memory: Gi
            cpu: "1000m"
          requests:
            memory: Gi
            cpu: "500m"
        env:
        - name: LIMITS_MEMORY
          valueFrom:
            resourceFieldRef:
              resource: limits.memory
              divisor: Mi
        - 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

2、部署 Jenkins

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

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

  • -n:指定应用启动的 namespace
$ kubectl create -f jenkins-deployment.yaml -n mydlqcloud

五、获取 Jenkins 生成的 Token

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

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

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

$ kubectl log $(kubectl get pods -n mydlqcloud | awk '{print $1}' | grep jenkins) -n mydlqcloud

(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 进行安装

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

1、进入Jenkins

输入集群地址和上面设置的Nodeport方式的端口 32001,然后输入上面获取的 Token 字符串。例如,本人的集群IP为 192.168.2.11 ,所以就可以访问 http://192.168.2.11:32001/jenkins ,进入后可以看到下面的界面。

2、安装插件

选择自定义插件来进行安装

安装一些常用的插件,这里可以选择一下,推荐安装下面插件。

确定后可以看到正在安装插件界面

3、设置用户名、密码

然后进入 Jenkins 界面

七、其他

1、插件因网络问题安装失败

如果 Jenkins 安装插件失败,则可以按一下设置

  • (1)、进入地址 http://192.168.2.11:32001/jenkins/pluginManager/advanced
  • (2)、将最下面的 Update Site 的 URL 地址替换成:http://mirror.esuni.jp/jenkins/updates/update-center.json
  • (3)、点“submit”按钮,然后点右下角角 “check now”
  • (4)、然后输入地址 http://192.168.2.11:32001/jenkins/restart 重启 jenkins 后再重新安装插件

PS:上面地址替换成你们的集群地址及端口。

本文分享自微信公众号 - 我的小碗汤(mysmallsoup),作者:超级小豆丁

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 5分钟搞定在k8s上部署jenkins,并提供域名访问

    https://github.com/jenkinsci/kubernetes-plugin

    我的小碗汤
  • 必学必会 ● 1小时入门 Docker,让部署应用更快更简单

    Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2....

    我的小碗汤
  • kubernetes垃圾回收器GarbageCollector Controller源码分析(一)

    由于operator创建的redis集群,在kubernetes apiserver重启后,redis集群被异常删除(包括redis exporter stat...

    我的小碗汤
  • Jenkins分布式部署配置

    利用jenkins分布式来构建job,当job量足够大的时候,可以有效的缓解jenkins-master上的压力,提高并行job数量, 减少job处于pendi...

    louiezhou001
  • why哥悄悄的给你说几个HashCode的破事。

    在这个文章正式开始之前,先几句话把这个问题说清楚了:我们常说的 Hash 冲突到底是怎么回事?

    why技术
  • 【Kubernetes系列】第9篇 CI/CD之全流程实践

    注: 本次示例使用的gitlab项目地址为:http://gitlab.hanker.com/colynn/hanker-hello.git

    HankerCloud
  • CVPR 2020 | 商汤提出SEPC:应对尺度变化的目标检测新算法

    在CVPR 2020上,为了更好的解决物体检测中的尺度问题,商汤EIG算法中台团队重新设计了经典的单阶段检测器的FPN【1】以及HEAD结构,通过构造更具等变性...

    AI算法修炼营
  • 大数据分析:全面分析18亿票房《羞羞的铁拳》传播套路

    很喜欢看开心麻花的作品,沈腾和马丽真是天生适合喜剧,收放自如,潇洒自然,傻大个艾伦和矮小子王宁最近几年台风更加成熟,表演更加张弛有度。其实,他们野心不大,只是努...

    沉默的白面书生
  • 详细探究Spark0.8的shuffle实现

    Background 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这...

    Albert陈凯
  • Jenkins2 学习系列20 -- 添加物理机Slave节点

    节点分为主节点master和代理节点agent。 在Jenkins 2中,节点是一个基础概念,代表了任何可以执行Jenkins任务的系统。节点中包含主节点和代...

    mafeifan

扫码关注云+社区

领取腾讯云代金券