Harbor es un registro de contenedor de código abierto. La extensión TKG se puede implementar para el registro de Harbor como un almacén de registro privado para las imágenes de contenedor que desea implementar en los clústeres de Tanzu Kubernetes.

Dependencias de las versiones de extensión Harbor

Cumpla los siguientes requisitos mínimos de la versión para instalar la extensión TKG del registro Harbor en un clúster de Tanzu Kubernetes aprovisionado por servicio Tanzu Kubernetes Grid.
Componente Versión mínima
vCenter Server

7.0.2.00400

espacio de nombres de vSphere

0.0.10-18245956

clúster supervisor

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

versión de Tanzu Kubernetes

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

Requisitos previos de la extensión Harbor

Cumpla los siguientes requisitos previos antes de implementar la extensión TKG v1.3.1 para el registro de Harbor.

Requisitos adicionales de la extensión Harbor

La extensión TKG v1.3.1 para el registro de Harbor tiene requisitos adicionales que se deben tener en cuenta antes y después de la instalación.
  • La extensión de Harbor requiere de una clase de almacenamiento de PVC predeterminada. Consulte Revisar los requisitos previos de almacenamiento persistente para las extensiones de TKG.
  • La extensión Harbor requiere la entrada de HTTP/S. Específicamente, los servicios Harbor se exponen a través de un servicio Envoy en la extensión Contour. Como requisito previo, implemente la extensión Contour. Consulte Implementar y administrar la extensión TKG para la entrada de Contour.
    • Si utiliza redes de NSX-T para el clúster supervisor, cree un servicio Envoy de tipo LoadBalancer.
    • Si utiliza redes de vSphere vDS para el clúster supervisor, cree un servicio Envoy de tipo LoadBalancer o de tipo NodePort, según cuál sea el entorno y los requisitos.
  • La extensión Harbor requiere de DNS. Después de instalar la extensión Harbor, debe configurar el DNS.
    • Para fines de realización de pruebas y verificación, agregue los FQDN de Harbor y Notary al archivo local /etc/hosts. Las instrucciones que aparecen a continuación describen cómo hacerlo.
    • En la fase de producción, Harbor requiere una zona DNS en un servidor DNS local, como BIND, o en una nube pública, como AWS Route53, Azure DNS o Google CloudDNS. Una vez que haya configurado DNS, instale la extensión DNS externo si desea registrar automáticamente los FQDN de Harbor con un servidor DNS. Consulte Implementar y administrar la extensión TKG para la detección de servicios de DNS externos.

Implementar la extensión Harbor

