ネットワーク ポリシーを使用してクラスタ全体の通信を制御する


このページでは、Google Kubernetes Engine(GKE)用にクラスタ全体のネットワーク ポリシーを構成する方法について説明します。

ネットワーク ポリシーと FQDN ネットワーク ポリシーは、Pod 間の通信トラフィック ルールを定義するのに役立ちます。ネットワーク ポリシーは、Pod がアプリケーション内や外部エンドポイントと通信する方法を制御します。

クラスタ管理者は、Cilium クラスタ全体のネットワーク ポリシー(CCNP)を構成できます。これにより、クラスタ全体の管理トラフィックを管理するためにネットワーク ポリシーの制限を回避できます。Cilium のクラスタ全体のネットワーク ポリシーは、Namespace にわたって、クラスタ全体のすべてのワークロードに厳格なネットワーク ルールを適用し、アプリケーション固有のルールをオーバーライドします。

GKE の Cilium クラスタ全体のネットワーク ポリシーは、GKE によって適用されるポリシーを指定するクラスタ スコープの CustomResourceDefinition(CRD)です。GKE で Cilium クラスタ全体のネットワーク ポリシーを有効にすると、クラスタ全体のネットワーク ルールを一元管理できます。クラスタに出入りするトラフィックに対する基本的なレイヤ 3(IP レベル)とレイヤ 4(ポートレベル)のアクセスを制御できます。

利点

Cilium クラスタ全体のネットワーク ポリシーを使用すると、次のことができます。

  • 一元化されたセキュリティを適用する: CCNP を使用すると、ネットワーク全体に適用されるネットワーク アクセス ルールを定義できます。これらの CCNP ルールは最上位のセキュリティ レイヤとして機能し、Namespace レベルで競合する可能性のあるポリシーをオーバーライドします。
  • マルチテナンシーを保護する: クラスタに複数のチームまたはテナントがホストされている場合は、ネットワーク トラフィック制御に重点を置いた CCNP ルールを実装することで、共有クラスタ内での分離を保護できます。特定のチームに Namespace または Namespace のグループを割り当てることで、ネットワーク レベルの分離を適用できます。
  • 柔軟なデフォルト ポリシーを定義する: CCNP を使用すると、クラスタ全体にデフォルトのネットワーク ルールを定義できます。クラスタ全体のセキュリティを損なうことなく、これらのルールを必要に応じてカスタマイズできます。

CCNP を実装するには、クラスタで GKE Dataplane V2 を有効にします。CCNP CRD が有効になっていることを確認してから、クラスタのネットワーク アクセス ルールを定義するポリシーを作成します。

始める前に

始める前に、次の作業が完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

要件

Cilium クラスタ全体のネットワーク ポリシーには次の要件があります。

  • Google Cloud CLI バージョン 465.0.0 以降。
  • 次のいずれかのバージョンを実行している GKE クラスタが必要です。
    • 1.28.6-gke.1095000 以降
    • 1.29.1-gke.1016000 以降
  • クラスタで GKE Dataplane V2 を使用する必要があります。
  • Cilium クラスタ全体のネットワーク ポリシー CRD を有効にする必要があります。

制限事項

Cilium クラスタ全体のネットワーク ポリシーには次の制限があります。

  • レイヤ 7 ポリシーはサポートされていません。
  • ノードセレクタはサポートされていません。
  • クラスタあたりの CiliumClusterwideNetworkPolicy の最大数は 1,000 です。

新しいクラスタで Cilium クラスタ全体のネットワーク ポリシーを有効にする

新しいクラスタで Cilium クラスタ全体のネットワーク ポリシーを有効にするには、Google Cloud CLI または Google Kubernetes Engine API を使用します。

gcloud

新しいクラスタで Cilium クラスタ全体のネットワーク ポリシーを有効にするには、--enable-cilium-clusterwide-network-policy フラグを使用して新しいクラスタを作成します。

Autopilot

gcloud container clusters create-auto CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy

次のように置き換えます。

  • CLUSTER_NAME: 使用するクラスタの名前。
  • COMPUTE_LOCATION: クラスタのロケーション。

Standard

gcloud container clusters create CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy \
    --enable-dataplane-v2

次のように置き換えます。

  • CLUSTER_NAME: 使用するクラスタの名前。
  • COMPUTE_LOCATION: クラスタのロケーション。

API

Cilium クラスタ全体のネットワーク ポリシーを有効にするには、新しいクラスタの作成時に次のオプションを指定する必要があります。

networkConfig オブジェクトdatapathProvider フィールド

{
  "cluster": {
    ...
    "networkConfig": {
      "datapathProvider": "ADVANCED_DATAPATH",
      "enableCiliumClusterwideNetworkPolicy": true
    }
  }
}

次のコマンドの出力に ciliumclusterwidenetworkpolicies.cilium.io が存在することを確認します。

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

出力例を以下に示します。

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

既存のクラスタで Cilium クラスタ全体のネットワーク ポリシーを有効にする

既存のクラスタで Cilium クラスタ全体のネットワーク ポリシーを有効にするには、Google Cloud CLI または Google Kubernetes Engine API を使用します。

