Wanneer je gebruik maakt van een Kubernetes-cluster, maak je vroeger of later vaak gebruik van eigen container images. Deze kun je publiekelijk opslaan, of op een eigen container registry hosten.
In deze handleiding laten we zien hoe je een Docker Container Registry deployed op een Kubernetes-cluster en daar je eigen container images naartoe pushed.
- Voor deze handleiding gaan we ervan uit dat je Traefik gebruikt binnen je Kubernetes-cluster, zie onze Traefik-handleiding. Een handig voordeel hiervan is dat je geen aparte loadbalancer hoeft aan te maken én dat Traefik een Let's Encrypt-certificaat verstrekt om de verbinding met je Docker Container Registry te beveiligen.
- In deze handleiding deployen we in de traefik namespace. Mocht je een aparte namespace willen gebruiken, maak die dan aan met kubectl create ns <naam> en voeg die als metadata toe aan alle niet componenten in stap 4, behalve bij de middleware.
Stap 1
Vraag het publieke IP-adres op van je Traefik-installatie op door de status van je services te bekijken met het commando:
kubectl get svc -n traefik
Stel het publieke IP-adres in in je DNS-records voor het subdomein waarop je je Docker-registry wil laten draaien.
Stap 2
Om te kunnen verbinden met je aankomende Docker-Registry heb je een wachtwoord en gebruikersnaam nodig. Genereer een wachtwoord met het commando hieronder, waarbij je 'gebruikersnaam' vervangt door een gebruikersnaam naar keus.
De toevoeging 'tee registry.htpasswd' zorgt ervoor dat de output wordt opgeslagen in een bestand met de naam registry.htpasswd in de huidige directory.
htpasswd -nB gebruikersnaam | tee registry.htpasswd
Je krijgt nu tweemaal een prompt voor een wachtwoord en daarna in de output de gebruikersnaam en het versleutelde wachtwoord:
New password: Re-type new password: gebruikersnaam:$5y$03$zn9rxGHYZBrRY45OT..VDO2oOISfl561Q0kvdDyvuZtlrOKV6KXVe
Stap 3
Maak een 'secret' aan op basis van het zojuist gegenereerde wachtwoord. Hierdoor kan je Docker Registry straks de gebruikersnaam en het wachtwoord uit de vorige stap verifiëren wanneer je er verbinding mee maakt. Vervang eventueel traefik als je voor de installatie van traefik een andere namespace hebt gebruikt.
kubectl create secret generic registry-auth-secret --from-file=users=registry.htpasswd -n traefik
Stap 4
Maak een .yaml deployment file aan voor je Docker Registry:
nano registry-deployment.yaml
Geef het bestand de inhoud hieronder. Vervang registry.jouwdomein.nl door een subdomein naar keuze. Let wel dat het domein in je TransIP-account moet zijn opgenomen, anders kan Traefik er geen Let's Encrypt certificaat aan toekennen.
# registry-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: docker-registry-deployment labels: app: docker-registry spec: replicas: 1 selector: matchLabels: app: docker-registry template: metadata: labels: app: docker-registry spec: volumes: - name: registry-pv-storage persistentVolumeClaim: claimName: registry-pv-claim containers: - name: docker-registry-container image: registry:2 ports: - name: docker-registry containerPort: 5000 volumeMounts: - mountPath: "/var/lib/registry" name: registry-pv-storage --- apiVersion: v1 kind: Service metadata: name: docker-registry spec: ports: - name: http port: 5000 selector: app: docker-registry --- apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: registry-ingress-auth namespace: traefik spec: basicAuth: secret: registry-auth-secret removeHeader: true --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: registry-pv-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: docker-registry-ingress annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/router.tls.certresolver: myresolver traefik.ingress.kubernetes.io/router.middlewares: traefik-registry-ingress-auth@kubernetescrd spec: rules: - host: registry.jouwdomein.nl http: paths: - path: / pathType: Prefix backend: service: name: docker-registry port: number: 5000
Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 5
Deploy je Docker Registry met het commando:
kubectl apply -f registry-deployment.yaml -n traefik
Containers naar je Docker Registry pushen
Om een gecontainerizeerde applicatie naar je Docker Registry te pushen, zijn er drie stappen nodig:
- Verbind met je eigen registry met de gebruikersnaam en wachtwoord uit stap 1 van dit artikel:
docker login registry.jedomein.nl
- Tag je container image met de Harbor registry URL:
docker tag my-image registry.jedomein.nl/my-image
- Push je container image naar de Harbor registry:
docker push registry.jedomein.nl/my-image
Hoe je vervolgens je gecontainerizeerde applicatie deployed leggen we uit in onze handleiding 'Je gecontainerizeerde image deployen in een Kubernetes-cluster'.