이 페이지에서는 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
콘솔
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.11.0-gke.23@sha256:f50757332ee45c0fb9f5856552a3ed16548c1de3c33c4e520a02d22e30af96ae args: # 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-masq-agent
상태를 확인합니다. ConfigMap이 정의되어 있지 않으면 모든 기본 대상에 대한 트래픽이 매스커레이드되지 않으며 포드 IP 주소가 보존됩니다. 다른 대상에 대한 트래픽은 노드 IP 주소를 보존합니다.- 영향을 받는 노드에서
sudo iptables -t nat -L IP-MASQ
명령어를 실행하여 NAT IP 테이블에서 IP-MASQ 체인이 올바르게 채워져 있는지 확인합니다. ConfigMap에 정의된nonMasqueradeCIDRs
가 NAT IP 테이블에 표시되지 않는 경우 ConfigMap을 만드는 데 사용된 구성 파일에 오타가 없는지 확인합니다. - 포드가 연결하려는 대상이 ConfigMap의
nonMasqueradeCIDRs
에 포함되어 있는지 확인합니다. 대상이nonMasqueradeCIDRs
에 없는 경우 트래픽은 노드 IP 주소를 유지합니다. - 대상 위치에서 노드 및 포드 IP 주소 범위가 모두 허용되는지 확인하세요.
- 노드 또는 포드에서 트래픽에 액세스할 수 없는 경우 연결 테스트를 실행합니다.