서비스 레지스트리용 Harbor 설치

이 항목에서는 Harbor를 Tanzu Kubernetes Grid의 워크로드 클러스터 또는 공유 서비스 클러스터에 배포하는 방법을 설명합니다.

참고

vSphere with Tanzu에서 Supervisor에 Harbor 설치 및 구성에 설명된 대로 Supervisor에 Harbor를 설치하거나, 아래 설명된 대로 개별 워크로드 클러스터에 설치할 수 있습니다.
Supervisor 서비스는 공유되기 때문에 vSphere with Tanzu는 별도의 공유 서비스 클러스터에 패키지를 배포하는 것을 지원하지 않습니다.

Notary와 Chartmuseum은 Harbor v2.6에서 더 이상 사용되지 않으며 Harbor v2.6.0 릴리스 정보에 설명된 대로 향후 릴리스에서 제거될 예정입니다. 사용자는 컨테이너 서명 및 확인을 위해 Sigstore Cosign으로 전환해야 합니다.

Harbor

Harbor는 컨텐츠를 저장, 서명, 검사하는 오픈 소스의 신뢰할 수 있는 클라우드 네이티브 컨테이너 레지스트리입니다. Tanzu Kubernetes Grid에는 Harbor용 서명된 패키지 바이너리를 포함하며, 워크로드 클러스터에 배포하여 해당 클러스터에 컨테이너 레지스트리 서비스를 제공할 수 있습니다. 이 Harbor 패키지는 일반적으로 보안, ID 제어, 관리와 같은 사용자에게 필요한 기능을 추가하여 오픈 소스 Docker 배포를 확장합니다.

Tanzu Kubernetes Grid에는 다음과 같이 배포할 수 있는 Harbor에 대한 서명된 바이너리를 포함합니다.

  • 해당 클러스터에 대한 컨테이너 레지스트리 서비스를 제공하는 워크로드 클러스터
  • 공유 서비스 클러스터는 독립형 관리 클러스터가 있는 배포에서 다른 워크로드 클러스터에 컨테이너 레지스트리 서비스를 제공합니다.

공유 서비스로 배포된 경우 동일한 독립형 관리 클러스터에서 관리하는 모든 워크로드 클러스터에서 Harbor를 사용할 수 있습니다. Harbor를 공유 서비스로 구현하려면 공유 서비스 실행 전용의 특수 클러스터에 배포합니다. 각 관리 클러스터에는 하나의 공유 서비스 클러스터만 있을 수 있습니다.

Harbor 레지스트리 및 ExternalDNS

VMware는 특히 Harbor 가용성이 중요한 프로덕션 또는 기타 환경에서 로드 밸런싱이 있는 인프라에서 Harbor 레지스트리와 함께 ExternalDNS를 설치할 것을 권장합니다.

수신 로드 밸런서의 IP 주소가 변경되면 ExternalDNS는 자동으로 변경 내용을 확인하고 새 주소를 Harbor 호스트 이름에 다시 매핑합니다. 이렇게 하면 Harbor 사용자 인터페이스에 연결에 설명된 대로 주소를 수동으로 다시 매핑해야 할 필요가 없습니다.

사전 요구 사항

Harbor 배포를 위해 클러스터 준비

Harbor 배포를 위해 클러스터를 준비하려면 다음을 수행합니다.

  1. 워크로드 클러스터 또는 공유 서비스 클러스터에 kubectl 컨텍스트를 설정합니다. 예:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. 클러스터에 아직 standard 패키지 저장소가 설치되어 있지 않은 경우 설치합니다.

    참고

    계획 기반 클러스터(레거시)를 대상으로 하는 경우 이 단계를 건너뜁니다. 계획 기반 클러스터의 경우 tanzu-standard 패키지 저장소가 모든 클러스터의 tanzu-package-repo-global 네임스페이스에서 자동으로 사용되도록 설정되었습니다.

    tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
    

    여기서 PACKAGE-REPOSITORY-ENDPOINTstandard 패키지 저장소의 URL입니다. 이 릴리스의 경우 URL은 projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1입니다.

    Tanzu CLI에서 이 값을 가져오려면 패키지 저장소 나열을 참조하거나 Tanzu Mission Control의 클러스터(Cluster) 창에서 추가 기능(Addons) > 저장소(Repositories) 목록을 참조하십시오.

  3. 아직 설치하지 않은 경우 cert-manager 및 Contour 패키지를 설치합니다. 지침은 수신 제어용 Contour 설치를 참조하십시오.

  4. (선택 사항) ExternalDNS 패키지를 설치합니다. 지침은 서비스 검색을 위한 ExternalDNS 설치를 참조하십시오.

  5. 아래의 클러스터에 Harbor 배포로 진행합니다.

