IP マスカレード エージェントの構成


このページでは、ip-masq-agent で IP マスカレードを行うように Google Kubernetes Engine(GKE)を構成する方法について説明します。GKE での IP マスカレードの詳細については、IP マスカレード エージェントをご覧ください。

始める前に

作業を始める前に、次のことを確認してください。

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

  1. gcloud init を実行して、次の操作を行います。

    gcloud init

    リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. ゾーンクラスタの場合はデフォルトの Compute Engine ゾーン、リージョン クラスタまたは Autopilot クラスタの場合はデフォルトの Compute Engine リージョンを選択します。

gcloud config の使用

  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project PROJECT_ID
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone COMPUTE_ZONE
  • Autopilot クラスタまたはリージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region COMPUTE_REGION
  • gcloud を最新バージョンに更新します。
    gcloud components update

ip-masq-agent ステータスのチェック

このセクションでは、次の方法について説明します。

  • クラスタで ip-masq-agent DaemonSet が実行されているかどうか確認します。
  • ip-masq-agent ConfigMap リソースを確認します。

ip-masq-agent DaemonSet の確認

クラスタで ip-masq-agent DaemonSet が実行されているかどうかを確認するには、gcloud コマンドライン ツールまたは Google Cloud Console を使用します。

gcloud

  1. クラスタの認証情報を取得します。

    gcloud container clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME は、使用するクラスタの名前に置き換えます。

  2. kube-system Namespace で 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
    

Console

  1. Cloud Console の [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. [ フィルタ] で、次の操作を行います。

    1. をクリックして、[システム オブジェクトである: 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 が実行されているかどうかを確認するには、gcloud コマンドライン ツールまたは Google Cloud Console を使用します。

gcloud

  1. クラスタの認証情報を取得します。

    gcloud container clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME は、使用するクラスタの名前に置き換えます。

  2. kube-system Namespace の 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
    

Console

  1. Cloud Console の [構成] ページに移動します。

    [構成] に移動

  2. [ フィルタ] で、次の操作を行います。

    1. をクリックして、[システム オブジェクトである: 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_INTERVAL
    

    次のように置き換えます。

    • CIDR_1CIDR_2: CIDR 形式の IP アドレス範囲。これらの宛先にパケットが送信されると、クラスタで IP アドレスの送信元がマスカレードされず、送信元 Pod の IP アドレスが保持されます。3 つ以上の CIDR が必要な場合は、nonMasqueradeCIDRs リストに同じ形式でエントリを追加します。少なくとも、nonMasqueradeCIDRs プロパティには、クラスタのノードと Pod の IP アドレス範囲を含める必要があります。

    • SYNC_INTERVAL: 各 ip-masq-agent Pod が ip-masq-agent ConfigMap の内容をチェックし、ローカルの /etc/config/ip-masq-agent ファイルに変更を書き込むまでの秒数。形式は Nx です。ここで、N は整数、xs(秒)や ms(ミリ秒)などの時間単位です。指定しない場合は、デフォルトの 60s が使用されます。

    リンクのローカル IPv4 アドレスに送信されるパケットのマスカレードを有効にする必要がない限り、masqLinkLocal を false(デフォルト)に設定します。詳細については、リンクローカルの宛先へのマスカレードをご覧ください。

  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 Namespace の 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_INTERVAL
    kind: ConfigMap
    metadata:
      name: ip-masq-agent
      namespace: kube-system
    

    次のように置き換えます。

    • CIDR_1CIDR_2: CIDR 形式の IP アドレス範囲。これらの宛先にパケットが送信されると、クラスタで IP アドレスの送信元がマスカレードされず、送信元 Pod の IP アドレスが保持されます。3 つ以上の CIDR が必要な場合は、nonMasqueradeCIDRs リストに同じ形式でエントリを追加します。少なくとも、nonMasqueradeCIDRs プロパティには、クラスタのノードと Pod の IP アドレス範囲を含める必要があります。

    • SYNC_INTERVAL: 各 ip-masq-agent Pod が ip-masq-agent ConfigMap の内容をチェックし、ローカルの /etc/config/ip-masq-agent ファイルに変更を書き込むまでの秒数。形式は Nx です。ここで、N は整数、xs(秒)や ms(ミリ秒)などの時間単位です。指定しない場合は、デフォルトの 60s が使用されます。

    リンクのローカル IPv4 アドレスに送信されるパケットのマスカレードを有効にする必要がない限り、masqLinkLocal を false(デフォルト)に設定します。詳細については、リンクローカルの宛先へのマスカレードをご覧ください。

  3. kube-system Namespace の 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: k8s.gcr.io/networking/ip-masq-agent-amd64:v2.6.0
            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 の名前は、Pod の config-volume Volume で参照されている configMap の名前と一致する必要があります。

    • チェーン(--masq-chain)の名前は IP-MASQ である必要があります。それ以外の場合、GKE はデフォルトのマスカレード ルールをオーバーライドしません。

    • DaemonSet Pod は ip-masq-agent ファイルから読み取ります。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 を削除する

このセクションでは、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

次のステップ