このページでは、クラスタ ネットワーク ポリシーを使用して、Pod が着信(または上り(内向き))ネットワーク トラフィックを受信できるかどうか、および発信(または下り(外向き))トラフィックを送信できるかどうかを制御する方法について説明します。
ネットワーク ポリシーを使用すると、Pod オブジェクト間の接続を制限できるため、攻撃を受けるリスクを低減できます。
ネットワーク ポリシーは、OSI モデルのレイヤ 3 またはレイヤ 4 のファイアウォールとして機能します。承認や暗号化などの追加機能はありません。
Pod オブジェクトへの受信トラフィックを制限する
NetworkPolicy オブジェクトを使用すると、Pod のネットワーク アクセス ポリシーを構成できます。NetworkPolicy オブジェクトには次の情報が含まれます。
ポリシーが適用される Pod オブジェクト。Pod オブジェクトと Workload は、ラベルとセレクタで定義します。
ネットワーク ポリシーの影響を受けるトラフィックのタイプ: 着信トラフィックの場合は上り(内向き)、発信トラフィックの場合は下り(外向き)、あるいはその両方。
上り(内向き)ポリシーの場合、指定した Pod オブジェクトに接続できる Pod オブジェクト。
下り(外向き)ポリシーの場合、指定した Pod オブジェクトが接続できる接続先 Pod オブジェクト。
受信トラフィック制限の例
このセクションでは、サンプル アプリケーションで受信トラフィックの制限を作成する方法について説明します。独自のアプリケーション環境に合わせてこの例を変更します。
ラベル
app=helloのウェブサーバー アプリケーションを実行し、クラスタ内でそれを内部公開します。kubectl run hello-web --labels app=hello \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 \ --port 8080 --exposehello-webPod へのトラフィックを、app=fooPod オブジェクトからのみ許可するようにNetworkPolicyを構成します。GKE on AWS により、このラベルがない Pod オブジェクトからの受信トラフィック、外部トラフィック、別の Namespace 内の Pod オブジェクトからのトラフィックはブロックされます。次のマニフェストでは、ラベルが
app=helloの Pod オブジェクトを選択し、ラベルがapp=fooの Pod オブジェクトからのトラフィックのみを許可する上り(内向き)ポリシーを指定しています。このポリシーをクラスタに適用します。
kubectl apply -f hello-allow-from-foo.yaml
上り(内向き)ポリシーを確認する
app=fooというラベルを使って一時 Pod を実行します。受信トラフィックが許可されていることを確認するために、hello-web:8080エンドポイントにリクエストを送信します。kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Pod
app=fooからapp=helloPod オブジェクトへのトラフィックが有効になっている場合、出力は次のようになります。Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z別のラベル(
app=other)を使用して一時 Pod を実行し、同じリクエストを行って、トラフィックが許可されていないことを確認します。kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \ -- wget -qO- --timeout=2 http://hello-web:8080出力で、接続がレスポンスを受信していないことがわかります。
wget: download timed out
Pod オブジェクトからの送信トラフィックを制限する
着信トラフィックと同じように、発信トラフィックを制限できます。
ただし、hello-web などの内部ホスト名や、www.example.com などの外部ホスト名をクエリするには、TCP プロトコルと UDP プロトコルを使用するポート 53 で DNS トラフィックを許可する下り(外向き)ポリシーを作成する必要があります。
下り(外向き)ネットワーク ポリシーを有効にするには、app=foo というラベルの Pod オブジェクトからのアウトバンド トラフィックを制御する NetworkPolicy をデプロイし、app=hello というラベルの Pod オブジェクトへのトラフィックと DNS トラフィックのみを許可します。
次のマニフェストでは、NetworkPolicy を指定して、次の 2 つの宛先を許可する、ラベル app=foo の Pod オブジェクトからの下り(外向き)トラフィックを制御します。
app=helloというラベルの、同じ名前空間内の Pod オブジェクト- ポート 53(UDP および TCP)の内部エンドポイントまたは外部エンドポイント
このポリシーをクラスタに適用します。
kubectl apply -f foo-allow-to-hello.yaml
下り(外向き)ポリシーを検証する
まず、
hello-web-2という新しいウェブ アプリケーションをデプロイし、クラスタ内でそれを内部公開します。kubectl run hello-web-2 --labels app=hello-2 \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --exposeapp=fooというラベルの一時 Pod を実行し、その Pod がhello-web:8080への接続を確立できることを確認します。kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080Pod は、次のリクエストに応答します。
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6zPod が
hello-web-2:8080への接続を確立できないことを確認します。kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web-2:8080出力で、接続がレスポンスを受信していないことがわかります。
wget: download timed outPod が、外部ウェブサイト(
www.example.comなど)への接続を確立できないことを確認します。kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://www.example.com出力で、接続がレスポンスを受信していないことがわかります。
wget: download timed out
クリーンアップ
このチュートリアルで作成したリソースを削除するには、次のコマンドを実行します。
kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml
次のステップ
- Kubernetes ネットワーク ポリシーのドキュメント
- ネットワーク ポリシー ロギングを使用して、クラスタのネットワーク ポリシーによって Pod オブジェクトへの接続が許可または拒否される時間を記録する。