클러스터에 Harbor 배포

다음 절차에 따라 Harbor를 워크로드 또는 공유 서비스 클러스터에 배포합니다.

  1. 클러스터에서 Harbor 패키지를 사용할 수 있는지 확인합니다.

    tanzu package available list -A
    
  2. 사용 가능한 패키지의 버전을 검색합니다.

    tanzu package available list harbor.tanzu.vmware.com -A
    
  3. standard 패키지 저장소에서 Harbor 패키지를 다운로드합니다.

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:PACKAGE-VERSION -o /tmp/harbor-package-PACKAGE-VERSION
    

    여기서 PACKAGE-VERSIONtanzu package available list에 있는 패키지의 버전이지만 _ 문자가 + 문자를 대체합니다. 또한 접두사 v를 포함해야 합니다. 예: v2.6.3_vmware.1-tkg.1.

    예:

    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
    
    1. 다음 중 하나를 수행하여 harbor-data-values.yaml 파일에서 필수 암호(password) 및 암호(secret)를 설정합니다.

      • 임의 암호(password)와 암호(secret)를 자동으로 생성하려면 다음을 실행합니다.

        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
        

        여기서 PACKAGE-VERSION은 설치하려는 Harbor 패키지의 버전입니다.

        예를 들어 Harbor 패키지 v2.6.3의 경우 다음을 실행합니다.

        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
        
      • 고유한 암호(password)와 암호(secret)를 설정하려면 harbor-data-values.yaml 파일에서 다음 항목을 업데이트합니다.

        • harborAdminPassword
        • secretKey
        • database.password
        • core.secret
        • core.xsrfKey
        • jobservice.secret
        • registry.secret
    2. harbor-data-values.yaml 파일에 다른 설정을 지정합니다.

      • hostname 설정을 Harbor 액세스에 사용할 호스트 이름으로 설정합니다. 예: harbor.yourdomain.com.
      • 자체 인증서를 사용하려면 tls.crt, tls.key, ca.crt 설정을 인증서, 키, CA 인증서의 내용으로 업데이트합니다. 인증서는 신뢰할 수 있는 기관에서 서명하거나 자체 서명할 수 있습니다. 이러한 항목을 비워 두면 Tanzu Kubernetes Grid가 자체 서명된 인증서를 자동으로 생성합니다.
      • generate-passwords.sh 스크립트를 사용한 경우 선택적으로 harborAdminPassword를 기억하기 쉬운 항목으로 업데이트합니다.
      • 다음 값은 비워둘 수 없습니다.

        • storageClass: persistence.persistentVolumeClaim 아래에서 registry, jobservice, database, redis, trivy의 경우 storageClasskubectl get sc에서 반환된 스토리지 프로파일로 설정합니다.
        참고

        azure-file 스토리지 클래스를 사용하면 Azure 설명서의 Azure Files를 사용하는 동안 "권한을 변경할 수 없습니다" 오류에 설명된 Azure 문제로 인해 디스크가 마운트된 후 파일 시스템 사용 권한을 변경할 수 없습니다.

        • pspNames: pspNameskubectl get psp에서 반환된 PSP 값으로 설정합니다(예: "vmware-system-restricted,vmware-system-privileged").
      • 필요한 경우 다른 persistence 설정을 업데이트하여 Harbor가 데이터를 저장하는 방법을 지정합니다.

        Harbor에 대량의 컨테이너 이미지를 저장해야 하는 경우 persistence.persistentVolumeClaim.registry.size를 더 큰 숫자로 설정합니다.

      harbor-data-values.yaml 파일의 값에 대한 자세한 내용은 대상 클러스터에 대해 아래 명령을 실행합니다.

      tanzu package available get harbor.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
      

      여기서 AVAILABLE-VERSION은 Harbor 패키지의 버전입니다. --values-schema 플래그는 Harbor 패키지의 Package API 리소스에서 valuesSchema 섹션을 검색합니다. 값 스키마의 출력 형식인 --outputyaml, json 또는 table로 설정할 수 있습니다.

      예:

      tanzu package available get harbor.tanzu.vmware.com/2.6.3+vmware.1-tkg.1 --values-schema
      
    3. harbor-data-values.yaml 파일에서 모든 주석을 제거합니다.

      yq -i eval '... comments=""' harbor-data-values.yaml
      
  4. 패키지를 설치합니다.

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version AVAILABLE-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace TARGET-NAMESPACE
    

    여기서:

    • TARGET-NAMESPACE는 Harbor 패키지를 설치하려는 네임스페이스입니다. 예: my-packages 또는 tanzu-cli-managed-packages 네임스페이스.

      • --namespace 플래그가 지정되지 않은 경우 Tanzu CLI는 default 네임스페이스에 패키지와 해당 리소스를 설치합니다. Harbor 포드, 그리고 Harbor 구성 요소와 연결된 기타 리소스는 tanzu-system-registry 네임스페이스에 생성됩니다. 이 네임스페이스에 Harbor 패키지를 설치하지 마십시오.
      • 지정된 네임스페이스가 이미 존재해야 합니다(예: kubectl create namespace my-packages 실행).
    • AVAILABLE-PACKAGE-VERSION은 위에서 검색한 버전입니다.

    예:

    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
    
  5. ebs.csi.aws.comstorageClass로 사용하는 경우 다음 중 하나를 수행합니다.

    • 스토리지 클래스 VolumeBoundModeImmediate에서 WaitForFirstConsumer로 변경합니다.

      • 이 작업은 Harbor 외의 서비스에 영향을 줄 수 있는 클러스터 전체 작업입니다.
    • 다음과 같이 Harbor Scandata 볼륨 EmptyDir 오버레이 패치를 적용합니다. 이 오버레이는 scandata 볼륨을 빈 디렉토리로 만들어 jobLog 볼륨 및 scandata 볼륨이 동일한 작업 서비스 포드에 마운트될 때 scandata 내보내기 기능에 영향을 미치고 AZ 충돌을 유발하지 않도록 합니다.

      1. 아래에 scandata-empty-dir-overlay.yamlHarbor Scandata 볼륨 EmptyDir 오버레이 코드가 포함된 파일을 생성합니다.

      2. 오버레이로 일반 암호를 생성합니다.

        kubectl -n test  create secret generic scandata-empty-dir-overlay -o yaml --dry-run=client --from-file=scandata-emptyDir-overlay.yaml | kubectl apply -f -
        
      3. 암호로 Harbor 패키지를 패치합니다.
        kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
        
      4. 패키지 상태가 isReconciling인지 확인합니다.
        kubectl get pkgi harbor -n my-packages
        
      5. 패키지 상태가 isReconciling이 아닌 경우 다시 생성할 수 있도록 기존 Harbor 포드를 삭제합니다.
        kubectl delete pods --all -n my-packages
        
  6. harbor 패키지가 설치되었는지 확인합니다.

    tanzu package installed list -A
    

    패키지에 대한 자세한 내용을 보려면 다음도 실행합니다.

    tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
    

    여기서 PACKAGE-NAMESPACEharbor 패키지가 설치되어 있는 네임스페이스입니다.

  7. harbor 애플리케이션이 PACKAGE-NAMESPACE에서 조정되었는지 확인합니다.

    kubectl get apps -A
    

    상태가 Reconcile Succeeded가 아닌 경우 harbor 애플리케이션의 전체 상태 세부 정보를 확인합니다. 전체 상태를 확인하면 문제를 해결하는 데 도움이 될 수 있습니다.

    kubectl get app harbor --namespace PACKAGE-NAMESPACE -o yaml
    

    여기서 PACKAGE-NAMESPACE는 패키지를 설치한 네임스페이스입니다. 문제 해결이 문제를 해결하는 데 도움이 되지 않을 경우 패키지를 다시 설치하기 전에 제거해야 합니다.

    tanzu package installed delete harbor --namespace PACKAGE-NAMESPACE
    
  8. 클러스터의 모든 포드를 표시하여 Harbor 서비스가 실행되고 있는지 확인합니다.

    kubectl get pods -A
    

    tanzu-system-registry 네임스페이스에는 harbor core database, jobservice, notary, portal, redis, registry, trivy 서비스가 다음과 유사한 이름으로 포드에서 실행됩니다.

    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
    [...]
    
  9. tanzu-system-registry 네임스페이스의 harbor-tls 암호에서 Harbor CA 인증서를 가져옵니다.

    kubectl -n tanzu-system-registry get secret harbor-tls -o=jsonpath="{.data.ca\.crt}" | base64 -d
    

    출력의 복사본을 만듭니다.

