이 문서에서는 Google Distributed Cloud (GDC) 에어 갭에서 전용 노드 풀 내에 컨테이너 워크로드를 격리하여 Kubernetes 클러스터의 보안과 관리를 강화하는 방법을 설명합니다. 워크로드를 격리하면 포드를 더 세부적으로 제어할 수 있고 Kubernetes 클러스터에서 권한 에스컬레이션 공격의 위험을 줄일 수 있습니다. 전용 노드 풀의 이점과 제한사항에 대한 자세한 내용은 노드 격리 개요를 참고하세요.
컨테이너 워크로드를 격리하는 데는 다음과 같은 여러 워크플로가 관련되어 있습니다.
노드 풀 taint 및 라벨 지정: 노드 풀에 taint 및 라벨을 적용하여 포드가 노드 풀에서 실행되도록 명시적으로 라벨이 지정되지 않는 한 노드 풀에서 포드를 밀어냅니다.
톨러레이션(toleration) 및 노드 어피니티 규칙 추가: 톨러레이션(toleration) 및 규칙을 포드에 적용하여 지정된 노드 풀에서만 실행되도록 합니다.
분리 작동 확인: 테인트된 노드 풀이 해당 노드 풀에서 실행되도록 라벨을 지정한 포드만 실행하는지 확인합니다.
이 워크플로는 Kubernetes 클러스터의 노드 풀을 관리하는 플랫폼 관리자 그룹의 IT 관리자, 컨테이너 워크로드를 관리하는 애플리케이션 운영자 그룹의 애플리케이션 개발자와 같은 사용자를 대상으로 합니다. 자세한 내용은 GDC 오프라인 문서의 대상을 참고하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
전용 노드 풀에 사용할 노드 taint와 노드 라벨의 특정 이름을 선택하세요. 예를 들면
workloadType=untrusted
입니다.필요한 경우 조직 IAM 관리자에게 네임스페이스에 바인딩되지 않은 사용자 클러스터 개발자 역할 (
user-cluster-developer
)을 부여해 달라고 요청하세요.
새 노드 풀 taint 및 라벨 지정
새 노드 풀에 taint 또는 라벨을 적용하면 나중에 추가된 노드를 포함한 모든 노드에 지정된 taint 및 라벨이 자동으로 적용됩니다.
새 노드 풀에 taint와 라벨을 추가하려면 다음 단계를 완료하세요.
노드 풀을 만드는 경우
Cluster
커스텀 리소스의nodePools
섹션을 직접 수정합니다.nodePools: # Several lines of code are omitted here. - machineTypeName: n2-standard-2-gdc name: nodepool-1 nodeCount: 3 taints: - key: "TAINT_KEY" value: "TAINT_VALUE" effect: "TAINT_EFFECT" labels: LABEL_KEY: LABEL_VALUE
다음을 바꿉니다.
TAINT_KEY
:TAINT_EFFECT
예약과 연결된 키-값 쌍의 taint 키 부분입니다. 예를 들면workloadType
입니다.TAINT_VALUE
:TAINT_EFFECT
예약과 연결된 키-값 쌍의 테인트 값 부분입니다. 예를 들면untrusted
입니다.TAINT_EFFECT
: 다음 효과 값 중 하나입니다.NoSchedule
: 이 taint를 허용하지 않는 포드는 노드에서 예약되지 않습니다. 기존 포드가 노드에서 제거되지 않습니다.PreferNoSchedule
: Kubernetes는 노드에 이 taint를 허용하지 않는 포드를 예약하지 않습니다.NoExecute
: 포드가 이미 노드에서 실행 중이면 포드가 노드에서 제거되고 아직 노드에서 실행되지 않은 경우 노드에 예약되지 않습니다.
LABEL_KEY: LABEL_VALUE
: 워크로드 매니페스트에 지정한 선택기에 해당하는 노드 라벨의 키-값 쌍입니다.
Cluster
리소스를 적용하여 새 노드 풀을 만듭니다.kubectl apply -f cluster.yaml --kubeconfig MANAGEMENT_API_SERVER
MANAGEMENT_API_SERVER
를 Kubernetes 클러스터가 호스팅되는 영역 API 서버의 kubeconfig 경로로 바꿉니다. 타겟팅된 영역의 API 서버에 대한 kubeconfig 파일을 아직 생성하지 않은 경우 영역 관리 API 서버 리소스를 참고하세요.
기존 노드 풀 taint 및 라벨 지정
기존 노드 풀에 테인트 또는 라벨을 적용하려면 각 기존 노드에 변경사항을 적용해야 합니다. 노드 풀 구성을 동적으로 업데이트할 수 없습니다.
기존 노드 풀에 taint와 라벨을 추가하려면 다음 단계를 완료하세요.
전용 노드 풀의 노드를 나열합니다.
kubectl get node --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG \ -l baremetal.cluster.gke.io/node-pool=NODE_POOL_NAME
다음 변수를 바꿉니다.
KUBERNETES_CLUSTER_KUBECONFIG
: Kubernetes 클러스터의 kubeconfig 경로입니다.NODE_POOL_NAME
: 전용 노드 풀의 이름입니다.
출력에서 노드 풀에 있는 모든 노드의 각 노드 ID를 기록합니다.
노드 풀의 각 노드에 대해 테인트를 적용합니다.
kubectl taint nodes NODE_ID \ TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
다음 변수를 바꿉니다.
NODE_ID
: 전용 노드 풀의 워커 노드 ID입니다.TAINT_KEY=TAINT_VALUE
:TAINT_EFFECT
예약과 연결된 키-값 쌍입니다. 예를 들면workloadType=untrusted
입니다.TAINT_EFFECT
: 다음 효과 값 중 하나입니다.NoSchedule
: 이 taint를 허용하지 않는 포드는 노드에서 예약되지 않습니다. 기존 포드가 노드에서 제거되지 않습니다.PreferNoSchedule
: Kubernetes는 노드에 이 taint를 허용하지 않는 포드를 예약하지 않습니다.NoExecute
: 포드가 이미 노드에서 실행 중이면 포드가 노드에서 제거되고 아직 노드에서 실행되지 않은 경우 노드에 예약되지 않습니다.
KUBERNETES_CLUSTER_KUBECONFIG
: Kubernetes 클러스터의 kubeconfig 경로입니다.
노드 풀의 각 노드에 컨테이너 워크로드에서 정의할 선택기에 해당하는 라벨을 적용합니다.
kubectl label NODE_ID \ LABEL_KEY:LABEL_VALUE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
다음 변수를 바꿉니다.
NODE_ID
: 전용 노드 풀의 워커 노드 ID입니다.LABEL_KEY:LABEL_VALUE
: 노드 라벨의 키-값 쌍입니다. 이는 워크로드 매니페스트에 지정한 선택기에 해당합니다.KUBERNETES_CLUSTER_KUBECONFIG
: Kubernetes 클러스터의 kubeconfig 경로입니다.
톨러레이션(toleration) 및 노드 어피니티 규칙 추가
전용 노드 풀을 taint한 후에는 추가한 taint에 대한 톨러레이션(toleration)이 없으면 워크로드가 이를 예약할 수 없습니다. 워크로드 사양에 톨러레이션(toleration)을 추가하여 해당 포드가 taint된 노드 풀에서 예약할 수 있도록 합니다.
전용 노드 풀에 라벨을 지정한 경우, 노드 어피니티 규칙을 추가하여 해당 노드 풀에서만 워크로드를 예약하도록 GDC에 지시할 수도 있습니다.
전용 노드 풀에서 실행되도록 컨테이너 워크로드를 구성하려면 다음 단계를 완료하세요.
컨테이너 워크로드 매니페스트 파일(예:
Deployment
커스텀 리소스)의.spec.template.spec
섹션에 다음 섹션을 추가합니다.# Several lines of code are omitted here. spec: template: spec: tolerations: - key: TAINT_KEY operator: Equal value: TAINT_VALUE effect: TAINT_EFFECT affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: LABEL_KEY operator: In values: - "LABEL_VALUE" # Several lines of code are omitted here.
다음을 바꿉니다.
TAINT_KEY
: 전용 노드 풀에 적용한 taint 키TAINT_VALUE
: 전용 노드 풀에 적용한 taint 값입니다.TAINT_EFFECT
: 다음 효과 값 중 하나입니다.NoSchedule
: 이 taint를 허용하지 않는 포드는 노드에서 예약되지 않습니다. 기존 포드가 노드에서 제거되지 않습니다.PreferNoSchedule
: Kubernetes는 노드에 이 taint를 허용하지 않는 포드를 예약하지 않습니다.NoExecute
: 포드가 이미 노드에서 실행 중이면 포드가 노드에서 제거되고 아직 노드에서 실행되지 않은 경우 노드에 예약되지 않습니다.
LABEL_KEY
: 전용 노드 풀에 적용한 노드 라벨 키입니다.LABEL_VALUE
: 전용 노드 풀에 적용한 노드 라벨 값
예를 들어 다음
Deployment
리소스는workloadType=untrusted:NoExecute
taint에 대한 톨러레이션(toleration)과workloadType=untrusted
노드 라벨에 대한 노드 어피니티 규칙을 추가합니다.kind: Deployment apiVersion: apps/v1 metadata: name: my-app namespace: default labels: app: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: tolerations: - key: workloadType operator: Equal value: untrusted effect: NoExecute affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: workloadType operator: In values: - "untrusted" containers: - name: my-app image: harbor-1.org-1.zone1.google.gdc.test/harborproject/my-app ports: - containerPort: 80 imagePullSecrets: - name: SECRET
컨테이너 워크로드를 업데이트합니다.
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
다음 변수를 바꿉니다.
NAMESPACE
: 컨테이너 워크로드의 프로젝트 네임스페이스입니다.KUBERNETES_CLUSTER_KUBECONFIG
: Kubernetes 클러스터의 kubeconfig 경로입니다.
GDC에서 영향을 받는 포드를 다시 만듭니다. 노드 어피니티 규칙은 생성된 전용 노드 풀로 포드를 강제 적용합니다. 톨러레이션(toleration)을 통해 이러한 포드만 노드에 배치될 수 있습니다.
분리 작동 확인
지정한 포드가 라벨이 지정된 노드 풀에서 실행 중인지 확인합니다.
지정된 네임스페이스의 포드를 나열합니다.
kubectl get pods -o=wide -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
다음 변수를 바꿉니다.
NAMESPACE
: 컨테이너 워크로드의 프로젝트 네임스페이스입니다.KUBERNETES_CLUSTER_KUBECONFIG
: Kubernetes 클러스터의 kubeconfig 경로입니다.
결과는 다음과 유사합니다.
pod/kube-abc-12tyuj pod/kube-abc-39oplef pod/kube-abc-95rzkap
워크로드가 전용 노드 풀에서 실행 중인지 확인합니다.