Schritt 1: Sichtbar machen, was der Cluster nach außen zieht
Bevor irgendetwas gespiegelt wird, brauchst du eine vollständige Liste. Erfahrungsgemäß ist sie doppelt so lang wie die Vermutung aus dem Team.
# Steuerungsebene: was kubeadm fuer die eingesetzte Version braucht
kubeadm config images list
# Laufender Cluster: jedes tatsaechlich verwendete Image, ohne Doppelte
kubectl get pods --all-namespaces \
-o jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}{end}{range .spec.initContainers[*]}{.image}{"\n"}{end}{end}' \
| sort -u
# Charts liefern oft Images, die in keinem Manifest im Repo stehen
helm template mein-release ./chart | grep -Eo 'image: *\S+' | sort -uDie dritte Abfrage ist die wichtigste. Sidecars, Init-Container und Webhook-Images tauchen erst beim Rendern des Charts auf. Wer nur die Images aus den eigenen Manifesten spiegelt, hat den halben Bedarf erfasst.
Was ein Standard-Cluster ohne Zutun nach außen ruft
| Komponente | Ziel im Internet | Ersatz in der geschlossenen Zone |
|---|---|---|
| Container-Laufzeit | registry.k8s.io, docker.io, quay.io, ghcr.io | Interne Registry mit Mirror-Eintrag in containerd |
| Helm | Chart-Repositories der Projekte | Charts als OCI-Artefakt in derselben Registry |
| Paketverwaltung der Knoten | Distributionsspiegel im Internet | Eigener Paketspiegel, für Red Hat Satellite oder reposync |
| Signaturprüfung mit cosign | Rekor und Fulcio von Sigstore | Signatur mit eigenem Schlüsselpaar, Prüfung ohne Transparenzlog |
| Schwachstellenscanner | Datenbank-Updates über das Netz | Datenbank als OCI-Artefakt spiegeln, Scanner offline betreiben |
| Zertifikatsverwaltung | ACME-Verzeichnis von Let's Encrypt | Interne Zertifizierungsstelle, ausgerollt über cert-manager |
| Zeitsynchronisation | Öffentliche NTP-Pools | Interne Zeitquelle, sonst scheitern TLS-Verbindungen im Cluster |