Standard 클러스터에서 IP 매스커레이드 에이전트 구성


이 페이지에서는 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

  1. 클러스터의 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

  2. 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
    
  3. ip-masq-agent DaemonSet이 최신 버전을 실행하고 있는지 확인합니다.

    kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'
    

    이 명령어에서 ip-masq-agent DaemonSet 배포에 지정된 컨테이너 이미지와 동일한 컨테이너 이미지를 반환해야 합니다.

콘솔

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 필터의 경우 다음을 수행합니다.

    1. 을 클릭하여 Is system object: False 필터를 지웁니다.
    2. 다음 속성을 필터링합니다.
      • 이름: 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

  1. 클러스터의 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

  2. 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
    

콘솔

  1. Google Cloud 콘솔에서 구성 페이지로 이동합니다.

    구성으로 이동

  2. 필터의 경우 다음을 수행합니다.

    1. 을 클릭하여 Is system object: False 필터를 지웁니다.
    2. 다음 속성을 필터링합니다.
      • 이름: 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을 수정합니다.

  1. 다음 템플릿을 사용해서 구성 파일을 만들고 이를 로컬로 저장합니다. 이 구성 파일의 로컬 사본에는 아무 이름이나 사용할 수 있습니다.

    nonMasqueradeCIDRs:
      - CIDR_1
      - CIDR_2
    masqLinkLocal: false
    resyncInterval: SYNC_INTERVALUNIT_OF_TIME
    

    다음을 바꿉니다.

    • CIDR_1CIDR_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 대상으로 매스커레이드를 참조하세요.

  2. ConfigMap 리소스를 만듭니다.

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

    LOCAL_CONFIG_FILE_PATH를 이전 단계에서 만든 구성 파일의 경로로 바꿉니다.

  3. 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의 콘텐츠를 수정할 수 있습니다.

  1. 텍스트 편집기에서 ConfigMap을 엽니다.

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. 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_1CIDR_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 대상으로 매스커레이드를 참조하세요.

  3. 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를 배포합니다.

  1. 다음 매니페스트를 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 줄의 주석 처리를 삭제합니다.

  2. 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 주소가 노드 IP 주소로 변경됨

IP 매스커레이드 에이전트를 사용하는 동안 포드가 외부 대상과 통신할 때 포드의 소스 IP 주소가 예상치 않게 노드의 IP 주소를 사용하는 것을 확인할 수 있습니다.

이 문제는 커스텀 소스 네트워크 주소 변환(SNAT) 목록이 누락되었거나 불완전하기 때문에 발생합니다. IP 매스커레이드 에이전트를 사용하는 경우 ConfigMap이 없거나 nonMasqueradeCIDRs 목록이 포함되지 않으면 클러스터의 기본 SNAT가 사용됩니다. 패킷이 포드를 나가면 기본 SNAT는 소스 IP 주소를 포드의 IP 주소에서 노드의 내부 IP 주소로 변경합니다. SNAT에 대한 자세한 내용은 IP 매스커레이드 에이전트를 참조하세요.

이 문제를 해결하려면 ip-masq-agent ConfigMap에서 nonMasqueradeCIDRs 목록을 정의하여 커스텀 SNAT 목록을 구성합니다.

  1. ip-masq-agent ConfigMap을 엽니다.

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. ConfigMap 내 nonMasqueradeCIDRs 목록을 검토합니다. nonMasqueradeCIDRs 목록이 있고 완전해야 합니다. 예를 들면 다음과 같습니다.

    ...
    nonMasqueradeCIDRs:
      - 35.100.0.0/16
    ...
    
  3. 목록이 없거나 불완전한 경우 nonMasqueradeCIDRs 목록을 추가하거나 수정하여 소스 포드 IP 주소를 보존할 대상 IP 범위를 포함합니다. 이 목록에는 Cloud NAT를 사용하려는 주소도 포함되어야 합니다.

    외부 트래픽에서 SNAT를 사용하지 않게 하려면 nonMasqueradeCIDRs 필드를 0.0.0.0/0로 설정합니다. 예를 들면 다음과 같습니다.

    ...
    nonMasqueradeCIDRs:
      - 0.0.0.0/0
    ...
    

    트래픽에서 SNAT를 사용하지 않으면 포드에서 전송된 모든 패킷은 대상에 관계없이 포드의 IP 주소를 소스 IP 주소로 유지합니다.

  4. 포드의 아웃바운드 패킷 소스 IP 주소를 확인합니다. 이 주소를 확인하려면 패킷 캡처를 수행합니다. 수행할 수 없으면 다음 명령어를 사용하여 노드의 IP 주소가 SNAT가 적용되는 아웃바운드 패킷의 소스 IP 주소인지 확인하면 됩니다.

    kubectl get nodes -o wide
    

다음 단계