Harbor 는 오픈 소스 컨테이너 레지스트리입니다. Tanzu Kubernetes 클러스터에 배포하려는 컨테이너 이미지의 개인 레지스트리 저장소로 Harbor 레지스트리용 TKG 확장을 배포할 수 있습니다.

Harbor 확장 버전 종속성

Tanzu Kubernetes Grid 서비스에서 프로비저닝된 Tanzu Kubernetes 클러스터에 Harbor 레지스트리용 TKG 확장을 설치하려면 다음 최소 버전 요구 사항을 준수합니다.
구성 요소 최소 버전
vCenter Server

7.0.2.00400

vSphere 네임스페이스

0.0.10-18245956

감독자 클러스터

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

Tanzu Kubernetes 릴리스

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

Harbor 확장 사전 요구 사항

Harbor 레지스트리용 TKG 확장 v1.3.1을 배포하기 전에 다음 사전 요구 사항을 준수합니다.

Harbor 확장 추가 요구 사항

Harbor 레지스트리용 TKG 확장 v1.3.1에는 설치 전후에 추가적인 요구 사항이 있습니다.
  • Harbor 확장에는 기본 PVC 스토리지 클래스가 필요합니다. TKG 확장에 대한 영구 스토리지 요구 사항 검토의 내용을 참조하십시오.
  • Harbor 확장에는 HTTP/S 수신이 필요합니다. 특히 Harbor 서비스는 Contour 확장의 엔보이 서비스를 통해 노출됩니다. 사전 요구 사항으로 Contour 확장을 배포합니다. Contour 수신용 TKG 확장 배포 및 관리의 내용을 참조하십시오.
    • 감독자 클러스터에 NSX-T 네트워킹을 사용하는 경우 LoadBalancer 유형의 엔보이 서비스를 생성합니다.
    • 감독자 클러스터에 vSphere vDS 네트워킹을 사용하는 경우에는 환경에 따라 LoadBalancer 유형 또는 NodePort 유형의 엔보이 서비스를 생성합니다.
  • Harbor 확장에는 DNS가 필요합니다. Harbor 확장을 설치한 후에는 DNS를 구성해야 합니다.
    • 테스트 및 확인을 위해 Harbor 및 Notary FQDN을 로컬 /etc/hosts 파일에 추가합니다. 이 작업을 수행하는 방법은 아래 지침에 설명되어 있습니다.
    • 운영 환경에서 Harbor는 로컬 DNS 서버(예: BIND) 또는 공용 클라우드(예: AWS Route53, Azure DNS 또는 Google CloudDNS)에 DNS 영역이 필요합니다. DNS를 설정한 후 Harbor FQDN을 DNS 서버에 자동으로 등록하려면 외부 DNS 확장을 설치합니다. 외부 DNS 서비스 검색을 위한 TKG 확장 배포 및 관리의 내용을 참조하십시오.

Harbor 확장 배포

