노드 내 공개 상태

이 페이지는 클러스터의 모든 네트워크 트래픽이 Google Cloud 네트워크에 표시되도록 Google Kubernetes Engine 클러스터에서 노드 내 공개 상태를 설정하는 방법을 보여줍니다. 즉, 같은 노드에 있는 pod 간의 트래픽을 포함하여 pod 간의 모든 트래픽의 흐름 로그를 확인할 수 있습니다. 노드 내 공개 상태를 사용하면 같은 노드에 있는 Pod에서도 Pod 간의 모든 트래픽에 적용되는 방화벽 규칙을 만들 수 있습니다.

pod가 패킷을 동일한 노드의 다른 pod로 전송하면 패킷은 노드를 떠나서 Google Cloud 네트워크에서 처리됩니다. 그런 다음 패킷은 같은 노드의 대상 pod로 즉시 전송됩니다.

현재 노드 내 공개 상태는 기본적으로 사용 중지되어 있습니다.

노드 내 공개 상태는 GKE v1.11.x 이상에서 사용할 수 있습니다.

고려 사항

로그 볼륨 증가

노드 내 공개 상태를 사용하면 VPC에서 캡처하는 트래픽 볼륨이 늘어나므로 흐름 로그 볼륨이 증가할 수 있습니다. 로깅 설정을 조정하면 흐름 로깅과 관련된 비용을 관리 할 수 있습니다.

모든 Pod 간 트래픽에는 방화벽이 적용됩니다.

이름 노드에 배포된 Pod를 포함하여 Pod 간의 전체 트래픽은 노드 내 공개 상태가 사용 설정된 경우 VPC에 표시됩니다. 노드 내 공개 상태를 사용 설정하면 이전의 무제한 트래픽에 방화벽 규칙이 적용될 수 있습니다. 노드 수준 방화벽을 평가하여 적법한 트래픽이 차단되지 않는지 확인하세요.

시작하기 전에

이 작업을 준비하려면 다음 단계를 완료하세요.

개요

다음은 이 주제에서 수행할 단계입니다.

  1. us-central1 리전에 기본 서브넷의 흐름 로그를 사용 설정합니다.

  2. us-central1-a 영역(zone)에 노드가 한 개 있는 클러스터를 만듭니다.

  3. 클러스터에 Pod 2개를 만듭니다.

  4. 한 Pod에서 다른 Pod로 HTTP 요청을 보냅니다.

  5. Pod 간 요청의 흐름 로그 항목을 확인합니다.

서브넷의 흐름 로그 사용 설정

gcloud

us-central1 리전에서 기본 서브넷의 흐름 로그를 사용 설정합니다.

gcloud compute networks subnets update default --region us-central1 --enable-flow-logs

서브넷에서 흐름 로그가 사용 설정되었는지 확인합니다.

gcloud compute networks subnets describe default --region us-central1

출력에서 흐름 로그가 사용 설정되었음을 확인할 수 있습니다.

...
enableFlowLogs: true
...
ipCidrRange: 10.128.0.0/20
region: https://www.googleapis.com/compute/v1/projects/abc-712099/regions/us-central1

Console

다음 단계를 따라 us-central1 리전의 기본 서브넷에 흐름 로그를 사용 설정합니다.

  1. Cloud Console에서 Google Kubernetes Engine VPC 네트워크 페이지를 방문합니다.

    VPC 네트워크 페이지로 이동

  2. us-central1 행에서 기본값을 클릭합니다.

  3. 수정을 클릭합니다.

  4. 흐름 로그에서 켜기를 선택합니다.

  5. 저장을 클릭합니다.

클러스터 만들기

노드가 한 개 있는 클러스터를 만듭니다.

gcloud

gcloud container clusters create [CLUSTER_NAME] \
    --zone us-central1-a \
    --num-nodes 1 \
    --enable-intra-node-visibility

Console

  1. Cloud Console의 Kubernetes 클러스터 만들기 페이지를 방문합니다.

    Kubernetes 클러스터 페이지로 이동

  2. 이름[CLUSTER_NAME]을 입력합니다.

  3. 영역으로 us-central1-a를 선택합니다.

  4. 노드 수1을 입력합니다.

  5. 페이지 하단에 있는 고급 옵션을 클릭합니다.

  6. 노드 내 공개 상태 사용 설정을 선택합니다.

  7. 만들기를 클릭합니다.

클러스터의 사용자 인증 정보 가져오기:

다음 명령어를 입력하여 새 클러스터의 사용자 인증 정보를 가져옵니다.

gcloud container clusters get-credentials [CLUSTER_NAME] \
    --zone us-central1-a

사용자 인증 정보는 일반적으로 $HOME/.kube/config에 있는 kubeconfig 파일에 저장됩니다.

Pod 2개 만들기

Pod의 매니페스트는 다음과 같습니다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container-1
    image: gcr.io/google-samples/hello-app:2.0

pod-1.yaml라는 파일에 매니페스트를 저장하고 Pod를 만듭니다.

kubectl apply -f pod-1.yaml

다음은 두 번째 Pod의 매니페스트입니다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
spec:
  containers:
  - name: container-2
    image: gcr.io/google-samples/node-hello:1.0

pod-2.yaml라는 파일에 매니페스트를 저장하고 Pod를 만듭니다.

kubectl apply -f pod-2.yaml

Pod를 확인합니다.

kubectl get pod pod-1 pod-2 --output wide

출력에 Pod의 IP 주소가 표시됩니다. 이 주소를 기록합니다.

