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

このページでは、Google Kubernetes Engine の IP マスカレード エージェントの機能について説明します。

概要

IP マスカレードは、多対 1 の IP アドレス変換に使用されるネットワーク アドレス変換(NAT)の一種です。複数のソース IP アドレスを単一アドレスの背後に隠します。

クラスタで IP マスカレードを使用すると、個々のポッド IP アドレスがリンクローカル範囲(169.254.0.0/16)と任意の追加 IP 範囲の外部トラフィックに公開されなくなり、クラスタのセキュリティを向上させることができます。

さらに、IP マスカレードを使用することで、マスカレードを使用しない IP 範囲間の通信を構成することもできます。たとえば、192.168.0.0/16 のアドレス範囲にあるポッドがクラスタの CIDR 範囲(10.0.0.0/8)のネットワーク リソースと通信できます。

始める前に

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

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • 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

ip-masq-agent の動作

GKE での IP マスカレードは、ip-masq-agent ツールにより処理されます。ip-masq-agent が GKE v1.7 以降で自動的に有効になるのは、以下の追加条件のうち 1 つ以上が満たされる場合です。

クラスタが GKE v1.7 以降を使用していても ip-masq-agent が自動で有効になるための他の条件に適合しない場合は、ip-masq-agent エージェントを手動で作成できます。

ip-masq-agent は、ノードとクラスタの IP 範囲の外部にある宛先にトラフィックを送信するときにノードまたはポッド IP アドレスのマスカレードを処理する iptables ルールを構成します。ポッド IP アドレスはノードのアドレスの背後に隠されます。

デフォルトでは、エージェントは RFC 1918 で規定される 3 つのプライベート IP 範囲を非マスカレード CIDR として扱うよう構成されます。

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

デフォルトでは、IP マスカレードはリンクローカル範囲(169.254.0.0/16)も非マスカレード CIDR として扱います。

デフォルトで、エージェントの構成ファイルはコンテナにある /etc/config/ip-masq-agent ファイルから 60 秒ごとに再読み込みされます。

以下に、ip-masq-agent によって適用されるデフォルトの iptables ルールセットを示します。

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

GKE バージョン 1.14.1-gke.14、1.14.2-gke.1 以降の場合、ip-masq-agent は GKE によってデプロイされ、--nomasq-all-reserved-ranges オプションがデフォルトで有効になります。このオプションは、次の IP 範囲を、デフォルトの非マスカレード ルールに追加します。100.64.0.0/10192.0.0.0/24192.0.2.0/24192.88.99.0/24198.18.0.0/15198.51.100.0/24203.0.113.0/24240.0.0.0/4エージェントを手動でデプロイするときに、フラグをマニフェスト ファイルに追加することで、これらの IP 範囲を追加することもできます。

ConfigMap を使用してエージェントを構成する

上記のデフォルトのルールセットがクラスタに対して十分でない場合は、ConfigMap を使用して対象の IP 範囲をカスタマイズできます。

ConfigMap ファイルは YAML または JSON で記述し、config というファイル名にする必要があります。

ファイルには次の 3 つのキーを含めることができます。これらのキーはすべてオプションです。

  • nonMasqueradeCIDRs: CIDR 表記の文字列のリスト。IP マスカレードを使用しない IP アドレス範囲を指定します。
  • masqLinkLocal: リンクローカル接頭辞(169.254.0.0/16)へのトラフィックをマスカレードするかどうかを示すブール値。デフォルトは false です。
  • resyncInterval: エージェントが ConfigMap ファイルをディスクから同期しようとする間隔を表す整数値。書式は Nx です。N は整数で、xsms などの時間単位を表します。

たとえば、以下の ConfigMap では、config10.0.0.0/8ip-masq-agent により除外できます。

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

デフォルトでは、リンクローカル範囲(169.254.0.0/16)は IP マスカレードから除外されます。

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 という名前の DaemonSet が作成されます。

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント