Installazione di Harbor per il registro del servizio

Questo argomento spiega come distribuire Harbor in un cluster del carico di lavoro o in un cluster di servizi condivisi in Tanzu Kubernetes Grid.

Nota

In vSphere with Tanzu è possibile installare Harbor in un supervisore come descritto in Installazione e configurazione di Harbor in un supervisore o installarlo in singoli cluster del carico di lavoro come descritto di seguito.
Poiché i servizi del supervisore sono condivisi, vSphere with Tanzu non supporta la distribuzione di pacchetti in un cluster di servizi condivisi separato.

Notary e Chartmuseum sono obsoleti in Harbor v2.6 e saranno rimossi in una versione futura, come indicato nelle Note di rilascio di Harbor v2.6.0. Gli utenti devono passare a Sigstore Cosign per la firma e la verifica del container.

Harbor

Harbor è un registro di container open source, attendibile e nativo del cloud che archivia, firma e scansiona contenuti. Tanzu Kubernetes Grid include file binari in pacchetto firmati per Harbor, che è possibile distribuire in un cluster del carico di lavoro per fornire i servizi del registro container per tale cluster. Questo pacchetto Harbor estende la distribuzione open source di Docker aggiungendo le funzionalità solitamente richieste dagli utenti quali il controllo e la gestione della sicurezza e dell'identità.

Tanzu Kubernetes Grid include file binari firmati per Harbor, che è possibile distribuire in:

  • Un cluster del carico di lavoro per fornire servizi del registro dei container per tali cluster
  • Un cluster di servizi condivisi per fornire servizi del registro dei container per altri cluster del carico di lavoro, in una distribuzione con un cluster di gestione autonomo.

Quando viene distribuito come servizio condiviso, Harbor è disponibile per tutti i cluster del carico di lavoro gestiti dallo stesso cluster di gestione autonomo. Per implementare Harbor come servizio condiviso, distribuirlo in un cluster specifico dedicato all'esecuzione dei servizi condivisi. Ogni cluster di gestione può avere un solo cluster di servizi condivisi.

Registro Harbor e ExternalDNS

VMware consiglia di installare ExternalDNS insieme al registro Harbor in infrastrutture con bilanciamento del carico, soprattutto negli ambienti di produzione o in altri ambienti in cui la disponibilità di Harbor è importante.

Se l'indirizzo IP del bilanciamento del carico in ingresso cambia, ExternalDNS riprende automaticamente la modifica e mappa nuovamente il nuovo indirizzo al nome host Harbor. Ciò preclude la necessità di mappare manualmente l'indirizzo come descritto in Connessione all'interfaccia utente di Harbor.

Prerequisiti

Preparare un cluster per la distribuzione di Harbor

Per preparare un cluster per la distribuzione di Harbor:

  1. Impostare il contesto di kubectl sul cluster del carico di lavoro o sul cluster di servizi condivisi. Ad esempio:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. Se nel cluster non è già installato il repository dei pacchetti standard, installarlo:

    Nota

    Se si utilizza un cluster basato sul piano (legacy), ignorare questo passaggio. Per i cluster basati sul piano, il repository dei pacchetti tanzu-standard veniva abilitato automaticamente in ogni cluster nello spazio dei nomi tanzu-package-repo-global.

    tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
    

    Dove PACKAGE-REPOSITORY-ENDPOINT è l'URL del repository del pacchetto standard. Per questa versione, l'URL è projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1.

    Vedere Elenco dei repository dei pacchetti per ottenere questo valore dalla CLI di Tanzu oppure in Tanzu Mission Control vedere l'elenco Elementi aggiuntivi (Addons) > Repository (Repositories) nel riquadro Cluster.

  3. Se non è già stato fatto, installare i pacchetti cert-manager e Contour. Per istruzioni, vedere Installazione di Contour per il controllo dell'ingresso.

  4. (Facoltativo) Installare il pacchetto ExternalDNS. Per istruzioni, vedere Installazione di ExternalDNS per l'esplorazione dei servizi.

  5. Procedere con Distribuire Harbor in un cluster di seguito.

Distribuire Harbor in un cluster

