Dieser Beitrag ist ein Tutorial darüber, wie man eine Jenkins-Instanz einrichtet, die auf Kubernetes läuft.
Es gibt auch ein vorheriges Tutorial darüber, wie man einen Kubernetes-Cluster mit K3s einrichtet.
Jenkins-Installation
Als ersten Schritt wird ein Namespace erstellt. Alle Jenkins-bezogenen Ressourcen werden darauf angewendet:
kubectl create namespace jenkins
Ein PersistentVolumeClaim wird auch benötigt in einer Datei namens jenkins-pvc.yaml:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-claim
namespace: jenkins
spec:
storageClassName: local-path
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Dies wird angewendet mit:
kubectl create -f jenkins-pvc.yaml -n jenkins
Das Deployment muss zur Datei jenkins-deployment.yaml hinzugefügt werden:
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-deployment
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins:lts
ports:
- name: http-port
containerPort: 8080
- name: jnlp-port
containerPort: 50000
volumeMounts:
- name: jenkins-vol
mountPath: /var/jenkins_vol
volumes:
- name: jenkins-vol
persistentVolumeClaim:
claimName: jenkins-claim
Das Deployment wird angewendet mit:
kubectl create -f jenkins-deployment.yaml -n jenkins
Jetzt sollte ein Pod mit der Jenkins-Instanz laufen. Dies kann überprüft werden mit:
kubectl get pods -n jenkins
In einer Datei jenkins-service.yaml werden zwei Services hinzugefügt: einer für die Jenkins-Instanz selbst und ein weiterer für JNLP, das für die Agent-Nodes benötigt wird:
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30000
selector:
app: jenkins
---
apiVersion: v1
kind: Service
metadata:
name: jenkins-jnlp
spec:
type: ClusterIP
ports:
- port: 50000
targetPort: 50000
selector:
app: jenkins
Beide Services werden angewendet mit:
kubectl create -f jenkins-service.yaml --namespace jenkins
Auch hier ist es gut zu überprüfen, ob alles funktioniert hat:
kubectl get services --namespace jenkins
Um auf die Jenkins-Instanz zuzugreifen, werden die IP des Nodes und die NodePort-Service-Portnummer benötigt. Die IP-Adressen der Nodes sind:
kubectl get nodes -o wide
Dann, um den NodePort-Service-Port zu erhalten:
kubectl get svc -n jenkins
Schließlich die laufende Jenkins-Instanz:

Jenkins-Konfiguration
Jetzt, da die Instanz läuft, muss sie einige Konfigurationsschritte durchlaufen.
Zuerst hole das initiale Passwort aus den Pod-Logs. Der Pod-Name kann ermittelt werden mit:
kubectl get pods -n jenkins
Dann, um auf die Logs zuzugreifen, führe aus:
kubectl logs -n jenkins <jenkins-pod-name>
Das in den Logs angezeigte Passwort sollte in den Browser kopiert werden, um mit dem “Continue”-Button fortzufahren.

Im nächsten Schritt müssen einige Plugins installiert werden, indem du “Install suggested plugins” drückst.

Alle vorgeschlagenen Plugins werden automatisch installiert.

Um als Admin mit dem initialen Passwort fortzufahren, drücke den “Skip and continue as admin”-Button.

Jenkins liefert die vollständige Jenkins-URL.
Beachte, dass dies nicht der sichere Weg für den Produktivbetrieb ist; für eine permanente Jenkins-Instanz sollte das Admin-Passwort so schnell wie möglich geändert werden.

Nach dem Drücken von “Start using Jenkins” ist die initiale Konfiguration abgeschlossen.

Abschließende Bemerkung
Wenn du alles von vorne beginnen musst, lösche den Namespace:
kubectl delete all --all -n jenkins