Harbor è un registro di contenitore open source. È possibile distribuire l'estensione TKG per il registro Harbor come archivio registro privato per le immagini del contenitore che si desidera distribuire ai cluster Tanzu Kubernetes.

Dipendenze della versione dell'estensione Harbor

Attenersi ai seguenti requisiti minimi di verifica per l'installazione dell'estensione TKG per il registro Harbor in un cluster Tanzu Kubernetes con provisioning eseguito dal Servizio Tanzu Kubernetes Grid.
Componente Versione minima
vCenter Server

7.0.2.00400

Spazio dei nomi vSphere

0.0.10-18245956

Cluster supervisore

v1.20.2+vmware.1-vsc0.0.10-18245956

Release di Tanzu Kubernetes

v1.20.7+vmware.1-tkg.1.7fb9067

Prerequisiti per l'estensione Harbor

Attenersi ai seguenti prerequisiti prima di distribuire l'estensione TKG v1.3.1 per il registro Harbor.

Requisiti aggiuntivi dell'estensione Harbor

L'estensione TKG v1.3.1 per il registro Harbor presenta requisiti aggiuntivi prima e dopo l'installazione.
  • L'estensione Harbor richiede una classe di storage PVC predefinita. Vedere Rivedere i requisiti di storage permanente per le estensioni TKG.
  • L'estensione Harbor richiede l'ingresso HTTP/S. In particolare, i servizi Harbor sono esposti tramite un servizio Envoy nell'estensione Contour. Come prerequisito, distribuire l'estensione Contour. Vedere Distribuzione e gestione dell'estensione TKG per Contour Ingress.
    • Se si utilizza la rete NSX-T per il Cluster supervisore, creare un servizio Envoy di tipo LoadBalancer.
    • Se si utilizza la rete vDS vSphere per il l'Cluster supervisore, creare un servizio Envoy di tipo LoadBalancer o di tipo NodePort, in base all'ambiente e ai requisiti.
  • L'estensione Harbor richiede DNS. Dopo l'installazione dell'estensione Harbor è necessario configurare il DNS.
    • A scopo di test e verifica, aggiungere FQDN Harbor e Notary al file /etc/hosts locale locale. Le istruzioni seguenti descrivono come eseguire questa operazione.
    • In produzione Harbor richiede una zona DNS su un server DNS locale, come BIND, o su un cloud pubblico, come AWS Route53, Azure DNS o Google CloudDNS. Una volta impostato il DNS, per registrare automaticamente FQDN Harbor con un server DNS, installare l'estensione DNS esterno. Vedere Distribuzione e gestione dell'estensione TKG per l'esplorazione dei servizi DNS esterni.

Distribuzione dell'estensione Harbor