Seguire questa procedura per distribuire Harbor in un cluster del carico di lavoro o in un cluster di servizi condivisi:

  1. Confermare che il pacchetto Harbor sia disponibile nel cluster:

    tanzu package available list -A
    
  2. Recuperare la versione del pacchetto disponibile:

    tanzu package available list harbor.tanzu.vmware.com -A
    
  3. Scaricare il pacchetto Harbor dal repository del pacchetto standard:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:PACKAGE-VERSION -o /tmp/harbor-package-PACKAGE-VERSION
    

    Dove PACKAGE-VERSION è la versione del pacchetto elencata nell'elenco tanzu package available list ma con un carattere _ sostituito dal carattere +. Deve inoltre includere il prefisso v. Ad esempio, v2.6.3_vmware.1-tkg.1.

    Ad esempio:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v2.6.3_vmware.1-tkg.1 -o /tmp/harbor-package-v2.6.3_vmware.1-tkg.1
    
    1. Impostare le password e i segreti obbligatori nel file harbor-data-values.yaml eseguendo una delle seguenti operazioni:

      • Per generare automaticamente password e segreti casuali, eseguire:

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.PACKAGE-VERSION -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-PACKAGE-VERSION
        
        cp /tmp/harbor-package-PACKAGE-VERSION/config/values.yaml harbor-data-values.yaml
        
        bash /tmp/harbor-package-PACKAGE-VERSION/config/scripts/generate-passwords.sh harbor-data-values.yaml
        

        Dove PACKAGE-VERSION è la versione del pacchetto Harbor che si desidera installare.

        Ad esempio, per il pacchetto Harbor v2.6.3, eseguire:

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.6.3+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-2.6.3
        bash /tmp/harbor-package-2.6.3/config/scripts/generate-passwords.sh harbor-data-values.yaml
        
      • Per impostare password e segreti personalizzati, aggiornare le voci seguenti nel file harbor-data-values.yaml:

        • harborAdminPassword
        • secretKey
        • database.password
        • core.secret
        • core.xsrfKey
        • jobservice.secret
        • registry.secret
    2. Specificare altre impostazioni nel file harbor-data-values.yaml.

      • Impostare l'impostazione hostname sul nome host da utilizzare per accedere a Harbor. Ad esempio, harbor.yourdomain.com.
      • Per utilizzare i propri certificati, aggiornare le impostazioni tls.crt, tls.key e ca.crt con il contenuto del certificato, della chiave e del certificato CA. Il certificato può essere firmato da un'autorità attendibile o autofirmato. Se si lascia vuoto questo campo, Tanzu Kubernetes Grid genera automaticamente un certificato autofirmato.
      • Se si utilizza lo script generate-passwords.sh, aggiornare facoltativamente la password harborAdminPassword con qualcosa di più semplice da ricordare.
      • Per i valori seguenti il campo non può essere vuoto:

        • storageClass: In persistence.persistentVolumeClaim, per registry, jobservice, database, redis e trivy impostare storageClass su un profilo archivio restituito da kubectl get sc.
        Nota

        Con la classe di storage azure-file non è possibile modificare le autorizzazioni del file system dopo il montaggio del disco a causa di un problema di Azure descritto in Errore "Impossibile modificare le autorizzazioni" durante l'utilizzo dei file di Azure nella documentazione di Azure.

        • pspNames: Impostare pspNames su valori PSP restituiti da kubectl get psp, ad esempio "vmware-system-restricted,vmware-system-privileged".
      • Facoltativamente, aggiornare altre impostazioni persistence per specificare il modo in cui Harbor archivia i dati.

        Se è necessario archiviare una grande quantità di immagini del container in Harbor, impostare persistence.persistentVolumeClaim.registry.size su un numero maggiore.

      Per ulteriori informazioni sui valori nel file harbor-data-values.yaml, eseguire il comando seguente per il cluster di destinazione:

      tanzu package available get harbor.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
      

      Dove AVAILABLE-VERSION è la versione del pacchetto Harbor. Il flag --values-schema recupera la sezione valuesSchema dalla risorsa API Package per il pacchetto Harbor. È possibile impostare il formato di output, --output, per lo schema dei valori su yaml, json o table.

      Ad esempio:

      tanzu package available get harbor.tanzu.vmware.com/2.6.3+vmware.1-tkg.1 --values-schema
      
    3. Rimuovere tutti i commenti nel file harbor-data-values.yaml:

      yq -i eval '... comments=""' harbor-data-values.yaml
      
  4. Installare il pacchetto:

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version AVAILABLE-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace TARGET-NAMESPACE
    

    In cui:

    • TARGET-NAMESPACE è lo spazio dei nomi in cui si desidera installare il pacchetto Harbor. Ad esempio, lo spazio dei nomi my-packages o tanzu-cli-managed-packages.

      • Se il flag --namespace non è specificato, la CLI di Tanzu installa il pacchetto e le relative risorse nello spazio dei nomi default. I pod Harbor e tutte le altre risorse associate al componente Harbor vengono create nello spazio dei nomi tanzu-system-registry; non installare il pacchetto Harbor in questo spazio dei nomi.
      • Lo spazio dei nomi specificato deve essere già stato creato, ad esempio eseguendo kubectl create namespace my-packages.
    • AVAILABLE-PACKAGE-VERSION è la versione recuperata in precedenza.

    Ad esempio:

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version 2.6.3+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    
  5. Se si utilizza ebs.csi.aws.com come storageClass, eseguire una delle operazioni seguenti:

    • Modificare la classe di storage VolumeBoundMode da Immediate a WaitForFirstConsumer.

      • Si tenga presente che questa è un'operazione a livello di cluster che può influire sui servizi oltre che su Harbor.
    • Applicare una patch ad Harbor Scandata Volume EmptyDir overlay come indicato di seguito. Questo overlay rende il volume dei dati di scansione una directory vuota per evitare di influire sulla funzionalità di esportazione dei dati di scansione e causare un conflitto della zona di disponibilità quando il volume jobLog e il volume scandata vengono montati nello stesso pod jobservice:

      1. Creare un file scandata-empty-dir-overlay.yaml contenente il codice Harbor Scandata Volume EmptyDir Overlay seguente.

      2. Creare un segreto generico dall'overlay:

        kubectl -n test  create secret generic scandata-empty-dir-overlay -o yaml --dry-run=client --from-file=scandata-emptyDir-overlay.yaml | kubectl apply -f -
        
      3. Applicare una patch al pacchetto Harbor con il segreto:
        kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
        
      4. Controllare se lo stato del pacchetto è isReconciling:
        kubectl get pkgi harbor -n my-packages
        
      5. Se lo stato del pacchetto non è isReconciling, eliminare i pod Harbor esistenti in modo che vengano ricreati:
        kubectl delete pods --all -n my-packages
        
  6. Verificare che il pacchetto harbor sia stato installato:

    tanzu package installed list -A
    

    Per visualizzare ulteriori dettagli sul pacchetto, è inoltre possibile eseguire:

    tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
    

    Dove PACKAGE-NAMESPACE è lo spazio dei nomi in cui è installato il pacchetto harbor.

  7. Verificare che l'app harbor sia stata riconciliata correttamente in PACKAGE-NAMESPACE:

    kubectl get apps -A
    

    Se lo stato non è Reconcile Succeeded, visualizzare i dettagli completi dello stato dell'app harbor. La visualizzazione dello stato completo può aiutare a risolvere il problema.

    kubectl get app harbor --namespace PACKAGE-NAMESPACE -o yaml
    

    Dove PACKAGE-NAMESPACE è lo spazio dei nomi in cui è stato installato il pacchetto. Se la risoluzione dei problemi non consente di risolvere il problema, è necessario disinstallare il pacchetto prima di installarlo di nuovo:

    tanzu package installed delete harbor --namespace PACKAGE-NAMESPACE
    
  8. Verificare che i servizi Harbor siano in esecuzione elencando tutti i pod nel cluster:

    kubectl get pods -A
    

    Nello spazio dei nomi tanzu-system-registry, i servizi harbor core, database, jobservice, notary, portal, redis, registry e trivy dovrebbero essere in esecuzione in un pod con nomi simili ai seguenti:

    NAMESPACE               NAME                                    READY   STATUS    RESTARTS   AGE
    [...]
    tanzu-system-ingress    contour-6b568c9b88-h5s2r                1/1     Running   0          26m
    tanzu-system-ingress    contour-6b568c9b88-mlg2r                1/1     Running   0          26m
    tanzu-system-ingress    envoy-wfqdp                             2/2     Running   0          26m
    tanzu-system-registry   harbor-core-557b58b65c-4kzhn            1/1     Running   0          23m
    tanzu-system-registry   harbor-database-0                       1/1     Running   0          23m
    tanzu-system-registry   harbor-jobservice-847b5c8756-t6kfs      1/1     Running   0          23m
    tanzu-system-registry   harbor-notary-server-6b74b8dd56-d7swb   1/1     Running   2          23m
    tanzu-system-registry   harbor-notary-signer-69d4669884-dglzm   1/1     Running   2          23m
    tanzu-system-registry   harbor-portal-8f677757c-t4cbj           1/1     Running   0          23m
    tanzu-system-registry   harbor-redis-0                          1/1     Running   0          23m
    tanzu-system-registry   harbor-registry-85b96c7777-wsdnj        2/2     Running   0          23m
    tanzu-system-registry   harbor-trivy-0                          1/1     Running   0          23m
    [...]
    
  9. Ottenere il certificato CA di Harbor dal segreto harbor-tls nello spazio dei nomi tanzu-system-registry:

    kubectl -n tanzu-system-registry get secret harbor-tls -o=jsonpath="{.data.ca\.crt}" | base64 -d
    

    Creare una copia dell'output.

