Instalar Harbor para el registro de servicios

En este tema se explica cómo implementar Harbor en un clúster de carga de trabajo o un clúster de servicios compartidos en Tanzu Kubernetes Grid.

Nota

En vSphere with Tanzu puede instalar Harbor en un supervisor como se describe en Instalar y configurar Harbor en un supervisor o instalarlo en clústeres de carga de trabajo individuales, como se describe a continuación.
Debido a que los servicios de supervisor son compartidos, vSphere with Tanzu no admite la implementación de paquetes en un clúster de servicios compartidos independiente.

Notary y Chartmuseum han quedado obsoletos en Harbor v2.6 y están programados para eliminarse en una versión futura, como se indica en las notas de la versión de Harbor v2.6.0. Los usuarios deben cambiar a Sigstore Cosign para la verificación y la firma del contenedor.

Harbor

Harbor es un registro de contenedores nativo en la nube, de confianza y de código abierto que almacena, firma y examina contenido. Tanzu Kubernetes Grid incluye archivos binarios, comprimidos y firmados para Harbor que se pueden implementar en un clúster de carga de trabajo para proporcionar servicios de registro de contenedores para ese clúster. El paquete de Harbor amplía la distribución de Docker de código abierto agregando las funcionalidades que suelen requerir los usuarios, como la seguridad, el control de identidades y la administración.

Tanzu Kubernetes Grid incluye archivos binarios firmados para Harbor, que se pueden implementar en:

  • Un clúster de carga de trabajo para proporcionar servicios de registro de contenedores para esos clústeres
  • Un clúster de servicios compartidos, para proporcionar servicios de registro de contenedores para otros clústeres de carga de trabajo, en una implementación con un clúster de administración independiente.

Cuando se implementa como un servicio compartido, Harbor está disponible para todos los clústeres de carga de trabajo administrados por el mismo clúster de administración independiente. Para implementar Harbor como un servicio compartido, debe implementarlo en un clúster especial dedicado a ejecutar servicios compartidos. Cada clúster de administración solo puede tener un clúster de servicios compartido.

Registro de Harbor y ExternalDNS

VMware recomienda instalar ExternalDNS junto con el registro de Harbor en infraestructuras con equilibrio de carga, especialmente en entornos de producción u otros entornos en los que la disponibilidad de Harbor sea importante.

Si cambia la dirección IP del equilibrador de carga de entrada, ExternalDNS selecciona automáticamente el cambio y vuelve a asignar la nueva dirección al nombre de host de Harbor. Esto evita la necesidad de volver a asignar manualmente la dirección como se describe en Conectar a la interfaz de usuario de Harbor.

Requisitos previos

Preparar un clúster para la implementación de Harbor

Para preparar un clúster para la implementación de Harbor:

  1. Establezca el contexto de kubectl al clúster de carga de trabajo o al clúster de servicios compartidos. Por ejemplo:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. Si el clúster aún no tiene instalado el repositorio del paquete standard, instálelo:

    Nota

    Si tiene como objetivo un clúster basado en planes (heredado), omita este paso. Para los clústeres basados en planes, el repositorio de paquetes tanzu-standard se habilita automáticamente en cada clúster, en el espacio de nombres tanzu-package-repo-global.

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

    Donde PACKAGE-REPOSITORY-ENDPOINT es la URL del repositorio de paquetes standard. Para esta versión, la URL es projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1.

    Consulte Repositorios de paquetes de lista para obtener este valor de la CLI de Tanzu, o bien en Tanzu Mission Control, consulte la lista Complementos (Addons) > Repositorios (Repositories) en el panel Clúster (Cluster).

  3. Si aún no lo ha hecho, instale los paquetes cert-manager y Contour. Para obtener instrucciones, consulte Instalar Contour para el control de entrada.

  4. (Opcional) Instale el paquete de ExternalDNS. Para obtener instrucciones, consulte Instalar ExternalDNS para la detección de servicios.

  5. Continúe con Implementar Harbor en un clúster a continuación.

Implementar Harbor en un clúster

