IP マスカレード エージェントの使用

このページでは、GKE での IP マスカレードの仕組みと IP マスカレード エージェントの構成オプションについて説明します。

概要

IP マスカレードはネットワーク アドレス変換(NAT)の一種で、複数のクライアントが 1 つの IP アドレスを使用して宛先にアクセスできる多対 1 の IP アドレス変換を行います。GKE クラスタは IP マスカレードを使用しているため、クラスタの外部にある宛先は Pod の IP アドレスではなく、ノードの IP アドレスからのパケットのみを受信します。これは、ノードの IP アドレスからのみパケットを受信することを想定している環境で有効な手法です。

以降のセクションでは、GKE クラスタで 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 ゾーンを選択します。

gcloud config の使用

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

GKE でのマスカレード

GKE は、iptables ルールと ip-masq-agent DaemonSet を使用して、ポッドから送信されたパケットの送信元 IP アドレスを特定の宛先に書き換えます。Pod が指定のマスカレード範囲内にある IP アドレスにパケットを送信すると、パケットの送信元アドレスとしてノードの IP アドレスが使用されます(Pod の IP アドレスは使用されません)。

GKE は、次の表にまとめられているように、IP マスカレードを実行します。

クラスタ構成 SNAT の動作

nonMasqueradeCIDRs リストで指定された宛先に送信されたパケットに対して GKE が送信元 Pod IP アドレスを保持している。

nonMasqueradeCIDRs リストで指定されていない宛先に送信されたパケットに対して、GKE が送信元 Pod IP アドレスを送信元ノード IP アドレスに変更している。

  • ip-masq-agent がインストールされていない、あるいは ip-masq-agent ConfigMap で nonMasqueradeCIDRs リストを指定していないさらに
  • --disable-default-snat フラグなしでクラスタを作成している。

デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。このデフォルトは、GKE のバージョンとノードのイメージタイプによって異なります。

デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを送信元ノード IP アドレスに変更します。

  • ip-masq-agent がインストールされていない、あるいは ip-masq-agent ConfigMap で nonMasqueradeCIDRs リストを指定していないさらに
  • --disable-default-snat フラグを指定してクラスタを作成します。

すべての宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。

この動作を変更するには、ip-masq-agent がインストールされていてip-masq-agent ConfigMap で nonMasqueradeCIDRs リストが指定されている必要があります。

追加情報は、Kubernetes ドキュメントのIP マスカレード エージェント ユーザーガイドにあります。

ip-masq-agent が含まれている場合

次のいずれかに該当する場合、ip-masq-agent DaemonSet は --nomasq-all-reserved-ranges 引数付きのアドオンとして GKE クラスタに自動的にインストールされます。

宛先の範囲を変更するには、ip-masq-agent ConfigMap に nonMasqueradeCIDRs を指定します。クラスタに ip-masq-agent がない場合は、ip-masq-agent を手動でインストールできます。

デフォルトのマスカレード以外の宛先

次のいずれかに該当する場合で、--disable-default-snat フラグなしで作成されたクラスタに対する、GKE のデフォルトのマスカレード以外の宛先の範囲を次の表にまとめています。

  • ip-masq-agent がデプロイされていない、または
  • ip-masq-agent ConfigMap に nonMasqueradeCIDRs が指定されていない
GKE のバージョン ノードのイメージタイプ 宛先の範囲
すべてのバージョン すべてのイメージタイプ 169.254.0.0/16
(リンクローカル範囲)
この動作を変更するには、ip-masq-agent ConfigMap で masqLinkLocalTrue に設定します。
1.14 より前のバージョン containerd が含まれる Container-Optimized OS(cos_containerd)
または ip-masq-agent--nomasq-all-reserved-ranges 引数を使用
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
この動作を変更するには、nonMasqueradeCIDRs の CIDR のリストを ip-masq-agent ConfigMap に指定します。

RFC 1918 以外の予約済みアドレス範囲の使用については、VPC ネットワークの有効な範囲をご覧ください。
ip-masq-agent が有効になっていない他のイメージタイプ 10.0.0.0/8
バージョン 1.14.1-gke.14、1.14.2-gke.1 以降 すべてのイメージタイプ 10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
100.64.0.0/10
192.0.0.0/24
192.0.2.0/24
192.88.99.0/24
198.18.0.0/15
198.51.100.0/24
203.0.113.0/24
240.0.0.0/4

