見出し画像

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機能を使ってフロントエンドからデータベースへの不必要な通信を防ぐ方法を紹介しました。

ちょうどレストランの厨房を守る仕切りのように、適切なポリシーを導入して、システムをスマートに守りましょう。

いいなと思ったら応援しよう!