在k8s中安装并使用jenkins一.概述二.

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

我们把世界看错,反说它欺骗了我们。—— 泰戈尔《飞鸟集》

一. 概述

在学习使用一个工具之前,我们需要知道怎么安装它,本文主要记录在 k8s 中安装并使用 jenkins。

开源工具 描述 官方文档 官方安装文档 docker 安装
jenkins devops持续集成工具 jenkins 官网 jenkins 快速安装 docker 安装

上面表格列出了官方的安装地址,如果需要快速体验使用,建议直接使用 docker 安装,一行命令就可以启动应用:

docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts-jdk11
复制代码

本文介绍在 k8s 中安装并使用 jenkins,主要通过两种方式安装实践:

  • 自己编写 yaml 文件安装
  • 使用 helm 安装

安装环境

这里使用 minikube 进行安装,在 k8s 集群中基本使用是一样的

  • minikube : v1.18.1
  • helm : v3.5.3

二. 自定义 yaml 文件安装 jenkins

由于 jenkins 需要持久化数据,所以我们需要创建 PVC ,建议使用 storageClass 动态创建 PVC,在 minikube 中有一个默认的 storageClass,名称是:standard,可以使用下面的命令查看:

# kubectl get sc
NAME                 PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
standard (default)   k8s.io/minikube-hostpath   Delete          Immediate           false                  50m
复制代码

关于 storageClass 的使用可以查看官网:kubernetes.io/zh/docs/con…

创建 jenkins-deploy.yaml 文件,文件内容如下:

###############使用 storageClass 创建 pvc ###################
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-data-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  # 指定 storageClass 的名字,这里使用 minikube 默认的 standard
  storageClassName: "standard"
  resources:
    requests:
      storage: 10Gi

###############创建一个ServiceAccount 名称为:jenkins-admin###################
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-admin
  namespace: default
  labels:
    name: jenkins

###############绑定账户jenkins-admin 为集群管理员角色,为了控制权限建议绑定自定义角色###################
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins-admin
  labels:
    name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins-admin
    namespace: default
roleRef:
  kind: ClusterRole
  # cluster-admin 是 k8s 集群中默认的管理员角色
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io


############### 在 default 命名空间创建 deployment ###################
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      terminationGracePeriodSeconds: 10
      # 注意:k8s 1.21.x 中 serviceAccount 改名为 serviceAccountName
      # 这里填写上面创建的 serviceAccount 的 name
      serviceAccount: jenkins-admin
      containers:
        - name: jenkins
          image: jenkins/jenkins:lts-jdk11
          imagePullPolicy: IfNotPresent
          env:
            - name: JAVA_OPTS
              value: -Duser.timezone=Asia/Shanghai
          ports:
            - containerPort: 8080
              name: web
              protocol: TCP
            - containerPort: 50000
              name: agent
              protocol: TCP
          resources:
            limits:
              cpu: 1000m
              memory: 1Gi
            requests:
              cpu: 500m
              memory: 512Mi
          livenessProbe:
            httpGet:
              path: /login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12
          readinessProbe:
            httpGet:
              path: /login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12
          volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
      volumes:
        - name: jenkinshome
          persistentVolumeClaim:
            claimName: jenkins-data-pvc

############### 在 default 命名空间创建 service ###################
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: default
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  type: ClusterIP
  ports:
    - name: web
      port: 8080
      targetPort: 8080


---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-agent
  namespace: default
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  type: ClusterIP
  ports:
    - name: agent
      port: 50000
      targetPort: 50000

复制代码

使用下面的命令部署 jenkins:

# kubectl apply -f jenkins-deploy.yaml

persistentvolumeclaim/jenkins-data-pvc created
serviceaccount/jenkins-admin created
clusterrolebinding.rbac.authorization.k8s.io/jenkins-admin created
deployment.apps/jenkins created
service/jenkins created
service/jenkins-agent created
复制代码

使用下面的命令临时暴露服务端口:

kubectl port-forward service/jenkins 8080:8080 -n default
复制代码

生产环境建议使用 ingress 通过域名暴露服务

