이 튜토리얼에서는 배스천 호스트를 사용하여 인터넷을 통해 Google Kubernetes Engine(GKE)에서 비공개 클러스터에 액세스하는 방법을 보여줍니다.
클라이언트가 공개 엔드포인트에 액세스할 수 없는 GKE 비공개 클러스터를 만들 수 있습니다. 이 액세스 옵션은 컨트롤 플레인에 대한 모든 인터넷 액세스를 방지하여 클러스터 보안을 향상시켜 줍니다. 하지만 공개 엔드포인트에 대한 액세스를 사용 중지하면 원격 클라이언트의 IP 주소를 승인된 네트워크로 추가하지 않는 한 원격으로 클러스터와 상호작용할 수 없습니다.
이 튜토리얼에서는 공격을 견딜 수 있도록 설계된 특수 목적의 호스트 머신인 배스천 호스트를 설정하는 방법을 보여줍니다. 이 배스천 호스트는 Tinyproxy를 사용해서 클라이언트 트래픽을 클러스터로 전달합니다. IAP(Identity-Aware Proxy)를 사용하여 원격 클라이언트에서 배스천 호스트에 안전하게 액세스할 수 있습니다.
비공개 클러스터 만들기
클라이언트가 공개 엔드포인트에 액세스할 수 없는 새로운 비공개 클러스터를 만듭니다. 클러스터를 자체 서브넷에 배치합니다. Google Cloud CLI 또는 Google Cloud 콘솔을 사용하여 이 작업을 수행할 수 있습니다.
gcloud
다음 명령어를 실행합니다.
gcloud container clusters create-auto CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--create-subnetwork=name=SUBNET_NAME \
--enable-master-authorized-networks \
--enable-private-nodes \
--enable-private-endpoint
다음을 바꿉니다.
CLUSTER_NAME
: 새 클러스터의 이름입니다.CONTROL_PLANE_LOCATION
: 클러스터의 컨트롤 플레인에 대한 Compute Engine 리전입니다.SUBNET_NAME
: 클러스터를 배치할 새 서브네트워크 이름입니다.
콘솔
Virtual Private Cloud 서브네트워크 만들기
Google Cloud 콘솔에서 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 \ --location=CONTROL_PLANE_LOCATION \ --project=PROJECT_ID
다음을 바꿉니다.
CLUSTER_NAME
: 비공개 클러스터의 이름입니다.CONTROL_PLANE_LOCATION
: 클러스터의 컨트롤 플레인에 대한 Compute Engine 위치입니다. 리전 클러스터의 경우 리전 또는 영역 클러스터의 경우 영역을 제공합니다.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
입니다.