O Harbor é um registro de contêiner de código aberto. Você pode implantar a Extensão TKG para o Harbor Registry como um repositório de registro privado para as imagens de contêiner que deseja implantar nos clusters do Tanzu Kubernetes.

Dependências da versão do Harbor Extension

Siga os seguintes requisitos de verificação mínimos para instalar a extensão TKG para o registro do Harbor em um cluster Tanzu Kubernetes provisionado pelo Tanzu Kubernetes Grid Service.
Componente Versão mínima
vCenter Server

7.0.2.00400

vSphere Namespace

0.0.10-18245956

Supervisor Cluster

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

Tanzu Kubernetes release

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

Pré-requisitos de extensão do Harbor

Siga os seguintes pré-requisitos antes de implantar a extensão TKG v1.3.1 para o Harbor Registry.

Requisitos adicionais do Harbor Extension

A extensão TKG v1.3.1 para o Harbor Registry tem requisitos adicionais de pré e pós-instalação.
  • A extensão Harbor requer uma classe de armazenamento de PVC padrão. Consulte o Revise os requisitos de armazenamento persistente para extensões TKG.
  • A extensão Harbor requer entrada HTTP / S. Especificamente, os serviços Harbor são expostos por meio de um serviço Envoy na extensão Contour. Como pré-requisito, implante a extensão Contour. Consulte o Implantar e gerenciar a extensão TKG para o Contour Ingress.
    • Se você estiver usando a rede NSX-T para o Supervisor Cluster, crie um serviço de Envoy do tipo LoadBalancer.
    • Se você estiver usando a rede vSphere vDS para o Supervisor Cluster, crie um serviço de Envoy do tipo LoadBalancer ou do tipo NodePort, dependendo do seu ambiente e dos requisitos.
  • A extensão Harbor requer DNS. Após a instalação da extensão Harbor, você precisa configurar o DNS.
    • Para fins de teste e verificação, adicione os FQDNs do Harbor e do Notário ao seu arquivo local / etc / hosts . As instruções abaixo descrevem como fazer isso.
    • Na produção, o Harbor requer uma zona DNS em um servidor DNS local, como BIND, ou em uma nuvem pública, como AWS Route53, Azure DNS ou Google CloudDNS. Depois de configurar o DNS, para registrar automaticamente os FQDNs do Harbor com um servidor DNS, instale a extensão de DNS externo. Consulte o Implantar e gerenciar a extensão TKG para descoberta de serviço de DNS externo.

Implantar a extensão Harbor