暴露服务端口后,可以访问:http://localhost:8080

image-20210804113719169.png

使用下面的命令查看管理员密码:

# kubectl get pod -n default
NAME                       READY   STATUS    RESTARTS   AGE
jenkins-68666b56fc-p8fvd   1/1     Running   0          8m28s

# kubectl exec jenkins-68666b56fc-p8fvd -- cat /var/jenkins_home/secrets/initialAdminPassword
b06be4420bcd4a02ab4968ab02838986
复制代码

登录成功后,需要安装插件:

image-20210804114339850.png

image-20210804114650970.png

这里不安装推荐的插件的原因是,很多插件我们是不需要的,还有就是默认下载插件会从国外下载,比较慢,后面会介绍配置国内下载地址。

点击安装后,创建第一个管理员用户:

image-20210804115005129.png

根据实际情况配置,这里选择使用admin 账号继续。

image-20210804115233111.png

三. 使用 helm 安装 jenkins

可以去到 helm 官方包管理仓库查找需要安装的应用。

helm 包管理地址:artifacthub.io/

在 Artifact hub 中搜索 jenkins,如下图所示:

image-20210804141544184.png

根据 jenkins 的说明进行安装,下面详细介绍一下安装步骤:

使用下面的命令添加安装 jenkins 的仓库

$  helm repo add jenkins https://charts.jenkins.io
"jenkins" has been added to your repositories
复制代码

使用下面的命令查看已经添加的helm仓库:

$  helm repo list
NAME            URL
kong            https://charts.konghq.com
aliyun          https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
stable          https://charts.helm.sh/stable
kubeview        https://benc-uk.github.io/kubeview/charts
tscharts        https://technosophos.github.com/tscharts
bitnami         https://charts.bitnami.com/bitnami
apisix          https://charts.apiseven.com
jenkins         https://charts.jenkins.io
复制代码

使用下面的命令更新 helm 仓库:

$  helm repo update
复制代码

使用下面的命令可以搜索仓库中的 jenkins:

$  helm search repo jenkins

aliyun/jenkins  0.13.5          2.73            Open source continuous integration server. It s...
bitnami/jenkins 8.0.8           2.289.3         The leading open source automation server
jenkins/jenkins 3.5.9           2.289.3         Jenkins - Build great things at any scale! The ...
stable/jenkins  2.5.4           lts             DEPRECATED - Open source continuous integration...
复制代码

使用下面的命令查看可以配置的内容:

$  helm show values jenkins/jenkins
复制代码

使用下面的命令下载 helm 的 chart 包到本地:

$  helm pull jenkins/jenkins
复制代码

下载下来的是一个压缩包,可以通过 tar -zxvf 命令解压:

$  tar -zxvf jenkins-3.5.9.tgz

-rw-r--r-- 1  1049089 45006 Jul 28 23:36 CHANGELOG.md
-rw-r--r-- 1  1049089  1287 Jul 28 23:36 Chart.yaml
-rw-r--r-- 1  1049089 30809 Jul 28 23:36 README.md
-rw-r--r-- 1  1049089 37647 Jul 28 23:36 VALUES_SUMMARY.md
drwxr-xr-x 1  1049089     0 Aug  5 17:59 templates
-rw-r--r-- 1  1049089 36203 Jul 28 23:36 values.yaml
复制代码

根据需要修改 values.yaml 文件进行自定义配置,这里为了快速体验,不做其他配置,直接使用下面的命令进行安装:

$  helm install jenkins ./jenkins
复制代码

使用下面的命令查看登录的用户名和密码:

# 查看登录的用户名
$  kubectl exec jenkins-0 -- cat /run/secrets/chart-admin-username
# 查看登录的密码
$  kubectl exec jenkins-0 -- cat /run/secrets/chart-admin-password
复制代码

使用下面的命令临时暴露服务:

kubectl --namespace default port-forward svc/jenkins 8080:8080
复制代码

生产环境建议使用 ingress 通过域名暴露服务

暴露服务端口后,可以访问:http://localhost:8080,如下图所示:

image-20210805193558764.png