7803gelesen 2Kommentare
Wenn du schon länger mit gitlab zu tun hast, dann ist dir sicherlich schon die Möglichkeit der Integration eines Kubernetes Cluster aufgefallen. Neben der Anbindung der GKE (Google Kubernetes Engine) hast du auch die Möglichkeit ein eigenes Kubernetes Cluster hinzuzufügen.
Voraussetzungen
Gitlab
Um den Inhalt dieses Artikels umzusetzen benötigst du administrative Rechte auf einer eigenen Gitlab-Instanz (wenn du das Cluster für alle Projekte zugänglich machen möchtest). Andernfalls reicht ein Account auf gitlab.com bzw. auf einer privaten Gitlab Installation.
Kubernetes
Natürlich brauchst du hier ein eigenes Kubernetes Cluster. In vorherigen Artikeln kannst du nachlesen, wie du beispielsweise ein K8s Cluster in der Hetzner Cloud bauen kannst.
Ich empfehle dir ein Cluster mit einem Master und mindestens 2 Worker Knoten.
Außerdem benötigst du auf deiner Maschine die Konfiguration für dein Kubernetes Cluster und auch die CLI-Software kubectl
.
Einrichtung
Für die Einrichtung des K8s Cluster hast du 2 Einstiegspunkte, je nachdem welche Rechte du in der Gitlab Instanz hast.
Benutzer auf gitlab.com / eingeschränkte Rechte auf einer gitlab Instanz
Bei eingeschränkten Rechten oder in einem Projekt auf gitlab.com klickst du auf das Projekt, öffnest den Menüpunkt “Operations” und klickst auf “Kubernetes”.
Administrator einer eigenen gitlab Instanz
Auf einer eigenen gitlab Instanz öffnest du die Administrationsoberfläche und klickst im Menü auf “Kubernetes”.
Formular zur Kubernetes Cluster Integration ausfüllen
Sobald du auf den Knopf “Add Kubernetes cluster” geklickt hast, startest du die Konfiguration für das eigene K8s Cluster. Wähle dazu den Tab “Add existing cluster” aus.
Kubernetes cluster name
Gebe hier einen Namen für das Cluster ein. Das dient später dazu, das richtige Cluster auszuwählen. Ich verwende hier immer die entsprechende Subdomain, die diesem K8s Cluster zugewiesen wurde.
Environment scope
Sofern du sämtliche Umgebungen in einem Cluster bereitstellen möchtest, gibst du hier den Wert “*
” ein. Andernfalls kannst du hier eine Auswahl von Umgebungen Komma getrennt eingeben.
API URL
Die API URL ist wichtig, dass die Gitlab weiß, wo es seine Anfragen hin senden soll. Dazu kannst du mit folgendem Befehl in der Konsole die gewünschte URL abrufen:
Mac:# kubectl cluster-info | grep 'Kubernetes master' | awk '/http/ {print $NF}'
Die Ausgabe des Befehls kannst du direkt in das entsprechende Formular-Feld kopieren.
CA Certificate
Das Zertifikat, dass gitlab braucht, um mit dem Cluster zu sprechen bekommst du über 2 Schritte. Dabei ist es im ersten Schritt wichtig, die Namen des Zertifikat-Schlüssel zu bekommen default-token-[xxxxx]
. Sobald du Diesen hast kannst du danach für diesen Wert hast, kannst du dessen Zertifikat abrufen.
Mac:# kubectl get secrets NAME TYPE DATA AGE default-token-[xxxxx] kubernetes.io/service-account-token 3 9m4s Mac:# kubectl get secret default-token-[xxxxx] -o jsonpath="{['data']['ca\.crt']}" | base64 --decode -----BEGIN CERTIFICATE----- . . . -----END CERTIFICATE-----
Die Ausgabe des 2. Befehls kopierst du anschließend in die Textbox.
Service Token
Um einen Service Token zu erhalten, musst du zuerst das passende Funktionskonto in Kubernetes anlegen. Dazu legst du am Einfachsten eine Datei auf deiner lokalen Maschine an: gitlab-admin-service-account.yml
Beachte dabei, dieses Konto bekommt die Rechte cluster-admin
.
apiVersion: v1 kind: ServiceAccount metadata: name: gitlab-admin namespace: kube-system apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: gitlab-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: kind: ServiceAccount name: gitlab-admin namespace: kube-system
Diese Datei kannst du mit dem nachfolgenden Befehl in dein K8s System einspielen.
Mac:# kubectl apply -f gitlab-admin-service-account.yml serviceaccount/gitlab-admin created clusterrolebinding.rbac.authorization.k8s.io/gitlab-admin created
Die beiden Zeilen geben dir die Rückmeldung, dass Account angelegt ist und die Rolle des cluster-admin
bekommen hat. Jetzt brauchst du nur noch den Schlüssel token
auszulesen und in das entsprechende Feld zu kopieren.
Mac:# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab-admin | awk '{print $1}') Name: gitlab-admin-token-[xxxxx] Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: gitlab-admin kubernetes.io/service-account.uid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Type: kubernetes.io/service-account-token Data ==== ca.crt: 1025 bytes namespace: 11 bytes token: [TOKEN]
RBAC-enabled cluster
Diese Option solltest du aktivieren, bzw aktiviert lassen. Damit wird festgelegt, dass Zugriffssteuerung und -kontrolle aktiviert ist (RBAC).
GitLab-managed cluster
Mit diesem Haken erlaubst du deiner gitlab Instanz, dass diese Namespaces und service Accounts in deinem Kubernetes Cluster verwalten darf.
Initiale Einrichtung des K8s Cluster abgeschlossen
Mit diesen Schritten hast du die Einrichtung deines eigenen Kubernetes Cluster in gitlab abgeschlossen.
Installation von notwendigen Erweiterungen im K8s Cluster
Gitlab braucht einige Erweiterungen um das Kubernetes Cluster für dich zu managen. Dazu gehören Helm – ein Applikationsmanager, Prometheus zur Überwachung des K8s Cluster, und cert-manager für Zertifikatmanagement. Dazu kannst du auch direkt die Erweiterung knative installieren, mit der du Serverless-Anwendungen managen kannst.
Foto: Jeff Sheldon
2 Kommentare
von Andreas Richter
Hallo Daniel! Das Format des gitlab-admin-service-account.yml Files ist hier leider nicht korrekt dargestellt, das richtige File habe ich unter https://docs.gitlab.com/ee/user/project/clusters/add_remove_clusters.html gefunden. Danke für den Artikel!
von frank
Schöne Beschreibung. Soweit habe ich das auch exakt hin bekommen. Eigener gitlab- und eigener kubernetes- Server. Jetzt bersuche ich verzweifelt die weiteren Applications zu installieren, was leider nicht klappt.
Bei einfach jeder App bekomme ich
“Something went wrong while installing Ingress
Operation failed. Check pod logs for install-ingress for more details.”
Und im kubernetes sehe ich: (z.B.)
kub1:~# kubectl logs install-runner -n gitlab-managed-apps
(…)
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Error: error initializing: Looks like “https://kubernetes-charts.storage.googleapis.com” is not a valid chart repository or cannot be reached: Failed to fetch https://kubernetes-charts.storage.googleapis.com/index.yaml : 403 Forbidden
Vermutlich fehlt mir irgend eine Einstellung. Nur welche? Eine Idee?
Gruß Frank