#import "../Helpers/code-snippets.typ": code

== GitLab Runner
Um in Gitlab CI/CD Pipelines Images builden zu können, benötigen wir einen Gitlab Runner. Dieser wird auf dem K3s Cluster installiert und bei Gitlab registriert.

Die minimale Konfiguration haben wir in `gitlab-runner-values.yaml` abgelegt:
#figure(
  code(
    numbers: true,
    caption: "gitlab-runner-values.yaml"
  )[```yaml
  gitlabUrl: 'https://gitlab.diller.gl' # URL zu Gitlab
  runnerToken: 'supersecret' # Token für die Registrierung des Runners bei Gitlab
  ```]
)
Dann haben wir den Gitlab Runner mit Helm installiert:
#code(numbers: true)[```bash
helm repo add gitlab https://charts.gitlab.io
helm repo update
helm install gitlab-diller-runner gitlab/gitlab-runner -n gitlab-diller-runner --create-namespace -f gitlab-runner-values.yaml
```]

Da wir Kubernetes YAML Manifeste in anderen Namespaces, als der Runner läuft, anwenden wollen, mussten wir noch die RBAC Berechtigungen anpassen. Der Runner startet jeweils einen zusätzlichen Concurrent Pods, um die kubectl Befehle auszuführen. Diese Concurent Pods verwenden den Service Account `default` des Namespaces, in dem der Runner läuft. Es gibt leider keine Möglichkeit, einen anderen Service Account zu konfigurieren. Es ist security-technisch nicht optimal, den default Service Account mit weitgehenden Berechtigungen auszustatten, weil andere Pods im selben Namespace diese Berechtigungen missbrauchen könnten. Da der Gitlab Runner aber der einzige Pod in diesem Namespace ist und wir darauf achten, dass das so bleibt, ist das Risiko vertretbar. Deshalb haben wir den Service Account `default` des Namespaces `gitlab-diller-runner` mit den nötigen Berechtigungen ausgestattet:
#figure(
  code(
    numbers: true,
    caption: "gitlab-runner-rbac.yaml"
  )[```yaml
  kind: ClusterRoleBinding
  metadata:
    name: gitlab-runner-cluster-wide-access
  roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: cluster-admin
  subjects:
  - kind: ServiceAccount
    name: default
    namespace: gitlab-diller-runner
  ```]
)
#code(numbers: true)[```bash
kubectl apply -f gitlab-runner-rbac.yaml
```]