NAME      READY     STATUS    RESTARTS   AGE       IP           ...
pod-1     1/1       Running   0          1d        10.52.0.13   ...
pod-2     1/1       Running   0          1d        10.52.0.14   ...

pod-1에서 pod-2로 요청 보내기

셸을 pod-1의 컨테이너로 가져옵니다.

kubectl exec -it pod-1 sh

셸에서 요청을 pod-2로 보냅니다.

wget -qO- [POD_2_IP_ADDRESS]:8080

여기서 [POD_2_IP_ADDRESS]는 이 연습의 앞부분에서 확인한 pod-2의 IP 주소입니다.

출력에 pod-2에서 실행 중인 컨테이너의 응답이 표시됩니다.

Hello Kubernetes!

exit를 입력하여 셸을 종료하고 기본 명령줄 환경으로 돌아갑니다.

흐름 로그 항목 보기

gcloud

일반 명령줄 창에 다음 명령어를 입력하여 pod-1에서 pod-2로의 요청 흐름 로그 항목을 확인합니다.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.connection.src_ip="[POD_1_IP_ADDRESS]"'

각 항목의 의미는 다음과 같습니다.

  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [POD_1_IP_ADDRESS]pod-1의 IP 주소입니다.

출력에 pod-1에서 pod-2로의 요청의 흐름 로그 항목이 표시됩니다. 이 예시에서 pod-1의 IP 주소는 10.56.0.13이고, pod-2의 IP 주소는 10.56.0.14입니다.

...
jsonPayload:
  bytes_sent: '0'
  connection:
    dest_ip: 10.56.0.14
    dest_port: 8080
    protocol: 6
    src_ip: 10.56.0.13
    src_port: 35414
...

Console

  1. Cloud Console에서 Google Kubernetes Engine Stackdriver 로그 페이지를 방문합니다.

    Stackdriver 로그 페이지로 이동

  2. 페이지 맨 위의 필터 상자 오른쪽에 있는 아래쪽 화살표를 클릭하고 고급 필터로 전환을 선택합니다.

  3. 필터 상자에 있는 텍스트를 삭제하고 다음 쿼리를 입력합니다.

    resource.type="gce_subnetwork"
    logName="projects/[PROJECT_ID]/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.src_ip="[POD_1_IP_ADDRESS]"
    

    각 항목의 의미는 다음과 같습니다.

    • [PROJECT_ID]는 프로젝트 ID입니다.
    • [POD_1_IP_ADDRESS]pod-1의 IP 주소입니다.

    나타나는 로그 항목을 펼칩니다. jsonPayload에서 요청이 pod-1에서 pod-2로 전송된 것을 확인할 수 있습니다. 이 예시에서 pod-1의 IP 주소는 10.56.0.13이고, pod-2의 IP 주소는 10.56.0.14입니다.

    jsonPayload: {
      bytes_sent:  "0"
      connection: {
        dest_ip:  "10.56.0.14"
        dest_port:  8080
        protocol:  6
        src_ip:  "10.56.0.13"
        src_port:  35414
    

클러스터에는 노드가 1개 밖에 없습니다. 따라서 pod-1pod-2는 같은 노드에 있습니다. 같은 노드에 있더라도 pod-1pod-2 간의 노드 내 통신에는 흐름 로그 항목을 사용할 수 있습니다.

기존 클러스터에 노드 내 공개 상태 사용 설정

gcloud

기존 클러스터에 노드 내 공개 상태를 사용 설정하려면 다음 명령어를 입력합니다.

gcloud beta container clusters update [CLUSTER_NAME] \
    --enable-intra-node-visibility

여기서 [CLUSTER_NAME]은 기존 클러스터의 이름입니다.

Console

  1. Cloud Console에서 Google Kubernetes Engine 메뉴로 이동합니다.

    Google Kubernetes Engine 메뉴로 이동

  2. 연필 모양의 클러스터 수정 버튼 을 클릭합니다.

  3. 노드 내 공개 상태를 사용 설정합니다.

  4. 저장을 클릭합니다.

기존 클러스터에 노드 내 공개 상태를 사용 설정하면 제어 영역과 워커 노드의 모든 구성요소가 다시 시작됩니다.

이 기능을 사용 설정한 후 노드에서 라우팅 규칙을 검사하여 활성화되었는지 확인할 수 있습니다.

ip rule show

다음과 유사한 출력이 표시됩니다.

0:  from all lookup local
30001:  from all fwmark 0x4000/0x4000 lookup main
30002:  from all iif lo lookup main
30003:  not from all iif eth0 lookup 1
32766:  from all lookup main
32767:  from all lookup default

ip route show table 1

다음과 유사한 출력이 표시됩니다.

default via [GKE_NODE_SUBNET_GW] dev eth0

노드 내 공개 상태 사용 중지

gcloud

기존 클러스터에 노드 내 공개 상태를 사용 중지하려면 다음 명령어를 입력합니다.

gcloud beta container clusters update [CLUSTER_NAME] \
  --no-enable-intra-node-visibility

여기서 [CLUSTER_NAME]은 기존 클러스터의 이름입니다.

Console

  1. Cloud Console의 Kubernetes 클러스터 페이지를 방문합니다.

    Kubernetes 클러스터 페이지로 이동

  2. 연필 모양의 클러스터 수정 버튼 을 클릭합니다.

  3. 노드 내 공개 상태 드롭다운 메뉴에서 사용 안 함을 선택합니다.

  4. 저장을 클릭합니다.

기존 클러스터에 노드 내 공개 상태를 사용 중지하면 제어 영역과 워커 노드의 모든 구성요소가 다시 시작됩니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 문서