Harbor 사용자 인터페이스에 연결

Harbor UI는 클러스터의 tanzu-system-ingress 네임스페이스에서 실행되는 Envoy 서비스 로드 밸런서를 통해 노출됩니다. 사용자가 Harbor UI에 연결할 수 있도록 허용하려면 Envoy 서비스 로드 밸런서의 주소를 Harbor 서비스의 호스트 이름(예: harbor.yourdomain.com)에 매핑해야 합니다.

  1. Envoy 서비스 로드 밸런서의 주소를 가져옵니다.

    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
    

    NSX ALB(Advanced Load Balancer)가 없는 vSphere에서 Envoy 서비스는 LoadBalancer 대신 NodePort를 통해 노출되므로 위의 출력은 비어 있으며 클러스터에 있는 Worker 노드의 IP 주소를 대신 사용할 수 있습니다. NSX ALB가 있는 vSphere에서 Envoy 서비스에는 20.54.226.44와 유사한 로드 밸런서 IP 주소가 있습니다.

  2. Envoy 서비스 로드 밸런서의 주소를 Harbor 서비스의 호스트 이름에 매핑합니다. vSphere 실행 중인 클러스터의 경우 /etc/hosts DNS 서버에 해당 A 레코드를 추가해야 합니다. 예를 들어 IP 주소가 10.93.9.100인 경우 다음을 /etc/hosts에 추가합니다.

    10.93.9.100 harbor.yourdomain.com notary.harbor.yourdomain.com
    

    Windows 시스템에서는 /etc/hosts/ C:\Windows\System32\Drivers\etc\hosts입니다.

