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
    

콘솔

  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.9.3-gke.5@sha256:c75a164d6011c7da7084da0fddfc7419914025e092741c3c230cec1589a1a06b
            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
            securityContext:
              privileged: true
            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 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 주소 범위가 모두 허용되는지 확인하세요.
  • 노드 또는 포드에서 트래픽에 액세스할 수 없는 경우 연결 테스트를 실행합니다.

다음 단계