背景
2つのGKEクラスタpublic-cluster
とprivate-cluster
を持つGCPプロジェクトがあります。 public-cluster
は、集中認証、ロギング、レート制限などを実行するAPIゲートウェイを実行し、private-cluster
で実行されているバックエンドマイクロサービスにリクエストを再ルーティングします。 APIゲートウェイは Ocelot を使用して構築されています。
public-cluster
はインターネットに面しており、ingress-nginxを使用して、ポート80/443でHTTP/sトラフィックを受け入れるパブリック外部IPアドレスを公開します。
private-cluster
の目的は、public-cluster
からのポート80/443トラフィックのみを受け入れることができることです。トラフィックがprivate-cluster
からでない限り、このクラスターに他の場所からアクセスできないようにします。つまり、VPC内または外部からのpublic-cluster
への直接のHTTP/sリクエストを許可しません。 内部ロードバランサー を使用してprivate-cluster
で実行されているサービスを公開したので、各サービスには独自の内部IPがあります。 APIゲートウェイはこれらの内部IPを使用して、受信リクエストをバックエンドマイクロサービスに再ルーティングします。
public-cluster
とprivate-cluster
は、同じVPC内の同じリージョン内の別々のサブネット上にあります。
意図されたアーキテクチャは次のとおりです。
。
問題
次のように、private-cluster
からのものでない限り、public-cluster
へのすべてのトラフィックをブロックするファイアウォールルールを作成しようとしています。
private-cluster
(ネットワークタグをターゲットとして使用)および0.0.0.0/0
へのすべてのトラフィックをソースIP範囲として拒否する上りルールprivate-cluster
public-cluster
public-cluster
内のノードにSSH接続し、private-cluster
のサービスに(サービスの内部ロードバランサーIPを使用して)curlリクエストを発行すると、上記のファイアウォールルールでトラフィックが正しく許可されます。ただし、ローカルマシンからpublic-cluster
API Gatewayへのリクエストを実行すると、ファイアウォールルールがトラフィックをブロックします。この場合、ファイアウォールルールのネットワークタグが無視されているようです。
ルールを機能させるために、以下のようないくつかのことを試みました(すべて失敗しています)。
public-cluster
のnginx外部IPを使用質問
だから、私の質問は:
public-cluster
で実行されているAPIゲートウェイから再ルーティングされたリクエストがファイアウォールを通過してprivate-cluster
に送られるようにする正しい方法は何ですか?public-cluster
のポッドアドレス範囲からprivate-cluster
のネットワークタグへのポート80/443を許可するファイアウォールルールを追加することで、これを機能させました。
public-clusters
のポッドアドレス範囲を取得します。gcloud container clusters describe public-cluster --zone europe-west2-a | grep clusterIpv4Cidr
--source-ranges=XX.XX.X.X/XX
をポッドアドレス範囲に置き換えます):gcloud compute firewall-rules create allow-public-cluster-to-private-cluster \
--direction=INGRESS \
--priority=1000 \
--network=custom-vpc \
--action=ALLOW \
--rules=tcp:80,tcp:443 \
--source-ranges=XX.XX.X.X/XX \
--target-tags=private-cluster
最善の方法は、パブリッククラスターのノードにラベルを適用してから、指定したラベルのみを許可するプライベートクラスターのポートを開くことです。すべてのgcpファイアウォールは、IPまたはクラスベースだけでなく、ラベルベースにすることができます。
Vpcネイティブクラスターの場合、プライベートクラスターノードはそのvpc上の他のすべてのインスタンスと通信できますが、vpcの外部にある宛先とは通信できません。そのvpc内でもロックダウンしたい場合は、それに応じてノードにタグを付け、それらのタグを使用してvmにファイアウォールルールを適用できます。