L'estensione TKG per il registro Harbor installa diversi contenitori nel cluster. Per ulteriori informazioni, vedere https://goharbor.io/.
Container Tipo di risorsa Repliche Descrizione
harbor-core Distribuzione 1 Server di gestione e configurazione per Envoy.
harbor-database Pod 1 Database Postgres
harbor-jobservice Distribuzione 1 Servizio di lavoro Harbor
harbor-notary-server Distribuzione 1 Servizio Harbor Notary
harbor-notary-signer Distribuzione 1 Harbor Notary
harbor-portal Distribuzione 1 Interfaccia web di Harbor
harbor-redis Pod 1 Istanza di Harbor Redis
harbor-registry Distribuzione 2 Istanza del registro del contenitore Harbor
harbor-trivy Pod 1 Scanner vulnerabilità delle immagini Harbor
Per installare il registro Harbor utilizzando l'estensione TKG, completare i passaggi seguenti.
  1. Verificare che tutti i prerequisiti dell'estensione siano soddisfatti. Vedere Prerequisiti per l'estensione Harbor e Requisiti aggiuntivi dell'estensione Harbor.
  2. Passare alla directory con l'estensione Harbor.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
  3. Creare lo spazio dei nomi tanzu-system-registry e l'account e ruoli del servizio Harbor.
    kubectl apply -f namespace-role.yaml
  4. Creare un file dei valori dei dati di Harbor.
    cp harbor-data-values.yaml.example harbor-data-values.yaml
  5. Specificare le password e i segreti obbligatori in harbor-data-values.yaml.
    Il registro Harbor richiede diverse password e segreti elencati e descritti nella tabella.
    Password o segreto Descrizione
    harborAdminPassword La password iniziale per l'amministratore di Harbor.
    secretKey Chiave segreta utilizzata per la crittografia. Deve essere una stringa di 16 caratteri.
    database.password Password iniziale per il database Postgres.
    core.secret Il segreto viene utilizzato quando il server core comunica con altri componenti.
    core.xsrfKey Chiave XSRF. Deve essere una stringa di 32 caratteri.
    jobservice.secret Il segreto viene utilizzato quando il servizio dei processi comunica con altri componenti.
    registry.secret Il segreto viene utilizzato per proteggere lo stato di caricamento dal back-end del client e dello storage del registro.
    Per generare automaticamente password e segreti casuali e compilare il file harbor-data-values.yaml, eseguire il comando seguente:
    bash generate-passwords.sh harbor-data-values.yaml
    Al completamento, dovrebbe essere visualizzato il messaggio seguente:
    Successfully generated random passwords and secrets in harbor-data-values.yaml

    Aprire il file harbor-data-values.yaml e verificare le password e i segreti obbligatori.

  6. Specificare altri valori di configurazione di Harbor in harbor-data-values.yaml, se necessario. I valori comunemente aggiornati possono includere quanto segue:
    Campo di configurazione Descrizione
    hostname

    Il nome host Harbor predefinito è core.harbor.domain.

    Se necessario, modificare questo valore in modo che soddisfi i propri requisiti.

    port.https

    Il valore predefinito è 443.

    Se si utilizza la rete NSX-T per il Cluster supervisore, e quindi un servizio di ingresso Envoy di tipo LoadBalancer, lasciare questa impostazione come 443 predefinito.

    Se si utilizza la rete vDS per il Cluster supervisore, e quindi un servizio di ingresso Envoy di tipo NodePort, impostare questo valore su quello corrispondente alla porta del nodo Envoy.

    clair.enabled

    Lo scanner dell'immagine Clair è stato sostituito da Trivy. Entrambi sono abilitati nel file di configurazione.

    Disabilitare Clair impostandone il valore su false.

    persistence.persistentVolumeClaim. <component>.accessMode

    Esistono diverse istanze di questa impostazione.

    Il valore predefinito è ReadWriteOnce.

    ReadWriteMany in programma sarà supportato in una prossima versione.

    imageChartStorage.type

    Il valore predefinito è filesystem.

    Modificare se necessario e configurare lo storage in uso.

    proxy Se desiderato, configurare un proxy per Harbor. Se è configurato un proxy, i valori noProxy predefiniti sono obbligatori.
  7. Creare un segreto con i valori dei dati.
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
    secret/harbor-data-values viene creato nello spazio dei nomi tanzu-system-registry. Verificarlo eseguendo il comando seguente:
    kubectl get secrets -n tanzu-system-registry
  8. Distribuire l'estensione Harbor.
    kubectl apply -f harbor-extension.yaml

    Al completamento, viene visualizzato il messaggio app.kappctrl.k14s.io/harbor created.

  9. Controllare lo stato dell'applicazione Harbor.
    kubectl get app harbor -n tanzu-system-registry
    Al completamento, lo stato passa da Reconciling a Reconcile succeeded.
    NAME     DESCRIPTION   SINCE-DEPLOY   AGE
    harbor   Reconciling   96s            98s
    NAME     DESCRIPTION           SINCE-DEPLOY   AGE
    harbor   Reconcile succeeded   39s            2m29s
    Se lo stato è Reconcile failed, vedere Risoluzione dei problemi relativi alla distribuzione del registro Harbor.
  10. Visualizzare informazioni dettagliate sull'estensione Harbor.
    kubectl get app harbor -n tanzu-system-registry -o yaml
  11. Visualizzare lo stato degli oggetti di distribuzione Harbor.
    kubectl get deployments -n tanzu-system-registry

    Al completamento, dovrebbero essere presenti le seguenti distribuzioni:

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    harbor-core            1/1     1            1           5m16s
    harbor-jobservice      1/1     1            1           5m16s
    harbor-notary-server   1/1     1            1           5m16s
    harbor-notary-signer   1/1     1            1           5m16s
    harbor-portal          1/1     1            1           5m16s
    harbor-registry        1/1     1            1           5m16s
  12. Visualizzare lo stato dei pod Harbor:
    kubectl get pods -n tanzu-system-registry
    NAME                                    READY   STATUS    RESTARTS   AGE
    harbor-core-9cbf4b79d-gxvgx             1/1     Running   0          7m11s
    harbor-database-0                       1/1     Running   0          7m11s
    harbor-jobservice-6b656ccb95-lm47d      1/1     Running   0          7m11s
    harbor-notary-server-8494c684db-gm7jf   1/1     Running   0          7m11s
    harbor-notary-signer-6f96b549d4-dzcnm   1/1     Running   0          7m11s
    harbor-portal-5b8f4ddbd-qdnp2           1/1     Running   0          7m11s
    harbor-redis-0                          1/1     Running   0          7m11s
    harbor-registry-688894c58d-72txm        2/2     Running   0          7m11s
    harbor-trivy-0                          1/1     Running   0          7m11s
  13. Risolvere i problemi relativi all'installazione di Harbor, se necessario. Vedere Risoluzione dei problemi relativi alla distribuzione del registro Harbor.