Siga este procedimiento para implementar Harbor en un clúster de carga de trabajo o un clúster de servicios compartidos:

  1. Confirme que el paquete de Harbor esté disponible en el clúster:

    tanzu package available list -A
    
  2. Recupere la versión del paquete disponible:

    tanzu package available list harbor.tanzu.vmware.com -A
    
  3. Descargue el paquete de Harbor del repositorio de paquetes standard:

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

    Donde PACKAGE-VERSION es la versión del paquete indicada por tanzu package available list pero con un carácter _ sustituido por el carácter +. También debe incluir el prefijo v. Por ejemplo, v2.6.3_vmware.1-tkg.1.

    Por ejemplo:

    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. Establezca las contraseñas y los secretos obligatorios en el archivo harbor-data-values.yaml mediante una de las siguientes acciones:

      • Para generar automáticamente contraseñas y secretos aleatorios, ejecute:

        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
        

        Donde PACKAGE-VERSION es la versión del paquete de Harbor que desea instalar.

        Por ejemplo, para el paquete de Harbor v2.6.3, ejecute:

        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
        
      • Para establecer sus propias contraseñas y secretos, actualice las siguientes entradas en el archivo harbor-data-values.yaml:

        • harborAdminPassword
        • secretKey
        • database.password
        • core.secret
        • core.xsrfKey
        • jobservice.secret
        • registry.secret
    2. Especifique otra configuración en el archivo harbor-data-values.yaml.

      • Establezca la opción hostname en el nombre de host que desea utilizar para acceder a Harbor. Por ejemplo, harbor.yourdomain.com.
      • Para utilizar sus propios certificados, actualice la configuración tls.crt, tls.key y ca.crt con el contenido del certificado, la clave y el certificado de CA. El certificado puede estar firmado por una entidad de confianza o autofirmado. Si las deja en blanco, Tanzu Kubernetes Grid genera automáticamente un certificado autofirmado.
      • Si utilizó el script de generate-passwords.sh, tiene la opción de actualizar el harborAdminPassword con algo que sea más fácil de recordar.
      • Se requieren valores no vacíos para lo siguiente:

        • storageClass: En persistence.persistentVolumeClaim, para registry, jobservice, database, redis y trivy, establezca storageClass en un perfil de almacenamiento devuelto por kubectl get sc.
        Nota

        Con la clase de almacenamiento azure-file no se pueden cambiar los permisos del sistema de archivos después de montar el disco, debido a un problema de Azure descrito en el error "No se pudieron cambiar los permisos" al utilizar los archivos de Azure en la documentación de Azure.

        • pspNames: Establezca pspNames en los valores de PSP devueltos por kubectl get psp, por ejemplo, "vmware-system-restricted,vmware-system-privileged".
      • De forma opcional, actualice otras opciones persistence para especificar el modo en que Harbor almacena los datos.

        Si necesita almacenar una gran cantidad de imágenes de contenedor en Harbor, establezca persistence.persistentVolumeClaim.registry.size en un número mayor.

      Para obtener más información sobre los valores del archivo harbor-data-values.yaml, ejecute el siguiente comando en el clúster de destino:

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

      Donde AVAILABLE-VERSION es la versión del paquete de Harbor. La marca --values-schema recupera la sección valuesSchema del recurso de API Package para el paquete de Harbor. Puede establecer el formato de salida, --output, para el esquema de valores en yaml, json o table.

      Por ejemplo:

      tanzu package available get harbor.tanzu.vmware.com/2.6.3+vmware.1-tkg.1 --values-schema
      
    3. Elimine todos los comentarios del archivo harbor-data-values.yaml:

      yq -i eval '... comments=""' harbor-data-values.yaml
      
  4. Instale el paquete:

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

    Donde:

    • TARGET-NAMESPACE es el espacio de nombres en el que se desea instalar el paquete de Harbor. Por ejemplo, el espacio de nombres my-packages o tanzu-cli-managed-packages.

      • Si no se especifica la marca --namespace, la CLI de Tanzu instala el paquete y sus recursos en el espacio de nombres default. Los pods de Harbor y cualquier otro recurso asociado con el componente de Harbor se crean en el espacio de nombres tanzu-system-registry; no instale el paquete de Harbor en este espacio de nombres.
      • El espacio de nombres especificado ya debe existir, por ejemplo, al haber ejecutado kubectl create namespace my-packages.
    • AVAILABLE-PACKAGE-VERSION es la versión que recuperó anteriormente.

    Por ejemplo:

    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. Si utiliza ebs.csi.aws.com como storageClass, realice una de las siguientes acciones:

    • Cambie la clase de almacenamiento VolumeBoundMode de Immediate a WaitForFirstConsumer.

      • Tenga en cuenta que se trata de una operación en todo el clúster que puede afectar a otros servicios además de a Harbor.
    • Aplique una revisión a la Superposición Harbor Scandata Volume EmptyDir de la siguiente manera. Esta superposición convierte el volumen scandata en un directorio vacío para evitar que afecte a la funcionalidad de exportación de scandata y provoque un conflicto de zona de disponibilidad cuando los volúmenes jobLog y scandata están montados en el mismo pod de jobservice:

      1. Cree un archivo scandata-empty-dir-overlay.yaml que contenga el código Harbor Scandata Volume EmptyDir Overlay.

      2. Cree un secreto genérico con la superposición:

        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. Aplique una revisión al paquete de Harbor con el secreto:
        kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
        
      4. Compruebe si el estado del paquete es isReconciling:
        kubectl get pkgi harbor -n my-packages
        
      5. Si el estado del paquete no es isReconciling, elimine los pods de Harbor existentes para que vuelvan a crear:
        kubectl delete pods --all -n my-packages
        
  6. Confirme que se haya instalado el paquete harbor:

    tanzu package installed list -A
    

    Para ver más detalles sobre el paquete, también puede ejecutar:

    tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
    

    Donde PACKAGE-NAMESPACE es el espacio de nombres en el que está instalado el paquete harbor.

  7. Confirme que la aplicación harbor se haya conciliado correctamente en su PACKAGE-NAMESPACE:

    kubectl get apps -A
    

    Si el estado no es Reconcile Succeeded, consulte los detalles del estado completo de la aplicación harbor. Ver el estado completo puede ayudarle a solucionar el problema.

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

    Donde PACKAGE-NAMESPACE es el espacio de nombres en el que se instaló el paquete. Si la solución de problemas no le ayuda a solucionar el problema, debe desinstalar el paquete antes de volver a instalarlo:

    tanzu package installed delete harbor --namespace PACKAGE-NAMESPACE
    
  8. Confirme que los servicios de Harbor se estén ejecutando enumerando todos los pods del clúster:

    kubectl get pods -A
    

    En el espacio de nombres tanzu-system-registry, debería ver los servicios harbor core, database, jobservice, notary, portal, redis, registry y trivy que se ejecutan en un pod con nombres similares a los siguientes:

    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. Obtenga el certificado de CA de Harbor del secreto harbor-tls en el espacio de nombres tanzu-system-registry:

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

    Haga una copia de la salida.

