基于K8S部署安装Jenkins
基于K8S部署安装Jenkins
- 1.Jenkins Kubernetes 清单文件
- 2.Kubernetes Jenkins 部署
- 1:为 Jenkins 创建 Namespace。 最好将所有DevOps工具分类为与其他应用程序分开的命名空间。
- 2:创建“serviceAccount.yaml”文件并复制以下管理员服务帐户清单。
- 1. kubectl 创建服务帐户。
- 3: 创建“volume.yaml”并复制以下持久性卷清单。
- 1. kubectl 获取工作节点主机名。
- 2.使用 kubectl 创建卷
- 4:创建名为“deployment.yaml”的部署文件,并复制以下部署清单。
- 1.使用 kubectl 创建部署。
- 2.检查部署状态。
- 3.查看部署详细信息。
- 3.使用 Kubernetes 服务访问 Jenkins
- 1.创建“service.yaml”并复制以下服务清单:
- 2.使用 kubectl 创建 Jenkins 服务。
- 3.显示devops-tools所有 Deployme 中的命名空间
- 4.显示devops-tools所有 Pod 中的命名空间
- 5.运行 exec 命令直接从如下所示的位置获取密码。
- 4.访问 Jenkins 仪表板和安装设置
1.Jenkins Kubernetes 清单文件
此处使用的所有 Jenkins Kubernetes 清单文件都托管在 GitHub 上。 克隆存储库。
[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工具分类为与其他应用程序分开的命名空间。
[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”文件并复制以下管理员服务帐户清单。
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: jenkins-admin
rules:- apiGroups: [""]resources: ["*"]verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:name: jenkins-adminnamespace: devops-tools
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: jenkins-admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: jenkins-admin
subjects:
- kind: ServiceAccountname: jenkins-adminnamespace: devops-tools
serviceAccount.yaml’ 创建一个 ‘jenkins-admin’ clusterRole, ‘jenkins-admin’ ServiceAccount,并将 ‘clusterRole’ 绑定到服务账户。
“jenkins-admin”集群角色具有管理集群组件的所有权限。 您还可以通过指定单个资源操作来限制访问。
1. kubectl 创建服务帐户。
[root@master kubernetes-jenkins]# kubectl apply -f serviceAccount.yaml
clusterrole.rbac.authorization.k8s.io/jenkins-admin created
3: 创建“volume.yaml”并复制以下持久性卷清单。
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-volumelabels:type: local
spec:storageClassName: local-storageclaimRef:name: jenkins-pv-claimnamespace: devops-toolscapacity:storage: 10GiaccessModes:- ReadWriteOncelocal:path: /mntnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node1 #替换为任何一个集群工作节点主机名
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: jenkins-pv-claimnamespace: devops-tools
spec:storageClassName: local-storageaccessModes:- ReadWriteOnceresources:requests:storage: 3Gi
重要提示:将“node1”替换为任何一个集群工作节点主机名。
1. kubectl 获取工作节点主机名。
[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 创建卷
[root@master kubernetes-jenkins]# kubectl create -f volume.yaml
storageclass.storage.k8s.io/local-storage created
4:创建名为“deployment.yaml”的部署文件,并复制以下部署清单。
apiVersion: apps/v1
kind: Deployment
metadata:name: jenkinsnamespace: devops-tools
spec:replicas: 1selector:matchLabels:app: jenkins-servertemplate:metadata:labels:app: jenkins-serverspec:securityContext:fsGroup: 1000runAsUser: 1000serviceAccountName: jenkins-admincontainers:- name: jenkinsimage: jenkins/jenkins:ltsresources:limits:memory: "2Gi"cpu: "1000m"requests:memory: "500Mi"cpu: "500m"ports:- name: httpportcontainerPort: 8080- name: jnlpportcontainerPort: 50000livenessProbe:httpGet:path: "/login"port: 8080initialDelaySeconds: 90periodSeconds: 10timeoutSeconds: 5failureThreshold: 5readinessProbe:httpGet:path: "/login"port: 8080initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 5failureThreshold: 3volumeMounts:- name: jenkins-datamountPath: /var/jenkins_homevolumes:- name: jenkins-datapersistentVolumeClaim:claimName: jenkins-pv-claim
在这个 Jenkins Kubernetes 部署中,我们使用了以下内容:
1.ecurityContext’,以便 Jenkins pod 能够写入本地持久卷。
2.活动和就绪情况探测,用于监视 Jenkins pod 的运行状况。
3.基于保存 Jenkins 数据路径“/var/jenkins_home”的本地持久性卷。
如果不需要本地存储持久卷,可以将部署中的卷定义替换为主机目录,如下所示。
volumes:
- name: jenkins-dataemptyDir: \{}
1.使用 kubectl 创建部署。
[root@master kubernetes-jenkins]# kubectl apply -f deployment.yaml
deployment.apps/jenkins created
2.检查部署状态。
[root@master kubernetes-jenkins]# kubectl get deployments -n devops-tools
NAME READY UP-TO-DATE AVAILABLE AGE
jenkins 0/1 1 0 9s
3.查看部署详细信息。
[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-serverService Account: jenkins-adminContainers:jenkins:Image: jenkins/jenkins:ltsPorts: 8080/TCP, 50000/TCPHost Ports: 0/TCP, 0/TCPLimits:cpu: 1memory: 2GiRequests:cpu: 500mmemory: 500MiLiveness: http-get http://:8080/login delay=90s timeout=5s period=10s #success=1 #failure=5Readiness: http-get http://:8080/login delay=60s timeout=5s period=10s #success=1 #failure=3Environment: <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-claimReadOnly: false
Conditions:Type Status Reason---- ------ ------Available False MinimumReplicasUnavailableProgressing 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”并复制以下服务清单:
apiVersion: v1
kind: Service
metadata:name: jenkins-servicenamespace: devops-toolsannotations:prometheus.io/scrape: 'true'prometheus.io/path: /prometheus.io/port: '8080'
spec:selector:app: jenkins-servertype: NodePortports:- port: 8080targetPort: 8080nodePort: 32000
在这里,我们使用类型为“NodePort”,它将在端口 32000 上的所有 kubernetes 节点 IP 上公开 Jenkins。 如果您有入口设置,则可以创建入口规则来访问 Jenkins。 此外,如果您在 AWS、Google 或 Azure 云上运行集群,则可以将 Jenkins 服务公开为 Loadbalancer。
2.使用 kubectl 创建 Jenkins 服务。
[root@master kubernetes-jenkins]# kubectl apply -f service.yaml
service/jenkins-service created
3.显示devops-tools所有 Deployme 中的命名空间
[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 中的命名空间
[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 命令直接从如下所示的位置获取密码。
kubectl exec -it jenkins-b96f7764f-7zzbn cat /var/jenkins_home/secrets/initialAdminPassword -n devops-tools
4.访问 Jenkins 仪表板和安装设置
浏览器输入:http://<node-ip>:32000
将 管理员账户密码 复制到对应的地方,点击 继续
这里建议点击 选择插件来安装,在点击 无 ,不安装任何插件,再点击 安装,因为我们没有配置镜像,安装插件是从外网下载过来的,会比较慢,并且下载的插件可能会出现不兼容等状况,导致失败率很高
[进入到创建管理员页面,填写账户信息后 保存并完成
进入以下页面配置 jenkins 的 url ,一般使用默认的就行了,保存并完成
可以点击 开始使用 Jenkins 直接登录进入 Jenkins