基于K8S部署安装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-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 创建服务帐户。
[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-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 获取工作节点主机名。
[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: 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”的本地持久性卷。
如果不需要本地存储持久卷,可以将部署中的卷定义替换为主机目录,如下所示。
volumes:
- name: jenkins-data
emptyDir: \{}
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-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”并复制以下服务清单:
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 服务。
[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