Harbor 프로젝트 만들기

Harbor에서 프로젝트는 컨테이너 이미지 컬렉션을 구성하고 관리하는 논리적 단위 역할을 합니다. 관련 아티팩트를 그룹화하고 전체 컬렉션에 특정 정책, 액세스 제어, 복제 규칙을 적용하는 방법을 제공합니다. 프로젝트를 만들기 전에는 이미지를 Harbor로 내보내거나 가져올 수 없습니다.

시작하기 전에

시작하기 전에 Harbor UI에 한 번 이상 로그인하여 Harbor 레지스트리로 ID를 초기화해야 합니다.

필요한 IAM 역할

Harbor 프로젝트를 만들고 이미지 네임스페이스를 관리하려면 IAM 프로젝트 관리자에게 연락하여 프로젝트 네임스페이스에서 Harbor 프로젝트를 만들고, 가져오고, 감시할 수 있는 Harbor 프로젝트 생성자(harbor-project-creator) 역할을 요청하세요. 이 역할에는 컨테이너화된 애플리케이션의 보안 경계를 설정할 수 있도록 새 이미지 네임스페이스를 정의하는 데 필요한 권한이 포함되어 있습니다.

Harbor 프로젝트 만들기

GDC 콘솔, gdcloud CLI 또는 API를 사용하여 Harbor 프로젝트를 만듭니다.

콘솔

GDC 콘솔에서 다음 단계를 따르세요.

  1. 탐색 메뉴의 CI/CD 섹션에서 Harbor Container Registry 링크를 클릭합니다.
  2. Harbor 프로젝트 만들기를 클릭합니다.
  3. 프로젝트 이름을 입력합니다.
  4. 선택사항: 취약점 스캔은 기본적으로 사용 설정되어 있습니다. Harbor 프로젝트의 자동 취약점 스캔을 사용 중지하려면 프로젝트의 취약점 스캔 사용 설정 전환 버튼을 클릭합니다. 자세한 내용은 취약점 스캔을 참조하세요.
  5. 만들기를 클릭합니다.
  6. 프로젝트가 생성되었다는 확인 메시지가 표시됩니다.
  7. Harbor 프로젝트가 생성되면 Harbor UI에 로그인하여 Harbor 프로젝트를 볼 수 있는지 확인합니다.

gdcloud

Harbor 프로젝트를 만듭니다.

  gdcloud harbor harbor-projects create HARBOR_PROJECT \
    --project=PROJECT \
    --instance=INSTANCE

다음을 바꿉니다.

  • HARBOR_PROJECT: 만들려는 Harbor 프로젝트의 이름입니다.
  • PROJECT: GDC 프로젝트의 이름입니다.
  • INSTANCE: 인스턴스 이름입니다.

API

GDC 콘솔 및 gdcloud CLI는 Harbor 프로젝트 생성자를 사용자 계정으로 설정합니다. API를 사용하는 경우 spec.creatorSubject 필드를 직접 설정해야 합니다.

  1. 영역 관리 API 서버에서 HarborInstanceProject 커스텀 리소스를 만듭니다. 리소스를 만든 후에는 creatorSubject 또는 autoScan 필드를 변경할 수 없으므로 리소스를 만들기 전에 두 값을 모두 확인하세요.

    kubectl --kubeconfig MANAGEMENT_API_SERVER create -f - <<EOF
    apiVersion: artifactregistry.gdc.goog/v1
    kind: HarborInstanceProject
    metadata:
      name: INSTANCE-HARBOR_PROJECT
      namespace: PROJECT
    spec:
      projectName: HARBOR_PROJECT
      harborInstanceRef:
        name: INSTANCE
      creatorSubject:
        apiGroup: rbac.authorization.k8s.io
        kind: User
        name: HARBOR_USERNAME
      autoScan: true
    EOF
    

    다음을 바꿉니다.

    • MANAGEMENT_API_SERVER: 영역 관리 API 서버의 kubeconfig 파일 경로입니다. 자세한 내용은 영역 컨텍스트로 전환을 참조하세요.
    • INSTANCE: Harbor 레지스트리 인스턴스의 이름입니다.
    • HARBOR_PROJECT: 만들려는 Harbor 프로젝트의 이름입니다.
    • PROJECT: Harbor 레지스트리 인스턴스가 포함된 GDC 프로젝트의 이름입니다.
    • HARBOR_USERNAME: Harbor 사용자 이름으로, 로그인 후 Harbor UI 사용자 메뉴에 표시된 것과 정확히 일치합니다. 이 사용자는 Harbor 프로젝트의 Harbor 프로젝트 관리자가 됩니다. 서비스 계정이 아닌 사용자의 사용자 이름을 사용합니다. 자세한 내용은 시작하기 전에를 참조하세요.

    autoScan 필드는 프로젝트에 푸시되는 이미지에 대해 자동 취약점 스캔을 사용 설정합니다. 자동 스캔을 사용 중지하려면 false로 설정합니다. 자세한 내용은 취약점 스캔을 참조하세요.

  2. Harbor 프로젝트가 생성되고 생성자가 할당되었는지 확인합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      get harborinstanceproject INSTANCE-HARBOR_PROJECT \
      -n PROJECT
    

    PROJECTCREATEDSTATUS 열에는 Created가 표시되고 PROJECTSUBJECTASSIGNEDSTATUS 열에는 SubjectAssigned가 표시됩니다.

    PROJECTSUBJECTASSIGNEDSTATUS 열에 SubjectAssignError가 표시되면 조건 메시지를 확인합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      describe harborinstanceproject INSTANCE-HARBOR_PROJECT \
      -n PROJECT
    

    user ... not found 메시지는 creatorSubject 필드에 지정된 사용자가 아직 Harbor UI에 로그인하지 않았음을 의미합니다. Harbor 서비스는 30초마다 다시 시도하므로 사용자가 로그인하면 상태가 SubjectAssigned로 변경됩니다.

