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
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
- Provisione um cluster. Consulte o Fluxo de trabalho para clusters de Tanzu Kubernetes provisionamento.
- Conecte-se ao cluster. Consulte o Conectar-se a um Tanzu Kubernetes cluster como um vCenter Single Sign-On usuário.
- Baixe o pacote TKG Extensions v1.3.1 para o host do cliente no qual você executa os comandos kubectl.
- Pré-requisitos de instalação das extensões TKG no cluster de destino.
Requisitos adicionais do Harbor Extension
- 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
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 |
- 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.
- Altere o diretório para a extensão Harbor.
cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
- Crie o namespace
tanzu-system-registry
e a conta de serviço e as funções do Harbor.kubectl apply -f namespace-role.yaml
- Crie um arquivo de valores de dados Harbor.
cp harbor-data-values.yaml.example harbor-data-values.yaml
- 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. 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. - 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. - 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
Osecret/harbor-data-values
é criado no namespacetanzu-system-registry
. Verifique isso executando o seguinte comando:kubectl get secrets -n tanzu-system-registry
- Implante a extensão Harbor.
kubectl apply -f harbor-extension.yaml
Se for bem-sucedido, você verá
app.kappctrl.k14s.io/harbor created
. - Verifique o status do aplicativo Harbor.
kubectl get app harbor -n tanzu-system-registry
Em caso de sucesso, o status muda deReconciling
paraReconcile succeeded
.NAME DESCRIPTION SINCE-DEPLOY AGE harbor Reconciling 96s 98s
NAME DESCRIPTION SINCE-DEPLOY AGE harbor Reconcile succeeded 39s 2m29s
Se o status forReconcile failed
, consulte Solução de problemas de implantação do Harbor Registry. - Visualize informações detalhadas sobre a extensão Harbor.
kubectl get app harbor -n tanzu-system-registry -o yaml
- 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
- 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
- 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)
- 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çoExternal-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çoExternal-IP
usando o seguinte comando.kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
- 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çoExternal-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
- 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.
- 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. - 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)
port.https
no arquivo
harbor-data-values.yaml
.
- Alterne o contexto para o vSphere Namespace onde o cluster está provisionado.
kubectl config use-context VSPHERE-NAMESPACE
- 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
- Escolha um dos nós de trabalhador e descreva-o usando o seguinte comando.
kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
- Localize o endereço IP da máquina virtual, por exemplo,
Vm Ip: 10.115.22.43
. - 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
- 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.
- 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.
- 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
- Acesse a interface da web do Harbor Registry em https://core.harbor.domain ou o nome do host que você usou.
- 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
. - Verifique se você pode acessar a interface de usuário do Harbor.
- Obtenha o certificado Harbor CA.
Na interface do Harbor, selecione New Project .
ou crie umClique em Registry Certificate (Registry Certificate) e baixe o certificado Harbor CA ( ca.crt ).
- 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.
- 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.
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.
- 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
- Atualize os valores de dados do Harbor em
harbor-data-values.yaml
. - 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, alteresyncPeriod
emharbor-extension.yaml
para um valor menor e aplique a extensão Contour usandokubectl apply -f harbor-extension.yaml
. - 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. - 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.
- Altere o diretório para onde você baixou os arquivos de extensão Harbor.
cd /extensions/registry/harbor/
- Exclua o aplicativo Harbor.
kubectl delete app harod -n tanzu-system-registry
Resultado esperado:app.kappctrl.k14s.io "harbor" deleted
- 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
- 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
- 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
- Exclua a implantação do Harbor existente. Consulte o Excluir a extensão Harbor.
- Implante a extensão Harbor. Consulte o Implantar a extensão Harbor.