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
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
- Aprovisionar un clúster. Consulte Flujo de trabajo para aprovisionar clústeres de Tanzu Kubernetes mediante la API v1alpha2 de TKGS.
- Conéctese al clúster. Consulte Conectarse a un clúster de Tanzu Kubernetes como usuario de vCenter Single Sign-On.
- Descargar el paquete de extensiones TKG v1.3.1 al host cliente en el que se ejecutan los comandos kubectl.
- Instalar los requisitos previos de las extensiones TKG en el clúster de destino.
Requisitos adicionales de la extensión Harbor
- 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
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 |
- 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.
- Cambie el directorio a la extensión Harbor.
cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
- 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
- Cree un archivo de valores de datos de Harbor.
cp harbor-data-values.yaml.example harbor-data-values.yaml
- 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. 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. - 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. - 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 nombrestanzu-system-registry
. Compruebe que esto es así ejecutando el siguiente comando:kubectl get secrets -n tanzu-system-registry
- Implemente la extensión Harbor.
kubectl apply -f harbor-extension.yaml
Si todo es correcto, debería ver
app.kappctrl.k14s.io/harbor created
. - Compruebe el estado de la aplicación Harbor.
kubectl get app harbor -n tanzu-system-registry
Si es correcto, el estado cambia deReconciling
aReconcile succeeded
.NAME DESCRIPTION SINCE-DEPLOY AGE harbor Reconciling 96s 98s
NAME DESCRIPTION SINCE-DEPLOY AGE harbor Reconcile succeeded 39s 2m29s
Si el estado esReconcile failed
, consulte Solucionar problemas generados en la implementación del registro de Harbor. - Vea los detalles de la extensión Harbor.
kubectl get app harbor -n tanzu-system-registry -o yaml
- 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
- 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
- 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)
- 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ónExternal-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ónExternal-IP
mediante el siguiente comando.kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
- 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ónExternal-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
- 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.
- 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. - 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)
port.https
correcto en el archivo
harbor-data-values.yaml
.
- 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
- 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
- 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
- Busque la dirección IP de la máquina virtual; por ejemplo,
Vm Ip: 10.115.22.43
. - 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
- 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.
- 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.
- 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
- Acceda a la interfaz web del registro de Harbor en https://core.harbor.domain o al nombre de host que utilizó.
- 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
. - Compruebe que puede acceder a la interfaz de usuario de Harbor.
- Obtenga el certificado de CA de Harbor.
En la interfaz de Harbor, seleccione Nuevo proyecto.
o cree unHaga clic en Certificado del registro y descargue el certificado de CA de Harbor (ca.crt).
- 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.
- 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.
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.
- 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
- Actualice los valores de datos de Harbor en
harbor-data-values.yaml
. - 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 desyncPeriod
enharbor-extension.yaml
a un valor menor y aplique la extensión de Contour mediantekubectl apply -f harbor-extension.yaml
. - 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. - 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.
- Cambie el directorio en el que descargó los archivos de la extensión Harbor.
cd /extensions/registry/harbor/
- Elimine la aplicación Harbor.
kubectl delete app harbor -n tanzu-system-registry
Resultado esperado:app.kappctrl.k14s.io "harbor" deleted
- 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 esNot Found
.apps.kappctrl.k14s.io "harbor" not found
- 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
- 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
- Elimine la implementación de Harbor existente. Consulte Eliminar la extensión Harbor.
- Implemente la extensión Harbor. Consulte Implementar la extensión Harbor.