Harbor est un registre de conteneur open source. Vous pouvez déployer l'extension TKG pour le registre Harbor en tant que magasin de registre privé pour les images de conteneur que vous souhaitez déployer sur des clusters Tanzu Kubernetes.

Dépendances de versions de l'extension Harbor

Respectez la configuration minimale requise suivante pour l'installation de l'extension TKG pour le registre Harbor dans un cluster Tanzu Kubernetes provisionné par le Service Tanzu Kubernetes Grid.
Composant Version minimale
vCenter Server

7.0.2.00400

Espace de noms vSphere

0.0.10-18245956

Cluster superviseur

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

Version de Tanzu Kubernetes

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

Configuration requise pour l'extension Harbor

Respectez les conditions préalables suivantes avant de déployer l'extension TKG v1.3.1 pour le registre Harbor.

Conditions requises supplémentaires pour l'extension Harbor

Certaines conditions supplémentaires sont requises avant et après l'installation de l'extension TKG v1.3.1 pour le registre Harbor.
  • L'extension Harbor nécessite une classe de stockage PVC par défaut. Reportez-vous à la section Vérifier les exigences de stockage persistant pour les extensions TKG.
  • L'extension Harbor nécessite une entrée HTTP/S. Plus précisément, les services Harbor sont exposés via un service Envoy dans l'extension Contour. Comme condition préalable, déployez l'extension Contour. Reportez-vous à la section Déployer et gérer l'extension TKG pour l'entrée Contour.
    • Si vous utilisez la mise en réseau NSX-T pour le Cluster superviseur, créez un service Envoy de type LoadBalancer.
    • Si vous utilisez la mise en réseau vSphere vDS pour le Cluster superviseur, créez un service Envoy de type LoadBalancer ou de type NodePort, selon votre environnement et vos exigences.
  • DNS est requis pour l'extension Harbor. Après l'installation, vous devez configurer DNS pour l'extension Harbor.
    • À des fins de test et de vérification, ajoutez les noms de domaine complets Harbor et Notary à votre fichier /etc/hosts local. Les instructions ci-dessous décrivent cette procédure.
    • En production, Harbor nécessite une zone DNS sur un serveur DNS local (tel que BIND) ou sur un cloud public (tel qu'AWS Route 53, Azure DNS ou Google Cloud DNS). Après avoir configuré DNS, pour enregistrer automatiquement les noms de domaine complets Harbor avec un serveur DNS, installez l'extension DNS externe. Reportez-vous à la section Déployer et gérer l'extension TKG pour la découverte de services DNS externes.

Déployer l'extension Harbor

L'extension TKG pour le registre Harbor installe plusieurs conteneurs sur le cluster. Pour plus d'informations, consultez https://goharbor.io/.
Conteneur Type de ressource Réplicas Description
harbor-core Déploiement 1 Serveur de gestion et de configuration pour Envoy
harbor-database Espace 1 Base de données Postgres
harbor-jobservice Déploiement 1 Service de tâche Harbor
harbor-notary-server Déploiement 1 Service Notary Harbor
harbor-notary-signer Déploiement 1 Notary Harbor
harbor-portal Déploiement 1 Interface Web Harbor
harbor-redis Espace 1 Instance Redis Harbor
harbor-registry Déploiement 2 Instance de registre de conteneur Harbor
harbor-trivy Espace 1 Scanner de vulnérabilité de l'image Harbor
Pour installer le registre Harbor à l'aide de l'extension TKG, procédez comme suit.
  1. Vérifiez que vous avez rempli chacune des conditions préalables de l'extension. Reportez-vous aux sections Configuration requise pour l'extension Harbor et Conditions requises supplémentaires pour l'extension Harbor.
  2. Remplacez le répertoire par celui de l'extension Harbor.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
  3. Créez l'espace de noms tanzu-system-registry, ainsi que le compte de service et les rôles Harbor.
    kubectl apply -f namespace-role.yaml
  4. Créez un fichier de valeurs de données Harbor.
    cp harbor-data-values.yaml.example harbor-data-values.yaml
  5. Spécifiez les mots de passe et secrets obligatoires dans harbor-data-values.yaml.
    Le registre Harbor requiert plusieurs mots de passe et secrets répertoriés et décrits dans ce tableau.
    Mot de passe ou secret Description
    harborAdminPassword Mot de passe initial de l'administrateur Harbor.
    secretKey Clé secrète utilisée pour le chiffrement. Doit être une chaîne de 16 caractères.
    database.password Mot de passe initial de la base de données Postgres.
    core.secret Le secret est utilisé lorsque le serveur principal communique avec un autre composant.
    core.xsrfKey Clé XSRF. Doit être une chaîne de 32 caractères.
    jobservice.secret Le secret est utilisé lorsque le service de tâche communique avec un autre composant.
    registry.secret Le secret est utilisé pour sécuriser l'état de chargement du client et du serveur principal de stockage du registre.
    Pour générer automatiquement des mots de passe et des secrets aléatoires et remplir le fichier harbor-data-values.yaml, exécutez la commande suivante :
    bash generate-passwords.sh harbor-data-values.yaml
    En cas de réussite, vous devez voir le message suivant :
    Successfully generated random passwords and secrets in harbor-data-values.yaml

    Ouvrez le fichier harbor-data-values.yaml et vérifiez les mots de passe et secrets obligatoires.

  6. Si nécessaire, spécifiez d'autres valeurs de configuration Harbor dans harbor-data-values.yaml. Les valeurs fréquemment mises à jour peuvent inclure les éléments suivants :
    Champ de configuration Description
    hostname

    Le nom d'hôte Harbor par défaut est core.harbor.domain.

    Si nécessaire, modifiez cette valeur pour qu'elle corresponde à vos besoins.

    port.https

    La valeur par défaut est 443.

    Si vous utilisez la mise en réseau NSX-T pour le Cluster superviseur et par conséquent un service d'entrée Envoy de type LoadBalancer, laissez ce paramètre sur la valeur par défaut de 443.

    Si vous utilisez la mise en réseau vDS pour le Cluster superviseur et par conséquent un service d'entrée Envoy de type NodePort, définissez cette valeur pour correspondre à celle du port de nœud Envoy.

    clair.enabled

    Le scanner d'images Clair a été abandonné en faveur de Trivy. Ils sont cependant tous les deux activés dans le fichier de configuration.

    Désactivez Clair en définissant sa valeur sur false.

    persistence.persistentVolumeClaim. <component>.accessMode

    Il existe plusieurs instances de ce paramètre.

    La valeur par défaut est ReadWriteOnce.

    ReadWriteMany est prévu pour être pris en charge dans une prochaine version.

    imageChartStorage.type

    La valeur par défaut est filesystem.

    Modifiez si nécessaire et configurez le stockage que vous utilisez.

    proxy Si vous le souhaitez, configurez un proxy pour Harbor. Si un proxy est configuré, les valeurs par défaut de noProxy sont requises.
  7. Créez un secret avec les valeurs de données.
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
    secret/harbor-data-values est créé dans l'espace de noms tanzu-system-registry. Vérifiez cela en exécutant la commande suivante :
    kubectl get secrets -n tanzu-system-registry
  8. Déployez l'extension Harbor.
    kubectl apply -f harbor-extension.yaml

    En cas de réussite, vous devez voir app.kappctrl.k14s.io/harbor created.

  9. Vérifiez l'état de l'application Harbor.
    kubectl get app harbor -n tanzu-system-registry
    En cas de réussite, l'état passe de Reconciling à Reconcile succeeded.
    NAME     DESCRIPTION   SINCE-DEPLOY   AGE
    harbor   Reconciling   96s            98s
    NAME     DESCRIPTION           SINCE-DEPLOY   AGE
    harbor   Reconcile succeeded   39s            2m29s
    Si l'état est Reconcile failed, reportez-vous à la section Dépanner le déploiement du registre Harbor.
  10. Affichez des informations détaillées sur l'extension Harbor.
    kubectl get app harbor -n tanzu-system-registry -o yaml
  11. Affichez l'état des objets de déploiement Harbor.
    kubectl get deployments -n tanzu-system-registry

    En cas de réussite, vous devez voir les déploiements suivants :

    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. Affichez l'état des espaces 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. Dépannez l'installation Harbor, si nécessaire. Reportez-vous à la section Dépanner le déploiement du registre Harbor.

Configurer DNS pour Harbor à l'aide d'un service Envoy de type LoadBalancer (mise en réseau NSX-T)

Si le service Envoy requis est exposé via un LoadBalancer, obtenez l'adresse IP externe de l'équilibrage de charge et créez des enregistrements DNS pour les noms de domaine complets Harbor.
  1. Obtenez l'adresse External-IP pour le service Envoy de type LoadBalancer.
    kubectl get service envoy -n tanzu-system-ingress
    Vous devez voir l'adresse External-IP renvoyée, par exemple :
    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
    Vous pouvez également obtenir l'adresse External-IP à l'aide de la commande suivante.
    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
  2. Pour vérifier l'installation de l'extension Harbor, mettez à jour votre fichier /etc/hosts local avec les noms de domaine complets Harbor et Notary mappés à l'adresse External-IP de l'équilibrage de charge, par exemple :
    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. Pour vérifier l'installation de l'extension Harbor, connectez-vous à Harbor. Reportez-vous à la section Se connecter à l'interface Web de Harbor.
  4. Créez deux enregistrements CNAME sur un serveur DNS qui mappent l'adresse External-IP de l'équilibrage de charge du service Envoy aux noms de domaine complets Harbor et Notary.
  5. Installez l'extension DNS externe. Reportez-vous à la section Déployer et gérer l'extension TKG pour la découverte de services DNS externes.

Configurer DNS pour Harbor à l'aide d'un service Envoy de type NodePort (mise en réseau vDS)

Si le service Envoy requis est exposé via un NodePort, obtenez l'adresse IP de machine virtuelle d'un nœud worker et créez des enregistrements DNS pour les noms de domaine complets Harbor.
Note : Pour utiliser NodePort, vous devez avoir spécifié la valeur port.https correcte dans le fichier harbor-data-values.yaml.
  1. Changez de contexte pour utiliser l'Espace de noms vSphere où le cluster est provisionné.
    kubectl config use-context VSPHERE-NAMESPACE
  2. Répertoriez les nœuds du cluster.
    kubectl get virtualmachines
    Vous devez voir les nœuds de cluster, par exemple :
    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. Choisissez l'un des nœuds worker et décrivez-le à l'aide de la commande suivante.
    kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
  4. Localisez l'adresse IP de la machine virtuelle, par exemple Vm Ip: 10.115.22.43.
  5. Pour vérifier l'installation de l'extension Harbor, mettez à jour votre fichier /etc/hosts local avec les noms de domaine complets Harbor et Notary mappés à l'adresse IP du nœud worker, par exemple :
    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. Pour vérifier l'installation de l'extension Harbor, connectez-vous à Harbor. Reportez-vous à la section Se connecter à l'interface Web de Harbor.
  7. Créez deux enregistrements CNAME sur un serveur DNS qui mappent l'adresse IP du nœud worker aux noms de domaine complets Harbor et Notary.
  8. Installez l'extension DNS externe. Reportez-vous à la section Déployer et gérer l'extension TKG pour la découverte de services DNS externes.

Se connecter à l'interface Web de Harbor

Une fois Harbor installé et configuré, connectez-vous et commencez à l'utiliser.
  1. Accédez à l'interface Web du registre Harbor à l'adresse https://core.harbor.domain ou au nom d'hôte que vous avez utilisé.

    Interface Web du registre Harbor.

  2. Connectez-vous à Harbor avec le nom d'utilisateur admin et le mot de passe généré que vous avez placé dans le fichier harbor-data-values.yaml.

    Page de connexion Harbor avec le nom d'utilisateur admin et le mot de passe généré.

  3. Vérifiez que vous pouvez accéder à l'interface utilisateur de Harbor.

    L'onglet Projets de l'interface utilisateur de Harbor s'affiche une fois que vous êtes connecté.

  4. Obtenez le certificat d'autorité de certification Harbor.

    Dans l'interface de Harbor, sélectionnez Projets > Bibliothèque ou créez un Nouveau projet.

    Cliquez sur Certificat de registre et téléchargez le certificat d'autorité de certification Harbor (ca.crt).

  5. Ajoutez le certificat d'autorité de certification Harbor dans le magasin d'approbations du client Docker afin de pouvoir transférer et extraire des images de conteneur vers et depuis le registre Harbor. Reportez-vous à la section Configurer un client Docker avec le certificat de Registre Harbor intégré.
  6. Pour plus d'informations sur l'utilisation de Harbor, reportez-vous à la documentation de Harbor.

Dépanner le déploiement du registre Harbor

En cas d'échec du déploiement ou du rapprochement, exécutez kubectl get pods -n tanzu-system-registry pour afficher l'état de l'espace. Les espaces harbor doivent être à l'état Running. Si l'état de l'espace est ImagePullBackOff ou ImageCrashLoopBackOff, l'image de conteneur n'a pas pu être extraite. Vérifiez l'URL du registre dans les valeurs de données et les fichiers YAML de l'extension, et assurez-vous qu'elles sont correctes.

Vérifiez les journaux du conteneur, où name-XXXX est le nom d'espace unique lorsque vous exécutez kubectl get pods -A :
kubectl logs pod/harbor-XXXXX -c harbor -n tanzu-system-registry

Mettre à jour l'extension Harbor

Mettez à jour l'extension Contour déployée sur un cluster Tanzu Kubernetes.

  1. Obtenez des valeurs de données Harbor à partir du secret.
    kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
    
  2. Mettez à jour les valeurs des données Harbor dans harbor-data-values.yaml.
  3. Mettez à jour le secret des valeurs de données 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'extension Harbor sera rapprochée des nouvelles valeurs de données.
    Note : Par défaut, kapp-controller synchronise les applications toutes les 5 minutes. La mise à jour doit prendre effet en 5 minutes ou moins. Si vous souhaitez que la mise à jour prenne effet immédiatement, modifiez syncPeriod dans harbor-extension.yaml à une valeur inférieure et appliquez l'extension Contour à l'aide de kubectl apply -f harbor-extension.yaml.
  4. Vérifiez l'état de l'extension.
    kubectl get app harbor -n tanzu-system-registry

    L'état de l'application Contour doit être Reconcile Succeeded une fois que celle-ci est mise à jour.

  5. Affichez l'état détaillé et résolvez les problèmes.
    kubectl get app harbor -n tanzu-system-registry -o yaml

Supprimer l'extension Harbor

Supprimez l'extension Harbor d'un cluster Tanzu Kubernetes.

Note : Suivez la procédure dans l'ordre. Ne supprimez pas l'espace de noms Contour et les objets de rôle avant la suppression de l'extension et de l'application Contour. La suppression de l'espace de noms et des objets de rôle Contour supprime le compte de service utilisé par kapp-controller. Si ce compte de service est supprimé avant la suppression de l'application et de l'extension, cela peut entraîner des erreurs système.
  1. Remplacez le répertoire par celui où vous avez téléchargé les fichiers de l'extension Harbor.
    cd /extensions/registry/harbor/
  2. Supprimez l'application Harbor.
    kubectl delete app harbor -n tanzu-system-registry
    Résultat attendu :
    app.kappctrl.k14s.io "harbor" deleted
  3. Vérifiez que l'application Harbor est supprimée.
    kubectl get app Harbor -n tanzu-system-registry
    Résultat attendu : l'application est Not Found.
    apps.kappctrl.k14s.io "harbor" not found
  4. Supprimez l'espace de noms du Registre.
    Ce n'est qu'après avoir confirmé que l'extension et l'application Harbor sont entièrement supprimées que vous pouvez supprimer en toute sécurité l'espace de noms et les objets de rôle.
    kubectl delete -f namespace-role.yaml
    Résultat attendu : l'espace de noms dans lequel Harbor est déployé et les objets de contrôle d'accès basés sur les rôles associés sont supprimés.
    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

Mettre à niveau l'extension Harbor

Si une extension Harbor existante est déployée, vous pouvez la mettre à niveau vers la dernière version.
  1. Obtenez le configmap Harbor.
    kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
    
  2. Supprimez le déploiement Harbor existant. Reportez-vous à la section Supprimer l'extension Harbor.
  3. Déployez l'extension Harbor. Reportez-vous à la section Déployer l'extension Harbor.