생성자 없이 생성된 Harbor 프로젝트 수정

조직의 프로젝트에 있는 HarborInstanceProject 리소스가 spec.creatorSubject 필드를 설정하지 않으면 Harbor 서비스가 조직 전체에서 Harbor 리소스에 대한 변경사항 처리를 중지합니다. 증상으로는 준비되지 않은 Harbor 인스턴스, 상태 없이 유지되는 새 Harbor 프로젝트, x509: certificate signed by unknown authority 오류로 실패하는 이미지 가져오기가 있습니다.

이 문제를 해결하려면 영향을 받는 리소스가 포함된 프로젝트의 Harbor 인스턴스 관리자(harbor-instance-admin) 역할이 필요합니다. 이 역할이 없으면 이 역할이 있는 사용자에게 이 단계를 완료해 달라고 요청합니다. 영향을 받는 리소스를 모르는 경우 Harbor 서비스 로그에서 찾을 수 있는 인프라 운영자(IO)에게 문의하세요.

  1. 영향을 받는 HarborInstanceProject 리소스가 spec.creatorSubject 필드를 설정하는지 확인합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      get harborinstanceproject HARBOR_INSTANCE_PROJECT \
      -n PROJECT -o jsonpath='{.spec.creatorSubject}'
    

    다음을 바꿉니다.

    • MANAGEMENT_API_SERVER: 영역 관리 API 서버의 kubeconfig 파일 경로입니다. 자세한 내용은 영역 컨텍스트로 전환을 참조하세요.
    • HARBOR_INSTANCE_PROJECT: HarborInstanceProject 리소스의 이름입니다. 이 페이지의 API 탭에서 만드는 리소스의 이름은 INSTANCE-HARBOR_PROJECT입니다.
    • PROJECT: 리소스가 포함된 GDC 프로젝트의 이름입니다.

    출력이 비어 있으면 필드가 설정되지 않은 것입니다.

  2. GDC 프로젝트 소유자와 함께 Harbor 프로젝트 관리자로 할당할 Harbor 사용자 이름을 확인합니다. spec.creatorSubject 필드를 설정한 후에는 변경할 수 없으므로 영향을 받는 각 리소스에 필드를 추가하기 전에 사용자 이름을 확인합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      patch harborinstanceproject HARBOR_INSTANCE_PROJECT \
      -n PROJECT --type merge \
      -p '{"spec":{"creatorSubject":{"apiGroup":"rbac.authorization.k8s.io","kind":"User","name":"HARBOR_USERNAME"}}}'
    

    HARBOR_USERNAME를 Harbor 프로젝트 관리자로 할당할 사용자의 Harbor 사용자 이름으로 바꿉니다. 이 역할은 이미지를 삭제하고 프로젝트 구성원을 관리할 수 있습니다. 사용자는 Harbor UI에 한 번 이상 로그인해야 하며 사용자 이름은 Harbor UI 사용자 메뉴에 표시된 이름과 정확히 일치해야 합니다.

  3. 생성자가 할당되었는지 확인합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      get harborinstanceproject HARBOR_INSTANCE_PROJECT \
      -n PROJECT
    

    영향을 받는 모든 리소스가 수정되면 Harbor 서비스가 약 10분 이내에 다시 시작되고 변경사항 처리를 재개하며 PROJECTSUBJECTASSIGNEDSTATUS 열에 SubjectAssigned가 표시됩니다. 15분 후에도 Harbor에서 이미지를 가져오지 못하면 IO에 문의하세요. IO가 영향을 받는 다른 리소스를 확인하고 필요한 경우 Harbor 서비스를 다시 시작할 수 있도록 수정한 리소스의 이름과 프로젝트를 IO에 제공합니다.

다음 단계

Harbor 프로젝트를 만든 후 Harbor 레지스트리에 연결하도록 Docker 및 Helm 클라이언트를 구성합니다.