이 페이지에서는 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가 설치되었는지 확인합니다.
다음 방법 중 하나를 사용하여 기본 gcloud
설정을 진행합니다.
gcloud init
를 사용하여 기본값 설정 과정을 진행합니다.gcloud config
를 사용하여 프로젝트 ID, 영역, 리전을 개별적으로 설정합니다.
gcloud init 사용
One of [--zone, --region] must be supplied: Please specify
location
오류가 표시되면 이 섹션을 완료합니다.
-
gcloud init
를 실행하고 다음 안내를 따르세요.gcloud init
원격 서버에서 SSH를 사용하는 경우
--console-only
플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.gcloud init --console-only
- 안내를 따라
gcloud
에서 Google Cloud 계정을 사용하도록 승인합니다. - 새 구성을 만들거나 기존 구성을 선택합니다.
- Google Cloud 프로젝트를 선택합니다.
- 영역 클러스터의 기본 Compute Engine 영역 또는 리전이나 Autopilot 클러스터의 리전을 선택합니다.
gcloud config 사용
GKE에서의 매스커레이드
GKE는 ip-masq-agent
DaemonSet과 함께 iptables
규칙을 사용하여 pod에서 특정 대상으로 전송되는 패킷의 소스 IP 주소를 변경합니다. Pod가 지정된 매스커레이딩 범위의 대상 IP 주소로 패킷을 전송하면 (Pod의 IP 주소 대신) 노드의 IP 주소가 패킷의 소스 주소로 사용됩니다.
GKE는 다음 표에 요약된 대로 IP 매스커레이딩을 수행합니다.
클러스터 구성 | SNAT 동작 |
---|---|
GKE는 GKE는 소스 Pod IP 주소를 |
|
|
GKE는 기본 비매스커레이드 대상 집합으로 전송된 패킷의 소스 Pod IP 주소를 유지합니다. 이러한 기본값은 GKE 버전 및 노드 이미지 유형에 따라 다릅니다. GKE는 소스 Pod IP 주소를 기본 비매스커레이드 대상의 외부 대상으로 전송된 패킷의 소스 노드 IP 주소로 변경합니다. |
|
GKE는 모든 대상으로 전송되는 패킷의 소스 Pod IP 주소를 유지합니다.
|
추가 정보는 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
가 배포되지 않았거나nonMasqueradeCIDRs
가ip-masq-agent
ConfigMap에 지정되지 않았습니다.
GKE 버전 | 노드 이미지 유형 | 대상 범위 | 참고 |
---|---|---|---|
모든 버전 | 모든 이미지 유형 | 169.254.0.0/16 (링크-로컬 범위) |
ip-masq-agent ConfigMap에서 masqLinkLocal 을 True 로 설정하여 이 동작을 변경할 수 있습니다. |
1.14 이전 버전 | containerd(cos_containerd)를 포함하는 Container-Optimized 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
은 정수이고x
는s
또는ms
와 같은 시간 단위입니다. 지정하지 않을 경우 기본값은60
초입니다.
nonMasqueradeCIDRs
지정
다음 ConfigMap은 10.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: 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.5.0 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을 사용하여 에이전트 구성을 참조하세요.
제한사항
ip-masq-agent
를 실행하는 클러스터는 다음과 같은 제한사항을 갖습니다.
- 노드 내 공개를 사용 설정하고
nonMasqueradeCIDRs
매개변수로 구성된ip-masq-agent
를 사용하는 경우,nonMasqueradeCIDRs
에 Pod CIDR이 포함되어야 합니다. 그렇지 않으면 노드 내 연결 문제가 발생할 수 있습니다.