다음 지침에 따라 vSphere 7.x용 TKr로 프로비저닝된 TKG 클러스터에 Harbor를 설치합니다.

사전 요구 사항

vSphere 7.x용 TKr에 표준 패키지를 설치하기 위한 워크플로의 내용을 참조하십시오.

Harbor에는 HTTP/S 수신이 필요합니다. Harbor 서비스는 Contour 패키지의 엔보이 서비스를 통해 노출됩니다. 사전 요구 사항으로 Contour 패키지를 배포합니다. vSphere 7.x용 TKr에 Contour 설치의 내용을 참조하십시오.
  • 감독자에 NSX 네트워킹을 사용하는 경우 LoadBalancer 유형의 엔보이 서비스를 생성합니다.
  • 감독자에 vSphere vDS 네트워킹을 사용하는 경우에는 환경에 따라 LoadBalancer 또는 NodePort 유형의 엔보이 서비스를 생성합니다.
Harbor 확장에는 DNS가 필요합니다. 테스트 및 확인을 위해 Harbor 및 Notary FQDN을 로컬 /etc/hosts 파일에 추가합니다. 이 작업을 수행하는 방법은 아래 지침에 설명되어 있습니다.

운영 환경에서 Harbor는 로컬 DNS 서버(예: BIND) 또는 공용 클라우드(예: AWS Route53 또는 Azure DNS)에 DNS 영역이 필요합니다. DNS를 설정한 후 Harbor FQDN을 DNS 서버에 자동으로 등록하려면 ExternalDNS 확장을 설치합니다. vSphere 7.x용 TKr에 ExternalDNS 설치의 내용을 참조하십시오.

Harbor 설치

표준 패키지를 사용하여 Harbor 레지스트리를 설치하려면 다음 단계를 완료합니다.

  1. 저장소에서 사용 가능한 Harbor 버전을 나열합니다.
    kubectl get packages -n tkg-system | grep harbor
  2. harbor.yaml 규격을 생성합니다.
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: harbor-sa
      namespace: tkg-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: habor-role-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
      - kind: ServiceAccount
        name: harbor-sa
        namespace: tkg-system
    ---
    apiVersion: packaging.carvel.dev/v1alpha1
    kind: PackageInstall
    metadata:
      name: harbor
      namespace: tkg-system
    spec:
      serviceAccountName: harbor-sa
      packageRef:
        refName: harbor.tanzu.vmware.com
        versionSelection:
          constraints: 2.7.1+vmware.1-tkg.1 #PKG-VERSION
      values:
      - secretRef:
          name: harbor-data-values
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: harbor-data-values
      namespace: harbor-registry
    stringData:
      values.yml: |
        namespace: tanzu-system-registry
        hostname: <ENTER-HARBOR-FQDN>
        port:
          https: 443
        logLevel: info
        tlsCertificate:
          tls.crt: ""
          tls.key: ""
          ca.crt:
        tlsCertificateSecretName:
        enableContourHttpProxy: true
        harborAdminPassword: <ENTER-STRONG-PASSWORD-HERE>
        secretKey: <ENTER-SECRET-KEY>
        database:
          password: <ENTER-STRONG-PASSWORD-HERE>
          shmSizeLimit:
          maxIdleConns:
          maxOpenConns:
        exporter:
          cacheDuration:
        core:
          replicas: 1
          secret: <ENTER-SECRET>
          xsrfKey: <ENTER-XSRF-KEY-WHICH-IS-AN-ALPHANUMERIC-STRING-WITH-32-CHARS>
        jobservice:
          replicas: 1
          secret: <ENTER-SECRET>
        registry:
          replicas: 1
          secret: <ENTER-SECRET>
        trivy:
          enabled: true
          replicas: 1
          gitHubToken: ""
          skipUpdate: false
        persistence:
          persistentVolumeClaim:
            registry:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 50Gi
            jobservice:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            database:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            redis:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            trivy:
              existingClaim: ""
              storageClass: "<ENTER-STORAGE-CLASS>"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
        proxy:
          httpProxy:
          httpsProxy:
          noProxy: 127.0.0.1,localhost,.local,.internal
        pspNames: vmware-system-restricted
        network:
          ipFamilies: ["IPv4", "IPv6"]
  3. 호스트 이름, 암호 및 스토리지 클래스를 포함하여 환경에 적합한 값으로 harbor.yaml 규격의 harbor-data-values 암호를 사용자 지정합니다.

    지침은 Harbor 패키지 참조 항목을 참조하십시오.

  4. Harbor를 설치합니다.
    kubectl apply -f harbor.yaml
  5. Harbor 설치를 확인합니다.
    kubectl get all -n harbor-registry

엔보이 LoadBalancer를 사용하여 Harbor용 DNS 구성(NSX 네트워킹)

사전 요구 사항 엔보이 서비스가 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
    #TKG Harbor with Envoy Load Balancer IP
    10.195.141.17 core.harbor.domain
    10.195.141.17 core.notary.harbor.domain
    
  3. Harbor 확장 설치를 확인하려면 Harbor에 로그인합니다.
  4. 엔보이 서비스 로드 밸런서 External-IP 주소를 Harbor FQDN 및 Notary FQDN에 매핑하는 2개의 CNAME 레코드를 DNS 서버에 생성합니다.
  5. 외부 DNS 확장을 설치합니다.

엔보이 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
  3. 작업자 노드 중 하나를 선택하고 다음 명령을 사용하여 설명합니다.
    kubectl describe virtualmachines tkg2-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
    #TKG Harbor with Envoy NodePort
    10.115.22.43 core.harbor.domain
    10.115.22.43 core.notary.harbor.domain
    
  6. Harbor 확장 설치를 확인하려면 Harbor에 로그인합니다.
  7. 작업자 노드 IP 주소를 Harbor FQDN 및 Notary FQDN에 매핑하는 2개의 CNAME 레코드를 DNS 서버에 생성합니다.
  8. 외부 DNS 확장을 설치합니다.

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 클라이언트의 신뢰 저장소에 추가합니다. TKG 서비스 클러스터에서 개인 레지스트리 사용의 내용을 참조하십시오.
  6. Harbor 사용에 대한 자세한 내용은 Harbor 설명서를 참조하십시오.