GKE 비공개 클러스터용 Container Registry 설정

이 페이지에서는 Container Registry를 Google Kubernetes Engine 비공개 클러스터 및 VPC 서비스 제어와 함께 사용할 수 있도록 DNS 항목을 구성하는 방법을 설명합니다. 이 단계는 GKE 비공개 클러스터가 Container Registry를 사용하는 경우에만 필요합니다.

시작하기 전에

서비스 경계를 만들기 전에 새로운 비공개 클러스터를 설정하거나 보호하려는 기존 비공개 클러스터를 식별합니다.

또한 443 포트에서 199.36.153.4/30으로의 이그레스를 허용해야 합니다. 일반적으로 VPC 네트워크에는 모든 대상으로의 이그레스 트래픽을 허용하는 임시 규칙이 있습니다. 그러나 이러한 트래픽을 거부하는 규칙이 있으면 포트 443의 TCP 트래픽을 199.36.153.4/30으로 허용하는 이그레스 방화벽 규칙을 만들어야 합니다.

DNS 구성

서비스 경계 내에서 Container Registry를 사용하는 GKE 비공개 클러스터를 지원하려면 먼저 Container Registry 주소에 대한 요청이 제한된 VIP인 restricted.googleapis.com으로 확인되도록 DNS 서버를 구성해야 합니다. Cloud DNS 비공개 DNS 영역을 사용하여 이렇게 구성할 수 있습니다.

  1. 관리형 비공개 영역을 만듭니다.

    gcloud beta dns managed-zones create ZONE_NAME \
        --visibility=private \
        --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK \
        --description=DESCRIPTION \
        --dns-name=gcr.io \
        --project=PROJECT_ID
    

    여기에서

    • ZONE_NAME은 만들려는 영역의 이름입니다. 예를 들면 gcr입니다. 이 이름은 다음과 같은 각 단계에서 사용됩니다.

    • PROJECT_ID는 GKE 비공개 클러스터를 호스팅하는 프로젝트의 ID입니다.

    • NETWORK는 요청을 리디렉션하려는 클러스터 네트워크의 이름입니다. 기본 네트워크는 default입니다.

    • DESCRIPTION은 관리되는 영역에 대한 사람이 읽을 수 있는 설명입니다(선택사항).

  2. 트랜잭션을 시작합니다.

    gcloud dns record-sets transaction start \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    여기에서

    • ZONE_NAME은 첫 번째 단계에서 생성한 영역의 이름입니다.

    • PROJECT_ID는 GKE 비공개 클러스터를 호스팅하는 프로젝트의 ID입니다.

  3. *.gcr.io의 CNAME 레코드를 추가합니다.

    gcloud dns record-sets transaction add \
      --name=*.gcr.io. \
      --type=CNAME gcr.io. \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    여기에서

    • ZONE_NAME은 첫 번째 단계에서 생성한 영역의 이름입니다.

    • PROJECT_ID는 GKE 비공개 클러스터를 호스팅하는 프로젝트의 ID입니다.

  4. 제한된 VIP에 A 레코드를 추가합니다.

    gcloud dns record-sets transaction add \
      --name=gcr.io. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    여기에서

    • ZONE_NAME은 첫 번째 단계에서 생성한 영역의 이름입니다.

    • PROJECT_ID는 GKE 비공개 클러스터를 호스팅하는 프로젝트의 ID입니다.

  5. 트랜잭션을 실행합니다.

    gcloud dns record-sets transaction execute \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    여기에서

    • ZONE_NAME은 첫 번째 단계에서 생성한 영역의 이름입니다.

    • PROJECT_ID는 GKE 비공개 클러스터를 호스팅하는 프로젝트의 ID입니다.

서비스 경계 구성

DNS 레코드를 구성한 후에는 새로운 서비스 경계를 생성하거나 기존 경계를 업데이트한 후 서비스 경계를 사용하여 보호하려는 서비스 목록에 Container Registry 서비스를 추가합니다.

경계가 작동하는지 확인

서비스 경계를 구성한 후에는 PHP 방명록 가이드를 따라 경계가 올바르게 작동하는지 확인할 수 있습니다.

구성이 제대로 작동하면 방명록 애플리케이션 웹 프런트엔드의 pod를 시작할 수 없습니다.

다음은 경계가 올바르게 구성된 경우에 반환되어야 하는 결과의 예를 보여주는 오류 메시지입니다.

Events:
  Type     Reason                 Age               From                                               Message
  ----     ------                 ----              ----                                               -------
  Normal   Scheduled              8m                default-scheduler                                  Successfully assigned sample-67f11b22f-t7ltj to gke-netpolicy-default-pool-02ad111e-06tk
  Normal   SuccessfulMountVolume  8m                kubelet, gke-netpolicy-default-pool-02ad111e-06tk  MountVolume.SetUp succeeded for volume "default-token-lhx2s"
  Normal   Pulling                6m (x4 over 8m)   kubelet, gke-netpolicy-default-pool-02ad111e-06tk  pulling image "gcr.io/google_samples/gb-frontend:v4"
  Warning  Failed                 6m (x4 over 8m)   kubelet, gke-netpolicy-default-pool-02ad111e-06tk  Failed to pull image "gcr.io/google_samples/gb-frontend:v4": rpc error: code = Unknown desc = Error response from daemon: Get https://gcr.io/v2/google_samples/gb-frontend/manifests/v4: denied: Request is prohibited by organization's policy