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.
NotaEn 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 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:
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.
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.
kubectl
y las herramientas Carvel. Para obtener instrucciones, consulte Instalar la CLI de Tanzu y otras herramientas para su uso con un supervisor de vSphere with Tanzu o Instalar la CLI de Tanzu y otras herramientas para su uso con clústeres de administración independientes.tanzu login
.Para preparar un clúster para la implementación de Harbor:
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
Si el clúster aún no tiene instalado el repositorio del paquete standard
, instálelo:
NotaSi 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 nombrestanzu-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).
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.
(Opcional) Instale el paquete de ExternalDNS. Para obtener instrucciones, consulte Instalar ExternalDNS para la detección de servicios.
Continúe con Implementar Harbor en un clúster a continuación.
Siga este procedimiento para implementar Harbor en un clúster de carga de trabajo o un clúster de servicios compartidos:
Confirme que el paquete de Harbor esté disponible en el clúster:
tanzu package available list -A
Recupere la versión del paquete disponible:
tanzu package available list harbor.tanzu.vmware.com -A
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
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
Especifique otra configuración en el archivo harbor-data-values.yaml
.
hostname
en el nombre de host que desea utilizar para acceder a Harbor. Por ejemplo, harbor.yourdomain.com
.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.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
.NotaCon 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
Elimine todos los comentarios del archivo harbor-data-values.yaml
:
yq -i eval '... comments=""' harbor-data-values.yaml
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
.
--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.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
Si utiliza ebs.csi.aws.com
como storageClass
, realice una de las siguientes acciones:
Cambie la clase de almacenamiento VolumeBoundMode
de Immediate
a WaitForFirstConsumer
.
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:
Cree un archivo scandata-empty-dir-overlay.yaml
que contenga el código Harbor Scandata Volume EmptyDir Overlay.
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 -
kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
isReconciling
:kubectl get pkgi harbor -n my-packages
isReconciling
, elimine los pods de Harbor existentes para que vuelvan a crear:kubectl delete pods --all -n my-packages
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
.
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
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
[...]
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.
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
.
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
.
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
.
Ahora que Harbor está configurado, puede insertar imágenes en él para que estén disponibles para que el clúster las extraiga.
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.
/etc/docker/certs.d/harbor.yourdomain.com/ca.crt
.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
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
Inserte la imagen en el registro Harbor.
docker push harbor.yourdomain.com/library/nginx:1.7.9
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
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.
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
.
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.
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