Connettersi all'interfaccia utente di Harbor

L'interfaccia utente di Harbor è esposta tramite del servizio di bilanciamento del carico del servizio Envoy in esecuzione nello spazio dei nomi tanzu-system-ingress nel cluster. Per consentire agli utenti di connettersi all'interfaccia utente di Harbor, è necessario mappare l'indirizzo del bilanciamento del carico del servizio Envoy al nome host del servizio Harbor, ad esempio harbor.yourdomain.com.

  1. Ottenere l'indirizzo del bilanciamento del carico del servizio Envoy.

    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
    

    In vSphere senza NSX Advanced Load Balancer (ALB), il servizio Envoy viene esposto tramite NodePort anziché LoadBalancer, pertanto l'output precedente sarà vuoto ed è possibile utilizzare invece l'indirizzo IP di qualsiasi nodo worker nel cluster. In vSphere con NSX ALB, il servizio Envoy ha un indirizzo IP del bilanciamento del carico simile a 20.54.226.44.

  2. Mappare l'indirizzo del bilanciamento del carico del servizio Envoy con il nome host del servizio Harbor. Per i cluster in esecuzione su vSphere, è necessario aggiungere un IP per la mappatura del nome host in /etc/hosts oppure aggiungere i record A corrispondenti nel server DNS. Ad esempio, se l'indirizzo IP è 10.93.9.100, aggiungere quanto segue a /etc/hosts:

    10.93.9.100 harbor.yourdomain.com notary.harbor.yourdomain.com
    

    Sulle macchine Windows, l'equivalente di /etc/hosts/ è C:\Windows\System32\Drivers\etc\hosts.

