IP Masquerade Agent 사용자 가이드

IP Masquerade Agent 사용자 가이드 (IP Masquerade Agent User Guide)

이 페이지는 ip-masq-agent를 구성하고 활성화하는 방법을 보여드려요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

버전을 확인하려면 kubectl version을 입력하세요.

IP Masquerade Agent 사용자 가이드 (IP Masquerade Agent User Guide)

ip-masq-agent는 파드의 IP 주소를 클러스터 노드의 IP 주소 뒤에 숨기는 iptables 규칙을 구성해요. 이는 일반적으로 클러스터의 파드 CIDR 범위 밖에 있는 목적지로 트래픽을 보낼 때 수행돼요.

핵심 용어 (Key Terms)

  • NAT (Network Address Translation): IP 헤더의 출발지 및/또는 목적지 주소 정보를 수정해 하나의 IP 주소를 다른 주소로 다시 매핑하는 방법이에요. 일반적으로 IP 라우팅을 수행하는 디바이스에서 수행돼요.
  • Masquerading: 일반적으로 다대일(many to one) 주소 변환을 수행하는 데 사용되는 NAT의 한 형태로, 여러 출발지 IP 주소가 일반적으로 IP 라우팅을 수행하는 디바이스인 단일 주소 뒤에 숨겨져요. 쿠버네티스에서는 이것이 노드의 IP 주소예요.
  • CIDR (Classless Inter-Domain Routing): 가변 길이 서브넷 마스킹을 기반으로 임의 길이의 접두사를 지정할 수 있게 해줘요. CIDR은 IP 주소의 새로운 표현 방법을 도입했는데, 이제 일반적으로 CIDR 표기법이라고 부르며 주소나 라우팅 접두사가 접두사의 비트 수를 나타내는 접미사와 함께 쓰여요(예: 192.168.2.0/24).
  • Link Local: link-local 주소는 호스트가 연결된 네트워크 세그먼트 또는 브로드캐스트 도메인 내의 통신에만 유효한 네트워크 주소예요. IPv4의 link-local 주소는 CIDR 표기법으로 주소 블록 169.254.0.0/16에 정의돼 있어요.

ip-masq-agent는 클러스터 노드의 IP와 클러스터 IP 범위 밖에 있는 목적지로 트래픽을 보낼 때 노드/파드 IP 주소의 masquerading을 처리하는 iptables 규칙을 구성해요. 이는 본질적으로 파드 IP 주소를 클러스터 노드의 IP 주소 뒤에 숨겨요. 일부 환경에서는 "외부" 주소로의 트래픽이 알려진 머신 주소에서 와야 해요. 예를 들어 Google Cloud에서는 인터넷으로의 모든 트래픽이 VM의 IP에서 와야 해요. Google Kubernetes Engine 같은 곳에서 컨테이너가 사용될 때, Pod IP는 egress에서 거부될 거예요. 이를 피하려면 VM 자체 IP 주소 뒤에 Pod IP를 숨겨야 해요. 일반적으로 "masquerade"라고 불러요.

기본적으로 에이전트는 RFC 1918이 지정한 세 개의 사설 IP 범위를 non-masquerade CIDR로 취급하도록 구성돼 있어요. 이 범위는 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16이에요. 에이전트는 link-local(169.254.0.0/16)도 기본적으로 non-masquerade CIDR로 취급해요. 에이전트는 /etc/config/ip-masq-agent 위치에서 매 60초마다 구성을 다시 불러오도록 구성돼 있으며, 이것도 구성 가능해요.

에이전트 구성 파일은 YAML 또는 JSON 문법으로 작성돼야 하며 세 개의 선택적 키를 포함할 수 있어요.

  • nonMasqueradeCIDRs: non-masquerade 범위를 지정하는 CIDR 표기법의 문자열 목록.
  • masqLinkLocal: link local 접두사 169.254.0.0/16으로의 트래픽을 masquerade할지 여부를 나타내는 불리언(true/false). 기본값은 false.
  • resyncInterval: 에이전트가 디스크에서 구성을 다시 불러오려 시도하는 시간 간격. 예: '30s'. 여기서 's'는 초, 'ms'는 밀리초를 의미해요.

10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 범위로의 트래픽은 masquerade되지 않아요. 다른 모든 트래픽(인터넷으로 가정)은 masquerade돼요. 파드의 로컬 목적지 예시로는 노드 자체의 IP 주소, 다른 노드의 주소, 또는 클러스터 IP 범위의 IP 주소 중 하나가 있을 수 있어요. 다른 모든 트래픽은 기본적으로 masquerade돼요. 아래 항목은 ip-masq-agent가 적용하는 기본 규칙 집합을 보여줘요.

iptables -t nat -L IP-MASQ-AGENT
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 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

기본적으로 GCE/Google Kubernetes Engine에서 네트워크 정책이 활성화되어 있거나 10.0.0.0/8 범위에 없는 클러스터 CIDR을 사용한다면, ip-masq-agent가 클러스터에서 실행돼요. 다른 환경에서 실행한다면 ip-masq-agent DaemonSet을 클러스터에 추가할 수 있어요.

ip-masq-agent 만들기 (Create an ip-masq-agent)

ip-masq-agent를 만들려면 다음 kubectl 명령을 실행하세요.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/ip-masq-agent/master/ip-masq-agent.yaml

에이전트를 실행하려는 클러스터의 노드에 적절한 노드 라벨도 적용해야 해요.

kubectl label nodes my-node node.kubernetes.io/masq-agent-ds-ready=true

더 많은 정보는 ip-masq-agent 문서에서 찾을 수 있어요.

대부분의 경우 기본 규칙 집합이 충분할 거예요. 그러나 클러스터에 그렇지 않다면, 영향을 받는 IP 범위를 커스터마이즈하는 ConfigMap을 만들어 적용할 수 있어요. 예를 들어 ip-masq-agent가 10.0.0.0/8만 고려하게 하려면 "config"라는 파일에 다음 ConfigMap을 만들 수 있어요.

참고: 파일이 config라고 불리는 것이 중요해요. 기본적으로 ip-masq-agent가 조회 키로 사용하기 때문이에요.

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

다음 명령을 실행해 configmap을 클러스터에 추가해요.

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

이것은 /etc/config/ip-masq-agent에 있는 파일을 업데이트하며, 이 파일은 매 resyncInterval마다 주기적으로 확인되어 클러스터 노드에 적용돼요. resync 간격이 지나면 iptables 규칙에 변경 사항이 반영된 것을 볼 수 있어요.

iptables -t nat -L IP-MASQ-AGENT
Chain IP-MASQ-AGENT (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

기본적으로 link local 범위(169.254.0.0/16)도 ip-masq agent가 처리하며, 이는 적절한 iptables 규칙을 설정해요. ip-masq-agent가 link local을 무시하게 하려면 ConfigMap에서 masqLinkLocal을 true로 설정할 수 있어요.

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

더 알아보기 (Learn more)