Neuigkeiten von trion.
Immer gut informiert.

Kaniko mit Custom CA Certificates

Kaniko

Damit Kaniko mit einer eigenen Registry verwendet werden kann, die TLS Zertifikate von einer eigenen Certificate Authority (CA) verwendet, wird ein eigenes Kaniko Container-Image benötigt. Wenn darin die passenden Zertifikate enthalten sind, kann Kaniko auf die Registry ohne Probleme zugreifen.

Dieses Beispiel baut auf dem vorherigen Beitrag auf und verwendet daher schon ein spezielles Kaniko Image für ARM Maschinen.

Im Prinzip ist das Vorgehen einfach: Das CA Zertifikat muss den vertrauenswürdigen Zertifikaten im Kaniko Image hinzugefügt werden. Kaniko erwartet die Zertifikate in /kaniko/ssl/certs/ca-certificates.crt, sodass hier ein CA Zertifikat problemlos ergänzt werden kann.

Je nachdem, welche Quelle für das Zertifikat dient, muss es in den Build-Container kopiert werden bzw. aus der Umgebung konfiguriert werden. Im Beispiel wird die Kubernetes CA verwendet, so dass sich das CA Zertifikat in /var/run/secrets/kubernetes.io/serviceaccount/ca.crt befindet.

Das für den Build erforderliche Dockerfile wird als Kubernetes-ConfigMap bereitgestellt.

So sieht der Kubernetes Build-Job als YAML dann aus:

Beispiel für einen Kubernetes Build-Job mit Dockerfile in einer ConfigMap
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kaniko-ca-dockerfile
data:
  Dockerfile: |
      FROM registry.docker-registry:5000/kaniko/executor as origin

      FROM alpine as prepare
      COPY --from=origin /kaniko/ssl/certs/ca-certificates.crt ca-certificates.crt
      COPY serviceaccount/ca.crt ca.crt
      RUN echo "-----BEGIN CERTIFICATE-----" >> ca-add.crt; cat ca.crt >> ca-add.crt; echo "-----END CERTIFICATE-----" >> ca-add.crt; cat ca-add.crt >> ca-certificates.crt

      FROM registry.docker-registry:5000/kaniko/executor
      COPY --from=prepare ca-certificates.crt /kaniko/ssl/certs/ca-certificates.crt
---
apiVersion: batch/v1
kind: Job
metadata:
  name: kaniko-build
  labels:
    run: dind
    name: dind
spec:
  ttlSecondsAfterFinished: 10
  template:
    spec:
      containers:
        -
          image: 'docker:dind'
          name: dind
          args:
            - '--insecure-registry=registry.docker-registry:5000'
          workingDir: /repo
          securityContext:
            privileged: true
          volumeMounts:
            -
              name: cache-volume
              mountPath: /tmp
            -
              name: container-volume
              mountPath: /var/lib/docker
        -
          image: 'docker:dind'
          name: docker
          args:
            - /bin/sh
            - '-c'
            - 'cp -r /var/run/secrets/kubernetes.io/serviceaccount/ .; docker build -f config/Dockerfile -t registry.docker-registry:5000/kaniko/ca-executor .;  docker images; docker push  registry.docker-registry:5000/kaniko/ca-executor; echo "completed"'
          workingDir: /tmp
          env:
            -
              name: DOCKER_HOST
              value: 'tcp://localhost:2375'
          volumeMounts:
            -
              name: cache-volume
              mountPath: /tmp
            -
              name: dockerfile
              readOnly: false
              mountPath: /tmp/config
      volumes:
        -
          name: container-volume
          emptyDir: {}
        -
          name: cache-volume
          emptyDir: {}
        -
          name: dockerfile
          configMap:
            name: kaniko-ca-dockerfile
      restartPolicy: Never

Der Build erfolgt dann dadurch, dass der Job in Kubernetes angelegt wird. Nach erfolgreichem Build kann der Job und die ConfigMap wieder entfernt werden.

Ausführung des Builds
$ kubectl apply -f build.yaml
configmap/kaniko-ca-dockerfile created
job.batch/kaniko-build created
# warten oder Logs verfolgen...
$ kubectl delete -f build.yaml
configmap "kaniko-ca-dockerfile" deleted
job.batch "kaniko-build" deleted

Das so gebaute Image ist nun in der Registry verfügbar und kann für Kaniko-Builds verwendet werden.




Zu den Themen Kubernetes, Docker und Cloud Architektur bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Los geht's!

Bitte teilen Sie uns mit, wie wir Sie am besten erreichen können.