关于kubernetes:在-k8s-中安装-jenkins-并配置实现-CICD

1次阅读

共计 7291 个字符,预计需要花费 19 分钟才能阅读完成。

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

一. 概述

在学习应用一个工具之前,咱们须要晓得怎么装置它。本文将本人学习的过程记录下来,一方面坚固学习的内容,另一方面心愿对有同样需要的小伙伴提供一些帮忙。

开源工具 形容 官网文档 官网装置文档 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 的应用能够查看官网:https://kubernetes.io/zh/docs…

创立 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

应用上面的命令查看管理员明码:

# 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

登录胜利后,须要装置插件:

这里不装置举荐的插件的起因是,很多插件咱们是不须要的,还有就是默认下载插件会从国外下载,比较慢,前面会介绍配置国内下载地址。

点击装置后,创立第一个管理员用户:

依据理论状况配置,这里抉择应用 admin 账号持续。

三. 应用 helm 装置 jenkins

能够去到 helm 官网包治理仓库查找须要装置的利用。

helm 包治理地址:https://artifacthub.io/

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

依据 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,如下图所示:

四. 配置 jenkins 实现 devops

依据后面的步骤曾经装置好了 jenkins,接下来我将介绍如何配置 jenkins 实现 devops。

1. 配置插件更新站点为国内源

默认插件更新站点为:https://updates.jenkins.io/update-center.json

批改插件更新站点为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

如下图所示:

2. 下载罕用插件

下载罕用插件如下图所示:

3. 配置 kubernetes 集群

点击【系统管理】—>【节点治理】—>【Configure Clouds】

这里不做任何配置,间接点击【连贯测试】就能够发现连贯 k8s 胜利,如下图所示:


配置 k8s 集群相干,如下图:

配置 pod 模板,如下图:

在 pod 模板中增加第一个容器:jenkins/inbound-agent,作为 jenkins 的 slave 节点,如下图所示:

在 pod 模板中增加第二个容器:docker,用于构建曾经推送镜像,如下图所示:

在 pod 模板中增加第三个容器:maven:3.8.1-openjdk-11,如下图所示:

依据须要增加更多容器,比方须要构建前端我的项目,能够增加一个 node:16.6.1-slim 容器,如下图所示:

4. 为 maven 容器配置缓存和挂载 settings.xml

若须要为 Jenkins Slave Pod 挂载自定义 Settings 文件,则能够先创立 Config Map Volume,再配置到 Pod Template 上。

执行以下命令创立自定义 Settings 文件:

kubectl -n default create configmap maven-config --from-file=settings.xml 

下单击 增加卷 ,抉择Config Map Volume 类型卷,另一个是 maven 的配置,为了长久化依赖,进步构建速度,配置如下图所示:

5. 应用 docker 构建和推送容器镜像

应用 docker 推送镜像时,须要设置镜像仓库的拜访权限,通过上面的形式设置:

执行以下命令登录镜像仓库,登录镜像仓库的同时会生成 config.json 文件:

docker login -u <username> -p <password> registry.cn-hangzhou.aliyuncs.com

jenkins 命名空间下应用生成的 config.json 文件创建名为 my-secret 的 Secret:

kubectl create secret generic jenkins-docker-cfg -n default --from-file=/root/.docker/config.json

在 Jenkins 零碎的 Pod Template 中配置挂载卷及环境变量:

6. 配置拜访 k8s 的 kubeconfig

配置拜访 k8s 的 kubeconfig,在 pipeline 中应用 kubernetesDeploy 的时候会应用到

  • [Manage Credentials] -> [jenkins] -> [全局凭据] -> [增加凭据]

7. 设置拉取公有仓库镜像的用户名和明码

  • [Manage Credentials] -> [jenkins] -> [全局凭据] -> [增加凭据]

8. 测试 devops 构建流程

创立一个 pipeline 我的项目,如下图所示:

在流水线脚本中输出如下内容:

pipeline {
     // 定义本次构建应用哪个标签的构建环境
    agent{
        node{label 'slave-pipeline'}
      }

    stages {stage('Hello') {
            steps {echo 'Hello World'}
        }
        // 拉取代码
        stage('git clone') {
            steps {git branch: "master", credentialsId: "", url:"https://gitee.com/peterwd/devops-demo.git"}
        }
        //  运行源码打包命令
        stage('Package'){
          steps{container("maven") {
                  sh "mvn --version"
                  sh "mvn clean package -DskipTests"
              }
          }
        }

        // 运行容器镜像构建和推送命令
        stage('Image Build And Publish'){
          steps{container('docker') {sh 'docker version'}
          }
        }
        
        //  运行 node 构建命令
        stage('node'){
          steps{container('node') {sh 'npm version'}
          }
        }
    }
}

如下图所示:


点击保留,并构建,显示如下:

正文完
 0