Pull through Cache

In diesem Artikel zeige ich wie man einfach einen Pull through Cache für K3D nutzt, um auch beim Löschen eines Clusters vom Caching von größen Images zu profitieren.

K3D

Ein Kubernetes Cluster der mit K3D/K3S aufgebaut ist, der hat ein integriertes Caching für Docker Images die aus einer Registry (docker.io oder quay.io) geladen werden. Solange also der Cluster steht und nicht mit delete gelöscht wird, hält K3D die Images innerhalb der Docker Container weiter vor. Dadurch wird der Netzwerkverkehr gesenkt und auch das erneute Deployen von Anwendungen erfolgt deutlich schneller.

K3D Registries

Seit kurzer Zeit besteht eine komfortable Möglichkeit eine Registry in K3D zu registrieren. Dazu muss man nur eine Registry Konfigurationsdatei angeben. In dieser werden die Parameter für die Konfiguration der Registry übergeben. Der Parameter –registry-config spezifiziert die Konfigurationsdatei.

Der Default registriert K3D den Hostname host.k3d.internal automatisch mit der IP des Hosts, sodass aus dem Cluster dieser hierüber angesprochen werden kann. In dem Beispiel möchte ich die docker.io und quay.io cachen. Trage wir dazu 2 Registries als Mirror in die Konfiguration ein:

mirrors:
  docker.io:
    endpoint:
      - "http://host.k3d.internal:5001"
      - "https://docker.io"
  quay.io:
    endpoint:
      - "http://host.k3d.internal:5002"
      - "https://quay.io"

Wir werden auf den lokalen Ports 5001 und 5002 des Hosts jeweils einen Pull through Cache installieren, sodass diese als Registries innerhalb des Clusters verwendet werden.

Docker Registry V2 und UI

Kommen wir nun zur Installation des Caches. Docker bietet mit dem Registry v2 Image selber eine Lösung hierfür an. Wichtig ist hierbei die Environment Variable REGISTRY_PROXY_REMOTEURL. Über diese kann eine Registry die angegeben werden, diese wird dann geproxied und das ist genau das wir für den Anwendungsfall benötigen.

Als UI kommt die https://github.com/Joxit/docker-registry-ui zum Einsatz. Diese bietet eine einfache UI, um den Inhalt der Registry anzuzeigen. Was in unserem Fall aber vollkommen ausreichend ist. Die UI wird über die Ports 6001 und 6002 analog zu den Registries bereitgestellt. Somit ergibt sich das folgende Dockerfile:

version: '2.0'
services:

#
# docker.io
#
  registry_1:
    image: registry:2.6.2
    ports:
      - 5001:5000
    volumes:
      - ./registry-data_1:/var/lib/registry
    networks:
      - registry-ui-net
    environment:
      REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io

  ui_1:
    image: joxit/docker-registry-ui:static
    ports:
      - 6001:80
    environment:
      - REGISTRY_TITLE=My Private Docker docker.io Registry
      - REGISTRY_URL=http://registry_1:5000
    depends_on:
      - registry_1
    networks:
      - registry-ui-net

#
# quay.io
#
  registry_2:
    image: registry:2.6.2
    ports:
      - 5002:5000
    volumes:
      - ./registry-data_2:/var/lib/registry
    networks:
      - registry-ui-net
    environment:
      REGISTRY_PROXY_REMOTEURL: https://quay.io

  ui_2:
    image: joxit/docker-registry-ui:static
    ports:
      - 6002:80
    environment:
      - REGISTRY_TITLE=My Private Docker Quay.io Registry Cache
      - REGISTRY_URL=http://registry_2:5000
    depends_on:
      - registry_2
    networks:
      - registry-ui-net

networks:
  registry-ui-net:

Registry und UI starten

Der Start ist unspektakulär. Es genügt

docker-compose up -d

um die Container zu starten. Nun steht K3D der Pull through Cache zur Verfügung.