Harbor 레지스트리용 TKG 확장은 클러스터에 여러 컨테이너를 설치합니다. 자세한 내용은 https://goharbor.io/의 내용을 참조하십시오.
컨테이너 리소스 유형 복제 설명
harbor-core 배포 1 엔보이용 관리 및 구성 서버
harbor-database 포드 1 Postgres 데이터베이스
harbor-jobservice 배포 1 Harbor 작업 서비스
harbor-notary-server 배포 1 Harbor Notary 서비스
harbor-notary-signer 배포 1 Harbor Notary
harbor-portal 배포 1 Harbor 웹 인터페이스
harbor-redis 포드 1 Harbor Redis 인스턴스
harbor-registry 배포 2 Harbor 컨테이너 레지스트리 인스턴스
harbor-trivy 포드 1 Harbor 이미지 취약성 스캐너
TKG 확장을 사용하여 Harbor 레지스트리를 설치하려면 다음 단계를 완료합니다.
  1. 각각의 확장 사전 요구 사항을 완료했는지 확인합니다. Harbor 확장 사전 요구 사항Harbor 확장 추가 요구 사항의 내용을 참조하십시오.
  2. 디렉토리를 Harbor 확장으로 변경합니다.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
  3. tanzu-system-registry 네임스페이스와 Harbor 서비스 계정 및 역할을 생성합니다.
    kubectl apply -f namespace-role.yaml
  4. Harbor 데이터 값 파일을 생성합니다.
    cp harbor-data-values.yaml.example harbor-data-values.yaml
  5. harbor-data-values.yaml에 필수 암호를 지정합니다.
    Harbor 레지스트리에 필요한 몇 가지 암호가 아래 표에 나열되고 설명되어 있습니다.
    암호 설명
    harborAdminPassword Harbor 관리자의 초기 암호입니다.
    secretKey 암호화에 사용되는 비밀 키입니다. 16자의 문자열이어야 합니다.
    database.password Postgres 데이터베이스의 초기 암호입니다.
    core.secret 암호는 코어 서버가 다른 구성 요소와 통신할 때 사용됩니다.
    core.xsrfKey XSRF 키입니다. 32자의 문자열이어야 합니다.
    jobservice.secret 암호는 작업 서비스가 다른 구성 요소와 통신할 때 사용됩니다.
    registry.secret 암호는 클라이언트 및 레지스트리 스토리지 백엔드에서 업로드 상태를 보호하는 데 사용됩니다.
    임의의 암호를 자동으로 생성하고 harbor-data-values.yaml 파일을 채우려면 다음 명령을 실행합니다.
    bash generate-passwords.sh harbor-data-values.yaml
    성공하면 다음 메시지가 표시됩니다.
    Successfully generated random passwords and secrets in harbor-data-values.yaml

    harbor-data-values.yaml 파일을 열고 필수 암호를 확인합니다.

  6. 필요한 경우 harbor-data-values.yaml에 다른 Harbor 구성 값을 지정합니다. 일반적으로 업데이트되는 값에는 다음이 포함될 수 있습니다.
    구성 필드 설명
    hostname

    기본 Harbor 호스트 이름은 core.harbor.domain입니다.

    필요한 경우 요구 사항에 맞게 이 값을 변경합니다.

    port.https

    기본값은 443입니다.

    감독자 클러스터에 NSX-T 네트워킹을 사용하며 그 결과 LoadBalancer 유형의 엔보이 수신 서비스를 사용하는 경우 이 설정을 기본값 443으로 둡니다.

    감독자 클러스터에 vDS 네트워킹을 사용하며 그 결과 NodePort 유형의 엔보이 수신 서비스를 사용하는 경우에는 이 값을 엔보이 노드 포트와 일치하도록 설정합니다.

    clair.enabled

    Clair 이미지 스캐너는 Trivy를 위해 더 이상 사용되지 않습니다. 둘 다 구성 파일에서 사용하도록 설정됩니다.

    값을 false로 설정하여 Clair를 사용하지 않도록 설정합니다.

    persistence.persistentVolumeClaim. <component>.accessMode

    이 설정에는 몇 가지 인스턴스가 있습니다.

    기본값은 ReadWriteOnce입니다.

    ReadWriteMany는 향후 릴리스에서 지원될 예정입니다.

    imageChartStorage.type

    기본값은 filesystem입니다.

    필요한 경우 변경하고 사용 중인 스토리지를 구성합니다.

    proxy 원하는 경우 Harbor에 대한 프록시를 구성합니다. 프록시가 구성된 경우 기본 noProxy 값이 필요합니다.
  7. 데이터 값으로 암호를 생성합니다.
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
    tanzu-system-registry 네임스페이스에 secret/harbor-data-values가 생성됩니다. 다음 명령을 실행하여 이를 확인합니다.
    kubectl get secrets -n tanzu-system-registry
  8. Harbor 확장을 배포합니다.
    kubectl apply -f harbor-extension.yaml

    성공하면 app.kappctrl.k14s.io/harbor created가 표시됩니다.

  9. Harbor 애플리케이션의 상태를 확인합니다.
    kubectl get app harbor -n tanzu-system-registry
    성공하면 상태가 Reconciling에서 Reconcile succeeded로 변경됩니다.
    NAME     DESCRIPTION   SINCE-DEPLOY   AGE
    harbor   Reconciling   96s            98s
    NAME     DESCRIPTION           SINCE-DEPLOY   AGE
    harbor   Reconcile succeeded   39s            2m29s
    상태가 Reconcile failed인 경우 Harbor 레지스트리 배포 문제 해결 항목을 참조하십시오.
  10. Harbor 확장에 대한 자세한 정보를 봅니다.
    kubectl get app harbor -n tanzu-system-registry -o yaml
  11. Harbor 배포 개체의 상태를 봅니다.
    kubectl get deployments -n tanzu-system-registry

    성공하면 다음 배포가 표시됩니다.

    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. 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. 필요한 경우 Harbor 설치 문제를 해결합니다. Harbor 레지스트리 배포 문제 해결의 내용을 참조하십시오.