Configurazione di DNS per Harbor utilizzando un servizio Envoy di tipo LoadBalancer (NSX-T Networking)

Se è stato esposto il servizio Envoy prerequisito tramite un LoadBalancer, ottenere l'indirizzo IP esterno del bilanciamento del carico e creare record DNS per FQDN Harbor.
  1. Ottenere l'indirizzo External-IP per il servizio Envoy di tipo LoadBalancer.
    kubectl get service envoy -n tanzu-system-ingress
    Dovrebbe essere visualizzato l'indirizzo External-IP restituito, ad esempio:
    NAME    TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
    envoy   LoadBalancer   10.99.25.220   10.195.141.17   80:30437/TCP,443:30589/TCP   3h27m
    In alternativa, è possibile ottenere l'indirizzo External-IP utilizzando il comando seguente.
    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
  2. Per verificare l'installazione dell'estensione Harbor, aggiornare il file /etc/hosts locale con i FQDN Harbor e Notary mappati all'indirizzo External-IP del bilanciamento del carico, ad esempio:
    127.0.0.1 localhost
    127.0.1.1 ubuntu
    # TKGS Harbor with Envoy Load Balancer IP
    10.195.141.17 core.harbor.domain
    10.195.141.17 core.notary.harbor.domain
    
  3. Per verificare l'installazione dell'estensione Harbor, accedere a Harbor. Vedere Accedere all'interfaccia Web di Harbor.
  4. Creare due record CNAME su un server DNS che mappa l'indirizzo External-IP del bilanciamento del carico del servizio Envoy al FQDN Harbor e Notary.
  5. Installare l'estensione DNS esterno. Vedere Distribuzione e gestione dell'estensione TKG per l'esplorazione dei servizi DNS esterni.

Configurazione del DNS per Harbor utilizzando un servizio Envoy di tipo NodePort (rete vDS)

