Git Server

Work in Progress

Für das Management der Configs und des Deployments wird ein Git Server gebraucht. Aus Sicherheitsgründen ist es empfehlenswert, selbst einen Git-/CI/CD Server für Kubernetes zu betreiben.

Gitlab

Gitlab liefert eine komplette CI/CD Lösung zusammen mit einem Git-Server. Die Community Version kann man kostenlos nutzen. Für eine Kubernetesumgebung ist daher Gitlab eine sehr gute Lösung. Pakete oder Images kann man
unter https://about.gitlab.com/install/?version=ce finden.

Installation

Sinnvoll ist auch hier die Installation als Container, allerdings möglichst nicht in der Kubernetesumgebung, denn die Git Repositories braucht man insbesondere dann, wenn es im Kubernetes Cluster Fehler gibt und deren Container evtl. nicht lauffähig sind. Für die Infrastrukturkomponenten von Kubernetes lohnt es es sich einen Docker Server als VM einzurichten, so dass diese auch dann zur Verfügung stehen, wenn Kubernetes einmal ausfallen sollte - im Sinne von "Shit happens".

docker-compose.yaml

Sinnvollerweise wird Gitlab mit Docker-Compose hochgezogen.

version: '3.7'

services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
         external_url 'https://git.example.com'
         # Add any other gitlab.rb configuration here, each on its own line
    volumes:
      - './gitdata/config:/etc/gitlab'
      - './gitdata/logs:/var/log/gitlab'
      - './gitdata/data:/var/opt/gitlab'
    extra_hosts:
      - "pgsql:10.5.0.247"
    hostname: 'git.example.com'
    logging:
      driver: json-file
    healthcheck:
      test: ["CMD", "/bin/sh", "-c", "/opt/gitlab/embedded/bin/curl --silent --insecure -f https://127.0.0.1/users/sign_in > /dev/null || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 5
    restart: unless-stopped
    ports:
      - fc00:c01d:c0ff:ee::1:22
      - 172.17.0.1:9022:22
      - 172.17.0.1:9080:80
      - 172.17.0.1:9443:443

Von außen sollte auch Gitlab über eine Web-Application Firewall angesprochen werden. Für interne Verbindungen ist daher selbstsigniertes Zertifikate ausreichend. Die docker-compose.yaml mappt die Gitlab Ports deshalb auf etwas exotische Nummern. Wichtig ist der SSH Port, mit dem sollten die pushs statfinden. Dieser wird via Firewall Regeln nach außen sichtbar gemacht.

Der Host "pgsql" wurde angegeben, weil Gitlab einen externen Postgresql Cluster verwenden soll. Dazu ist allerdings noch eine Anpassung der /etc/gitlab/gitlab.rb notwendig. Wird der interne Postgresql von Gitlab benutzt, dann wird dieser extra_hosts Eintrag nicht gebraucht.

Externe Datenbank

Falls schon ein Postgresql Cluster vorhanden ist, dann kann es sinnvoll sein, diesen auch für Gitlab zu nutzen. Die Anleitung unter https://docs.gitlab.com/ce/administration/postgresql/external.html ist leider nicht ganz vollständig, daher läuft es auf Fehler, wenn man ohne weitere Maßnahmen ausführt. Während der Installation benötigt es Superuser-Rechte, damit die Postgres Extension btree_gist installiert werden kann. Der Postgres User für Gitlab kann wie folgt eingerichtet werden:

create database gitlabhq_production;
create user gitlab with encrypted password '***';
grant all privileges on database gitlabhq_production to gitlab;
alter role gitlab superuser;

...dann gitlab-ctl reconfigure

alter role gitlab nosuperuser;

Danach funktioniert Gitlab auch ohne Superuser-Rechte in Postgresql.