こんにちは!クラウドネイティブ環境でアプリケーションを開発・運用していると、「誰が私たちのサービスにアクセスできるのか?」というセキュリティの問いに直面することがよくあります。Kubernetesの基本的な哲学は「すべてのPod間の通信を許可する(Any-to-Any)」ですが、実際の運用環境では非常に危険な考え方です。
今日は、CKAD試験の必須項目であり、ゼロトラスト(Zero Trust)セキュリティの出発点であるNetworkPolicyを徹底的に掘り下げていきます。

1. NetworkPolicyとは何か?
KubernetesのNetworkPolicyは、Podグループ間のネットワークトラフィックの流れを許可するルールを定義するL3/L4ファイアウォールの役割を果たします。
主要な特徴
- ホワイトリスト方式: 基本的にNetworkPolicyが適用された瞬間、明示されていないすべてのトラフィックは遮断されます。
- ラベルセレクター(Label Selector)ベース: IPアドレスではなく、Podのラベルを通じて対象を指定します。これは、動的なKubernetes環境に最適化された方式です。
- ネットワークプラグイン依存性: 重要です!NetworkPolicyをサポートするネットワークソリューション(Calico、Cilium、Weave Netなど)がクラスターにインストールされている場合にのみ、実際の遮断が機能します。
2. NetworkPolicyの主要な構成要素
NetworkPolicyのYAMLを作成する際に、必ず理解しておくべき4つの主要な領域があります。
- podSelector: ポリシーを適用するターゲットPodを選択します。
- policyTypes: このポリシーが受信トラフィック(Ingress)に関するものか、送信トラフィック(Egress)に関するものかを明示します。
- Ingress: 許可する受信トラフィックのソース(from)とポート(ports)を定義します。
- Egress: 許可する送信トラフィックの宛先(to)とポート(ports)を定義します。
3. 実践例で学ぶ通信制御
シナリオ1: 特定のPodからのリクエストのみを許可する(Ingress)
app: databaseラベルを持つPodに対して、app: backendラベルを持つPodからの5432ポートへの接続のみを許可したい場合です。
YAML
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-allow-backend
namespace: default
spec:
podSelector:
matchLabels:
app: database # ポリシーを適用する対象(DB Pod)
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: backend # 接続を許可するソース(バックエンドPod)
ports:
- protocol: TCP
port: 5432 # 許可するポート
シナリオ2: すべてのトラフィックを遮断する(Default Deny)
最も安全なセキュリティ戦略は、すべての通信を遮断し、必要なものだけを開放することです。
YAML
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: default
spec:
podSelector: {} # ネームスペース内のすべてのPodを選択
policyTypes:
- Ingress
- Egress
# ingress/egressのサブ項目を空にすると、すべてのトラフィックが遮断されます。
4. CKAD試験で間違いやすいポイント(裏技)
試験会場で慌てないためには、以下の3つの条件を明確に区別する必要があります。
- podSelector vs namespaceSelector: *
podSelectorのみの場合、同じネームスペース内のPodを探します。 - 他のネームスペースのPodを許可するには、必ず
namespaceSelectorを併用する必要があります。 - 配列(-)の有無:
- YAML
- podSelector: {…}
- podSelector: {…}
- namespaceSelector: {…} # 2番: 2つの条件が「OR」で動作(現在のNSの特定のPod、または特定のNSのすべてのPod)
- DNS確認(Egress): Podから外部への送信トラフィックを制御する際、DNSクエリ(UDP 53)を許可しないと、ドメインベースの通信が失敗します。Egressポリシーの際は必ず確認してください!
`
from:
namespaceSelector: {…} # 1番: 2つの条件が「AND」で動作(特定のNS内の特定のPod)
from:
`
5. 終わりに
NetworkPolicyは単に通信を遮断するツールではなく、マイクロサービスアーキテクチャにおいてサービス間の信頼境界を設定する非常に重要な手段です。CKAD試験を準備されている方は、様々なラベルの組み合わせを通じてkubectl describe netpolの結果を分析する練習を十分に行うことをお勧めします。
今日まとめた内容が、皆様のクラスターをより安全にする一助となれば幸いです!
コメントを残す