Conectarse a la interfaz de usuario de Harbor

La interfaz de usuario de Harbor se expone a través del equilibrador de carga del servicio Envoy que se ejecuta en el espacio de nombres tanzu-system-ingress en el clúster. Para permitir que los usuarios se conecten a la interfaz de usuario de Harbor, debe asignar la dirección del equilibrador de carga del servicio Envoy al nombre de host del servicio de Harbor, por ejemplo, harbor.yourdomain.com.

  1. Obtenga la dirección del equilibrador de carga del servicio Envoy.

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

    En vSphere sin NSX Advanced Load Balancer (ALB), el servicio Envoy se expone a través de NodePort en lugar de LoadBalancer, por lo que el resultado anterior estará vacío y, en su lugar, puede utilizar la dirección IP de cualquier nodo de trabajador del clúster. En vSphere con NSX ALB, el servicio Envoy tiene una dirección IP de equilibrador de carga similar a 20.54.226.44.

  2. Asigne la dirección del equilibrador de carga del servicio Envoy al nombre de host del servicio de Harbor. Para los clústeres que se ejecutan en vSphere, debe agregar una asignación de IP al nombre de host en /etc/hosts o agregar los registros A correspondientes en el servidor DNS. Por ejemplo, si la dirección IP es 10.93.9.100, agregue lo siguiente a /etc/hosts:

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

    En máquinas Windows, el equivalente a /etc/hosts/ es C:\Windows\System32\Drivers\etc\hosts.

Los usuarios ahora pueden conectarse a la interfaz de usuario de Harbor si acceden a https://harbor.yourdomain.com en un navegador web e inician sesión como usuario admin con el harborAdminPassword que configuró en harbor-data-values.yaml.

Insertar y extraer imágenes desde y hacia Harbor

Ahora que Harbor está configurado, puede insertar imágenes en él para que estén disponibles para que el clúster las extraiga.

  1. Si Harbor utiliza un certificado autofirmado, descargue el certificado de CA de Harbor desde https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert e instálelo en la máquina local, de modo que Docker pueda confiar en este certificado de CA.

    • En Linux, guarde el certificado como /etc/docker/certs.d/harbor.yourdomain.com/ca.crt.
    • En macOS, siga este procedimiento.
    • En Windows, haga clic con el botón secundario en el archivo de certificado y seleccione Instalar certificado.
  2. Inicie sesión en el registro de Harbor con el usuario admin. Cuando se le solicite, introduzca el harborAdminPassword que estableció al instalar el paquete de Harbor en el clúster.

    docker login harbor.yourdomain.com -u admin
    
  3. Etiquete una imagen existente que ya haya extraído localmente, por ejemplo, nginx:1.7.9.

    docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
    
  4. Inserte la imagen en el registro Harbor.

    docker push harbor.yourdomain.com/library/nginx:1.7.9
    
  5. Ahora puede extraer la imagen del registro de Harbor en cualquier equipo en el que esté instalado el certificado de CA de Harbor.

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

Actualizar una implementación de Harbor en ejecución

Si necesita realizar cambios en la configuración del paquete de Harbor después de la implementación, siga estos pasos para actualizar el paquete de Harbor implementado.

  1. Actualice la configuración de Harbor en harbor-data-values.yaml. Por ejemplo, puede aumentar la cantidad de almacenamiento del registro actualizando el valor persistence.persistentVolumeClaim.registry.size.

  2. Actualiza la configuración del paquete instalado:

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

    Donde:

    • INSTALLED-PACKAGE-VERSION es la versión del paquete de Harbor instalado.
    • INSTALLED-PACKAGE-NAMESPACE es el espacio de nombres en el que se instala el paquete de Harbor.

    Por ejemplo:

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

El paquete de Harbor se conciliará con el nuevo valor o los valores que agregó. kapp-controller puede tardar hasta cinco minutos en aplicar los cambios.

Para obtener más información sobre el comando tanzu package installed update, consulte Actualizar un paquete en Instalar y administrar paquetes. Puede usar este comando para actualizar la versión y la configuración de un paquete instalado.

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