클러스터에서 컨테이너 이미지 푸시 및 풀

시스템 아티팩트는 조직 인프라 클러스터의 Artifact Registry에 있습니다. 플랫폼 관리자 (PA)가 Google Distributed Cloud (GDC) 에어 갭 어플라이언스에서 조직을 만들면 모든 시스템 아티팩트가 조직 인프라 클러스터에서 복제됩니다.

인프라 운영자 (IO)는 새 시스템 아티팩트를 조직 인프라 클러스터에 푸시해야 합니다. 새 시스템 아티팩트 푸시는 PA가 선택 기능을 사용 설정하도록 요청하거나 시스템에 새 아티팩트를 패치하여 수정할 수 있는 버그나 서비스 중단이 표시되는 경우에만 발생합니다.

시작하기 전에

관리자로서 시스템 Artifact Registry 프로젝트의 리소스에 액세스하는 데 필요한 권한을 얻으려면 보안 관리자에게 컨테이너 이미지를 푸시할 클러스터에 따라 다음 역할을 부여해 달라고 요청하세요.

필요한 권한을 획득한 후 인프라 클러스터의 시스템 Artifact Registry에 이미지를 푸시하기 전에 다음 단계를 따르세요.

  1. gdcloud 명령줄 인터페이스 (CLI)의 안내에 따라 Distributed Cloud CLI를 다운로드하고 설치합니다.

  2. 구성요소 설치 안내에 따라 docker-credential-gdcloud 구성요소를 설치합니다.

    gdcloud components install docker-credential-gdcloud
    
  3. 구성된 ID 공급업체로 로그인:

    gdcloud auth login
    
  4. kubeconfig 파일을 내보냅니다.

    gdcloud clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

  5. Docker를 구성합니다.

    gdcloud auth configure-docker
    

스토리지 버킷에서 컨테이너 이미지 다운로드

PA에서 스토리지 버킷에서 이미지를 다운로드하고 시스템 Artifact Registry에 이미지를 업로드하도록 요청하는 경우 이 섹션의 안내를 따르세요. PA는 프로젝트 및 버킷 이름과 같은 세부정보를 제공해야 합니다.

IO는 스토리지 버킷에서 컨테이너 이미지를 다운로드할 수 있는 권한이 있어야 합니다.

  • 보안 관리자에게 프로젝트의 네임스페이스에서 프로젝트 버킷 객체 뷰어 (project-bucket-object-viewer) 역할을 부여해 달라고 요청하세요.

자세한 내용은 IAM R0005 런북을 참고하세요.

프로젝트 내 버킷과 해당 버킷의 객체에 대한 읽기 전용 액세스 권한이 부여됩니다.

필요한 권한을 획득한 후 다음 단계에 따라 PA 프로젝트의 네임스페이스 스토리지 버킷에서 컨테이너 이미지를 다운로드합니다.

  1. PA에게 버킷의 보안 비밀 이름을 요청합니다. 보안 비밀 이름은 다음 예와 같습니다.

    object-storage-key-std-user-ID
    

    보안 비밀 이름에는 버킷에 액세스하기 위한 고유한 ID 값이 포함됩니다.

  2. 버킷의 보안 비밀 이름을 복사합니다.

  3. 버킷 액세스 사용자 인증 정보를 가져오고 gdcloud CLI를 구성합니다.

    SECRET_NAME=SECRET_NAME ACCESS_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.access-key-id}' | base64 -d)
    SECRET_KEY=$(kubectl get secret ${SECRET_NAME} -n object-storage-access-keys -o=jsonpath='{.data.secret-access-key}' | base64 -d)
    S3_ENDPOINT=objectstorage.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
    echo "Access Key: ${ACCESS_KEY}" \
    && echo "Secret Key: ${SECRET_KEY}" \
    && echo "S3 Endpoint: ${S3_ENDPOINT}"
    
    gdcloud config set storage/s3_access_key_id ${ACCESS_KEY}
    gdcloud config set storage/s3_secret_access_key ${SECRET_KEY}
    gdcloud config set storage/s3_endpoint ${S3_ENDPOINT}
    

    SECRET_NAME를 이전 단계에서 복사한 값으로 바꿉니다.

  4. 스토리지 버킷에서 워크스테이션으로 컨테이너 이미지를 다운로드합니다.

    gdcloud cp s3://BUCKET_NAME/g/CONTAINER_IMAGE_NAME
    

    다음을 바꿉니다.

    • BUCKET_NAME: 컨테이너 이미지가 있는 스토리지 버킷의 이름입니다. PA에서 이 이름을 제공합니다.
    • CONTAINER_IMAGE_NAME: 스토리지 버킷에서 다운로드할 컨테이너 이미지 파일의 이름입니다.

이미지를 시스템 Artifact Registry로 푸시