La extensión TKG del registro de Harbor instala varios contenedores en el clúster. Para obtener más información, consulte https://goharbor.io/.
Contenedor Tipo de recurso Réplicas Descripción
harbor-core Implementación 1 Servidor de administración y configuración para Envoy
harbor-database Pod 1 Base de datos de Postgres
harbor-jobservice Implementación 1 Servicio de trabajo de Harbor
harbor-notary-server Implementación 1 Servicio notarial de Harbor
harbor-notary-signer Implementación 1 Notary de Harbor
harbor-portal Implementación 1 Interfaz web de Harbor
harbor-redis Pod 1 Instancia de Redis de Harbor
harbor-registry Implementación 2 Instancia de registro de contenedor de Harbor
harbor-trivy Pod 1 Escáner de vulnerabilidad de imagen de Harbor
Para instalar el registro de Harbor con la extensión TKG, complete los siguientes pasos.
  1. Asegúrese de haber completado cada uno de los requisitos previos de la extensión. Consulte Requisitos previos de la extensión Harbor y Requisitos adicionales de la extensión Harbor.
  2. Cambie el directorio a la extensión Harbor.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
  3. Cree el espacio de nombres tanzu-system-registry, así como las funciones y la cuenta de servicio de Harbor.
    kubectl apply -f namespace-role.yaml
  4. Cree un archivo de valores de datos de Harbor.
    cp harbor-data-values.yaml.example harbor-data-values.yaml
  5. Especifique las contraseñas y los secretos obligatorios en harbor-data-values.yaml.
    El registro de Harbor requiere varias contraseñas y secretos enumerados y descritos en la tabla.
    Contraseña o secreto Descripción
    harborAdminPassword La contraseña inicial del administrador de Harbor.
    secretKey La clave secreta utilizada para el cifrado. Debe ser una cadena de 16 caracteres.
    database.password La contraseña inicial de la base de datos Postgres.
    core.secret El secreto se utiliza cuando el servidor principal se comunica con otro componente.
    core.xsrfKey La clave XSRF. Debe ser una cadena de 32 caracteres.
    jobservice.secret El secreto se utiliza cuando el servicio de trabajo se comunica con otro componente.
    registry.secret El secreto se utiliza para proteger el estado de carga del back-end de almacenamiento del cliente y del registro.
    Para generar automáticamente contraseñas y secretos aleatorios y rellenar el archivo harbor-data-values.yaml, ejecute el siguiente comando:
    bash generate-passwords.sh harbor-data-values.yaml
    Una vez se realice correctamente, debería ver el siguiente mensaje:
    Successfully generated random passwords and secrets in harbor-data-values.yaml

    Abra el archivo harbor-data-values.yaml y compruebe las contraseñas y los secretos obligatorios.

  6. En caso necesario, especifique otros valores de configuración de Harbor en harbor-data-values.yaml. Los valores más actualizados pueden incluir lo siguiente:
    Campo de configuración Descripción
    hostname

    El nombre de host predeterminado de Harbor es core.harbor.domain.

    Si es necesario, cambie este valor para que coincida con sus requisitos.

    port.https

    El valor predeterminado es 443.

    Si utiliza redes de NSX-T para el clúster supervisor y, por lo tanto, un servicio de entrada Envoy de tipo LoadBalancer, deje esta opción como el valor 443 predeterminado.

    Si utiliza redes de vDS para el clúster supervisor y, por lo tanto, un servicio de entrada Envoy de tipo NodePort, establezca este valor de modo que coincida con el puerto del nodo Envoy.

    clair.enabled

    El escáner de imágenes Clair está en desuso en favor de Trivy. Ambos están habilitados en el archivo de configuración.

    Para deshabilitar Clair, establezca su valor en false.

    persistence.persistentVolumeClaim. <component>.accessMode

    Existen varias instancias de esta configuración.

    El valor predeterminado es ReadWriteOnce.

    ReadWriteMany está programado para ser compatible en una próxima versión.

    imageChartStorage.type

    El valor predeterminado es filesystem.

    Cámbielo si es necesario y configure el almacenamiento que está utilizando.

    proxy Si lo desea, configure un proxy para Harbor. En tal caso, se necesitarán los valores noProxy predeterminados.
  7. Cree un secreto con los valores de datos.
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
    secret/harbor-data-values se crea en el espacio de nombres tanzu-system-registry. Compruebe que esto es así ejecutando el siguiente comando:
    kubectl get secrets -n tanzu-system-registry
  8. Implemente la extensión Harbor.
    kubectl apply -f harbor-extension.yaml

    Si todo es correcto, debería ver app.kappctrl.k14s.io/harbor created.

  9. Compruebe el estado de la aplicación Harbor.
    kubectl get app harbor -n tanzu-system-registry
    Si es correcto, el estado cambia de Reconciling a Reconcile succeeded.
    NAME     DESCRIPTION   SINCE-DEPLOY   AGE
    harbor   Reconciling   96s            98s
    NAME     DESCRIPTION           SINCE-DEPLOY   AGE
    harbor   Reconcile succeeded   39s            2m29s
    Si el estado es Reconcile failed, consulte Solucionar problemas generados en la implementación del registro de Harbor.
  10. Vea los detalles de la extensión Harbor.
    kubectl get app harbor -n tanzu-system-registry -o yaml
  11. Vea el estado de los objetos de implementación de Harbor.
    kubectl get deployments -n tanzu-system-registry

    Si es correcto, debería ver las siguientes implementaciones:

    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. Vea el estado de los pods de 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. Solucione los problemas de la instalación de Harbor, si es necesario. Consulte Solucionar problemas generados en la implementación del registro de Harbor.

