IP 매스커레이드 에이전트

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

개요

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

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

시작하기 전에

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

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 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 매스커레이딩을 수행합니다.

  • 클러스터에 ip-masq-agent가 설치되어 있으며 그리고 ip-masq-agent ConfigMap에 고유한 nonMasqueradeCIDRs를 정의한 경우, GKE는 소스 IP 주소를 nonMasqueradeCIDRs에 지정된 대상으로 전송된 패킷의 pod IP 주소로 유지합니다.

  • ip-masq-agent가 설치되지 않았거나 CIDR이 nonMasqueradeCIDRs에 지정되지 않은 경우, GKE는 기본 비매스커레이드 대상의 집합으로 전송된 패킷의 소스 IP 주소를 유지합니다. 이러한 기본값은 GKE 버전 및 노드 이미지 유형에 따라 다릅니다.

추가 정보는 Kubernetes 문서의 IP Masquerade Agent User Guide를 확인하세요.

ip-masq-agent가 포함된 경우

다음 중 하나 이상이 참인 경우 ip-masq-agent DaemonSet가 GKE 클러스터의 --nomasq-all-reserved-ranges 인수와 함께 자동으로 설치됩니다.

  • 클러스터에 네트워크 정책이 있습니다.
  • pod의 CIDR 범위가 10.0.0.0/8 내에 있지 않습니다.

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

기본 비매스커레이드 대상

다음 표에는 nonMasqueradeCIDRsip-masq-agent ConfigMap에 지정되지 않은 경우의 GKE 기본 비매스커레이드 대상 범위가 요약되어 있습니다.

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 목록을 지정하여 이 동작을 변경할 수 있습니다.
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 결과 예시

다음 예시는 ip-masq-agent로 관리되는 NAT 테이블의 iptables 규칙을 보여줍니다.

iptables -t nat -L IP-MASQ
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의 다음 키를 사용하면 비매스커레이드 대상 범위를 지정하고 의 동작을 변경할 수 있습니다. 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 리소스를 배포해야 합니다.

먼저 다음을 로컬에 ip-masq-agent.yaml라는 파일로 저장합니다.

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: ip-masq-agent
  namespace: kube-system
spec:
  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"

그러고 나서 다음 명령어를 실행합니다.

kubectl apply -f ip-masq-agent.yaml

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

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

다음 단계

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

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

Kubernetes Engine 문서