LoadBalancer 유형의 엔보이 서비스를 사용하여 Harbor용 DNS 구성(NSX-T 네트워킹)

사전 요구 사항 엔보이 서비스가 LoadBalancer를 통해 노출되는 경우 로드 밸런서의 외부 IP 주소를 가져오고 Harbor FQDN에 대한 DNS 레코드를 생성합니다.
  1. LoadBalancer 유형의 엔보이 서비스에 대한 External-IP 주소를 가져옵니다.
    kubectl get service envoy -n tanzu-system-ingress
    반환된 External-IP 주소가 다음과 같이 표시됩니다.
    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
    또는 다음 명령을 사용하여 External-IP 주소를 가져올 수 있습니다.
    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
  2. Harbor 확장 설치를 확인하려면 로드 밸런서의 External-IP 주소에 매핑된 Harbor 및 Notary FQDN으로 로컬 /etc/hosts 파일을 업데이트합니다. 예를 들면 다음과 같습니다.
    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. Harbor 확장 설치를 확인하려면 Harbor에 로그인합니다. Harbor 웹 인터페이스에 로그인의 내용을 참조하십시오.
  4. 엔보이 서비스 로드 밸런서 External-IP 주소를 Harbor FQDN 및 Notary FQDN에 매핑하는 2개의 CNAME 레코드를 DNS 서버에 생성합니다.
  5. 외부 DNS 확장을 설치합니다. 외부 DNS 서비스 검색을 위한 TKG 확장 배포 및 관리의 내용을 참조하십시오.

NodePort 유형의 엔보이 서비스를 사용하여 Harbor용 DNS 구성(vDS 네트워킹)

사전 요구 사항 엔보이 서비스가 NodePort를 통해 노출되는 경우 작업자 노드의 가상 시스템 IP 주소를 가져오고 Harbor FQDN에 대한 DNS 레코드를 생성합니다.
참고: NodePort를 사용하려면 harbor-data-values.yaml 파일에 올바른 port.https 값을 지정해야 합니다.
  1. 클러스터가 프로비저닝된 vSphere 네임스페이스로 컨텍스트를 전환합니다.
    kubectl config use-context VSPHERE-NAMESPACE
  2. 클러스터의 노드를 나열합니다.
    kubectl get virtualmachines
    클러스터 노드가 표시됩니다. 예를 들면 다음과 같습니다.
    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. 작업자 노드 중 하나를 선택하고 다음 명령을 사용하여 설명합니다.
    kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
  4. 가상 시스템의 IP 주소(예: Vm Ip: 10.115.22.43)를 찾습니다.
  5. Harbor 확장 설치를 확인하려면 작업자 노드 IP 주소에 매핑된 Harbor 및 Notary FQDN으로 로컬 /etc/hosts 파일을 업데이트합니다. 예를 들면 다음과 같습니다.
    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. Harbor 확장 설치를 확인하려면 Harbor에 로그인합니다. Harbor 웹 인터페이스에 로그인의 내용을 참조하십시오.
  7. 작업자 노드 IP 주소를 Harbor FQDN 및 Notary FQDN에 매핑하는 2개의 CNAME 레코드를 DNS 서버에 생성합니다.
  8. 외부 DNS 확장을 설치합니다. 외부 DNS 서비스 검색을 위한 TKG 확장 배포 및 관리의 내용을 참조하십시오.

Harbor 웹 인터페이스에 로그인

