基于K8S部署安装Jenkins

基于K8S部署安装Jenkins

  • [1.Jenkins Kubernetes 清单文件](#1.Jenkins Kubernetes 清单文件)
  • [2.Kubernetes Jenkins 部署](#2.Kubernetes Jenkins 部署)
  • [3.使用 Kubernetes 服务访问 Jenkins](#3.使用 Kubernetes 服务访问 Jenkins)
      • 1.创建"service.yaml"并复制以下服务清单:
      • [2.使用 kubectl 创建 Jenkins 服务。](#2.使用 kubectl 创建 Jenkins 服务。)
      • [3.显示devops-tools所有 Deployme 中的命名空间](#3.显示devops-tools所有 Deployme 中的命名空间)
      • [4.显示devops-tools所有 Pod 中的命名空间](#4.显示devops-tools所有 Pod 中的命名空间)
      • [5.运行 exec 命令直接从如下所示的位置获取密码。](#5.运行 exec 命令直接从如下所示的位置获取密码。)
  • [4.访问 Jenkins 仪表板和安装设置](#4.访问 Jenkins 仪表板和安装设置)

1.Jenkins Kubernetes 清单文件

此处使用的所有 Jenkins Kubernetes 清单文件都托管在 GitHub 上。 克隆存储库。

bash 复制代码
[root@master test]# git clone https://github.com/scriptcamp/kubernetes-jenkins
正克隆到 'kubernetes-jenkins'...
remote: Enumerating objects: 16, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 16 (delta 1), reused 0 (delta 0), pack-reused 9
接收对象中: 100% (16/16), 完成.
处理 delta 中: 100% (1/1), 完成

root@master test]# cd kubernetes-jenkins/
[root@master kubernetes-jenkins]# ls
deployment.yaml  namespace.yaml  README.md  serviceAccount.yaml  service.yaml  volume.yaml

2.Kubernetes Jenkins 部署

让我们开始在 Kubernetes 上部署 Jenkins。

1:为 Jenkins 创建 Namespace。 最好将所有DevOps工具分类为与其他应用程序分开的命名空间。

bash 复制代码
[root@master kubernetes-jenkins]# kubectl  create namespace devops-tools
namespace/devops-tools created
#查看空间名
[root@master jenkins]# kubectl get namespaces
NAME              STATUS   AGE
default           Active   6d
devops-tools      Active   58m
ingress-nginx     Active   4d23h
jenkins           Active   3d18h
kube-flannel      Active   6d
kube-node-lease   Active   6d
kube-public       Active   6d
kube-system       Active   6d
[root@master jenkins]

2:创建"serviceAccount.yaml"文件并复制以下管理员服务帐户清单。

bash 复制代码
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: jenkins-admin
rules:
  - apiGroups: [""]
    resources: ["*"]
    verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-admin
  namespace: devops-tools
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins-admin
subjects:
- kind: ServiceAccount
  name: jenkins-admin
  namespace: devops-tools

serviceAccount.yaml' 创建一个 'jenkins-admin' clusterRole, 'jenkins-admin' ServiceAccount,并将 'clusterRole' 绑定到服务账户。

"jenkins-admin"集群角色具有管理集群组件的所有权限。 您还可以通过指定单个资源操作来限制访问。

1. kubectl 创建服务帐户。

bash 复制代码
[root@master kubernetes-jenkins]# kubectl apply -f serviceAccount.yaml
clusterrole.rbac.authorization.k8s.io/jenkins-admin created

3: 创建"volume.yaml"并复制以下持久性卷清单。

bash 复制代码
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-pv-volume
  labels:
    type: local
spec:
  storageClassName: local-storage
  claimRef:
    name: jenkins-pv-claim
    namespace: devops-tools
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  local:
    path: /mnt
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node1 #替换为任何一个集群工作节点主机名
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pv-claim
  namespace: devops-tools
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

重要提示:将"node1"替换为任何一个集群工作节点主机名。

1. kubectl 获取工作节点主机名。

bash 复制代码
[root@master jenkins]# kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   6d    v1.23.12
node1    Ready    <none>                 6d    v1.23.12
node2    Ready    <none>                 6d    v1.23.12

对于卷,我们使用"本地"存储类进行演示。 这意味着,它在"/mnt"位置下的特定节点中创建一个"PersistentVolume"卷。

由于"本地"存储类需要节点选择器,因此您需要正确指定工作节点名称,以便 Jenkins pod 在特定节点中进行调度。

如果 pod 被删除或重新启动,数据将保留在节点卷中。 但是,如果节点被删除,您将丢失所有数据。

理想情况下,您应使用云提供商提供的可用存储类的持久卷,或者使用集群管理员提供的持久性卷,以在节点故障时持久化数据。

2.使用 kubectl 创建卷

bash 复制代码
[root@master kubernetes-jenkins]# kubectl  create  -f volume.yaml 
storageclass.storage.k8s.io/local-storage created

4:创建名为"deployment.yaml"的部署文件,并复制以下部署清单。

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: devops-tools
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins-server
  template:
    metadata:
      labels:
        app: jenkins-server
    spec:
      securityContext:
            fsGroup: 1000
            runAsUser: 1000
      serviceAccountName: jenkins-admin
      containers:
        - name: jenkins
          image: jenkins/jenkins:lts
          resources:
            limits:
              memory: "2Gi"
              cpu: "1000m"
            requests:
              memory: "500Mi"
              cpu: "500m"
          ports:
            - name: httpport
              containerPort: 8080
            - name: jnlpport
              containerPort: 50000
          livenessProbe:
            httpGet:
              path: "/login"
              port: 8080
            initialDelaySeconds: 90
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 5
          readinessProbe:
            httpGet:
              path: "/login"
              port: 8080
            initialDelaySeconds: 60
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          volumeMounts:
            - name: jenkins-data
              mountPath: /var/jenkins_home
      volumes:
        - name: jenkins-data
          persistentVolumeClaim:
              claimName: jenkins-pv-claim

在这个 Jenkins Kubernetes 部署中,我们使用了以下内容:

1.ecurityContext',以便 Jenkins pod 能够写入本地持久卷。

2.活动和就绪情况探测,用于监视 Jenkins pod 的运行状况。

3.基于保存 Jenkins 数据路径"/var/jenkins_home"的本地持久性卷。

如果不需要本地存储持久卷,可以将部署中的卷定义替换为主机目录,如下所示。

bash 复制代码
volumes:
- name: jenkins-data
  emptyDir: \{}

1.使用 kubectl 创建部署。

bash 复制代码
[root@master kubernetes-jenkins]# kubectl apply -f deployment.yaml
deployment.apps/jenkins created

2.检查部署状态。

bash 复制代码
[root@master kubernetes-jenkins]# kubectl get deployments -n devops-tools
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
jenkins   0/1     1            0           9s

3.查看部署详细信息。

bash 复制代码
[root@master kubernetes-jenkins]# kubectl describe deployments --namespace=devops-tools
Name:                   jenkins
Namespace:              devops-tools
CreationTimestamp:      Sun, 04 Aug 2024 22:15:18 -0400
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=jenkins-server
Replicas:               1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:           app=jenkins-server
  Service Account:  jenkins-admin
  Containers:
   jenkins:
    Image:       jenkins/jenkins:lts
    Ports:       8080/TCP, 50000/TCP
    Host Ports:  0/TCP, 0/TCP
    Limits:
      cpu:     1
      memory:  2Gi
    Requests:
      cpu:        500m
      memory:     500Mi
    Liveness:     http-get http://:8080/login delay=90s timeout=5s period=10s #success=1 #failure=5
    Readiness:    http-get http://:8080/login delay=60s timeout=5s period=10s #success=1 #failure=3
    Environment:  <none>
    Mounts:
      /var/jenkins_home from jenkins-data (rw)
  Volumes:
   jenkins-data:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  jenkins-pv-claim
    ReadOnly:   false
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   jenkins-b96f7764f (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  14s   deployment-controller  Scaled up replica set jenkins-b96f7764f to 1

3.使用 Kubernetes 服务访问 Jenkins

现在,我们已经创建了一个部署。 但是,它无法向外界开放。 为了从外部世界访问 Jenkins 部署,我们需要创建一个服务并将其映射到部署。

1.创建"service.yaml"并复制以下服务清单:

bash 复制代码
apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  namespace: devops-tools
  annotations:
      prometheus.io/scrape: 'true'
      prometheus.io/path:   /
      prometheus.io/port:   '8080'
spec:
  selector:
    app: jenkins-server
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 32000

在这里,我们使用类型为"NodePort",它将在端口 32000 上的所有 kubernetes 节点 IP 上公开 Jenkins。 如果您有入口设置,则可以创建入口规则来访问 Jenkins。 此外,如果您在 AWS、Google 或 Azure 云上运行集群,则可以将 Jenkins 服务公开为 Loadbalancer。

2.使用 kubectl 创建 Jenkins 服务。

bash 复制代码
[root@master kubernetes-jenkins]# kubectl apply -f service.yaml
service/jenkins-service created

3.显示devops-tools所有 Deployme 中的命名空间

bash 复制代码
[root@master kubernetes-jenkins]# kubectl get deployments -n devops-tools
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
jenkins   0/1     1            0           31s

4.显示devops-tools所有 Pod 中的命名空间

bash 复制代码
[root@master kubernetes-jenkins]# kubectl get pods --namespace=devops-tools
NAME                      READY   STATUS    RESTARTS   AGE
jenkins-b96f7764f-7zzbn   1/1     Running   0          3m5s

5.运行 exec 命令直接从如下所示的位置获取密码。

bash 复制代码
kubectl exec -it jenkins-b96f7764f-7zzbn cat /var/jenkins_home/secrets/initialAdminPassword -n devops-tools

4.访问 Jenkins 仪表板和安装设置

bash 复制代码
浏览器输入:http://<node-ip>:32000

将 管理员账户密码 复制到对应的地方,点击 继续

这里建议点击 选择插件来安装,在点击 无 ,不安装任何插件,再点击 安装,因为我们没有配置镜像,安装插件是从外网下载过来的,会比较慢,并且下载的插件可能会出现不兼容等状况,导致失败率很高

[进入到创建管理员页面,填写账户信息后 保存并完成

进入以下页面配置 jenkins 的 url ,一般使用默认的就行了,保存并完成

可以点击 开始使用 Jenkins 直接登录进入 Jenkins

相关推荐
大江东去了吗6 小时前
k8s HPA
云原生·容器·kubernetes
花菜回锅肉7 小时前
开源可视化大屏superset Docker环境部署
数据仓库·docker·容器·开源·superset
wd5205217 小时前
常用环境部署(十七)——Docker安装pritunl+openvpn
运维·docker·容器
Watermelo6179 小时前
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
java·spring boot·docker·微服务·云原生·容器·devops
Richardlygo10 小时前
编写Dockerfile第二版
docker·容器
码农阿豪10 小时前
OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
docker·云原生·容器
是芽芽哩!10 小时前
【Kubernetes】常见面试题汇总(五)
云原生·容器·kubernetes
雨声不在10 小时前
在jenkins中获取git的修改记录的方法
git·jenkins
何遇mirror10 小时前
深入解析 Docker exec 命令
容器
芦苇浮绿水11 小时前
记一次升级 Viper、ETCD V3操作Toml
数据库·kubernetes·go·etcd