Configurar DNS para Harbor mediante un servicio Envoy de tipo LoadBalancer (redes de NSX-T)

Si el servicio Envoy de requisitos previos se expone a través de LoadBalancer, obtenga la dirección IP externa del equilibrador de carga y cree registros de DNS para los FQDN de Harbor.
  1. Obtenga la dirección External-IP para el servicio Envoy de tipo LoadBalancer.
    kubectl get service envoy -n tanzu-system-ingress
    Debería ver la dirección External-IP que se devuelve, por ejemplo:
    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
    Si lo prefiere, puede obtener la dirección External-IP mediante el siguiente comando.
    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
  2. Para comprobar la instalación de la extensión Harbor, actualice el archivo /etc/hosts local con los FQDN de Harbor y Notary asignados a la dirección External-IP del equilibrador de carga; por ejemplo:
    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. Para comprobar la instalación de la extensión Harbor, inicie sesión en Harbor. Consulte Iniciar sesión en la interfaz web de Harbor.
  4. Cree dos registros CNAME en un servidor DNS que asignen la dirección External-IP del servicio Envoy del equilibrador de carga al FQDN de Harbor y al FQDN de Notary.
  5. Instale la extensión DNS externo. Consulte Implementar y administrar la extensión TKG para la detección de servicios de DNS externos.

Configurar DNS para Harbor mediante un servicio Envoy de tipo NodePort (redes de vDS)

Si el servicio Envoy de requisitos previos se expone a través de NodePort, obtenga la dirección IP de la máquina virtual de un nodo de trabajo y cree registros de DNS para los FQDN de Harbor.
Nota: Para usar NodePort, debe haber especificado el valor de port.https correcto en el archivo harbor-data-values.yaml.
  1. Cambie el contexto a la instancia de espacio de nombres de vSphere en la que se aprovisiona el clúster.
    kubectl config use-context VSPHERE-NAMESPACE
  2. Enumere los nodos del clúster.
    kubectl get virtualmachines
    Debería ver los nodos del clúster; por ejemplo:
    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. Seleccione uno de los nodos de trabajo y describa el nodo mediante el siguiente comando.
    kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
  4. Busque la dirección IP de la máquina virtual; por ejemplo, Vm Ip: 10.115.22.43.
  5. Para comprobar la instalación de la extensión Harbor, actualice el archivo /etc/hosts local con los FQDN de Harbor y Notary asignados a la dirección IP del nodo de trabajo; por ejemplo:
    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. Para comprobar la instalación de la extensión Harbor, inicie sesión en Harbor. Consulte Iniciar sesión en la interfaz web de Harbor.
  7. Cree dos registros CNAME en un servidor DNS que asignen la dirección IP del nodo de trabajo al FQDN de Harbor y al FQDN de Notary.
  8. Instale la extensión DNS externo. Consulte Implementar y administrar la extensión TKG para la detección de servicios de DNS externos.

Iniciar sesión en la interfaz web de Harbor

Una vez que Harbor esté instalado y configurado, inicie sesión y comience a utilizarlo.
  1. Acceda a la interfaz web del registro de Harbor en https://core.harbor.domain o al nombre de host que utilizó.

    Interfaz web del registro de Harbor.

  2. Inicie sesión en Harbor con el nombre de usuario admin y la contraseña generada que colocó en el archivo harbor-data-values.yaml.

    La página de inicio de sesión de Harbor con el nombre de usuario admin y la contraseña generada.

  3. Compruebe que puede acceder a la interfaz de usuario de Harbor.

    La pestaña Proyectos de la interfaz de usuario de Harbor aparece después de iniciar sesión.

  4. Obtenga el certificado de CA de Harbor.

    En la interfaz de Harbor, seleccione Proyectos > biblioteca o cree un Nuevo proyecto.

    Haga clic en Certificado del registro y descargue el certificado de CA de Harbor (ca.crt).

  5. Agregue el certificado de CA de Harbor al almacén de confianza del cliente de Docker para poder insertar y extraer imágenes de contenedor al registro de Harbor y desde él. Consulte Configurar un cliente de Docker con un certificado de registro de Harbor integrado.
  6. Consulte la documentación de Harbor para obtener más información sobre el uso de Harbor.

