이 페이지에서는 ip-masq-agent
를 사용하여 IP 매스커레이드를 수행하도록 Google Kubernetes Engine(GKE) 표준 모드에서 생성된 클러스터를 구성하는 방법을 설명합니다. GKE Autopilot 모드의 IP 매스커레이드에 대한 자세한 내용은 이그레스 NAT 정책을 사용하여 Autopilot 클러스터에서 IP 매스커레이드 구성을 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화하세요. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
ip-masq-agent
상태 확인
이 섹션에서는 다음 방법을 보여줍니다.
- 클러스터에
ip-masq-agent
DaemonSet가 있는지 확인합니다. ip-masq-agent
ConfigMap 리소스를 확인합니다.
ip-masq-agent
DaemonSet 확인
클러스터에서 ip-masq-agent
DaemonSet을 실행하고 있는지 확인하려면 Google Cloud CLI 또는 Google Cloud 콘솔을 사용합니다.
gcloud
클러스터의 사용자 인증 정보를 가져옵니다.
gcloud container clusters get-credentials CLUSTER_NAME
CLUSTER_NAME
을 클러스터 이름으로 바꿉니다.kube-system
네임스페이스에서ip-masq-agent
를 검색합니다.kubectl get daemonsets/ip-masq-agent -n kube-system
ip-masq-agent
DaemonSet가 있으면 다음과 비슷한 출력이 표시됩니다.NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE ip-masq-agent 3 3 3 3 3 <none> 13d
ip-masq-agent
DaemonSet가 없으면 다음과 비슷한 출력이 표시됩니다.Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
ip-masq-agent
DaemonSet이 최신 버전을 실행하고 있는지 확인합니다.kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'
이 명령어에서 ip-masq-agent DaemonSet 배포에 지정된 컨테이너 이미지와 동일한 컨테이너 이미지를 반환해야 합니다.
콘솔
Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.
필터의 경우 다음을 수행합니다.
- 을 클릭하여 Is system object: False 필터를 지웁니다.
- 다음 속성을 필터링합니다.
- 이름:
ip-masq-agent
. - 클러스터: 클러스터의 이름입니다.
- 이름:
ip-masq-agent
DaemonSet가 있는 경우 테이블에 DaemonSet 레코드가 표시됩니다.ip-masq-agent
DaemonSet가 없으면 행이 표시되지 않습니다.
ip-masq-agent
ConfigMap을 만들고 ip-masq-agent
DaemonSet를 배포하려면 ip-masq-agent
구성 및 배포를 참조하세요.
ip-masq-agent
ConfigMap 확인
클러스터에서 ip-masq-agent
ConfigMap을 실행하고 있는지 확인하려면 Google Cloud CLI 또는 Google Cloud 콘솔을 사용합니다.
gcloud
클러스터의 사용자 인증 정보를 가져옵니다.
gcloud container clusters get-credentials CLUSTER_NAME
CLUSTER_NAME
을 클러스터 이름으로 바꿉니다.kube-system
네임스페이스에서ip-masq-agent
ConfigMap을 기술합니다.kubectl describe configmaps/ip-masq-agent -n kube-system
ip-masq-agent
ConfigMap이 있으면 다음과 비슷한 출력이 표시됩니다.Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>
ip-masq-agent
ConfigMap이 없으면 다음과 비슷한 출력이 표시됩니다.Error from server (NotFound): configmaps "ip-masq-agent" not found
콘솔
Google Cloud 콘솔에서 구성 페이지로 이동합니다.
필터의 경우 다음을 수행합니다.
- 을 클릭하여 Is system object: False 필터를 지웁니다.
- 다음 속성을 필터링합니다.
- 이름:
ip-masq-agent
. - 클러스터: 클러스터의 이름입니다.
- 이름:
ip-masq-agent
ConfigMap이 있으면 테이블에 ConfigMap 레코드가 표시됩니다.ip-masq-agent
ConfigMap이 없으면 행이 표시되지 않습니다.
클러스터에 이미 ip-masq-agent
ConfigMap이 있으면 이를 구성하고 배포할 수 있습니다.
ip-masq-agent
구성 및 배포
이 섹션에서는 ip-masq-agent
ConfigMap을 만들거나 수정하고 ip-masq-agent
DaemonSet를 배포하거나 삭제하는 방법을 보여줍니다. 수행할 태스크를 결정하려면 먼저 클러스터에 ip-masq-agent
ConfigMap 및 ip-masq-agent
DaemonSet이 포함되었는지 여부를 결정해야 합니다.
ip-masq-agent
ConfigMap 만들기
다음 단계에서는 ip-masq-agent
ConfigMap을 만드는 방법을 보여줍니다. 클러스터에 이미 ip-masq-agent
ConfigMap이 있으면 대신 기존 ip-masq-agent ConfigMap을 수정합니다.
다음 템플릿을 사용해서 구성 파일을 만들고 이를 로컬로 저장합니다. 이 구성 파일의 로컬 사본에는 아무 이름이나 사용할 수 있습니다.
nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIME
다음을 바꿉니다.
CIDR_1
및CIDR_2
: CIDR 형식의 IP 주소 범위입니다. 패킷이 대상으로 전송되면 클러스터가 IP 주소 소스를 매스커레이드하지 않고 소스 포드 IP 주소를 보존합니다. CIDR이 3개 이상 필요하면 동일한 형식에 따라nonMasqueradeCIDRs
목록에 항목을 더 추가합니다. 최소한nonMasqueradeCIDRs
속성에는 클러스터의 노드 및 포드 IP 주소 범위가 포함되어야 합니다.SYNC_INTERVAL
: 각ip-masq-agent
포드가ip-masq-agent
ConfigMap 내용을 확인하고 변경사항을 로컬/etc/config/ip-masq-agent
파일에 기록할 때까지 걸리는 시간입니다. 기본값은60
입니다.UNIT_OF_TIME
: resyncInterval의 시간 단위입니다. 유효한 값은s
(초) 또는ms
(밀리초)입니다. 기본값은s
입니다.
로컬 IPv4 주소를 연결하기 위해 전송되는 패킷에 대해 매스커레이드를 사용 설정해야 하는 경우가 아니라면
masqLinkLocal
을 false(기본값)로 설정합니다. 자세한 내용은 link-local 대상으로 매스커레이드를 참조하세요.ConfigMap 리소스를 만듭니다.
kubectl create configmap ip-masq-agent \ --namespace=kube-system \ --from-file=config=LOCAL_CONFIG_FILE_PATH
LOCAL_CONFIG_FILE_PATH
를 이전 단계에서 만든 구성 파일의 경로로 바꿉니다.kube-system
네임스페이스에서ip-masq-agent
ConfigMap을 기술합니다.kubectl describe configmaps/ip-masq-agent -n kube-system
출력은 다음과 비슷합니다.
Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>
이 출력에는 구성 변경사항과 함께
config
매개변수가 포함됩니다. 이제ip-masq-agent
DeamonSet를 배포할 수 있습니다.
기존 ip-masq-agent
ConfigMap 수정
다음 단계에 따라 기존 ip-masq-agent
ConfigMap의 콘텐츠를 수정할 수 있습니다.
텍스트 편집기에서 ConfigMap을 엽니다.
kubectl edit configmap ip-masq-agent --namespace=kube-system
ConfigMap 파일의 콘텐츠를 수정합니다.
apiVersion: v1 data: config: | nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIME kind: ConfigMap metadata: name: ip-masq-agent namespace: kube-system
다음을 바꿉니다.
CIDR_1
및CIDR_2
: CIDR 형식의 IP 주소 범위입니다. 패킷이 대상으로 전송되면 클러스터가 IP 주소 소스를 매스커레이드하지 않고 소스 포드 IP 주소를 보존합니다. CIDR이 3개 이상 필요하면 동일한 형식에 따라nonMasqueradeCIDRs
목록에 항목을 더 추가합니다. 최소한nonMasqueradeCIDRs
속성에는 클러스터의 노드 및 포드 IP 주소 범위가 포함되어야 합니다.SYNC_INTERVAL
: 각ip-masq-agent
포드가ip-masq-agent
ConfigMap 내용을 확인하고 변경사항을 로컬/etc/config/ip-masq-agent
파일에 기록할 때까지 걸리는 시간입니다. 기본값은60
입니다.UNIT_OF_TIME
: resyncInterval의 시간 단위입니다. 유효한 값은s
(초) 또는ms
(밀리초)입니다. 기본값은s
입니다.
로컬 IPv4 주소를 연결하기 위해 전송되는 패킷에 대해 매스커레이드를 사용 설정해야 하는 경우가 아니라면
masqLinkLocal
을 false(기본값)로 설정합니다. 자세한 내용은 link-local 대상으로 매스커레이드를 참조하세요.kube-system
네임스페이스에서ip-masq-agent
ConfigMap을 기술합니다.kubectl describe configmaps/ip-masq-agent -n kube-system
출력은 다음과 비슷합니다.
Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>
이 출력에는 개발자가 만든 파일의 구성 값과 일치하는
config
파라미터가 포함됩니다.
ip-masq-agent
DaemonSet 배포
ip-masq-agent
ConfigMap을 만들거나 수정한 후 ip-masq-agent
DaemonSet를 배포합니다.
다음 매니페스트를 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: gke.gcr.io/ip-masq-agent:v2.12.3-gke.4@sha256:b5db41ddaf863b660da330322714f668101482b528829c50c53229d901d11af5 args: - --v=2 - --logtostderr=false - --log_file=/dev/stdout - --log_file_max_size=0 # The masq-chain must be IP-MASQ - --masq-chain=IP-MASQ # To non-masquerade reserved IP ranges by default, # uncomment the following line. # - --nomasq-all-reserved-ranges # Must be set to false when using Dataplane V2. - --random-fully=false securityContext: privileged: false capabilities: drop: ["ALL"] add: ["NET_ADMIN", "NET_RAW"] allowPrivilegeEscalation: false seccompProfile: type: RuntimeDefault volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: ip-masq-agent optional: true items: - key: config path: ip-masq-agent tolerations: - effect: NoSchedule operator: Exists - effect: NoExecute operator: Exists - key: "CriticalAddonsOnly" operator: "Exists"
이 매니페스트는 컨테이너의 volumeMount에 지정된 대로 마운트되는
config-volume
라는 볼륨을 만듭니다.이 매니페스트를 수정해야 할 경우 다음 조건을 고려하세요.
볼륨 이름은 무엇이든 가능하지만 컨테이너의
volumeMount
이름과 일치해야 합니다.ConfigMap 이름은 포드에서
config-volume
볼륨에 참조된configMap
이름과 일치해야 합니다.체인 이름(
--masq-chain
)은IP-MASQ
여야 합니다. 그렇지 않으면 GKE가 기본 매스커레이드 규칙을 재정의하지 않습니다.ip-masq-agent
파일에서 읽은 DaemonSet 포드입니다.ip-masq-agent
파일 콘텐츠는 ConfigMap에서config
키의 값입니다.기본적으로 비매스커레이스 예약 IP 범위를 사용하는 경우
arg
섹션에서- --nomasq-all-reserved-ranges
줄의 주석 처리를 삭제합니다.
DaemonSet를 배포합니다.
kubectl apply -f LOCAL_FILE_PATH
LOCAL_FILE_PATH
를 이전 단계에서 만든 파일의 경로로 바꿉니다.
만든 ip-masq-agent
DaemonSet을 수동으로 업데이트할 수 있습니다. 자세한 내용은 DaemonSet 업데이트를 참조하세요.
ip-masq-agent
삭제
이 섹션에서는 ip-masq-agent
DaemonSet 및 ip-masq-agent
ConfigMap을 삭제하는 방법을 보여줍니다. ip-masq-agent
를 삭제해도 노드의 기존 IP 매스커레이딩 설정이 되돌아가지 않습니다.
ip-masq-agent
DaemonSet 삭제
ip-masq-agent
DaemonSet를 수동으로 만든 경우 다음 명령어를 실행하여 이를 삭제할 수 있습니다.
kubectl delete daemonsets ip-masq-agent -n kube-system
ip-masq-agent
ConfigMap 삭제
ip-masq-agent
ConfigMap을 완전히 삭제하려면 다음 명령어를 실행합니다.
kubectl delete configmap ip-masq-agent -n kube-system
문제 해결
다음 섹션에서는 문제 해결에 관한 도움말을 제공합니다.
일반적인 문제해결
다음 단계를 수행하면 IP 주소 매스커레이드 문제를 진단할 수 있습니다.
ip-masq-agent
상태를 확인합니다. ConfigMap이 정의되어 있지 않으면 모든 기본 대상에 대한 트래픽이 매스커레이드되지 않으며 포드 IP 주소가 보존됩니다. 다른 대상에 대한 트래픽은 노드 IP 주소를 보존합니다.- DaemonSet에 지정된
ip-masq-agent
이미지의 버전을 확인합니다.ip-masq-agent
DaemonSet 버전이 최신 버전이 아니면 배포 단계를 수행하여 DaemonSet을 업데이트합니다. - 영향을 받는 노드에서
sudo iptables -t nat -L IP-MASQ
명령어를 실행하여 NAT IP 테이블에서 IP-MASQ 체인이 올바르게 채워져 있는지 확인합니다. ConfigMap에 정의된nonMasqueradeCIDRs
가 NAT IP 테이블에 표시되지 않는 경우 ConfigMap을 만드는 데 사용된 구성 파일에 오타가 없는지 확인합니다. - 대상 위치에서 노드 및 포드 IP 주소 범위가 모두 허용되는지 확인하세요.
- 노드 또는 포드에서 트래픽에 액세스할 수 없는 경우 연결 테스트를 실행합니다.
문제: 포드 IP 주소가 노드 IP 주소로 변경됨
IP 매스커레이드 에이전트를 사용하는 동안 포드가 외부 대상과 통신할 때 포드의 소스 IP 주소가 예상치 않게 노드의 IP 주소를 사용하는 것을 확인할 수 있습니다.
이 문제는 커스텀 소스 네트워크 주소 변환(SNAT) 목록이 누락되었거나 불완전하기 때문에 발생합니다. IP 매스커레이드 에이전트를 사용하는 경우 ConfigMap이 없거나 nonMasqueradeCIDRs
목록이 포함되지 않으면 클러스터의 기본 SNAT가 사용됩니다. 패킷이 포드를 나가면 기본 SNAT는 소스 IP 주소를 포드의 IP 주소에서 노드의 내부 IP 주소로 변경합니다. SNAT에 대한 자세한 내용은 IP 매스커레이드 에이전트를 참조하세요.
이 문제를 해결하려면 ip-masq-agent
ConfigMap에서 nonMasqueradeCIDRs
목록을 정의하여 커스텀 SNAT 목록을 구성합니다.
ip-masq-agent
ConfigMap을 엽니다.kubectl edit configmap ip-masq-agent --namespace=kube-system
ConfigMap 내
nonMasqueradeCIDRs
목록을 검토합니다.nonMasqueradeCIDRs
목록이 있고 완전해야 합니다. 예를 들면 다음과 같습니다.... nonMasqueradeCIDRs: - 35.100.0.0/16 ...
목록이 없거나 불완전한 경우
nonMasqueradeCIDRs
목록을 추가하거나 수정하여 소스 포드 IP 주소를 보존할 대상 IP 범위를 포함합니다. 이 목록에는 Cloud NAT를 사용하려는 주소도 포함되어야 합니다.외부 트래픽에서 SNAT를 사용하지 않게 하려면
nonMasqueradeCIDRs
필드를0.0.0.0/0
로 설정합니다. 예를 들면 다음과 같습니다.... nonMasqueradeCIDRs: - 0.0.0.0/0 ...
트래픽에서 SNAT를 사용하지 않으면 포드에서 전송된 모든 패킷은 대상에 관계없이 포드의 IP 주소를 소스 IP 주소로 유지합니다.
포드의 아웃바운드 패킷 소스 IP 주소를 확인합니다. 이 주소를 확인하려면 패킷 캡처를 수행합니다. 수행할 수 없으면 다음 명령어를 사용하여 노드의 IP 주소가 SNAT가 적용되는 아웃바운드 패킷의 소스 IP 주소인지 확인하면 됩니다.
kubectl get nodes -o wide