배스천 호스트를 사용하여 비공개 클러스터에 원격으로 액세스


이 튜토리얼에서는 배스천 호스트를 사용하여 인터넷을 통해 Google Kubernetes Engine(GKE)에서 비공개 클러스터에 액세스하는 방법을 보여줍니다.

클라이언트가 공개 엔드포인트에 액세스할 수 없는 GKE 비공개 클러스터를 만들 수 있습니다. 이 액세스 옵션은 제어 영역에 대한 모든 인터넷 액세스를 방지하여 클러스터 보안을 향상시켜 줍니다. 하지만 공개 엔드포인트에 대한 액세스를 사용 중지하면 원격 클라이언트의 IP 주소를 승인된 네트워크로 추가하지 않는 한 원격으로 클러스터와 상호작용할 수 없습니다.

이 튜토리얼에서는 공격을 견딜 수 있도록 설계된 특수 목적의 호스트 머신인 배스천 호스트를 설정하는 방법을 보여줍니다. 이 배스천 호스트는 Tinyproxy를 사용해서 클라이언트 트래픽을 클러스터로 전달합니다. IAP(Identity-Aware Proxy)를 사용하여 원격 클라이언트에서 배스천 호스트에 안전하게 액세스할 수 있습니다.

목표

  • 공개 엔드포인트에 액세스할 수 없는 비공개 클러스터 만들기
  • 클러스터 서브넷에서 배스천 호스트 역할을 할 Compute Engine 가상 머신(VM) 배포하기
  • IAP를 사용하여 인터넷을 통해 원격 클라이언트를 클러스터에 연결하기

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API GKE, Compute Engine, Identity-Aware Proxy 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  7. gcloud 구성요소를 업데이트 및 설치합니다.
    gcloud components update
    gcloud components install alpha beta
  8. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  9. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  10. API GKE, Compute Engine, Identity-Aware Proxy 사용 설정

    API 사용 설정

  11. Google Cloud CLI를 설치합니다.
  12. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  13. gcloud 구성요소를 업데이트 및 설치합니다.
    gcloud components update
    gcloud components install alpha beta

비공개 클러스터 만들기

클라이언트가 공개 엔드포인트에 액세스할 수 없는 새로운 비공개 클러스터를 만듭니다. 클러스터를 자체 서브넷에 배치합니다. 이 작업은 Google Cloud CLI 또는 Google Cloud Console을 사용하여 수행할 수 있습니다.

gcloud

다음 명령어를 실행합니다.

gcloud container clusters create-auto CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --create-subnetwork=name=SUBNET_NAME \
    --enable-master-authorized-networks \
    --enable-private-nodes \
    --enable-private-endpoint

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름
  • COMPUTE_REGION: 클러스터의 Compute Engine 리전
  • SUBNET_NAME: 클러스터를 배치할 새 서브네트워크 이름

Console

Virtual Private Cloud 서브네트워크 만들기

  1. Google Cloud Console에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. 기본 네트워크를 클릭합니다.

  3. 서브넷 섹션에서 서브넷 추가를 클릭합니다.

  4. 서브넷 추가 대화상자에서 다음을 지정합니다.

    1. 이름: 새 서브넷의 이름입니다.
    2. 리전: 서브넷의 리전입니다. 클러스터 리전과 동일해야 합니다.
    3. IP 주소 범위: 10.2.204.0/22 또는 VPC 네트워크의 다른 범위와 충돌하지 않는 다른 범위를 지정하세요.
    4. 비공개 Google 액세스에 대해 사용 옵션을 선택합니다.
  5. 추가를 클릭합니다.

비공개 클러스터 만들기

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭합니다.

  3. GKE Autopilot구성을 클릭합니다.

  4. 새 클러스터의 이름리전을 지정합니다. 리전은 서브넷과 동일해야 합니다.

  5. 네트워킹 섹션에서 비공개 클러스터 옵션을 선택합니다.

  6. 외부 IP 주소를 사용한 액세스 제어 영역 체크박스를 선택 취소합니다.

  7. 노드 서브넷 드롭다운 목록에서 앞에서 만든 서브넷을 선택합니다.

  8. 선택적으로 클러스터의 다른 설정을 구성합니다.

  9. 만들기를 클릭합니다.

또한 --master-ipv4-cidr 플래그를 지정하여 GKE Standard 클러스터를 사용할 수 있습니다.

배스천 호스트 VM 만들기

비공개 클러스터 내부 네트워크 내에 클러스터를 관리할 수 있는 배스천 호스트 역할을 하는 Compute Engine VM을 만드세요.

gcloud

Compute Engine VM 만들기