다음 단계에 따라 워크스테이션에 있는 컨테이너 이미지 파일을 관리 API 서버의 시스템 Artifact Registry에 푸시합니다.

  1. Console을 엽니다.

  2. 컨테이너 이미지를 푸시할 클러스터의 시스템 Artifact Registry 엔드포인트 경로를 가져옵니다.

    export REGISTRY_ENDPOINT=harbor.$(kubectl get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  3. 컨테이너 이미지를 클러스터의 시스템 Artifact Registry 엔드포인트에 로드하고, 태그를 지정하고, 푸시합니다.

    docker load --input CONTAINER_IMAGE_PATH
    
    docker tag CONTAINER_IMAGE_PATH ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    
    docker push ${REGISTRY_ENDPOINT}/CONTAINER_IMAGE_PATH
    

    CONTAINER_IMAGE_PATH을 로컬 파일 시스템의 컨테이너 이미지 파일 경로로 바꿉니다. 이 경로의 유효한 값은 oracle_db.tar입니다.

Harbor 아티팩트 가져오기

대부분의 경우 GDC 시스템은 시스템 아티팩트 레지스트리 (SAR)와 자동으로 상호작용하여 Harbor에서 최신 아티팩트를 가져옵니다. 일부 극단적인 경우에는 이 작업을 수동으로 실행할 수 있습니다. Harbor에서 아티팩트 이미지를 수동으로 가져오려면 다음 단계를 따르세요.

  1. 각 애플리케이션에서 정의한 아티팩트 세부정보를 설정합니다.

    APP_NAME=APP
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    REPOSITORY=REPOSITORY
    

    다음을 바꿉니다.

    • APP: 애플리케이션의 이름입니다.
    • HARBOR_PROJECT_NAME: Harbor 프로젝트 이름입니다.
    • REPOSITORY: 저장소의 이름입니다.
  2. Harbor 정보를 가져옵니다.

    HARBOR_URL=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}')
    HARBOR_IP=${HARBOR_URL#https://}
    
  3. 아티팩트 태그를 가져옵니다. 태그를 가져오는 방법에는 두 가지가 있습니다.

    • 방법 1: 다음은 선호되는 옵션입니다.

      1. 로컬 번들의 아티팩트를 나열하고 해당 태그를 가져옵니다.
      TAG=$(gdcloud artifacts tree ${BUNDLE_SUB_FOLDER:?} | grep ${HARBOR_PROJECT:?}/${REPOSITORY:?} | cut -d ":" -f2 | grep -v '.sig')
      
    • 방법 2: 방법 1이 예상대로 작동하지 않는 경우에만 이 방법을 사용하세요.

      1. Harbor의 태그를 나열하고 가장 최근 태그를 선택합니다.

          ADMIN_PASS=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} -n harbor-system get secret harbor-admin -o jsonpath="{.data.secret}" | base64 -d)
        
          curl -k -X GET \
            --header 'Accept: application/json' \
            --header "authorization: Basic $(echo -n admin:${ADMIN_PASS:?} | base64)" \
          "${HARBOR_URL}/api/v2.0/projects/${HARBOR_PROJECT:?}/repositories/${REPOSITORY:?}/artifacts?with_tag=true" | jq -r '.[] | select(.tags != null) | .tags[] | {tag: .name, updated:.push_time}'
        

        출력은 다음 예와 비슷해야 합니다.

        {
          "tag": "<tag1>",
          "updated": "<date1>"
        }
        {
          "tag": "<tag2>",
          "updated": "<date2>"
        }
        
      2. 가장 최근에 업데이트된 시간의 태그 값을 내보냅니다.

        TAG=MOST_RECENT_TAG
        

        MOST_RECENT_TAG을 가장 최근에 업데이트된 시간이 있는 태그로 바꿉니다.

  4. Harbor에서 아티팩트를 다운로드합니다.

    gdcloud artifacts pull --single-manifest-repo \
    ${HARBOR_IP:?}/${HARBOR_PROJECT:?}/${REPOSITORY:?}:${TAG:?} \
    ${APP_NAME:?}-${TAG:?}
    

    다음 오류 메시지가 표시되면 무시해도 됩니다.

    tee: '/root/logs/artifacts_pull_--single-manifest-repo_2023.07.13:14.59.24.log': Permission denied
    

알려진 문제

Harbor 아티팩트를 가져오는 것과 관련된 몇 가지 알려진 문제가 있습니다.

  • --kubeconfig ${INFRA_ORG_KUBECONFIG:?} 인수를 추가해야 할 수도 있습니다.
  • curl 명령어에 certificate signed by unknown authority 오류 메시지가 표시될 수 있습니다. 다음 방법 중 하나를 사용하여 이 오류를 해결하세요.

    • 임시 수정: gdcloud artifacts pull 명령어에 --insecure 플래그를 추가합니다.
    • 안정적인 수정: 조직 인프라 CA를 신뢰합니다. 자세한 내용은 이미지 가져오기 오류를 참고하세요.
  • 다음과 같이 콘텐츠를 추출해야 할 수 있습니다.

    gdcloud artifacts extract ${APP_NAME:?}-${TAG:?} ${APP_NAME:?}-${TAG:?}-extracted