이 튜토리얼에서는 배스천 호스트를 사용하여 인터넷을 통해 Google Kubernetes Engine(GKE)에서 비공개 클러스터에 액세스하는 방법을 보여줍니다.
클라이언트가 공개 엔드포인트에 액세스할 수 없는 GKE 비공개 클러스터를 만들 수 있습니다. 이 액세스 옵션은 제어 영역에 대한 모든 인터넷 액세스를 방지하여 클러스터 보안을 향상시켜 줍니다. 하지만 공개 엔드포인트에 대한 액세스를 사용 중지하면 원격 클라이언트의 IP 주소를 승인된 네트워크로 추가하지 않는 한 원격으로 클러스터와 상호작용할 수 없습니다.
이 튜토리얼에서는 공격을 견딜 수 있도록 설계된 특수 목적의 호스트 머신인 배스천 호스트를 설정하는 방법을 보여줍니다. 이 배스천 호스트는 Tinyproxy를 사용해서 클라이언트 트래픽을 클러스터로 전달합니다. IAP(Identity-Aware Proxy)를 사용하여 원격 클라이언트에서 배스천 호스트에 안전하게 액세스할 수 있습니다.
목표
- 공개 엔드포인트에 액세스할 수 없는 비공개 클러스터 만들기
- 클러스터 서브넷에서 배스천 호스트 역할을 할 Compute Engine 가상 머신(VM) 배포하기
- IAP를 사용하여 인터넷을 통해 원격 클라이언트를 클러스터에 연결하기
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Update and install
gcloud
components:gcloud components update
gcloud components install alpha beta -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Update and install
gcloud
components: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 서브네트워크 만들기
Google Cloud Console에서 VPC 네트워크 페이지로 이동합니다.
기본 네트워크를 클릭합니다.
서브넷 섹션에서 서브넷 추가를 클릭합니다.
서브넷 추가 대화상자에서 다음을 지정합니다.
- 이름: 새 서브넷의 이름입니다.
- 리전: 서브넷의 리전입니다. 클러스터 리전과 동일해야 합니다.
- IP 주소 범위:
10.2.204.0/22
또는 VPC 네트워크의 다른 범위와 충돌하지 않는 다른 범위를 지정하세요. - 비공개 Google 액세스에 대해 사용 옵션을 선택합니다.
추가를 클릭합니다.
비공개 클러스터 만들기
Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.
만들기를 클릭합니다.
GKE Autopilot의 구성을 클릭합니다.
새 클러스터의 이름 및 리전을 지정합니다. 리전은 서브넷과 동일해야 합니다.
네트워킹 섹션에서 비공개 클러스터 옵션을 선택합니다.
외부 IP 주소를 사용한 액세스 제어 영역 체크박스를 선택 취소합니다.
노드 서브넷 드롭다운 목록에서 앞에서 만든 서브넷을 선택합니다.
선택적으로 클러스터의 다른 설정을 구성합니다.
만들기를 클릭합니다.
또한 --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을 배치할 서브네트워크
콘솔
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
인스턴스 만들기를 클릭합니다.
다음 사항을 지정합니다.
- 이름: VM 이름
- 리전 및 영역: VM의 리전 및 영역. 클러스터와 동일한 리전을 사용하세요.
- 머신 유형: 머신 유형. 소형 머신 유형(예시:
e2-micro
)을 선택합니다. - 네트워크 인터페이스에 대해서는 클러스터와 동일한 VPC 네트워크 및 서브넷을 선택합니다.
- 선택적으로 인스턴스의 다른 설정을 구성합니다.
만들기를 클릭합니다.
방화벽 규칙 만들기
IAP에서 배스천 호스트 VM에 연결하도록 하려면 방화벽 규칙을 만듭니다.
프록시 배포
배스천 호스트 및 비공개 클러스터가 구성되었으면 호스트에 프록시 데몬을 배포하여 트래픽을 클러스터 제어 영역으로 전달해야 합니다. 이 튜토리얼에서는 Tinyproxy를 설치합니다.
VM에서 세션을 시작합니다.
gcloud compute ssh INSTANCE_NAME --tunnel-through-iap --project=PROJECT_ID
Tinyproxy를 설치하세요.
sudo apt install tinyproxy
Tinyproxy 구성 파일을 엽니다.
sudo vi /etc/tinyproxy/tinyproxy.conf
파일에서 다음을 수행합니다.
- 포트가
8888
인지 확인합니다. Allow
섹션을 검색합니다./Allow 127
Allow
섹션에 다음 줄을 추가합니다.Allow localhost
- 포트가
파일을 저장하고 Tinyproxy를 다시 시작합니다.
sudo service tinyproxy restart
세션을 종료합니다.
exit
원격 클라이언트에서 클러스터에 연결
Tinyproxy를 구성한 후에는 클러스터 사용자 인증 정보를 사용하여 원격 클라이언트를 설정하고 프록시를 지정해야 합니다. 원격 클라이언트에서 다음을 수행합니다.
클러스터의 사용자 인증 정보를 가져옵니다.
gcloud container clusters get-credentials CLUSTER_NAME \ --region=COMPUTE_REGION \ --project=PROJECT_ID
다음을 바꿉니다.
CLUSTER_NAME
: 비공개 클러스터의 이름COMPUTE_REGION
: 클러스터의 리전PROJECT_ID
: 클러스터의 Google Cloud 프로젝트 ID
IAP를 사용하여 배스천 호스트에 터널을 엽니다.
gcloud compute ssh INSTANCE_NAME \ --tunnel-through-iap \ --project=PROJECT_ID \ --zone=COMPUTE_ZONE \ --ssh-flag="-4 -L8888:localhost:8888 -N -q -f"
프록시를 지정합니다.
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 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
개별 리소스 삭제
이 튜토리얼에서 배포한 배스천 호스트를 삭제하세요.
gcloud compute instances delete INSTANCE_NAME \ --zone=COMPUTE_ZONE
다음과 같이 클러스터를 삭제합니다.
gcloud container clusters delete CLUSTER_NAME \ --region=COMPUTE_REGION
서브넷 삭제:
gcloud compute networks subnets delete SUBNET_NAME \ --region=COMPUTE_REGION