Gli utenti possono ora connettersi all'interfaccia utente di Harbor andando in https://harbor.yourdomain.com in un browser Web e accedendo come utente admin con la harborAdminPassword configurata in harbor-data-values.yaml.

Push e pull di immagini da e verso Harbor

Ora che Harbor è configurato, è possibile eseguire il push di immagini per renderle disponibili per il pull del cluster.

  1. Se Harbor utilizza un certificato autofirmato, scaricare il certificato CA di Harbor da https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert e installarlo sulla macchina locale, in questo modo Docker può fidarsi di tale certificato.

    • Su Linux, salvare il certificato come /etc/docker/certs.d/harbor.yourdomain.com/ca.crt.
    • Su macOS, seguire questa procedura.
    • In Windows, fare clic con il pulsante destro del mouse sul file del certificato e scegliere Installa certificato.
  2. Accedere al registro Harbor con l'utente admin. Quando richiesto, immettere la harborAdminPassword impostata quando è stato installato il pacchetto Harbor nel cluster.

    docker login harbor.yourdomain.com -u admin
    
  3. Contrassegnare un'immagine esistente già estratta in locale, ad esempio nginx:1.7.9.

    docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
    
  4. Eseguire il push dell'immagine nel registro Harbor.

    docker push harbor.yourdomain.com/library/nginx:1.7.9
    
  5. Ora è possibile eseguire il pull dell'immagine dal registro Harbor su qualsiasi macchina su cui è installato il certificato CA di Harbor.

    docker pull harbor.yourdomain.com/library/nginx:1.7.9
    

Aggiornamento di una distribuzione Harbor in esecuzione

Se è necessario apportare modifiche alla configurazione del pacchetto Harbor dopo la distribuzione, seguire queste istruzioni per aggiornare il pacchetto Harbor distribuito.

  1. Aggiornare la configurazione Harbor in harbor-data-values.yaml. Ad esempio, è possibile aumentare la quantità di storage del registro aggiornando il valore persistence.persistentVolumeClaim.registry.size.

  2. Aggiornare la configurazione del pacchetto installato:

    tanzu package installed update harbor \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    In cui:

    • INSTALLED-PACKAGE-VERSION è la versione del pacchetto Harbor installato.
    • INSTALLED-PACKAGE-NAMESPACE è lo spazio dei nomi in cui è installato il pacchetto Harbor.

    Ad esempio:

    tanzu package installed update harbor \
    --version 2.6.3+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    

Il pacchetto Harbor sarà riconciliato usando il nuovo valore o i valori aggiunti. L'applicazione delle modifiche da parte di kapp-controller può richiedere fino a cinque minuti.

Per ulteriori informazioni sul comando tanzu package installed update, vedere Aggiornamento di un pacchetto in Installazione e gestione di pacchetti È possibile utilizzare questo comando per aggiornare la versione e la configurazione di un pacchetto installato.

Harbor Scandata Volume EmptyDir Overlay

scandata-empty-dir-overlay.yaml:

#@ load("@ytt:overlay", "overlay")
​
#@overlay/match by=overlay.and_op(overlay.subset({"kind": "Deployment"}), overlay.subset({"metadata": {"name": "harbor-jobservice"}}))
---
spec:
  template:
    spec:
      volumes:
        #@overlay/match by="name"
        #@overlay/remove
        - name: job-scandata-exports
        #@overlay/append
        - name: job-scandata-exports
          emptyDir:
            sizeLimit: 500Mi
check-circle-line exclamation-circle-line close-line
Scroll to top icon