IP 매스커레이드 에이전트 사용

이 페이지에서는 GKE에서 IP 매스커레이드가 작동하는 방식과 IP 매스커레이드 에이전트의 구성 옵션에 대해 설명합니다.

개요

IP 매스커레이드는 다대일 IP 주소 변환을 수행하는 데 사용되는 네트워크 주소 변환(NAT)의 일종으로, 여러 클라이언트가 단일 IP 주소를 사용하여 대상에 액세스할 수 있게 해줍니다. GKE 클러스터는 IP 매스커레이드를 사용하여 클러스터 외부의 대상이 pod IP 주소 대신 노드 IP 주소에서만 패킷을 수신하도록 합니다. 이 방식은 노드 IP 주소에서만 패킷을 수신할 것으로 예상되는 환경에서 유용합니다.

다음 섹션에서는 GKE 클러스터에서 IP 매스커레이드를 구성하는 방법을 설명합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

다음 방법 중 하나를 사용하여 기본 gcloud 설정을 진행합니다.

  • gcloud init를 사용하여 기본값 설정 과정을 진행합니다.
  • gcloud config를 사용하여 프로젝트 ID, 영역, 리전을 개별적으로 설정합니다.

gcloud init 사용

One of [--zone, --region] must be supplied: Please specify location 오류가 표시되면 이 섹션을 완료합니다.

  1. gcloud init를 실행하고 다음 안내를 따르세요.

    gcloud init

    원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

    gcloud init --console-only
  2. 안내를 따라 gcloud에서 Google Cloud 계정을 사용하도록 승인합니다.
  3. 새 구성을 만들거나 기존 구성을 선택합니다.
  4. Google Cloud 프로젝트를 선택합니다.
  5. 기본 Compute Engine 영역을 선택합니다.

gcloud config 사용

  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project project-id
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone compute-zone
  • 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region compute-region
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

GKE에서의 매스커레이드

GKE는 ip-masq-agent DaemonSet과 함께 iptables 규칙을 사용하여 pod에서 특정 대상으로 전송되는 패킷의 소스 IP 주소를 변경합니다. Pod가 지정된 매스커레이딩 범위의 대상 IP 주소로 패킷을 전송하면 (Pod의 IP 주소 대신) 노드의 IP 주소가 패킷의 소스 주소로 사용됩니다.

GKE는 다음 표에 요약된 대로 IP 매스커레이딩을 수행합니다.

클러스터 구성 SNAT 동작

GKE는 nonMasqueradeCIDRs 목록에 지정된 대상으로 전송된 패킷의 소스 Pod IP 주소를 유지합니다.

GKE는 소스 Pod IP 주소를 nonMasqueradeCIDRs 목록에 지정되지 않은 대상으로 전송된 패킷의 소스 노드 IP 주소로 변경합니다.

  • ip-masq-agent가 설치되지 않았거나 ip-masq-agent ConfigMap에서 nonMasqueradeCIDRs 목록을 지정하지 않았으며
  • --disable-default-snat 플래그
    없는 클러스터를 만들었습니다.

GKE는 기본 비매스커레이드 대상 집합으로 전송된 패킷의 소스 Pod IP 주소를 유지합니다. 이러한 기본값은 GKE 버전 및 노드 이미지 유형에 따라 다릅니다.

GKE는 소스 Pod IP 주소를 기본 비매스커레이드 대상의 외부 대상으로 전송된 패킷의 소스 노드 IP 주소로 변경합니다.

  • ip-masq-agent가 설치되지 않았거나 ip-masq-agent ConfigMap에서 nonMasqueradeCIDRs 목록을 지정하지 않았으며
  • --disable-default-snat 플래그
    있는 클러스터를 만들었습니다.

GKE는 모든 대상으로 전송되는 패킷의 소스 Pod IP 주소를 유지합니다.

ip-masq-agent가 설치되어 있고 ip-masq-agent ConfigMap에 nonMasqueradeCIDRs 목록을 지정했는지 확인하여 이 동작을 변경합니다.

추가 정보는 Kubernetes 문서의 IP 매스커레이드 에이전트 사용자 가이드를 확인하세요.

ip-masq-agent가 포함된 경우

ip-masq-agent DaemonSet는 다음 중 하나 이상에 해당하는 경우 GKE 클러스터에서 --nomasq-all-reserved-ranges 인수를 사용하여 자동으로 부가 기능으로 설치됩니다.

  • 클러스터에 네트워크 정책이 있습니다.
  • pod의 CIDR 범위가 10.0.0.0/8 내에 있지 않습니다.
  • --disable-default-snat 플래그 없이 클러스터가 생성되었으며 워크로드 아이덴티티가 사용 설정되었습니다.

ip-masq-agent ConfigMap에 nonMasqueradeCIDRs를 지정하여 대상 범위를 변경할 수 있습니다. 클러스터에 ip-masq-agent가 포함되어 있지 않으면 수동으로 ip-masq-agent를 설치할 수 있습니다.

기본 비매스커레이드 대상

다음 표에는 다음 중 하나가 참인 경우 --disable-default-snat 플래그 없이 생성된 클러스터의 GKE 기본 비매스커레이드 대상 범위가 요약되어 있습니다.

  • ip-masq-agent가 배포되지 않았거나
  • nonMasqueradeCIDRsip-masq-agent ConfigMap에 지정되지 않았습니다.
GKE 버전 노드 이미지 유형 대상 범위 참고
모든 버전 모든 이미지 유형 169.254.0.0/16
(링크-로컬 범위)
ip-masq-agent ConfigMap에서 masqLinkLocalTrue로 설정하여 이 동작을 변경할 수 있습니다.
1.14 이전 버전 containerd(cos_containerd)를 포함하는 컨테이너 최적화 OS
또는 --nomasq-all-reserved-ranges 인수로 시작하는 ip-masq-agent
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
ip-masq-agent ConfigMap에서 nonMasqueradeCIDRs에 CIDR 목록을 지정하여 이 동작을 변경할 수 있습니다.

