Winkelwagen

    Sorry, we konden geen resultaten vinden voor jouw zoekopdracht.

    Een Docker registry deployen in Kubernetes

    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.


     

    Stap 1

    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 2

    Maak een namespace aan voor je Docker Registry, bijvoorbeeld:

    kubectl create ns docker-registry

     

    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.

    kubectl create secret generic registry-auth-secret --from-file=users=registry.htpasswd -n docker-registry

     

    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
      namespace: docker-registry
      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
      namespace: 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: docker-registry
    spec:
      basicAuth:
        secret: registry-auth-secret
        removeHeader: true
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: registry-pv-claim
      namespace: docker-registry
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: docker-registry-ingress
      namespace: docker-registry
      annotations:
        ingressClassName: 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
    

    Toelichting code

    • Het eerste block van de code gaat specifiek in op de deployment. Raadpleeg onze handleiding 'Een .yaml deployment in Kubernetes maken ' voor gedetailleerde informatie over hoe een deployment via .yaml-bestand is opgebouwd.  
      ---
    • kind:service: Maak een service aan voor de Docker Registry.
    • metadata.name:docker-registry: Naam van de service.
    • metadata.namespace: docker-registry: De namespace waar het component in wordt gedeployed (deze komt vaker terug in het .yaml bestand).
    • spec.ports.name/port: Respectievelijk de naam en het poortnummer die exposed worden.
    • spec.selector.app:docker-registry: De pod waar deze service verkeer naartoe routeert.  
      ---
    • kind: Middleware: Middleware is specifiek voor Traefik en stelt je in staat om verkeer te tweaken voor het naar een service wordt gestuurd.
    • metadata.name: registry-ingress-auth: De naam van de Middleware.
    • spec.basicAuth: Schakel basic authentication in.
    • spec.basicAuth.secret: registry-auth-secret: De secret die je in stap 3 hebt aangemaakt voor authenticatie met je Docker Registry.
    • spec.basicAuth.removeHeader: true: Verwijder de Authorization header na succesvolle authenticatie.  
      ---
    • kind: PersistentVolumeClaim: Een PersistentVolumeClaim (PVC) is heel simpel gezegd een verzoek voor extra schijfruimte waar je deployment gebruik van kan maken om data naar weg te schrijven.
    • metadata.name: registry-pv-claim: De naam van de PersistentVolumeClaim.
    • spec.accessMode: ReadWriteOnce: De PVC kan door één enkele node (maar wel door meerdere pods op die node) met Read Write rechten worden gebruikt.
    • spec.resources.requests:storage: 5Gi: De omvang van de PersistentVolumeClaim. In dit voorbeeld 5 Gibibyte. Je bent vrij om hier G voor gigabyte te gebruiken, zie ook deze pagina voor meer informatie over Gibibytes.  
      ---
    • kind: Ingress: Een API object dat externe toegang beheert tot de services in een cluster, meestal HTTP.
    • metadata.name: docker-registry-ingress: De naam van de Ingress.
    • metadata.annotations: ingressClassName: traefik: Welke Ingress controller gebruikt moet worden om traffic te routeren. In dit geval Traefik.
    • metadata.annotations: traefik.ingress.kubernetes.io/router.tls.certresolver: myresolver: Configureert een (Let's Encrypt) certresolver voor HTTPS traffic.
    • metadata.annotations: traefik.ingress.kubernetes.io/router.middlewares: traefik-registry-ingress-auth@kubernetescrd: Voegt een Middleware-object toe aan de router om authenticatie te verzorgen.
    • spec.rules.host: registry.jouwdomein.nl: Het (sub)domein waarop jouw Docker Registry bereikbaar wordt.
    • spec.rules.http.paths.path.backend.service.name: docker-registry: De service waar verkeer naartoe wordt gerouteerd.
    • spec.rules.http.paths.path.backend.service.port: 5000: De port waar verkeer naartoe gerouteerd wordt.
     
     

    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 

    Alternatief kun je in stap 4 overal de toevoeging namespace: docker-registry verwijderen en het kubectl commando uitvoeren als volgt:

    kubectl apply -f registry-deployment.yaml -n docker-registry

    Het voordeel hiervan is dat je zo hetzelfde .yaml-bestand makkelijker over meerdere namespaces kunt uitrollen door enkel de namespace in het kubectl-commando aan te passen in plaats van die in het .yaml-bestand aan te moeten passen. Aan de andere kant maakt het toevoegen van de namespace in het .yaml-bestand die volledig en overzichtelijk. 


     

    Stap 6

    Je Docker Registry is nu gedeployed! Het duurt maximaal een minuut of twee voor je een publiek IP-adres krijgt. Vraag deze op door de status van je services te bekijken met het commando:

    kubectl get svc -n docker-registry

    Stel het publieke IP-adres in in je DNS-records voor het subdomein uit stap 4. Hierna kan het enige tijd duren (variabel van 5 minuten tot maximaal een uur of twee) voor Traefik een Let's Encrypt certificaat aan je subdomein heeft toegewezen.


     

    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'.

    Kom je er niet uit?

    Ontvang persoonlijke hulp van onze supporters

    Neem contact op