이제 사용자는 웹 브라우저에서 https://harbor.yourdomain.com으로 이동하여 Harbor UI에 연결하고, harbor-data-values.yaml에서 구성한 harborAdminPassword를 사용하여 사용자 admin로 로그인할 수 있습니다.

Harbor에서 이미지 푸시(Push) 및 끌어오기(Pull)

이제 Harbor가 설정되었으므로 이미지를 푸시하여 클러스터에서 끌어올 수 있도록 할 수 있습니다.

  1. Harbor에서 자체 서명된 인증서를 사용하는 경우 Docker가 이 CA 인증서를 신뢰할 수 있도록 https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert에서 Harbor CA 인증서를 다운로드하여 로컬 시스템에 설치합니다.

    • Linux에서는 인증서를 /etc/docker/certs.d/harbor.yourdomain.com/ca.crt로 저장합니다.
    • macOS에서는 이 절차를 따릅니다.
    • Windows 인증서 파일을 마우스 오른쪽 버튼으로 클릭하고 인증서 설치를 선택합니다.
  2. admin 사용자로 Harbor 레지스트리에 로그인합니다. 메시지가 표시되면 클러스터에 Harbor 패키지를 설치할 때 설정한 harborAdminPassword를 입력합니다.

    docker login harbor.yourdomain.com -u admin
    
  3. 이미 로컬로 끌어온 기존 이미지에 태그를 지정합니다(예: nginx:1.7.9).

    docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
    
  4. 이미지를 Harbor 레지스트리로 다시 푸시합니다.

    docker push harbor.yourdomain.com/library/nginx:1.7.9
    
  5. 이제 Harbor CA 인증서가 설치된 모든 시스템의 Harbor 레지스트리에서 이미지를 끌어올 수 있습니다.

    docker pull harbor.yourdomain.com/library/nginx:1.7.9
    

실행 중인 Harbor 배포 업데이트

배포 후 Harbor 패키지의 구성을 변경해야 하는 경우 다음 단계에 따라 배포된 Harbor 패키지를 업데이트합니다.

  1. harbor-data-values.yaml에서 Harbor 구성을 업데이트합니다. 예를 들어 persistence.persistentVolumeClaim.registry.size 값을 업데이트하여 레지스트리 스토리지의 양을 늘릴 수 있습니다.

  2. 설치된 패키지의 구성을 업데이트합니다.

    tanzu package installed update harbor \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    형식 설명:

    • INSTALLED-PACKAGE-VERSION은 설치된 Harbor 패키지의 버전입니다.
    • INSTALLED-PACKAGE-NAMESPACE는 Harbor 패키지가 설치된 네임스페이스입니다.

    예:

    tanzu package installed update harbor \
    --version 2.6.3+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    

Harbor 패키지가 새 값 또는 추가한 값을 사용하여 조정됩니다. kapp-controller가 변경 내용을 적용하는 데 최대 5분이 걸릴 수 있습니다.

tanzu package installed update 명령에 대한 자세한 내용은 패키지 설치 및 관리에서 패키지 업데이트를 참조하십시오. 이 명령을 사용하여 설치된 패키지의 버전 및 구성을 업데이트할 수 있습니다.

Harbor Scandata 볼륨 EmptyDir 오버레이

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
check-circle-line exclamation-circle-line close-line
Scroll to top icon