비RFC 1918 예약된 주소 범위 사용에 대한 자세한 내용은 VPC 네트워크 유효 범위를 참조하세요.
ip-masq-agent가 사용 설정되지 않은 다른 이미지 유형 10.0.0.0/8
버전 1.14.1-gke.14, 1.14.2-gke.1 이상 모든 이미지 유형 10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
100.64.0.0/10
192.0.0.0/24
192.0.2.0/24
192.88.99.0/24
198.18.0.0/15
198.51.100.0/24
203.0.113.0/24
240.0.0.0/4

iptables에서 매스커레이드 규칙 확인

노드 중 하나에 SSH로 연결하고 다음 명령어를 실행합니다.

iptables -t nat -L IP-MASQ

다음은 ip-masq-agent daemonset을 실행하지 않는 클러스터의 출력 예시입니다. 여기에서 노드 풀은 버전이 1.14 이상이고, cos_cointainerd 이미지가 사용됩니다(자세한 내용은 위 섹션의 표 참조).

RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

ip-masq-agent ConfigMap 매개변수

ip-masq-agent ConfigMap의 다음 키를 사용하면 비매스커레이드 대상 범위를 지정하고 ip-masq-agent의 동작을 변경할 수 있습니다. ConfigMap 파일은 YAML 또는 JSON으로 작성해야 하며 이름이 config로 지정되어야 합니다.

  • nonMasqueradeCIDRs: Pod IP 주소를 유지하기 위한 대상 IP 주소 범위를 지정하는 CIDR 표기법의 문자열 목록입니다.
  • masqLinkLocal: 링크-로컬 프리픽스(169.254.0.0/16)에 대한 트래픽을 매스커레이드할지를 나타내는 부울 값입니다. 기본값은 false입니다.
  • resyncInterval: ip-masq-agent가 구성을 다시 로드(ConfigMap에서 /etc/config/ip-masq-agent에 쓰기)할 때까지 경과하는 시간을 나타냅니다. 형식은 Nx입니다. 여기서 N은 정수이고 xs 또는 ms와 같은 시간 단위입니다. 지정하지 않을 경우 기본값은 60초입니다.

nonMasqueradeCIDRs 지정

다음 ConfigMap, config10.0.0.0/8로 전송된 패킷의 소스 주소를 유지합니다.

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

ip-masq-agent가 링크-로컬 범위에 IP 매스커레이딩을 사용 설정하도록 하려면 ConfigMap에서 masqLinkLocal 키 값을 true로 설정합니다.

예를 들면 다음과 같습니다.

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true

클러스터에 ConfigMap 추가

클러스터에 ConfigMap을 추가하려면 셸 또는 터미널 창에서 다음 명령어를 실행하세요.

kubectl create configmap configmap-name \
  --from-file config \
  --namespace kube-system

여기서 configmap-name은 ConfigMap 리소스에 대해 선택하는 이름입니다(예: ip-masq-agent).

예를 들면 다음과 같습니다.

kubectl create configmap ip-masq-agent --from-file config --namespace kube-system

동기화가 완료되면 iptables에 변경사항이 표시됩니다.

iptables -t nat -L IP-MASQ
Chain IP-MASQ (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local */
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

수동으로 ip-masq-agent 리소스 만들기(선택사항)

ip-masq-agent를 수동으로 만들고 구성해야 할 수도 있습니다. 이렇게 하려면 클러스터에 ip-masq-agent 리소스를 배포해야 합니다.

  1. 다음 매니페스트를 로컬에 ip-masq-agent.yaml라는 파일로 저장합니다.

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          k8s-app: ip-masq-agent
      template:
        metadata:
          labels:
            k8s-app: ip-masq-agent
        spec:
          hostNetwork: true
          containers:
          - name: ip-masq-agent
            image: gcr.io/google-containers/ip-masq-agent-amd64:v2.4.1
            args:
                - --masq-chain=IP-MASQ
                # To non-masquerade reserved IP ranges by default, uncomment the line below.
                # - --nomasq-all-reserved-ranges
            securityContext:
              privileged: true
            volumeMounts:
              - name: config
                mountPath: /etc/config
          volumes:
            - name: config
              configMap:
                # Note this ConfigMap must be created in the same namespace as the
                # daemon pods - this spec uses kube-system
                name: ip-masq-agent
                optional: true
                items:
                  # The daemon looks for its config in a YAML file at /etc/config/ip-masq-agent
                  - key: config
                    path: ip-masq-agent
          tolerations:
          - effect: NoSchedule
            operator: Exists
          - effect: NoExecute
            operator: Exists
          - key: "CriticalAddonsOnly"
            operator: "Exists"
    
  2. 다음 명령어를 실행합니다.

    kubectl apply -f ip-masq-agent.yaml
    

그러면 클러스터의 모든 노드에서 실행되는 ip-masq-agent이라는 이름의 daemonset가 생성됩니다.

ip-masq-agent 도구를 구성하려면 ConfigMap을 사용하여 에이전트 구성을 참조하세요.

제한사항

ip-masq-agent를 실행하는 클러스터는 다음과 같은 제한사항을 갖습니다.

  • 노드 내 공개를 사용 설정하고 nonMasqueradeCIDRs 매개변수로 구성된 ip-masq-agent를 사용하는 경우, nonMasqueradeCIDRs에 Pod CIDR이 포함되어야 합니다. 그렇지 않으면 노드 내 연결 문제가 발생할 수 있습니다.

다음 단계