このページでは、GKE での IP マスカレードの仕組みと IP マスカレード エージェントの構成オプションについて説明します。
概要
IP マスカレードはネットワーク アドレス変換(NAT)の一種で、複数のクライアントが 1 つの IP アドレスを使用して宛先にアクセスできる多対 1 の IP アドレス変換を行います。GKE クラスタは IP マスカレードを使用しているため、クラスタの外部にある宛先は Pod の IP アドレスではなく、ノードの IP アドレスからのパケットのみを受信します。これは、ノードの IP アドレスからのみパケットを受信することを想定している環境で有効な手法です。
以降のセクションでは、GKE クラスタで IP マスカレードを構成する方法について説明します。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API が有効になっていることを確認します。 Google Kubernetes Engine API の有効化
- Cloud SDK がインストール済みであることを確認します。
次のいずれかの方法で gcloud
のデフォルトの設定を指定します。
gcloud init
。デフォルトの設定全般を確認する場合に使用します。gcloud config
。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。
gcloud init の使用
エラー One of [--zone, --region] must be supplied: Please specify
location
を受信した場合は、このセクションの内容を実施します。
-
gcloud init
を実行して、次の操作を行います。gcloud init
リモート サーバーで SSH を使用している場合は、
--console-only
フラグを指定して、コマンドがブラウザを起動しないようにします。gcloud init --console-only
- 手順に従って
gcloud
を承認し、Google Cloud アカウントを使用します。 - 新しい構成を作成するか、既存の構成を選択します。
- Google Cloud プロジェクトを選択します。
- デフォルトの 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 の動作 |
---|---|
|
|
|
デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。このデフォルトは、GKE のバージョンとノードのイメージタイプによって異なります。 デフォルトのマスカレード以外の宛先外に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを送信元ノード IP アドレスに変更します。 |
|
すべての宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。 この動作を変更するには、 |
追加情報は、Kubernetes ドキュメントのIP マスカレード エージェント ユーザーガイドにあります。
ip-masq-agent
が含まれている場合
次のいずれかに該当する場合、ip-masq-agent
DaemonSet は --nomasq-all-reserved-ranges
引数付きのアドオンとして GKE クラスタに自動的にインストールされます。
- クラスタにネットワーク ポリシーがある
- ポッドの CIDR 範囲が
10.0.0.0/8
内でない - クラスタが
--disable-default-snat
フラグなしで作成されており、Workload Identity が有効になっている
宛先の範囲を変更するには、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 で masqLinkLocal を True に設定します。 |
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 は、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: 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:latest 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 を使用してエージェントを構成するをご覧ください。
制限
ip-masq-agent
を実行するクラスタには、次の制限事項があります。
- ノード内の可視化を有効にして、
nonMasqueradeCIDRs
パラメータが構成されたip-masq-agent
を使用する場合、nonMasqueradeCIDRs
には Pod CIDR が含まれている必要があります。そうしないと、ノード内での接続の問題が発生します。