A extensão TKG para o Harbor Registry instala vários contêineres no cluster. Para obter mais informações, consulte https://goharbor.io/.
Container Tipo de Recurso Réplicas Descrição
harbor-core Implantação 1 Servidor de gerenciamento e configuração para o Envoy
harbor-database Pod 1 banco de dados Postgres
harbor-jobservice Implantação 1 Serviço de trabalho do Harbor
harbor-notary-server Implantação 1 Serviço notarial do porto
harbor-notary-signer Implantação 1 Tabelião do porto
harbor-portal Implantação 1 Interface da web do Harbor
harbor-redis Pod 1 Instância de redis do Harbor
harbor-registry Implantação 2 Instância de registro de contêiner do Harbor
harbor-trivy Pod 1 Scanner de vulnerabilidade de imagem Harbor
Para instalar o Harbor Registry usando a extensão TKG, conclua as seguintes etapas.
  1. Verifique se você concluiu cada um dos pré-requisitos de extensão. Consulte Pré-requisitos de extensão do Harbor e Requisitos adicionais do Harbor Extension.
  2. Altere o diretório para a extensão Harbor.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
  3. Crie o namespace tanzu-system-registry e a conta de serviço e as funções do Harbor.
    kubectl apply -f namespace-role.yaml
  4. Crie um arquivo de valores de dados Harbor.
    cp harbor-data-values.yaml.example harbor-data-values.yaml
  5. Especifique as senhas e os segredos obrigatórios em harbor-data-values.yaml.
    O Harbor Registry requer várias senhas e segredos listados e descritos na tabela.
    Senha ou segredo Descrição
    harborAdminPassword A senha inicial para o administrador do Harbor.
    secretKey A chave secreta usada para criptografia. Deve ser uma cadeia de 16 caracteres.
    database.password A senha inicial para o banco de dados Postgres.
    core.secret O segredo é usado quando o servidor núcleo se comunica com outro componente.
    core.xsrfKey A chave XSRF. Deve ser uma cadeia de caracteres de 32 caracteres.
    jobservice.secret O segredo é usado quando o serviço de trabalho se comunica com outro componente.
    registry.secret O segredo é usado para proteger o estado de carregamento do back-end de armazenamento do registro e do cliente.
    Para gerar automaticamente senhas e segredos aleatórios e preencher o arquivo harbor-data-values.yaml, execute o seguinte comando:
    bash generate-passwords.sh harbor-data-values.yaml
    Em caso de sucesso, você deve ver a seguinte mensagem:
    Successfully generated random passwords and secrets in harbor-data-values.yaml

    Abra o arquivo harbor-data-values.yaml e verifique as senhas e os segredos obrigatórios.

  6. Especifique outros valores de configuração do Harbor em harbor-data-values.yaml, se necessário. Os valores normalmente atualizados podem incluir o seguinte:
    Campo de configuração Descrição
    hostname

    O nome de host padrão do Harbor é core.harbor.domain.

    Se necessário, altere esse valor para corresponder aos seus requisitos.

    port.https

    O padrão é 443.

    Se você estiver usando a rede NSX-T para o Supervisor Cluster e, portanto, um serviço de entrada do Envoy do tipo LoadBalancer, deixe essa configuração como o 443 padrão.

    Se você estiver usando a rede vDS para o Supervisor Cluster e, portanto, um serviço de entrada do Envoy do tipo NodePort, defina esse valor para corresponder à porta do nó do Envoy.

    clair.enabled

    O scanner de imagem Clair está obsoleto em favor do Trivy. Ambos estão habilitados no arquivo de configuração.

    Desative o Clair definindo seu valor como false.

    persistence.persistentVolumeClaim. <component>.accessMode

    Existem várias instâncias dessa configuração.

    O padrão é ReadWriteOnce.

    ReadWriteMany está agendado para ter suporte em uma versão futura.

    imageChartStorage.type

    O padrão é filesystem.

    Altere se necessário e configure o armazenamento que você está usando.

    proxy Se desejar, configure um proxy para o Harbor. Se um proxy estiver configurado, os valores padrão de noProxy serão necessários.
  7. Crie um segredo com os valores de dados.
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
    O secret/harbor-data-values é criado no namespace tanzu-system-registry. Verifique isso executando o seguinte comando:
    kubectl get secrets -n tanzu-system-registry
  8. Implante a extensão Harbor.
    kubectl apply -f harbor-extension.yaml

    Se for bem-sucedido, você verá app.kappctrl.k14s.io/harbor created.

  9. Verifique o status do aplicativo Harbor.
    kubectl get app harbor -n tanzu-system-registry
    Em caso de sucesso, o status muda de Reconciling para Reconcile succeeded.
    NAME     DESCRIPTION   SINCE-DEPLOY   AGE
    harbor   Reconciling   96s            98s
    NAME     DESCRIPTION           SINCE-DEPLOY   AGE
    harbor   Reconcile succeeded   39s            2m29s
    Se o status for Reconcile failed, consulte Solução de problemas de implantação do Harbor Registry.
  10. Visualize informações detalhadas sobre a extensão Harbor.
    kubectl get app harbor -n tanzu-system-registry -o yaml
  11. Visualize o status dos objetos de implantação do Harbor.
    kubectl get deployments -n tanzu-system-registry

    Em caso de sucesso, você deve ver as seguintes implantações:

    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. Visualize o status dos pods do 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 problemas de instalação do Harbor, se necessário. Consulte o Solução de problemas de implantação do Harbor Registry.

Configurar o DNS para o Harbor usando um serviço de envio do tipo LoadBalancer (NSX-T rede)

Se o serviço de pré-requisito do Envoy for exposto por meio de um LoadBalancer, obtenha o endereço IP externo do balanceador de carga e crie registros DNS para os FQDNs do Harbor.
  1. Obtenha o endereço External-IP para o serviço de Envoy do tipo LoadBalancer.
    kubectl get service envoy -n tanzu-system-ingress
    Você deve ver o endereço External-IP retornado, por exemplo:
    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
    Como alternativa, você pode obter o endereço External-IP usando o seguinte comando.
    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
  2. Para verificar a instalação da extensão Harbor, atualize o arquivo /etc/hosts local com os FQDNs Harbor e Notary mapeados para o endereço External-IP do balanceador de carga, por exemplo:
    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 verificar a instalação da extensão Harbor, faça login no Harbor. Consulte o Faça login na interface da Web do Harbor.
  4. Crie dois registros CNAME em um servidor DNS que mapeiam o endereço do Balanceador de Carga do serviço Envoy External-IP para o FQDN do Harbor e o FQDN do Notário.
  5. Instale a extensão de DNS externo. Consulte o Implantar e gerenciar a extensão TKG para descoberta de serviço de DNS externo.

Configurar o DNS para o Harbor usando um serviço de envio do tipo NodePort (rede vDS)

Se o serviço de pré-requisito do Envoy for exposto por meio de uma NodePort, obtenha o endereço IP da máquina virtual de um nó de trabalhador e crie registros DNS para os FQDNs do Harbor.
Observação: Para usar o NodePort, você deve ter especificado o valor correto de port.https no arquivo harbor-data-values.yaml.
  1. Alterne o contexto para o vSphere Namespace onde o cluster está provisionado.
    kubectl config use-context VSPHERE-NAMESPACE
  2. Liste os nós no cluster.
    kubectl get virtualmachines
    Você deve ver os nós do cluster, por exemplo:
    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. Escolha um dos nós de trabalhador e descreva-o usando o seguinte comando.
    kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
  4. Localize o endereço IP da máquina virtual, por exemplo, Vm Ip: 10.115.22.43.
  5. Para verificar a instalação da extensão Harbor, atualize o arquivo /etc/hosts local com os FQDNs do Harbor e do Notário mapeados para o endereço IP do nó do trabalhador, por exemplo:
    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 verificar a instalação da extensão Harbor, faça login no Harbor. Consulte o Faça login na interface da Web do Harbor.
  7. Crie dois registros CNAME em um servidor DNS que mapeie o endereço IP do nó do trabalhador para o FQDN do Harbor e o FQDN do Notário.
  8. Instale a extensão de DNS externo. Consulte o Implantar e gerenciar a extensão TKG para descoberta de serviço de DNS externo.

