-
[GCP] GKE 설명 및 생성해보기카테고리 없음 2025. 3. 30. 18:30
GKE 모드 설명
gke는 autopilot 모드와 standard 모드가 있습니다.
autopilot 모드는 Google이 클러스터 인프라를 자동으로 관리해주는 완전 관리형 모드로 노드 관리가 필요 없고, 워크로드에만 집중 가능하며 사용한 리소스만큼 비용을 지불하면 됩니다.
GKE Autopilot과 Standard를 비교 요약하면 다음과 같습니다.
항목 Autopilot 모드 Standard 모드 운영 부담 ✅ Google이 자동 관리 ❌ 직접 관리 필요 노드 관리 ❌ 불가능 (Google이 자동 운영) ✅ 가능 (사용자가 설정) 리소스 과금 방식 Pod 단위 과금 (최적화됨) VM 단위 과금 (비효율적일 수 있음) 확장성 ✅ 자동 확장 최적화 ⚠️ 직접 관리 필요 보안 관리 ✅ 자동 보안 패치 ⚠️ 수동 패치 필요 커스텀 설정 ❌ 제한됨 ✅ 네트워크, OS 설정 자유 사용 사례 빠른 배포, 운영 부담 최소화 고유한 설정이 필요한 경우 클러스터 기본사항
클러스터 등급을 변경하면 추가 기능이 포함되지만 비용도 추가적으로 지불됩니다.
네트워킹
Access using DNS
DNS를 사용해 접근을 하도록 하는 옵션입니다. 해당 옵션은 클러스터 생성 후 변경할 수 있습니다.
Access using IPv4 addresses
IP를 통해 접근하도록 하는 옵션입니다. DNS를 통한 접근을 하도록 허용하지 않으면 해당 옵션은 활성화가 고정입니다.
승인된 네트워크 사용 설정(enable-master-authorized-networks)
컨트롤 플레인에 허용되는 IP 대역대만 접근하도록 하는 옵션입니다.
아래의
컨트롤 플레인 외부 IP 주소를 사용하여 액세스
를 비활성화하면 해당 옵션은 자동으로 활성화가 고정으로 됩니다.컨트롤 플레인 외부 IP 주소를 사용하여 액세스 (enable-private-endpoint)
이 옵션을 선택하면 GKE 컨트롤 플레인에 공인(Public) IP 주소가 할당됩니다. 이 외부 IP 주소를 통해 인터넷 어디에서든 (적절한 인증 정보가 있다면) Kubernetes API 서버에 접근할 수 있습니다. 해당 옵션을 활성화한다면 로컬 개발 환경이나 Google Cloud 외부의 CI/CD 시스템 등 어디서든
kubectl
명령어를 사용하기 편리하지만 컨트롤 플레인의 API 엔드포인트가 공용 인터넷에 노출되므로 보안 위협에 더 취약할 수 있습니다. 이 옵션을 사용하더라도, 아래 설명할 "승인된 네트워크(Authorized Networks)" 기능을 함께 사용하여 특정 IP 대역에서만 접근을 허용하도록 제한해야 합니다.public 클러스터, private 클러스터를 나눌 때, 핵심인 옵션입니다.
모든 리전의 컨트롤 플레인 내부 IP 주소를 사용하여 액세스 (enable-master-global-access)
이 옵션을 선택하면 컨트롤 플레인에 외부 IP 주소가 할당되지 않고 클러스터가 속한 VPC 네트워크 내에서만 접근 가능한 비공개(Private) IP 주소만 할당됩니다.
모든 리전
이라는 표현은 Google의 관리형 서비스가 리전에 상관없이 이 내부 엔드포인트에 접근할 수 있음을 의미하지만, 여전히 VPC 외부의 공용 인터넷에서는 직접 접근할 수 없습니다. 이 옵션은비공개 클러스터(Private Cluster)
를 구성하는 핵심 설정입니다.컨트롤 플레인이 공용 인터넷에 노출되지 않아 보안성이 크게 향상되고 내부 네트워크에서만 접근이 가능하므로 외부 공격 표면이 줄어들지만 VPC 외부(예: 로컬 개발 환경, 온프레미스 네트워크)에서 컨트롤 플레인에 접근하려면 Cloud VPN, Cloud Interconnect, 또는 VPC 내부에 배스천 호스트(점프 서버)를 설정하는 등의 추가 구성이 필요합니다. 보안이 중요한 프로덕션 환경에서는 이 옵션을 사용하는 것이 좋습니다.
Enforce authorized networks on the control plane's internal endpoint[컨트롤 플레인 내부 엔드포인트에 승인된 네트워크 적용] (enable-authorized-networks-on-private-endpoint)
이 옵션은
승인된 네트워크 사용 설정
를 선택했을 때 추가로 적용할 수 있는 보안 강화 기능입니다. 활성화하면 VPC 내부에서 컨트롤 플레인의 내부 IP 주소로 접근하는 경우에도승인된 네트워크
목록에 포함된 IP 주소 또는 CIDR 범위에서만 접근을 허용합니다.비공개 클러스터(내부 IP만 사용)의 보안을 더욱 강화하기 위해 사용됩니다. 예를 들어, VPC 내의 특정 서브넷(예: 관리용 서브넷, 배스천 호스트가 있는 서브넷)에서만 컨트롤 플레인 접근을 허용하고 싶을 때 유용합니다. 이 옵션은 내부 엔드포인트에 대한 접근 제어이며, 외부 엔드포인트의 승인된 네트워크 설정과는 별개입니다.
Google Cloud 외부 IP 주소를 승인된 네트워크에 추가 (no-enable-google-cloud-access)
승인된 네트워크(Authorized Networks)는 컨트롤 플레인 API 서버에 접근할 수 있는 IP 주소 범위를 제한하는 기능입니다. 이 특정 옵션을 체크하면, Cloud Shell, Cloud Build 등 Google Cloud의 다양한 서비스들이 사용하는 공인 IP 주소 대역을 자동으로 승인된 네트워크 목록에 추가해 줍니다.
주로 외부 IP 주소 사용을 선택하고 "승인된 네트워크" 기능을 활성화했을 때 사용합니다. 이 옵션을 사용하지 않으면, Cloud Shell 등에서 클러스터에 접근하기 위해 해당 서비스의 IP 대역을 수동으로 찾아서 추가해야 하는 번거로움이 있습니다. 이 옵션은 이러한 Google Cloud 서비스와의 원활한 연동을 보장합니다.
만약 외부 IP 주소를 사용하지 않고 내부 IP 주소만 사용한다면(모든 리전의 컨트롤 플레인 내부 IP 주소를 사용하여 액세스), 이 옵션의 직접적인 영향은 제한적입니다. 하지만 Google Cloud 서비스(예: Cloud Build)가 VPC 외부에서 실행되어 클러스터 API에 접근해야 하는 경우 관련될 수 있습니다.
네트워크, 서브넷
GKE에서 사용할 vpc와 서브넷을 지정합니다.
Enable Private nodes (enable-private-nodes)
내부 IP 주소만 사용하여 노드를 프로비저닝하기 위한 옵션입니다. 활성화하면 외부 클라이언트가 노드에 액세스할 수 없고 인터넷에 직접 액세스할 수 있는 노드에서 액세스할 수 없습니다. 이 설정은 언제든지 변경할 수 있습니다. 비공개 노드의 사용 설정 여부와 관계없이 컨트롤 플레인은 내부 IP 주소를 통해서만 모든 노드와 통신합니다.
제어 영역의 기본 비공개 엔드포인트 서브넷 재정의 (private-endpoint-subnetwork)
GKE는 기본적으로 클러스터 서브넷에 비공개 엔드포인트를 프로비저닝합니다. Enable Private nodes 옵션을 활성화하면 해당 옵션은 설정하지 않아도 됩니다.
고급 설정
고급 설정의 내용 대부분은 생성 후 수정할 수 있으므로 여기선 설명을 생략합니다.
public 클러스터, private 클러스터 나누는 기준
GKE에서 public 클러스터, private 클러스터를 나누는 기준은 컨트롤 플레인(마스터 노드)의 엔드포인트 접근성입니다. 즉,
컨트롤 플레인 외부 IP 주소를 사용하여 액세스 (enable-private-endpoint)
옵션의 활성화 여부에 따라 공개, 비공개 클러스터가 나뉩니다.Enable Private nodes (enable-private-nodes)
옵션의 경우, 비활성화되었다고 해서 public 클러스터, private 클러스터를 나누진 않습니다. 이 옵션은컨트롤 플레인 외부 IP 주소를 사용하여 액세스 (enable-private-endpoint)
와 독립적으로 사용될 수 있습니다.enable-private-endpoint
와Enable Private nodes (enable-private-nodes)
는 다음과 같은 조합이 될 수 있습니다.- 공개 클러스터 + 공개 노드
- (기본값) 컨트롤 플레인과 워커 노드 모두 외부 IP를 가집니다.
- 공개 클러스터 + 비공개 노드(
enable-private-nodes
만 사용)- 컨트롤 플레인은 외부 IP를 가지지만 워커 노드는 내부 IP만 가집니다. 컨트롤 플레인이 외부에 노출되어 있으므로 공개 클러스터로 분류됩니다.
- 비공개 클러스터 + 공개 노드(
enable-private-endpoint
만 사용)- 컨트롤 플레인은 내부 IP만 가지지만 워커 노드는 외부 IP를 가집니다. 기술적으로 가능하지만 매우 드문 구성이며 보안상 이점도 줄어듭니다. 그래도 컨트롤 플레인이 비공개이므로 비공개 클러스터로 분류됩니다.
- 비공개 클러스터 + 비공개 노드(
enable-private-endpoint
와enable-private-nodes
모두 사용)- 컨트롤 플레인과 워커 노드 모두 내부 IP만 가집니다. 가장 일반적인 형태의 비공개 클러스터 구성입니다.
예시
공개 엔드포인트에서 액세스할 수 없는 비공개 클러스터 만들기
클러스터에서 사용할 서브넷에 비공개 Google 액세스 옵션을 활성화 시킵니다. 이후 클러스터는 다음과 같이 설정합니다.
gcloud container clusters create-auto private-cluster-0 \ --network "projects/{프로젝트명}/global/networks/test-vpc1 \ --subnetwork "projects/{프로젝트명}/regions/us-central1/subnetworks/private-gke-subnet" \ --enable-master-authorized-networks \ --enable-private-nodes \ --enable-private-endpoint
이렇게 클러스터를 구성할 경우, 승인된 외부 네트워크가 없으므로 로컬에서 kubectl을 실행할 수 없습니다.
private-gke-subnet
에 VM을 생성하고 해당 VM에서 kubectl을 사용하는 방식으로 해야 합니다.만약 다른 서브넷에 존재하는 VM에서 호출하고자 한다면 다음과 같이 승인된 네트워크를 추가해야 합니다.
gcloud container clusters update private-cluster-0 \ --enable-master-authorized-networks \ --master-authorized-networks 10.11.20.0/24
공개 엔드포인트에 무제한으로 액세스할 수 있는 공개 클러스터 만들기
gcloud container clusters create-auto private-cluster-1 \ --network "projects/{프로젝트명}/global/networks/test-vpc1 \ --subnetwork "projects/{프로젝트명}/regions/us-central1/subnetworks/private-gke-subnet" \ --no-enable-master-authorized-networks \ --enable-private-nodes
승인된 네트워크만 컨트롤 플레인에 접속하도록 구성할 수 있습니다. 하지만 컨트롤 플레인에 외부 IP가 할당되므로 보안적으로 취약하여 운영환경에서는 사용하지 않는 것이 좋습니다.
공개 엔드포인트에서 액세스할 수 없는 비공개 클러스터에 kubectl 명령어 호출하기
--enable-private-endpoint 옵션을 활성화하면 로컬에서 kubectl 명령어를 사용할 수 없습니다. 승인된 네트워크를 추가하는 것도 외부 네트워크가 아닌 내부 네트워크의 IP 대역대만 등록할 수 있습니다.
로컬에서 kubectl과 같은 명령어를 호출할 수 있는 가장 간단한 방법은 enable-private-endpoint 옵션을 비활성화하고 허용된 네트워크에서만 접속하도록 하는 것입니다. 하지만 해당 방법을 진행하면 컨트롤 플레인이 외부 IP를 가지게 되므로 보안적으로 좋지 않습니다. 따라서 다음과 같은 방법으로 우회하는 것이 좋습니다.
Cloud VPN이나 Coud Interconnect 사용
GCP Cloud VPN을 사용해서 GKE VPC와 로컬 네트워크를 연결하고 Cloud Interconnect를 이용해서 GCP 네트워크를 내부망처럼 사용하는 방식입니다. 이렇게 하면 컨트롤 플레인에 프라이빗 IP로 직접 접근 가능하게 됩니다. 즉, enable-private-endpoint를 유지하면서도 로컬에서 안전하게 kubectl을 사용할 수 있습니다.
GCP Bastion host 사용
GCP VM을 하나 만들고 이를 통해 kubectl을 실행하는 방법입니다. 이 방식은 VPN보다 간단하지만, SSH 접근 관리가 필요하며 로컬이 아닌 vm에서 실행하는 것이기 때문에 필요한 도구들을 해당 VM에 설치해야 합니다.
Cloud Shell 사용
Google Cloud Shell에서 kubectl을 실행하는 방법입니다. Cloud Shell은 GCP 내부 네트워크에서 실행되므로 자동으로 프라이빗 컨트롤 플레인에 접근 가능하며 추가 설정 없이 바로 사용 가능합니다. 하지만 Cloud Shell 세션이 짧고 지속적인 사용이 어려울 수 있습니다.
레퍼런스
https://cloud.google.com/kubernetes-engine/docs/how-to/creating-an-autopilot-cluster?hl=ko
https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters?hl=ko
- 공개 클러스터 + 공개 노드