Solucionar problemas generados en la implementación del registro de Harbor

Si se produce un error en la implementación o la reconciliación, ejecute kubectl get pods -n tanzu-system-registry para ver el estado del pod. Los pods de harbor deben tener el estado Running. Si el estado de un pod es ImagePullBackOff o ImageCrashLoopBackOff, no se podrá extraer la imagen del contenedor. Compruebe la URL del registro en los valores de datos y los archivos YAML de extensión, y asegúrese de que sean precisos.

Compruebe los registros del contenedor, en los que name-XXXX es el nombre único del pod cuando ejecuta kubectl get pods -A:
kubectl logs pod/harbor-XXXXX -c harbor -n tanzu-system-registry

Actualizar la extensión Harbor

Actualice la extensión de Contour que está implementada en el clúster de Tanzu Kubernetes.

  1. Obtenga los valores de datos de Harbor del secreto.
    kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
    
  2. Actualice los valores de datos de Harbor en harbor-data-values.yaml.
  3. Actualice el secreto de los valores de datos de 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-
    
    La extensión Harbor se conciliará con los nuevos valores de datos.
    Nota: De forma predeterminada, kapp-controller sincronizará las aplicaciones cada 5 minutos. La actualización debería tener efecto en 5 minutos o menos. Si desea que la actualización se aplique inmediatamente, cambie los valores de syncPeriod en harbor-extension.yaml a un valor menor y aplique la extensión de Contour mediante kubectl apply -f harbor-extension.yaml.
  4. Compruebe el estado de la extensión.
    kubectl get app harbor -n tanzu-system-registry

    El estado de la aplicación Contour debe cambiar a Reconcile Succeeded una vez que Contour se actualice.

  5. Vea el estado detallado y solucione los problemas.
    kubectl get app harbor -n tanzu-system-registry -o yaml

Eliminar la extensión Harbor

Elimine la extensión Harbor de un clúster de Tanzu Kubernetes.

Nota: Complete los pasos en orden. No elimine los objetos de función y espacio de nombres Contour antes de eliminar la aplicación y la extensión Contour. Al eliminar los objetos de función y espacio de nombres Contour, se elimina la cuenta de servicio que utiliza kapp-controller. Si esta cuenta de servicio se elimina antes de eliminar la aplicación y la extensión, se pueden producir errores en el sistema.
  1. Cambie el directorio en el que descargó los archivos de la extensión Harbor.
    cd /extensions/registry/harbor/
  2. Elimine la aplicación Harbor.
    kubectl delete app harbor -n tanzu-system-registry
    Resultado esperado:
    app.kappctrl.k14s.io "harbor" deleted
  3. Compruebe que la aplicación Harbor se haya eliminado.
    kubectl get app Harbor -n tanzu-system-registry
    Resultado esperado: el estado de la aplicación es Not Found.
    apps.kappctrl.k14s.io "harbor" not found
  4. Elimine el espacio de nombres del registro.
    Solo después de confirmar que la aplicación y la extensión Harbor se han eliminado completamente se pueden eliminar de forma segura los objetos de función y espacio de nombres.
    kubectl delete -f namespace-role.yaml
    Resultado esperado: se elimina el espacio de nombres donde está implementado Harbor y los objetos de control de acceso basado en funciones asociados.
    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

Actualizar la extensión Harbor

Si tiene una extensión Harbor existente implementada, puede actualizarla a la versión más reciente.
  1. Obtenga el mapa de configuración de Harbor.
    kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
    
  2. Elimine la implementación de Harbor existente. Consulte Eliminar la extensión Harbor.
  3. Implemente la extensión Harbor. Consulte Implementar la extensión Harbor.