Se è stato esposto il servizio Envoy prerequisito tramite NodePort, ottenere l'indirizzo IP della macchina virtuale di un nodo di lavoro e creare record DNS per i FQDN Harbor.
Nota: Per utilizzare NodePort, è necessario aver specificato il valore port.https corretto nel file harbor-data-values.yaml.
  1. Passare al contesto dello Spazio dei nomi vSphere in cui viene eseguito il provisioning del cluster.
    kubectl config use-context VSPHERE-NAMESPACE
  2. Elencare i nodi nel cluster.
    kubectl get virtualmachines
    Dovrebbero essere presenti i nodi del cluster, ad esempio:
    NAME                                            POWERSTATE   AGE
    tkgs-cluster-X-control-plane-6dgln              poweredOn    6h7m
    tkgs-cluster-X-control-plane-j6hq6              poweredOn    6h10m
    tkgs-cluster-X-control-plane-xc25f              poweredOn    6h14m
    tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm   poweredOn    6h12m
    tkgs-cluster-X-workers-9twdr-59bc54dc97-pjptr   poweredOn    6h12m
    tkgs-cluster-X-workers-9twdr-59bc54dc97-t45mn   poweredOn    6h12m
  3. Scegliere uno dei nodi di lavoro e descriverlo utilizzando il comando seguente.
    kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
  4. Individuare l'indirizzo IP della macchina virtuale, ad esempio Vm Ip: 10.115.22.43.
  5. Per verificare l'installazione dell'estensione Harbor, aggiornare il file /etc/hosts locale con i FQDN Harbor e Notary mappati all'indirizzo IP del nodo di lavoro, ad esempio:
    127.0.0.1 localhost
    127.0.1.1 ubuntu
    # TKGS Harbor with Envoy NodePort
    10.115.22.43 core.harbor.domain
    10.115.22.43 core.notary.harbor.domain
    
  6. Per verificare l'installazione dell'estensione Harbor, accedere a Harbor. Vedere Accedere all'interfaccia Web di Harbor.
  7. Creare due record CNAME su un server DNS che mappano l'indirizzo IP del nodo di lavoro ai FQDN Harbor e Notary.
  8. Installare l'estensione DNS esterno. Vedere Distribuzione e gestione dell'estensione TKG per l'esplorazione dei servizi DNS esterni.

Accedere all'interfaccia Web di Harbor

Una volta installato e configurato Harbor, accedere e iniziare a utilizzarlo.
  1. Accedere all'interfaccia web del registro Harbor a https://core.harbor.domain o al nome host usato.

  2. Acceda a Harbor con il nome utente admin e la password generata che è stata inserita nel file del harbor-data-values.yaml.

  3. Assicurarsi di poter accedere all'interfaccia utente di Harbor.

  4. Ottenere il certificato CA di Harbor.

    Nell'interfaccia di Harbor, selezionare Progetti > libreria oppure creare un Nuovo progetto.

    Fare clic su Certificato di registro e scaricare il certificato CA di Harbor (ca.crt).

  5. Aggiungere il certificato CA di Harbor nel trust store del client Docker così da poter inviare ed estrarre immagini del contenitore verso e dal registro Harbor. Vedere Configurazione di un client Docker con il certificato Registro Harbor incorporato.
  6. Fai riferimento alla documentazione di Harbor per i dettagli su come utilizzare Harbor.

Risoluzione dei problemi relativi alla distribuzione del registro Harbor

Se la distribuzione o la riconciliazione non riesce, eseguire kubectl get pods -n tanzu-system-registry per visualizzare lo stato del pod. I pod di harbor devono essere Running. Se lo stato di un pod è ImagePullBackOff o ImageCrashLoopBackOff, non è possibile estrarre l'immagine del container. Controllare l'URL del registro nei valori dei dati e nei file YAML dell'estensione e assicurarsi che sia corretto.