Harbor가 설치 및 구성되면 로그인하여 사용을 시작합니다.
  1. Harbor 레지스트리 웹 인터페이스(https://core.harbor.domain) 또는 사용한 호스트 이름에 액세스합니다.

    Harbor 레지스트리 웹 인터페이스입니다.

  2. harbor-data-values.yaml 파일에 입력한 사용자 이름 admin과 생성된 암호를 사용하여 Harbor에 로그인합니다.

    사용자 이름 admin과 생성된 암호가 있는 Harbor 로그인 페이지입니다.

  3. Harbor 사용자 인터페이스에 액세스할 수 있는지 확인합니다.

    로그인한 후 Harbor 사용자 인터페이스의 [프로젝트] 탭이 표시됩니다.

  4. Harbor CA 인증서를 가져옵니다.

    Harbor 인터페이스에서 프로젝트 > 라이브러리를 선택하거나 새 프로젝트를 생성합니다.

    레지스트리 인증서를 클릭하고 Harbor CA 인증서(ca.crt)를 다운로드합니다.

  5. Harbor 레지스트리에서 컨테이너 이미지를 푸시하고 끌어올 수 있도록 Harbor CA 인증서를 Docker 클라이언트의 신뢰 저장소에 추가합니다. 내장된 Harbor 레지스트리 인증서를 사용하여 Docker 클라이언트 구성의 내용을 참조하십시오.
  6. Harbor 사용에 대한 자세한 내용은 Harbor 설명서를 참조하십시오.

Harbor 레지스트리 배포 문제 해결

배포 또는 조정이 실패하면 kubectl get pods -n tanzu-system-registry를 실행하여 포드 상태를 확인합니다. harbor 포드는 Running이어야 합니다. 포드 상태가 ImagePullBackOff 또는 ImageCrashLoopBackOff이면 컨테이너 이미지를 끌어올 수 없습니다. 데이터 값 및 확장 YAML 파일에서 레지스트리 URL을 확인하고 정확한지 확인합니다.

컨테이너 로그를 확인합니다. 여기서 name-XXXXkubectl get pods -A를 실행할 때 고유한 포드 이름입니다.
kubectl logs pod/harbor-XXXXX -c harbor -n tanzu-system-registry

Harbor 확장 업데이트

Tanzu Kubernetes 클러스터에 배포된 Contour 확장을 업데이트합니다.

  1. 암호에서 Harbor 데이터 값을 얻습니다.
    kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
    
  2. harbor-data-values.yaml에서 Harbor 데이터 값을 업데이트합니다.
  3. 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-
    
    Harbor 확장이 새 데이터 값으로 조정됩니다.
    참고: 기본적으로 kapp-controller는 5분마다 애플리케이션을 동기화합니다. 업데이트는 5분 이내에 적용됩니다. 업데이트를 즉시 적용하려면 harbor-extension.yamlsyncPeriod를 더 작은 값으로 변경하고 kubectl apply -f harbor-extension.yaml을 사용하여 Contour 확장을 적용합니다.
  4. 확장의 상태를 확인합니다.
    kubectl get app harbor -n tanzu-system-registry

    Contour가 업데이트되면 Contour 애플리케이션 상태가 Reconcile Succeeded로 변경됩니다.

  5. 자세한 상태를 살펴보고 문제를 해결합니다.
    kubectl get app harbor -n tanzu-system-registry -o yaml

Harbor 확장 삭제

Tanzu Kubernetes 클러스터에서 Harbor 확장을 삭제합니다.

참고: 순서대로 단계를 완료하십시오. Contour 확장 및 애플리케이션이 삭제되기 전에 Contour 네임스페이스 및 역할 개체를 삭제하지 마십시오. Contour 네임스페이스 및 역할 개체를 삭제하면 kapp-controller에서 사용하는 서비스 계정이 삭제됩니다. 애플리케이션 및 확장을 삭제하기 전에 이 서비스 계정을 삭제하면 시스템 오류가 발생할 수 있습니다.
  1. 디렉토리를 Harbor 확장 파일을 다운로드한 위치로 변경합니다.
    cd /extensions/registry/harbor/
  2. Harbor 애플리케이션을 삭제합니다.
    kubectl delete app harbor -n tanzu-system-registry
    예상 결과:
    app.kappctrl.k14s.io "harbor" deleted
  3. Harbor 애플리케이션이 삭제되었는지 확인합니다.
    kubectl get app Harbor -n tanzu-system-registry
    예상 결과: 애플리케이션이 Not Found 상태입니다.
    apps.kappctrl.k14s.io "harbor" not found
  4. 레지스트리 네임스페이스를 삭제합니다.
    Harbor 확장 및 애플리케이션이 완전히 삭제된 것을 확인한 후에만 네임스페이스 및 역할 개체를 삭제해도 안전합니다.
    kubectl delete -f namespace-role.yaml
    예상 결과: Harbor가 배포된 네임스페이스 및 연결된 역할 기반 액세스 제어 개체가 삭제됩니다.
    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

Harbor 확장 업그레이드

기존 Harbor 확장이 배포된 경우 최신 버전으로 업그레이드할 수 있습니다.
  1. Harbor configmap을 얻습니다.
    kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
    
  2. 기존 Harbor 배포를 삭제합니다. Harbor 확장 삭제의 내용을 참조하십시오.
  3. Harbor 확장을 배포합니다. Harbor 확장 배포의 내용을 참조하십시오.