CI/CD mit GitlabCI

GitLab mit Kubernetes verbinden

Damit GitLab automatisiert die Pods im Cluster aktualisiert/deployed, muss GitLab mit Kubernetes verbunden werden.

Erstellen der Ressourcen

Für die nachfolgenden Schritte ist es erforderlich, dass Sie sich erfolgreich beim Cluster angemeldet haben und über einen Space verfügen.

  1. Einen Serviceaccount anlegen

    • Erstellen Sie eine Datei mit dem nachfolgenden Inhalt:
      1
      2
      3
      4
      5
      
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: <serviceaccount-name>
        namespace: <space-name>
      
      • Ersetzen Sie das Feld <serviceaccount-name> mit einem Namen für Ihren Serviceaccount. Der Namen wird später noch benötigt, daher merken/notieren Sie sich diesen.
      • Ersetzen Sie das Feld <Space> mit dem Namen des Spaces, indem der Serviceaccount angelegt werden soll.
    • Erstellen Sie den eben beschriebenen Serviceaccount mit dem folgenden Befehl:
      1
      
      kubectl apply -f <Ihre yaml-Datei>
      
  2. Dem Serviceaccount Rechte zu ordnen

    • Erstellen Sie eine Datei mit dem nachfolgenden Inhalt:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: <serviceaccount-name>
        namespace: <space-name>
      subjects:
        - kind: ServiceAccount
          name: <serviceaccount-name>
          namespace: <space-name>
      roleRef:
        kind: ClusterRole
        name: kiosk-space-admin
        apiGroup: rbac.authorization.k8s.io
      
    • Ersetzen die Platzhalter und führen Sie anschließend den folgenden Befehl aus:
      1
      
      kubectl apply -f <Ihre yaml-Datei>
      
  3. Eintragen der Informationen in GitLab

    1. Gehen Sie dafür zu Ihrem Projekt und wählen in der Seitenleiste Infrastructure -> Kubernetes cluster -> Button "Integrate with a cluster certificate" -> Tab "Connect existing cluster".
      Oder klicken Sie auf der Hauptseite Ihres Git-Projektes auf den Button [+] Add Kubernetes cluster -> Tab "Connect existing cluster".

    2. Kubernetes cluster name: Hier können Sie einen beliebigen Namen eintragen. Nehmen Sie z. B. haw-icc

    3. Environment scope: Lassen Sie unverändert (*).

    4. API URL: Führen Sie hier den folgenden Befehl aus und tragen Sie die komplette URL in das Feld ein:

      1
      
      kubectl cluster-info -n <space-name>
      
    5. CA Certificate:
      Die Informationen zum CA Zertifikat sind in dem Secret abgespeichert, welches Sie für ihr Projekt angelegt haben. Siehe Link.
      Eine Liste aller Secrets in Ihrem Namensraum erhalten Sie mit dem folgenden Befehl:

      1
      
      kubectl -n <space-name> get secrets
      

      Mit dem folgenden Befehl erhalten Sie das CA Zertifikat:

      1
      
      kubectl -n <space-name> get secret <Secret Name> -o jsonpath={.data.'ca\.crt'}|base64 --decode
      

      Kopieren Sie die gesamte Antwort, inklusive der -----BEGIN CERTIFICATE----- und -----END CERTIFICATE----- Abschnitte, und fügen Sie diese in das Feld CA Certificate ein.

    6. Service Token:
      Auch die Informationen zum Service Token sind in diesem Secret abgespeichert.

      Mit dem folgenden Befehl erhalten Sie das Service Token:

      1
      
      kubectl -n <space-name> get secret <Secret Name> -o jsonpath={.data.'token'}|base64 --decode
      

      Kopieren Sie die Antwort in das Feld Service Token.

    7. Entfernen Sie die Haken bei den Boxen GitLab-managed cluster und Namespace per environment.

    8. Drücken Sie anschließend auf den Button "Add Kubernetes Cluster", um das Cluster für das Projekt einzutragen.

Einrichten der Pipeline

Wenn Sie ein Docker Image bauen und dieses als Container ausführen, dann enthält das Image eine bestimmte Version Ihres Quellcodes bzw. Ihrer Anwendungen. Wenn Sie Änderungen an Ihrem Quellcode vornehmen, dann müssen Sie anschließend auch Ihr Docker-Image neu bauen, damit dieses die neue Version Ihres Quellcodes enthält. Zudem müssen Sie das neue Image in die Container Registry Ihres Projektes hochladen und anschließend Ihre Anwendung in der ICC neu deployen, damit diese das aktuelle Image für Ihren Container nutzt.

  1. Erstellen Sie eine Datei mit Namen '.gitlab-ci.yml' (beachten Sie den Punkt am Anfang des Namens) im Wurzelverzeichnis Ihrer Anwendung (also auf einer Ebene mit index.php und den anderen YAML Dateien). Gitlab liest diese Datei automatisch aus und erstellt daraus eine Buildpipeline.

  2. Die '.gitlab-ci.yml'-Datei wird für unseren Anwendungsfall zwei Jobs in zwei Stages definieren. Dort bauen wir das Docker Image, taggen und pushen es schließlich in die Container Registry von GitLab. Anschließend wird mittels kubectl apply -f deploy.yaml Ihre Deployment in die ICC durchgeführt. Kopieren Sie dazu den folgenden Inhalt in die zuvor erstelle Datei und achten Sie darauf, dass die Formatierung eingehalten wird.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    # .gitlab-ci.yml
    stages:
      - dockerize
      - deploy
       
    variables:
      DOCKER_TLS_CERTDIR: "/certs"
       
    create_image:
      stage: dockerize
      image: docker:dind
      services:
        - docker:dind
      tags:
        - dind
        - docker
      script:
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
        - docker build -t "$CI_REGISTRY_IMAGE" .
        - docker push "$CI_REGISTRY_IMAGE"
       
    deploy_image:
      stage: deploy
      image: $CI_REGISTRY/icc/kubectl:v1.19.10
      environment:
        name: k8.informatik.haw-hamburg.de
      script:
        - kubectl apply -f deploy.yaml
    
    • Die tags dienen dafür, dass der privilegierte GitLab-Runner für diesen Schritt genutzt wird.
    • Im „script“ Teil führen wir die bekannten Docker Befehle aus.
  3. Committen und pushen Sie die .gitlab-ci.yml nun via Git in Ihr GitLab Repository.

    1
    2
    3
    
    git add .gitlab-ci.yml
    git commit -m "Added GitLab CI YAML - File"
    git push
    
  4. Navigieren Sie im Browser in Ihr Gitlab Projekt und dann auf CI / CD -> Pipelines.
    Sie sollten hier nun eine Darstellung Ihrer Buildpipeline sehen. Mit einem Klick auf das Symbol in der Spalte Stages gelangen Sie zu den Details der jeweiligen Stage. Etwaige Fehler in der Konfiguration werden Sie hier finden. Läuft der Build wie geplant durch, wird die Pipeline grün.