Faça login na interface da Web do Harbor

Depois que o Harbor estiver instalado e configurado, faça login e comece a usá-lo.
  1. Acesse a interface da web do Harbor Registry em https://core.harbor.domain ou o nome do host que você usou.

  2. Faça login no Harbor com o nome de usuário admin e a senha gerada que você colocou no arquivo harbor-data-values.yaml.

  3. Verifique se você pode acessar a interface de usuário do Harbor.

  4. Obtenha o certificado Harbor CA.

    Na interface do Harbor, selecione Projects (Projects) > library (library) ou crie um New Project .

    Clique em Registry Certificate (Registry Certificate) e baixe o certificado Harbor CA ( ca.crt ).

  5. Adicione o certificado da autoridade de certificação Harbor no armazenamento confiável do cliente Docker para que você possa enviar e receber imagens de contêiner de e para o Harbor Registry. Consulte o Configurar um cliente Docker com o certificado Harbor Registry incorporado.
  6. Consulte a documentação do Harbor para obter detalhes sobre como usar o Harbor.

Solução de problemas de implantação do Harbor Registry

Se a implantação ou a reconciliação falhar, execute kubectl get pods -n tanzu-system-registry para exibir o status do pod. Os pods de harbor devem ser Running. Se um status de pod for ImagePullBackOff ou ImageCrashLoopBackOff, a imagem do contêiner não poderá ser extraída. Verifique a URL do registro nos valores de dados e nos arquivos YAML de extensão e certifique-se de que eles sejam precisos.

Verifique os logs do contêiner, onde name-XXXX é o nome do pod exclusivo quando você executa kubectl get pods -A:
kubectl logs pod/harbor-XXXXX -c harbor -n tanzu-system-registry

Atualizar a extensão Harbor

Atualize a extensão Contour que é implantada em um cluster do Tanzu Kubernetes.

  1. Obter valores de dados Harbor do segredo.
    kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
    
  2. Atualize os valores de dados do Harbor em harbor-data-values.yaml.
  3. Atualize o segredo dos valores de dados do 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-
    
    A extensão Harbor será reconciliada com os novos valores de dados.
    Observação: Por padrão, o kapp-controller sincronizará os aplicativos a cada 5 minutos. A atualização deve entrar em vigor em 5 minutos ou menos. Se você quiser que a atualização entre em vigor imediatamente, altere syncPeriod em harbor-extension.yaml para um valor menor e aplique a extensão Contour usando kubectl apply -f harbor-extension.yaml.
  4. Verifique o status da extensão.
    kubectl get app harbor -n tanzu-system-registry

    O status do aplicativo Contour deve mudar para Reconcile Succeeded assim que o Contour for atualizado.

  5. Visualize o status detalhado e solucione problemas.
    kubectl get app harbor -n tanzu-system-registry -o yaml

Excluir a extensão Harbor

Exclua a extensão Harbor de um cluster Tanzu Kubernetes.

Observação: Conclua as etapas em ordem. Não exclua o namespace Contour e os objetos de função antes que a extensão do Contour e o aplicativo sejam excluídos. Excluir o namespace Contour e os objetos de função exclui a conta de serviço usada pelo kapp-controller. Se essa conta de serviço for excluída antes que o aplicativo e a extensão sejam excluídos, isso pode levar a erros do sistema.
  1. Altere o diretório para onde você baixou os arquivos de extensão Harbor.
    cd /extensions/registry/harbor/
  2. Exclua o aplicativo Harbor.
    kubectl delete app harod -n tanzu-system-registry
    Resultado esperado:
    app.kappctrl.k14s.io "harbor" deleted
  3. Verifique se o aplicativo Harbor foi excluído.
    kubectl get app Harbor -n tanzu-system-registry
    Resultado esperado: o aplicativo é Not Found.
    apps.kappctrl.k14s.io "harbor" not found
  4. Exclua o namespace do Registro.
    Somente depois de ter confirmado que a extensão Harbor e o aplicativo foram totalmente excluídos é seguro excluir os objetos de namespace e de função.
    kubectl delete -f namespace-role.yaml
    Resultado esperado: o namespace onde o Harbor é implantado e os objetos de controle de acesso baseados em função associados são excluídos.
    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

Atualizar a extensão Harbor

Se você tiver uma extensão Harbor existente implantada, poderá atualizá-la para a versão mais recente.
  1. Obtenha o mapa de configuração do Harbor.
    kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
    
  2. Exclua a implantação do Harbor existente. Consulte o Excluir a extensão Harbor.
  3. Implante a extensão Harbor. Consulte o Implantar a extensão Harbor.