Kubernetes NetworkPolicyを活用してPod間通信を制御しよう:EgressDeny編
Kubernetesクラスターを運用していると、「特定のPodがあるサービスにアクセスしないようにしたい」というシーン、意外とありますよね。たとえば、フロントエンドアプリが誤ってデータベースに直接アクセスしてしまうリスクを防ぎたい場合など。今回は、CiliumのegressDeny機能を使って「フロントエンドからデータベースへの通信を拒否する」ポリシーを設定してみましょう。
ポリシー設定の背景:Pod間通信の制御が大切な理由
想像してみてください。レストランの厨房にある冷蔵庫。料理人は食材を取り出すことができますが、お客様が冷蔵庫に直接アクセスできると困りますよね。注文された料理を通じてのみ冷蔵庫の中身に触れるべきです。これと同じで、フロントエンドアプリはAPIを通じてデータベースにアクセスするべきで、直接触れるべきではありません。
Kubernetesでは、デフォルトでは全てのPod間通信が許可されています。このため、明確な制御が必要です。CiliumのegressDenyを活用すれば、これを簡単に実現できます。
Ciliumでの設定手順:フロントエンドからデータベースへの通信を拒否
ここでは、CiliumのegressDenyを使った具体的な設定を見ていきます。
1. 前提条件
クラスター上にCiliumが導入されていること。
frontendラベルを持つPodと、databaseサービスが存在すること。
2. NetworkPolicyの作成
以下のYAMLファイルを作成します。このポリシーは、frontendラベルを持つPodからdatabaseサービスへの通信を拒否します。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: deny-frontend-to-database
spec:
description: >
Deny all egress traffic from Pods with label 'type=frontend'
to the database service using egressDeny.
egressDeny:
- toEndpoints:
- matchLabels:
app: database
toPorts:
- ports:
- port: "3306"
protocol: TCP
endpointSelector:
matchLabels:
type: frontend
ポリシーの構成内容
endpointSelector: type=frontendラベルを持つPodを対象にしています。
egressDeny: 特定の送信トラフィックを拒否するために使用します。
toEndpoints: app=databaseラベルを持つサービスやPodへの通信を制限します。
toPorts: ポート番号3306(一般的なデータベースポート)を指定。
ポリシー適用後の効果
このポリシーを適用すると、frontendラベル付きのPodからdatabaseサービスへの直接通信ができなくなります。一方で、他の通信(例えば、APIサーバーへの通信)はそのまま維持されます。
まとめ
Pod間通信の制御は、システム全体の安全性を高めるうえで欠かせない要素です。今回の例では、CiliumのegressDeny機能を使ってフロントエンドからデータベースへの不必要な通信を防ぐ方法を紹介しました。
ちょうどレストランの厨房を守る仕切りのように、適切なポリシーを導入して、システムをスマートに守りましょう。