Controllare i registri del container, dove name-XXXX è il nome univoco del pod quando si esegue kubectl get pods -A:
kubectl logs pod/harbor-XXXXX -c harbor -n tanzu-system-registry

Aggiornare l'estensione Harbor

Aggiornare l'estensione Contour che viene distribuita in un cluster di Tanzu Kubernetes.

  1. Recupera i valori dei dati di Harbor dal segreto.
    kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
    
  2. Aggiornare i valori dei dati di Harbor in harbor-data-values.yaml.
  3. Aggiornare il segreto dei valori dei dati di Harbor.
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry -o yaml --dry-run | kubectl replace -f-
    
    L'estensione di Harbor sarà riconciliata con i nuovi valori dei dati.
    Nota: Per impostazione predefinita, kapp-controller sincronizzerà le app ogni 5 minuti. L'aggiornamento dovrebbe essere applicato in 5 minuti al massimo. Se si desidera che l'aggiornamento venga applicato immediatamente, impostare syncPeriod in harbor-extension.yaml su un valore inferiore e applicare l'estensione Contour mediante kubectl apply -f harbor-extension.yaml.
  4. Controllare lo stato dell'estensione.
    kubectl get app harbor -n tanzu-system-registry

    Lo stato dell'app Contour dovrebbe cambiare in Reconcile Succeeded dopo l'aggiornamento di Contour.

  5. Visualizzare lo stato dettagliato e risolvere i problemi.
    kubectl get app harbor -n tanzu-system-registry -o yaml

Eliminazione dell'estensione Harbor

Eliminare l'estensione Harbor da un cluster Tanzu Kubernetes.

Nota: Completare i passaggi nell'ordine indicato. Non eliminare lo spazio dei nomi Contour e gli oggetti ruolo prima che vengano eliminati l'estensione e l'app Contour. Se si elimina lo spazio dei nomi e gli oggetti ruolo Contour, viene eliminato l'account del servizio utilizzato da kapp-controller. L'eliminazione dell'account del servizio prima dell'eliminazione dell'app e dell'estensione può causare errori di sistema.
  1. Passare alla directory in cui sono stati scaricati i file di estensione Harbor.
    cd /extensions/registry/harbor/
  2. Eliminare l'app Harbor.
    kubectl delete app harbor -n tanzu-system-registry
    Risultato previsto:
    app.kappctrl.k14s.io "harbor" deleted
  3. Verificare che l'app Harbor sia eliminata.
    kubectl get app Harbor -n tanzu-system-registry
    Risultato previsto: l'app è Not Found.
    apps.kappctrl.k14s.io "harbor" not found
  4. Eliminare lo spazio dei nomi del registro.
    Solo dopo aver confermato che l'estensione e l'app di Harbor sono state completamente eliminate è possibile eliminare lo spazio dei nomi e gli oggetti ruolo.
    kubectl delete -f namespace-role.yaml
    Risultato previsto: lo spazio dei nomi in cui viene distribuito Harbor e i relativi oggetti di controllo degli accessi in base al ruolo vengono eliminati.
    namespace "tanzu-system-registry" deleted
    serviceaccount "harbor-extension-sa" deleted
    role.rbac.authorization.k8s.io "harbor-extension-role" deleted
    rolebinding.rbac.authorization.k8s.io "harbor-extension-rolebinding" deleted
    clusterrole.rbac.authorization.k8s.io "harbor-extension-cluster-role" deleted
    clusterrolebinding.rbac.authorization.k8s.io "harbor-extension-cluster-rolebinding" deleted

Upgrade dell'estensione Harbor

Se è già stata distribuita un'estensione Harbor, è possibile eseguire l'upgrade alla versione più recente.
  1. Accedere alla mappa di configurazione di Harbor.
    kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
    
  2. Eliminare la distribuzione di Harbor esistente. Vedere Eliminazione dell'estensione Harbor.
  3. Distribuire l'estensione Harbor. Vedere Distribuzione dell'estensione Harbor.