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

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

概要

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

以降のセクションでは、GKE クラスタで IP マスカレードを構成する方法について説明します。

始める前に

このタスクの準備として、次の手順を行います。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Enable Google Kubernetes Engine API を有効にする
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト 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 アドレスを特定の宛先に書き換えます。ポッドが指定のマスカレード範囲内にある IP アドレスにパケットを送信すると、パケットの送信元アドレスとしてノードの IP アドレスが使用されます(ポッドの IP アドレスは使用されません)。

GKE は、次の場合を除き、すべての宛先に対して IP マスカレードを実行します。

  • クラスタに ip-masq-agent がインストールされさらに ip-masq-agent ConfigMap に独自の nonMasqueradeCIDRs を定義している場合、nonMasqueradeCIDRs に指定した宛先に送信されたパケットに対して、GKE は送信元 IP アドレスをポッドの IP アドレスとして保持します。

  • ip-masq-agent がインストールされていない場合や、nonMasqueradeCIDRs に CIDR が指定されていない場合、デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 IP アドレスを保持します。このデフォルトは、GKE のバージョンとノードのイメージタイプによって異なります。

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

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

以下のいずれかの条件を満たすと、--nomasq-all-reserved-ranges 引数を使用して GKE クラスタに ip-masq-agent DaemonSet が自動的にインストールされます。

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

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

以下の表に、nonMasqueradeCIDRsip-masq-agent ConfigMap に指定されていない場合に GKE がデフォルトで使用するマスカレード以外の宛先範囲を示します。

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 に指定します。
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 の出力例

以下に、NAT テーブルの iptables ルールの例を示します。このテーブルは ip-masq-agent で維持されています。

iptables -t nat -L IP-MASQ
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 の次のキーを使用すると、マスカレード以外の宛先範囲を指定して の動作を変更できます。ConfigMap ファイルは YAML または JSON 形式で記述し、config という名前で保存する必要があります。

  • nonMasqueradeCIDRs: ポッドの 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 リソースをデプロイする必要があります。

まず、次の内容のファイルを ip-masq-agent.yaml という名前でローカルに保存します。

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: ip-masq-agent
  namespace: kube-system
spec:
  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"

そのうえで、次のコマンドを実行します。

kubectl apply -f ip-masq-agent.yaml

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

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

次のステップ