gcloud compute instances create INSTANCE_NAME \
    --zone=COMPUTE_ZONE \
    --machine-type=e2-micro \
    --network-interface=no-address,network-tier=PREMIUM,subnet=SUBNET_NAME

다음을 바꿉니다.

  • INSTANCE_NAME: VM의 이름
  • COMPUTE_ZONE: VM의 Compute Engine 영역입니다. 이를 클러스터와 동일한 리전에 배치합니다.
  • SUBNET_NAME: VM을 배치할 서브네트워크

콘솔

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. 인스턴스 만들기를 클릭합니다.

  3. 다음 사항을 지정합니다.

    1. 이름: VM 이름
    2. 리전영역: VM의 리전 및 영역. 클러스터와 동일한 리전을 사용하세요.
    3. 머신 유형: 머신 유형. 소형 머신 유형(예시: e2-micro)을 선택합니다.
    4. 네트워크 인터페이스에 대해서는 클러스터와 동일한 VPC 네트워크 및 서브넷을 선택합니다.
    5. 선택적으로 인스턴스의 다른 설정을 구성합니다.
  4. 만들기를 클릭합니다.

방화벽 규칙 만들기

IAP가 배스천 호스트 VM에 연결하도록 허용하려면 방화벽 규칙을 만듭니다.

프록시 배포

배스천 호스트 및 비공개 클러스터가 구성되었으면 호스트에 프록시 데몬을 배포하여 트래픽을 클러스터 제어 영역으로 전달해야 합니다. 이 튜토리얼에서는 Tinyproxy를 설치합니다.

  1. VM에서 세션을 시작합니다.

    gcloud compute ssh INSTANCE_NAME --tunnel-through-iap --project=PROJECT_ID
    
  2. Tinyproxy를 설치하세요.

    sudo apt install tinyproxy
    
  3. Tinyproxy 구성 파일을 엽니다.

    sudo vi /etc/tinyproxy/tinyproxy.conf
    
  4. 파일에서 다음을 수행합니다.

    1. 포트가 8888인지 확인합니다.
    2. Allow 섹션을 검색합니다.

        /Allow 127
      
    3. Allow 섹션에 다음 줄을 추가합니다.

        Allow localhost
      
  5. 파일을 저장하고 Tinyproxy를 다시 시작합니다.

    sudo service tinyproxy restart
    
  6. 세션을 종료합니다.

    exit
    

원격 클라이언트에서 클러스터에 연결

Tinyproxy를 구성한 후에는 클러스터 사용자 인증 정보를 사용하여 원격 클라이언트를 설정하고 프록시를 지정해야 합니다. 원격 클라이언트에서 다음을 수행합니다.

  1. 클러스터의 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials CLUSTER_NAME \
        --region=COMPUTE_REGION \
        --project=PROJECT_ID
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 비공개 클러스터의 이름
    • COMPUTE_REGION: 클러스터의 리전
    • PROJECT_ID: 클러스터의 Google Cloud 프로젝트 ID
  2. IAP를 사용하여 배스천 호스트에 터널을 엽니다.

    gcloud compute ssh INSTANCE_NAME \
        --tunnel-through-iap \
        --project=PROJECT_ID \
        --zone=COMPUTE_ZONE \
        --ssh-flag="-4 -L8888:localhost:8888 -N -q -f"
    
  3. 프록시를 지정합니다.

    export HTTPS_PROXY=localhost:8888
    kubectl get ns
    

    출력은 비공개 클러스터의 네임스페이스 목록입니다.

원격 클라이언트에서 리슨 중지

언제든지 원격 클라이언트에서 변경사항을 되돌리려면 TCP 포트 8888에서 리스너 프로세스를 종료합니다. 이를 수행하기 위한 명령어는 클라이언트 운영체제에 따라 다릅니다.

netstat -lnpt | grep 8888 | awk '{print $7}' | grep -o '[0-9]\+' | sort -u | xargs sudo kill

문제 해결하기

엔터프라이즈 네트워크의 방화벽 제한사항

엄격한 방화벽이 설정된 엔터프라이즈 네트워크에 있는 경우 예외 요청이 없이는 이 튜토리얼을 완료하지 못할 수 있습니다. 예외를 요청할 경우 배스천 호스트의 소스 IP 범위는 기본적으로 35.235.240.0/20입니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

개별 리소스 삭제

  1. 이 튜토리얼에서 배포한 배스천 호스트를 삭제하세요.

    gcloud compute instances delete INSTANCE_NAME \
        --zone=COMPUTE_ZONE
    
  2. 다음과 같이 클러스터를 삭제합니다.

    gcloud container clusters delete CLUSTER_NAME \
        --region=COMPUTE_REGION
    
  3. 서브넷 삭제:

    gcloud compute networks subnets delete SUBNET_NAME \
        --region=COMPUTE_REGION