기본적으로 Google Kubernetes Engine (GKE) 노드는 각 노드에서 kubelet 프로세스를 사용하여 Kubernetes API 서버에 노드 객체를 등록합니다. 이 문서에서는 보안 GKE 노드의 자동 등록을 방지하고 대신 신뢰할 수 있는 GKE 컨트롤 플레인 구성요소가 등록 작업을 실행하도록 요구하는 방법을 보여줍니다. 보안 엔지니어와 플랫폼 관리자는 컨트롤 플레인 노드 생성을 사용하여 노드의 권한을 제한할 수 있습니다.
다음 개념에 익숙해야 합니다.
GKE의 노드 생성 모드
모든 GKE 클러스터에서 사용 설정되는 보안 GKE 노드는 노드 등록 프로세스 중에 노드 ID의 암호화 확인을 강제합니다. 이 확인을 통해 합법적인 노드만 Kubernetes API 서버에 등록하고 워크로드를 실행할 수 있습니다.
각 노드의 kubelet가 API 서버에서 Node 객체를 생성하고 수정하는 GKE 클러스터의 기본 등록 워크플로에서는 노드가 손상될 경우 위험이 발생합니다. 예를 들어 CVE-2025-5187에서 취약점으로 인해 노드 사용자가 해당 Node 객체를 삭제하고 손상된 노드를 등록할 수 있었습니다.
컨트롤 플레인 노드 생성
GKE 버전 1.35.3-gke.1189000 이상에서는 kubelet가 노드를 자체 등록하도록 허용하는 대신 gcp-controller-manager라는 신뢰할 수 있는 GKE 컨트롤 플레인 구성요소가 Node 객체를 만들도록 선택적으로 요구할 수 있습니다. kubelet가 암호화 방식으로 확인된 노드 ID를 사용하여 API 서버와의 TLS 연결을 설정하면 gcp-controller-manager 구성요소가 Node 객체를 만듭니다. 승인 컨트롤러는 kubelet에서 Node 객체를 생성하려는 요청을 거부합니다. 컨트롤 플레인 구성요소를 사용하여 Node 객체를 만들면 잠재적으로 손상된 노드가 임의의 Node 객체를 만들거나 Node 사양을 조작할 위험을 줄일 수 있습니다.
기본 노드 생성 및 등록 동작을 변경하려면 Standard 또는 Autopilot 클러스터를 만들 때 다음 중 하나를 실행합니다.
- Google Cloud CLI:
--node-creation-mode플래그에CONTROL_PLANE값을 지정합니다. - Kubernetes Engine API:
NodeCreationConfig메서드의node-creation-mode필드에VIA_CONTROL_PLANE값을 지정합니다.
제한사항
gcp-controller-manager가 Kubernetes API에서 Node 객체를 만드는 시점과 kubelet가 전체 노드 라벨 및 주석으로 해당 Node 객체를 업데이트하는 시점 사이에 약간의 지연이 있습니다. 노드 생성 시 전체 라벨 또는 주석에 즉시 의존하는 워크로드 또는 컨트롤러는 예기치 않은 동작을 보일 수 있습니다. 특정 라벨과 주석은 kubelet 등록과 다른 시간에 조정될 수 있습니다. 작업 부하와 DaemonSet이 작동하기 전에 라벨 및 주석 존재 확인을 사용하는지 확인합니다.
- 모든 노드 taint에 대한 톨러레이션이 있는 DaemonSet 및 워크로드를 배포하지 마세요. 이렇게 하면 준비되지 않은 노드에서 포드가 실행될 수 있습니다.
initContainer을 사용하여 기본 컨테이너를 실행하기 전에 노드 라벨을 확인합니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
컨트롤 플레인 노드 생성 사용 설정
클러스터를 만들거나 기존 클러스터를 업데이트할 때 gcp-controller-manager 구성요소를 사용하여 노드 생성을 사용 설정할 수 있습니다. 기존 클러스터의 경우 업데이트는 클러스터의 새 노드에만 영향을 미칩니다. 기존 노드는 변경사항의 영향을 받지 않습니다.
다음 명령어는 기존 클러스터의 컨트롤 플레인 노드 생성 모드를 사용 설정합니다.
gcloud container clusters update CLUSTER_NAME \
--node-creation-mode=CONTROL_PLANE \
--location=CONTROL_PLANE_LOCATION \
다음을 바꿉니다.
CLUSTER_NAME: 클러스터 이름입니다.CONTROL_PLANE_LOCATION: 클러스터 컨트롤 플레인의 리전 또는 영역입니다.
clusters create 명령어 및 clusters create-auto 명령어에서 --node-creation-mode 플래그를 지정할 수도 있습니다.
컨트롤 플레인 노드 생성 사용 중지
--node-creation-mode Google Cloud CLI 플래그에 KUBELET 값을 지정하거나 NodeCreationConfig GKE API 메서드에 VIA_KUBELET 값을 지정하여 kubelet가 언제든지 노드를 만드는 기본 GKE 동작으로 되돌릴 수 있습니다. 기존 클러스터의 경우 이 변경사항은 해당 클러스터의 새 노드에만 영향을 미칩니다.
다음 명령어는 컨트롤 플레인 노드 생성을 사용 중지하도록 클러스터를 업데이트합니다.
gcloud container clusters update CLUSTER_NAME \
--node-creation-mode=KUBELET \
--location=CONTROL_PLANE_LOCATION \
다음을 바꿉니다.
CLUSTER_NAME: 클러스터 이름입니다.CONTROL_PLANE_LOCATION: 클러스터 컨트롤 플레인의 리전 또는 영역입니다.
다음 단계
- 보안 GKE 노드에 대해 자세히 알아보세요.
- GKE 보안 개요를 읽습니다.
- 클러스터 보안을 강화하는 방법을 알아봅니다.