gcloud

  1. クラスタで GKE Dataplane V2 が有効になっていることを確認します。

    gcloud container clusters describe CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --format="value(networkConfig.datapathProvider)" \
    

    次のように置き換えます。

    • CLUSTER_NAME: 使用するクラスタの名前。
    • COMPUTE_LOCATION: クラスタのロケーション。
  2. --enable-cilium-clusterwide-network-policy フラグを使用してクラスタを更新します。

    gcloud container clusters update CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --enable-cilium-clusterwide-network-policy
    
  3. anetd DaemonSet を再起動します。

    kubectl rollout restart ds -n kube-system anetd && \
        kubectl rollout status ds -n kube-system anetd
    

API

クラスタで GKE Dataplane V2 が有効になっていることを確認します。

{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  },
  "name": "cluster"
}
To update an existing cluster, run the following update cluster command:
{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  }
  "name": "cluster"
}

次のコマンドの出力に ciliumclusterwidenetworkpolicies.cilium.io が存在することを確認します。

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

出力例を以下に示します。

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

Cilium クラスタ全体のネットワーク ポリシーの使用

このセクションでは、Cilium クラスタ全体のネットワーク ポリシーの構成例について説明します。

例 1: ワークロードへの上り(内向き)トラフィックを制御する

次の例では、role=backend というラベルのすべてのエンドポイントが、ポート 80 で role=frontend というラベルのエンドポイントからの上り(内向き)接続を受け入れることができます。role=backend というラベルのエンドポイントは、このポリシーで許可されていないすべての上り(内向き)接続を拒否します。

  1. 次のマニフェストを l4-rule-ingress.yaml として保存します。

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-ingress"
    spec:
      endpointSelector:
        matchLabels:
          role: backend
      ingress:
        - fromEndpoints:
            - matchLabels:
                role: frontend
          toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f l4-rule-ingress.yaml
    

例 2: 特定のポートでワークロードからの下り(外向き)トラフィックを制限する

次のルールは、app=myService というラベルのエンドポイントが、ポート 80(TCP 経由)で任意のレイヤ 3 宛先にのみパケットを送信できるようにします。

  1. 次のマニフェストを l4-rule-egress.yaml として保存します。

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-egress"
    spec:
      endpointSelector:
        matchLabels:
          app: myService
      egress:
        - toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f l4-rule-egress.yaml
    

例 3: 特定のポートと CIDR でワークロードからの下り(外向き)トラフィックを制限する

次の例では、role=crawler というラベルのすべてのエンドポイントが、ポート 80(TCP プロトコル)上のパケットを宛先 CIDR 192.10.2.0/24 にのみ送信できるようにします。

  1. 次のマニフェストを cidr-l4-rule.yaml として保存します。

     apiVersion: "cilium.io/v2"
     kind: CiliumClusterwideNetworkPolicy
     metadata:
       name: "cidr-l4-rule"
     spec:
       endpointSelector:
         matchLabels:
           role: crawler
       egress:
         - toCIDR:
             - 192.0.2.0/24
           toPorts:
             - ports:
                 - port: "80"
                   protocol: TCP
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f cidr-l4-rule.yaml
    

ネットワーク トラフィックのモニタリングとトラブルシューティング

ネットワーク ポリシー ロギングGKE Dataplane V2 オブザーバビリティにより、Cliium クラスタ全体のネットワーク ポリシーの影響を受けるネットワーク トラフィックをモニタリングし、トラブルシューティングできます。

レイヤ 7 ポリシーまたはノードセレクタの使用を試みる

症状

GKE で GKE Dataplane V2 を使用していて、レイヤ 7 ルール(HTTP フィルタリングなど)とノードセレクタを含む CCNP ポリシーを定義しようとすると、次のようなエラー メッセージが表示されることがあります。

エラー

Error from server (GKE Warden constraints violations): error when creating
"ccnp.yaml": admission webhook
"warden-validating.common-webhooks.networking.gke.io" denied the request: GKE
Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by gke-cilium-network-policy-limitation]":["L7
rules are not allowed in CiliumClusterwideNetworkPolicy"]} Requested by user:
'[email protected]', groups: 'system:authenticated'.

考えられる原因

GKE には、CCNP に関する制限があります。アプリケーション レベルのデータ(HTTP ヘッダーなど)に基づくフィルタリングを可能にするレイヤ 7 ポリシーとノードセレクタは、GKE の Cilium インテグレーションではサポートされていません。

解決策

GKE クラスタで高度なレイヤ 7 フィルタリング機能が必要な場合は、Anthos Service Mesh の使用を検討してください。これにより、アプリケーション レベルできめ細かいトラフィック制御を行うことができます。

Cilium クラスタ全体のネットワーク ポリシーが有効になっていない

症状

この機能が明示的に有効になっていないクラスタで Cilium クラスタ全体のネットワーク ポリシー(CCNP)を構成しようとすると、構成に失敗し、次のようなエラー メッセージが表示されることがあります。

エラー

error: resource mapping not found for name: "l4-rule" namespace: "" from
"ccnp.yaml": no matches for kind "CiliumClusterwideNetworkPolicy" in version
"cilium.io/v2" ensure CRDs are installed first

考えられる原因

Cilium クラスタ全体のネットワーク ポリシーはカスタム リソース定義(CRD)に依存します。このエラー メッセージは、クラスタに CRD がないことを示しています。

解決策

CCNP を使用する前に、Cilium クラスタ全体のネットワーク ポリシー CRD を有効にします。

次のステップ