Skip to content

Images und Pull-Secrets

Öffentliche Images

Nichts zu konfigurieren. Nenn Image und Tag:

yaml
image: nginx:1.29

Nagel eine echte Version fest, statt latest zu nehmen. Mit latest weißt du nicht, welcher Build läuft, und ein neu gestarteter Pod kann stillschweigend auf einem anderen hochkommen.

Die ITSH-Registry

registry.itsh.dev gehört zu deinem Konto. Repositories und Zugangstoken legst du im Bereich Registry im Portal an, dort steht auch die passende docker login-Zeile.

Im Pfad steht dein Account-Slug, nicht dein Namespace

Image-Pfade lauten registry.itsh.dev/<dein-slug>/<image>:<tag>. Den Wert findest du im Portal im Bereich Registry, dort heißt das Feld Registry-Namespace. Trotz dieses Namens ist es nicht dein Kubernetes-Namespace. Setzt du den ein, bekommst du einen ImagePullBackOff.

Dein Namespace hat dafür meistens schon ein Pull-Secret namens itsh-registry:

bash
kubectl get secret itsh-registry

Es hängt nicht am Standard-ServiceAccount, es zu haben reicht also nicht. Referenzier es im Pod-Template:

yaml
spec:
  imagePullSecrets:
    - name: itsh-registry
  containers:
    - name: myapp
      image: registry.itsh.dev/<dein-slug>/myapp:1.0.0

Wenn das Secret fehlt

Es wird für dich angelegt, aber ohne Wiederholungsversuch, ein Namespace kann also ohne dastehen. Später repariert das nichts. Leg es dann selbst an, mit einem Registry-Token aus dem Portal:

bash
kubectl create secret docker-registry itsh-registry \
  --docker-server=registry.itsh.dev \
  --docker-username='<token-name>' \
  --docker-password='<token>'

Der Name ist egal, solange Pod-Template und Secret zusammenpassen.

Eine andere private Registry

Genau dieselbe Form, nur woandershin gezeigt:

bash
kubectl create secret docker-registry my-registry \
  --docker-server=registry.example.com \
  --docker-username='<user>' \
  --docker-password='<passwort-oder-token>'

Danach referenzierst du my-registry unter imagePullSecrets.

Nimm ein Token oder einen Deploy Key, der nur dieses eine Repository lesen darf, nie ein Passwort mit weiterreichenden Rechten. Das Secret liegt in deinem Namespace, und wer deine Kubeconfig hat, kann es lesen.

Im Free Tier müssen Registries HTTPS sprechen

Ausgehender Traffic ist auf HTTP und HTTPS beschränkt, eine Registry auf einem ungewöhnlichen Port ist also nicht erreichbar. Siehe Free Tier.

Wenn ein Pull scheitert

ImagePullBackOff steht unter Ein Pod startet nicht. Kurz gesagt: kubectl describe pod <name> nennt Registry und Grund, und bei einer privaten Registry ist es fast immer ein fehlendes oder nicht referenziertes Pull-Secret.

Wie es weitergeht