web-dev-qa-db-ja.com

GKEクラスター間のトラフィックを許可するGPCファイアウォールルールを作成する方法

背景

2つのGKEクラスタpublic-clusterprivate-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-clusterprivate-clusterは、同じVPC内の同じリージョン内の別々のサブネット上にあります。

意図されたアーキテクチャは次のとおりです。

in this image


問題

次のように、private-clusterからのものでない限り、public-clusterへのすべてのトラフィックをブロックするファイアウォールルールを作成しようとしています。

  • 優先順位が低く、private-cluster(ネットワークタグをターゲットとして使用)および0.0.0.0/0へのすべてのトラフィックをソースIP範囲として拒否する上りルール
  • より優先度の高い上りルール:
    • ターゲット= private-cluster
    • ソースフィルター= public-cluster
    • TCPポート80および443のトラフィックを許可します

public-cluster内のノードにSSH接続し、private-clusterのサービスに(サービスの内部ロードバランサーIPを使用して)curlリクエストを発行すると、上記のファイアウォールルールでトラフィックが正しく許可されます。ただし、ローカルマシンからpublic-cluster AP​​I Gatewayへのリクエストを実行すると、ファイアウォールルールがトラフィックをブロックします。この場合、ファイアウォールルールのネットワークタグが無視されているようです。

ルールを機能させるために、以下のようないくつかのことを試みました(すべて失敗しています)。

  • パブリッククラスターが存在するサブネットIP範囲をソースフィルターIP範囲として使用する
  • サブネットのゲートウェイIPをソースフィルターIPとして使用する
  • ソースIPとしてpublic-clusterのnginx外部IPを使用

質問

だから、私の質問は:

  1. このファイアウォールルールを定義して、public-clusterで実行されているAPIゲートウェイから再ルーティングされたリクエストがファイアウォールを通過してprivate-clusterに送られるようにする正しい方法は何ですか?
  2. より一般的には、これはKubernetesクラスターの一般的なアーキテクチャパターンですか(つまり、パブリックパブリッククラスターがAPIゲートウェイを実行し、バックエンドの非パブリッククラスターにリクエストを再ルーティングします)、そうでない場合、これを設計するより良い方法はありますか? (これは非常に主観的な質問ですが、別のアプローチについて聞きたいと思っています)
1
Andrew Ridout

public-clusterのポッドアドレス範囲からprivate-clusterのネットワークタグへのポート80/443を許可するファイアウォールルールを追加することで、これを機能させました。

  1. public-clustersのポッドアドレス範囲を取得します。
gcloud container clusters describe public-cluster --zone europe-west2-a | grep clusterIpv4Cidr
  1. ファイアウォールルールを作成します(--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
0
Andrew Ridout

最善の方法は、パブリッククラスターのノードにラベルを適用してから、指定したラベルのみを許可するプライベートクラスターのポートを開くことです。すべてのgcpファイアウォールは、IPまたはクラスベースだけでなく、ラベルベースにすることができます。

0
matteo nunziati

Vpcネイティブクラスターの場合、プライベートクラスターノードはそのvpc上の他のすべてのインスタンスと通信できますが、vpcの外部にある宛先とは通信できません。そのvpc内でもロックダウンしたい場合は、それに応じてノードにタグを付け、それらのタグを使用してvmにファイアウォールルールを適用できます。

0