iptables でのマスカレード ルールの確認

ノードの 1 つに SSH で接続し、次のコマンドを実行します。

iptables -t nat -L IP-MASQ

以下に、ip-masq-agent DaemonSet を実行していないクラスタからの出力例を示します。ノードプールは 1.14 より古いバージョンで、cos_cointainerd イメージを使用しています(詳細は上のセクションの表を参照)。

RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

ip-masq-agent ConfigMap パラメータ

ip-masq-agent ConfigMap の次のキーを使用すると、マスカレード以外の宛先範囲を指定して ip-masq-agent の動作を変更できます。ConfigMap ファイルは YAML または JSON 形式で記述し、config という名前で保存する必要があります。

  • nonMasqueradeCIDRs: Pod の IP アドレスを保持する宛先 IP アドレスの範囲を表す CIDR 表記の文字列リスト。
  • masqLinkLocal: トラフィックをリンクローカル接頭辞(169.254.0.0/16)へマスカレードするかどうかを示すブール値。デフォルトは false です。
  • resyncInterval: ip-masq-agent が構成を再読み込みするまでの経過時間を表します(ConfigMap から /etc/config/ip-masq-agent に書き込みます)。形式は Nx です。N は整数、x は時間単位(s または ms)です。指定しない場合、デフォルトは 60 秒です。

nonMasqueradeCIDRs の指定

次の ConfigMap(config)は、10.0.0.0/8 宛てのパケットの送信元アドレスを保持します。

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

ip-masq-agent でリンクローカル範囲の IP マスカレードを有効にするには、ConfigMap で masqLinkLocal キーの値を true に設定します。

例:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true

ConfigMap をクラスタに追加する

ConfigMap をクラスタに追加するには、シェルまたはターミナル ウィンドウから次のコマンドを実行します。

kubectl create configmap configmap-name \
  --from-file config \
  --namespace kube-system

ここで、configmap-name は ConfigMap リソースに付ける名前(ip-masq-agent など)です。

例:

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

同期が完了すると、iptables が変更されています。

iptables -t nat -L IP-MASQ
Chain IP-MASQ (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local */
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

ip-masq-agent リソースの手動作成(省略可)

場合によっては、ip-masq-agent の作成と構成を手動で行う必要があります。そのためには、クラスタに ip-masq-agent リソースをデプロイする必要があります。

  1. 次のマニフェストを ip-masq-agent.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: gcr.io/google-containers/ip-masq-agent-amd64:v2.4.1
            args:
                - --masq-chain=IP-MASQ
                # To non-masquerade reserved IP ranges by default, uncomment the line below.
                # - --nomasq-all-reserved-ranges
            securityContext:
              privileged: true
            volumeMounts:
              - name: config
                mountPath: /etc/config
          volumes:
            - name: config
              configMap:
                # Note this ConfigMap must be created in the same namespace as the
                # daemon pods - this spec uses kube-system
                name: ip-masq-agent
                optional: true
                items:
                  # The daemon looks for its config in a YAML file at /etc/config/ip-masq-agent
                  - key: config
                    path: ip-masq-agent
          tolerations:
          - effect: NoSchedule
            operator: Exists
          - effect: NoExecute
            operator: Exists
          - key: "CriticalAddonsOnly"
            operator: "Exists"
    
  2. 次のコマンドを実行します。

    kubectl apply -f ip-masq-agent.yaml
    

これで、クラスタのすべてのノードで実行される ip-masq-agent という名前の DaemonSet が作成されます。

ip-masq-agent ツールの構成方法については、ConfigMap を使用してエージェントを構成するをご覧ください。

制限

ip-masq-agent を実行するクラスタには、次の制限事項があります。

  • ノード内の可視化を有効にして、nonMasqueradeCIDRs パラメータが構成された ip-masq-agent を使用する場合、nonMasqueradeCIDRs には Pod CIDR が含まれている必要があります。そうしないと、ノード内での接続の問題が発生します。

次のステップ