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

Ressourcen