すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ACK クラスターでのネットワークポリシーの使用

最終更新日:Mar 24, 2026

ACK のネットワークポリシーは、ポリシーに基づくネットワーク制御を提供します。Terway コンテナネットワークを使用する場合、クラスター内の特定のアプリケーションに対して IP アドレスまたはポートレベルでネットワークトラフィックを制御するネットワークポリシーを利用できます。本トピックでは、ACK クラスターでのネットワークポリシーの使用方法および一般的な利用シーンについて説明します。

前提条件

制限事項

  • コンソールからネットワークポリシー機能を利用するには、ホワイトリストに登録されたユーザーである必要があります。アクセス権限の申請は、クォータセンターコンソール コンソールで実施してください。

  • コマンドラインからネットワークポリシーを管理する場合は、ホワイトリスト登録は不要です。

  • NetworkPolicy ルールでは、ラベルセレクターを使用して名前空間または Pod を選択します。ただし、クラスター内に多数の NetworkPolicy が存在すると、ルールの適用に要する時間が増加し、クラスター管理およびトラブルシューティングが複雑化する可能性があります。クラスターあたりの NetworkPolicy の最大数は 100 件を推奨します。

  • 本機能は、Terway CNI プラグインを使用し、共有 ENI(Elastic Network Interface)モードで構成されたノードにのみ適用されます。排他的な ENI モードで構成されたノードプールではサポートされません。

    本ドキュメントでは、異なるコンピューティングシナリオにおける具体的な構成および制限事項については取り扱いません。ハイブリッドクラウドやエラスティックインスタンスなど、特定のコンピューティング環境で本機能を利用する場合は、対応するコンピューティングプロダクトのドキュメントをご参照ください。
  • ACK では、標準の Kubernetes ネットワークポリシーのみがサポートされています。Calico や Cilium などのサードパーティ製ソリューションによるカスタムネットワークポリシーはサポートされていません。

実装の詳細

クラスターを作成する際、NetworkPolicy の実装はクラスターの初期 Terway バージョンによって異なります。

1.9.0 以降

コンポーネント

NetworkPolicy 実装

terway-eniip

eBPF

重要
  • ルールでクラスター内の Pod をマッチさせる必要がある場合は、podSelector または namespaceSelector を使用してください。ipBlock は、クラスター外のアドレスのみをマッチさせることができます。

  • 初期 Terway バージョンが 1.9.0 より前のクラスターを作成した場合、Terway を 1.9.0 以降にアップグレードしても、NetworkPolicy の実装は変更されません。

  • eBPF をベースとした NetworkPolicy 実装には、カーネルバージョン 4.19 以降が必要です。カーネルバージョンが 4.19 より前のノードでは、本機能は動作しません。

  • これらの注意事項は、Terway コンポーネントを実行する通常の ECS ノードにのみ適用されます。仮想ノードでネットワークポリシーを有効にするには、「ネットワークポリシーを使用する」をご参照ください。

1.9.0 より前

コンポーネント

NetworkPolicy 実装

IPvlan または DataPath V2 が無効化された terway-eniip

iptables

IPvlan または DataPath V2 が有効化された terway-eniip

eBPF

重要
  • ルールでクラスター内の Pod をマッチさせる必要がある場合は、podSelector または namespaceSelector を使用してください。eBPF 実装では、ipBlock はクラスター外のアドレスのみをマッチさせることができます。

  • 初期 Terway バージョンが 1.9.0 より前のクラスターを作成した場合、Terway を 1.9.0 以降にアップグレードしても、NetworkPolicy の実装は変更されません。

  • eBPF をベースとした NetworkPolicy 実装には、カーネルバージョン 4.19 以降が必要です。カーネルバージョンが 4.19 より前のノードでは、本機能は iptables モードにフォールバックします。これにより、NetworkPolicy ルールが正しく機能しない可能性があります。

  • これらの注記は、Terway コンポーネントを実行する通常の ECS ノードにのみ適用されます。仮想ノードでネットワークポリシーを有効にするには、「ネットワークポリシーを使用する」をご参照ください。

ネットワークポリシーの有効化

新規または既存のクラスターに対して、ネットワークポリシー機能を有効化できます。

新規クラスター

クラスターを作成する際に、NetworkPolicies のサポート オプションを選択して、ネットワークポリシー機能を有効化します。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。

既存のクラスター

  1. まず、ACK コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

  2. クラスターリスト」ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、「アドオン管理」をクリックします。

  3. ネットワーク タブをクリックし、terway-eniip コンポーネントを検索して、右下隅の 設定 をクリックします。NetworkPolicy を有効化 のチェックボックスをオンにし、OK をクリックします。

    image

    重要

    DataPath V2 が有効化されていないクラスターの場合、既存のノードでネットワークポリシー機能が有効化されるには、ノードの再起動が必要です。

ネットワークポリシーの例

サンプルアプリケーションの準備

他の Pod からアクセス可能な Nginx テストアプリケーションを作成する手順を以下に示します。

コンソール

  1. まず、ACK コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

  2. クラスターリスト ページで対象のクラスターの名前をクリックし、左側のナビゲーションウィンドウで ワークロード > デプロイメント を選択します。

  3. [デプロイメント] ページで、[イメージから作成] をクリックします。[作成] ウィザードで、nginx という名前のアプリケーションを作成し、サービスとして公開します。アプリケーションを設定した後、[作成] をクリックします。

    本例では、Nginx アプリケーションの以下のパラメーターのみを設定し、その他のパラメーターはすべてデフォルト設定を使用します。詳細については、「設定の詳細」をご参照ください。

    パラメーター

    説明

    基本情報

    名前

    アプリケーションの名前。

    nginx

    レプリカ

    Pod の数。

    1

    コンテナ

    イメージ名

    コンテナのイメージ。

    nginx:latest

    高度な設定

    サービス

    サービス の横にある 作成 をクリックして、サービスのパラメーターを設定します。

    名前:nginx

    タイプ

    • ClusterIP

    • LoadBalancer

    • NodePort

    ポートマッピング

    • 名前:nginx

    • サービスポート:80

    • コンテナポート:80

    • プロトコル:TCP

  4. [デプロイメント] ページで、[イメージから作成] を再度クリックします。[作成] ウィザードで、nginx サービスへのネットワーク接続をテストするための、busybox という名前のクライアントアプリケーションを作成します。

    本例では、busybox クライアントアプリケーションの以下のパラメーターのみを設定し、その他のパラメーターはすべてデフォルト設定を使用します。詳細については、「設定の詳細」をご参照ください。

    パラメーター

    説明

    基本情報

    名前

    アプリケーションの名前。

    busybox

    レプリカ

    Pod の数。

    1

    コンテナ

    イメージ名

    コンテナのイメージ。

    busybox:latest

    開始コマンド

    このパラメーターは空欄のままにしてください。

    stdin および tty を選択します。

  5. busybox クライアントアプリケーションが nginx サービスにアクセスできることを確認します。

    1. [デプロイメント] ページで、busybox アプリケーションを見つけ、その名前をクリックします。

    2. Pod タブをクリックします。次に、busybox-{hash} Pod を見つけ、操作 列の ターミナル をクリックします。

      image.png

    3. busybox ターミナルで、wget nginx コマンドを実行して、Nginx へのネットワーク接続をテストします。

      connection

      出力結果より、busybox Pod が nginx サービスにアクセスできることを確認できます。

CLI

  1. 以下のコマンドを実行して、Nginx アプリケーションを作成し、nginx という名前のサービスでアプリケーションを公開します。

    Nginx アプリケーションを作成します。

    kubectl run nginx --image=nginx

    期待される出力:

    pod/nginx created

    Pod が実行中であることを確認します。

    kubectl get pod

    期待される出力:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx                    1/1     Running   0          45s

    nginx という名前のサービスを作成します。

    kubectl expose pod nginx --port=80

    期待される出力:

    service/nginx exposed

    サービスを表示します。

    kubectl get service

    期待される出力:

    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   172.XX.XX.1     <none>        443/TCP   30m
    nginx        ClusterIP   172.XX.XX.48    <none>        80/TCP    12s
  2. 以下のコマンドを実行して、busybox という名前の Pod を作成し、その Pod から nginx という名前のサービスにアクセスします。

    kubectl run busybox --rm -ti --image=busybox /bin/sh

    期待される出力:

    If you don't see a command prompt, try pressing enter.
    / #
    / #

    プロンプトが表示されたら、以下のコマンドを実行して nginx にアクセスします:

    wget nginx

    期待される出力:

    Connecting to nginx (172.XX.XX.48:80)
    saving to 'index.html'
    index.html           100% |****************************************************************************************************************************************************|   612  0:00:00 ETA
    'index.html' saved

シナリオ 1:ラベルによるアクセス許可

コンソール

コンソールでネットワークポリシーを使用するには、ホワイトリストに登録されている必要があります。ホワイトリストへの登録申請は、チケットを送信チケットを送信してください。詳細については、「制限事項」をご参照ください。

  1. まず、ACK コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

  2. クラスターリスト ページで、クラスターの名前をクリックします。 左側のナビゲーションウィンドウで、ネットワーク > ネットワークポリシー をクリックします。

  3. [ネットワークポリシー] ページで、上部から名前空間を選択します。この例では、[デフォルト] を選択します。右上隅の [作成] をクリックし、[作成] パネルでネットワークポリシーを設定します。

    パラメーター

    説明

    名前

    ネットワークポリシーの名前。

    access-nginx

    Pod セレクター

    + ワークロードのラベルを追加して選択 をクリックし、ネットワークポリシーを適用する Pod を指定します。

    説明

    Pod セレクターを設定しない場合、ネットワークポリシーは選択した名前空間内のすべての Pod に適用されます。

    本例では、以下の設定を使用します:

    • タイプ を Deployment に設定

    • ワークロード を nginx に設定

    • ラベル を app=nginx に設定

    Ingress

    各ネットワークポリシーには、インバウンドルールの許可リストが含まれます。各ルールは、from および ports の両方のセクションに一致するトラフィックを許可します。

    • ルール

      • podSelector:ネットワークポリシーと同じ名前空間内の特定の Pod を選択し、それらをインバウンドトラフィックの送信元として許可します。

      • namespaceSelector:特定の名前空間を選択し、その名前空間内のすべての Pod をインバウンドトラフィックの送信元として許可します。

      • ipBlock:CIDR 表記で指定された特定の IP アドレス範囲を選択し、その IP アドレスをインバウンドトラフィックの送信元として許可します。

    • ポート:TCP および UDP プロトコルがサポートされます。

    説明
    • ルールを追加しない場合、選択した Pod へのインバウンドトラフィックは拒否されます。

    • クラスターで DataPath v2 または IPvlan が有効化されている場合、ipBlock を使用して Pod CIDR ブロックからのトラフィックを制限することはできません。代わりに podSelector を使用する必要があります。

    本例では、インバウンドルールは追加しません。

    アウトバウンド

    各ネットワークポリシーには、アウトバウンドルールの許可リストが含まれます。各ルールは、to および ports の両方のセクションに一致するトラフィックを許可します。

    • ルール

      • podSelector:ネットワークポリシーと同じ名前空間内の特定の Pod を選択し、それらをアウトバウンドトラフィックの送信先として許可します。

      • namespaceSelector:特定の名前空間を選択し、その名前空間内のすべての Pod をアウトバウンドトラフィックの送信先として許可します。

      • ipBlock:CIDR 表記で指定された特定の IP アドレス範囲を選択し、その IP アドレスをアウトバウンドトラフィックの送信先として許可します。

    • ポート:TCP および UDP プロトコルがサポートされます。

    説明

    クラスターで DataPath v2 または IPvlan が有効化されている場合、ipBlock を使用して Pod CIDR ブロックからのトラフィックを制限することはできません。代わりに podSelector を使用する必要があります。

    本例では、アウトバウンドルールは追加しません。

  4. 次へ をクリックし、その後 OK をクリックします。

  5. busybox ターミナルで、wget nginx コマンドを実行して、nginx サービスへのネットワーク接続をテストします。詳細については、「ステップ 5」をご参照ください。

    ネットワークポリシーが busybox Pod からのアクセスを許可しないため、接続がタイムアウトします。

    timeout

  6. busybox アプリケーションからのアクセスを許可するようにネットワークポリシーを変更します。

    1. ネットワークポリシー一覧で access-nginx ネットワークポリシーを見つけ、操作 列の 編集 をクリックします。

    2. インバウンドルールを追加します。

      [Ingress] セクションの右側で、[+ 追加] をクリックし、次の手順を実行します。

      • ルール の右側にある + 追加 をクリックし、podSelector を使用したアクセスルールを追加します。以下の設定を使用します:

        パラメーター

        セレクター

        podSelector

        タイプ

        Deployment

        ワークロード

        busybox

        ラベル

        app=busybox

      • ポート の右側にある + 追加 をクリックし、以下の設定を構成します:

        パラメーター

        プロトコル

        TCP

        ポート

        80

    3. 次へ をクリックし、その後 OK をクリックします。

    4. ネットワークポリシーを変更した後に、busybox と nginx 間のネットワーク接続をテストするために、wget -O /dev/null nginx コマンドを実行します。

      busybox アプリケーション向けのルールをネットワークポリシーに追加した後、busybox Pod が nginx Pod にアクセスできるようになります。正常访问

CLI

  1. 以下の YAML テンプレートを使用し、vim policy.yaml コマンドを実行して、policy.yaml という名前のファイルを作成します。

    vim policy.yaml
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: access-nginx
    spec:
      podSelector:
        matchLabels:
          run: nginx
      ingress:
      - from:
        - podSelector:
            matchLabels:
              access: "true"
  2. policy.yaml ファイルからネットワークポリシーをデプロイするため、以下のコマンドを実行します。

    kubectl apply -f policy.yaml

    期待される出力:

    networkpolicy.networking.k8s.io/access-nginx created
  3. 以下のコマンドを実行して、nginx サービスへのネットワーク接続をテストします。アクセスラベルが指定されていないため、リクエストがタイムアウトします。

    kubectl run busybox --rm -ti --image=busybox /bin/sh

    nginx サービスへのネットワーク接続をテストします

    wget nginx

    期待される出力:

    Connecting to nginx (172.19.XX.XX:80)
    wget: can't connect to remote host (172.19.XX.XX): Connection timed out
  4. 必要なアクセスラベルを持つ Pod を起動するため、以下のコマンドを実行します。

    kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh

    nginx サービスへのネットワーク接続をテストします

    wget nginx

    期待される出力:

    Connecting to nginx (172.21.XX.XX:80)
    saving to 'index.html'
    index.html           100% |****************************************************************************************************************************************************|   612  0:00:00 ETA
    'index.html' saved

    出力結果より、リクエストが成功し、nginx サービスにアクセスできることを確認できます。

ユースケース 2:送信元 CIDR ブロックによるアクセス制限

コンソール

  1. nginx サービス向けのネットワークポリシーを構成します。構成の詳細については、「ユースケース 1:特定のラベルを持つアプリケーションへのサービスアクセス制限」をご参照ください。

  2. サービス一覧で、外部エンドポイント 列(例:47.xxx.xx.x)から nginx サービスのパブリック IP アドレスを検索し、ブラウザでそのアドレスにアクセスしてみてください。en

    ネットワークポリシーがデフォルトですべてのインバウンドトラフィックを拒否するため、アクセスは失敗します。

  3. ネットワークポリシーを変更し、特定のクライアント CIDR ブロックからのアクセスを許可します。

    1. ブラウザで myip.ipip.net を開き、ご自身のマシンのパブリック IP アドレスを確認します。

    2. ネットワークポリシー一覧で access-nginx ポリシーを見つけ、編集 をクリックし、編集 パネルでルールを変更します。

      送信元 の右側にある + 追加 をクリックし、以下の手順を実行します:

      • ルール の右側にある + 追加 をクリックし、ご自身のマシンの IP アドレスからのアクセスを許可するルールを追加します:

        パラメーター

        セレクター

        ipBlock

        cidr

        <ご自身のマシンの IP アドレス>/32

        例:42.xx.xx.xx/32

      • ルール の右側にある + 追加 をクリックし、Alibaba Cloud SLB のヘルスチェック CIDR ブロックからのアクセスを許可する別のルールを追加します:

        パラメーター

        セレクター

        ipBlock

        cidr

        100.0.0.0/8

      • ポート の右側にある + 追加 をクリックし、ポート設定を以下のように構成します:

        パラメーター

        プロトコル

        TCP

        ポート

        80

      ipblock

    3. 次へ をクリックし、その後 OK をクリックします。

    4. サービス一覧で、外部エンドポイント列の IP アドレス(例:47.xxx.xx.x:80)をクリックして、nginx サービスにアクセスします。

      image.png

      ネットワークポリシーが更新された後、インターネット向け SLB 経由でクライアントから nginx サービスにアクセスできるようになります。

CLI

  1. 以下のコマンドを実行して、nginx アプリケーション向けの Alibaba Cloud Server Load Balancer (SLB) サービスを作成し、type=LoadBalancer を指定して nginx サービスをインターネットに公開します。

    vim nginx-service.yaml

    以下の内容は、nginx-service.yaml ファイルのテンプレートです。

    # 次の YAML コンテンツを nginx-service.yaml に貼り付けます。
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        run: nginx
      name: nginx-slb
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer

    nginx-service.yaml ファイルからサービスを作成するため、以下のコマンドを実行します。

    kubectl apply -f nginx-service.yaml 

    期待される出力:

    service/nginx-slb created

    サービスがインターネットに公開されていることを確認します:

    kubectl get service nginx-slb

    期待される出力:

    NAME        TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
    nginx-slb   LoadBalancer   172.19.xx.xxx   47.110.xxx.xxx   80:32240/TCP   8m
  2. 先ほど作成した SLB の IP アドレス 47.110.xxx.xxx にアクセスするため、以下のコマンドを実行します。アクセスは失敗します。

    wget 47.110.xxx.xxx

    期待される出力:

    --2018-11-21 11:46:05--  http://47.110.xx.xxx/
    Connecting to 47.110.XX.XX:80... failed: Connection refused.
    説明

    アクセスが失敗する理由は以下のとおりです:

    • 構成済みの nginx サービスは、特定のラベル access=true を持つアプリケーションからのみアクセス可能です。

    • SLB の IP アドレスにアクセスすることは、Kubernetes に対する外部アクセスであり、特定のラベルを持つアプリケーションへのサービスアクセス制限というネットワークポリシーの用途とは異なります。

    解決策:ネットワークポリシーを変更し、許可する送信元 CIDR ブロックを追加します。

  3. ご自身のローカルパブリック IP アドレスを確認するため、以下のコマンドを実行します。

    curl myip.ipip.net

    期待される出力:

    Current IP: 10.0.x.x From: China Beijing Beijing        # 出力は参考用です。実際の IP アドレスを使用してください。
  4. policy.yaml ファイルを変更するため、以下のコマンドを実行します。

    vim policy.yaml

    以下の内容で policy.yaml ファイル を更新します:

    # 以下の内容は YAML ファイルの内容です。
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: access-nginx
    spec:
      podSelector:
        matchLabels:
          run: nginx
      ingress:
      - from:
        - podSelector:
            matchLabels:
              access: "true"
        - ipBlock:
            cidr: 100.64.0.0/10
        - ipBlock:
            cidr: 10.0.0.0/24      # ご自身のローカルネットワークのアドレス範囲。これは例です。実際の情報を使用してください。

    policy.yaml ファイルから変更を適用するため、以下のコマンドを実行します。

    kubectl apply -f policy.yaml 

    期待される出力:

    networkpolicy.networking.k8s.io/access-nginx unchanged
    説明
    • /24 アドレス範囲を使用してください。

    • SLB のヘルスチェックアドレスは 100.64.0.0/10 アドレスブロックにあります。そのため、100.64.0.0/10 を設定する必要があります。

  5. クライアント Pod を起動し、それを使用して nginx サービスにアクセスします。

    kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh

    nginx サービスにアクセスします:

    wget 47.110.XX.XX

    期待される出力:

    Connecting to 47.110.XX.XX (47.110.XX.XX:80)
    index.html           100% |***********************************************************|   612  0:00:00 ETA

    100% の進行状況は、nginx サービスへの接続が成功したことを示します。

ユースケース 3:Pod のアウトバウンドを特定のアドレスに制限

コンソール

本トピックでは、www.aliyun.com および registry.aliyuncs.com というドメインを使用した例を紹介し、Pod が registry.aliyuncs.com にのみアクセスできるようにネットワークポリシーを構成する方法を説明します。

  1. ping コマンドを使用して、registry.aliyuncs.com のバインド済み IP アドレス(120.55.XXX.XXX)を照会します。

  2. busybox アプリケーションのアクセスを registry.aliyuncs.com にのみ制限するネットワークポリシールールを作成します。

    1. [ネットワークポリシー] ページで、右上隅にある [作成] をクリックします。[作成] パネルで、ネットワークポリシー ルールを設定します。

    2. パラメーターの詳細については、「ユースケース 1:特定のラベルを持つアプリケーションへのサービスアクセス制限」をご参照ください。以下の表に、例としての構成を示します。

      パラメーター

      説明

      名前

      ネットワークポリシーのカスタム名。

      busybox-policy

      Pod セレクター

      + ワークロードタイプとラベルを指定 をクリックして、ネットワークポリシーを適用する Pod を選択します。

      説明

      Pod セレクターを指定しない場合、ネットワークポリシーは名前空間内のすべての Pod に適用されます。

      本例では、以下の設定を使用します:

      • タイプステートレス に設定

      • ワークロード を busybox に設定

      • ラベル を app=busybox に設定

      出口

      アウトバウンド の右側にある + 追加 をクリックし、その後 ルール の右側にある + 追加 をクリックします。

      以前に取得した registry.aliyuncs.com の IP アドレスを /32 形式(例:120.55.XXX.XXX/32)で ipBlock として設定するルールを追加します。

      • セレクター:ipBlock

      • cidr:120.55.XXX.XXX/32

      image.png

      アウトバウンド の右側にある + 追加 をクリックして、別のルールを追加します。このルールは、UDP ポート 53 で全名前空間へのアウトバウンドトラフィックを許可し、アプリケーションが DNS 解決を実行できるようにします。

      • ルール の右側にある + 追加 をクリックし、全名前空間を選択するルールを追加します。

      • ポート の右側にある + 追加 をクリックし、UDP ポート 53 のルールを追加します。

      • ルール:

        • セレクター:namespaceSelector

        • 名前空間:すべて

      • ポート:

        • プロトコル:UDP

        • ポート:53

      image

    3. 次へ をクリックし、その後 OK をクリックします。

    4. BusyBox ターミナルで、以下のコマンドを実行して www.aliyun.com にアクセスします。

      nc -vz -w 1 www.aliyun.com 443

      期待される出力:

      nc: www.aliyun.com (60.191.xx.xx:443): Connection timed out

      registry.aliyuncs.com にアクセスします。

      nc -vz -w 1 registry.aliyuncs.com 443

      期待される出力:

      registry.aliyuncs.com (120.55.xx.xx:443) open

CLI

  1. www.aliyun.com が解決する IP アドレスの一覧を取得するため、以下のコマンドを実行します。

    dig +short registry.aliyuncs.com

    期待される出力:

    120.55.XXX.XXX
  2. busybox-policy ファイルを作成するため、以下のコマンドを実行します。

    vim busybox-policy.yaml

    busybox-policy ファイル のテンプレートは以下のとおりです:

    # 以下の内容は YAML ファイルの内容です。
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: busybox-policy
    spec:
      podSelector:
        matchLabels:
          run: busybox
      egress:
      - to:
        - ipBlock:
            cidr: 120.55.XXX.XXX/32
      - to:
        - ipBlock:
            cidr: 0.0.0.0/0
        - namespaceSelector: {}
        ports:
        - protocol: UDP
          port: 53
    説明

    busybox-policy ファイルには、アプリケーションのアウトバウンドアクセスを制限するアウトバウンドルールが含まれています。DNS 解決を正常に機能させるためには、UDP 要求を許可するようにこのルールを設定する必要があります。

  3. busybox-policy ファイルからネットワークポリシーを作成するため、以下のコマンドを実行します。

    kubectl apply -f busybox-policy.yaml 

    期待される出力:

    networkpolicy.networking.k8s.io/busybox-policy created
  4. busybox Pod を起動し、ネットワークアクセスをテストするため、以下のコマンドを実行します。

    kubectl run busybox --rm -ti --image=busybox /bin/sh

    www.aliyun.com 以外のウェブサイト(例:www.taobao.com)にアクセスします:

    wget www.taobao.com

    期待される出力:

    Connecting to www.taobao.com (64.13.XX.XX:80)
    wget: can't connect to remote host (64.13.XX.XX): Connection timed out

    can't connect to remote host エラーは、サービスへのアクセスが失敗したことを示します。

  5. www.aliyun.com にアクセスするため、以下のコマンドを実行します。

    wget registry.aliyuncs.com

    期待される出力:

    Connecting to registry.aliyuncs.com (120.55.XXX.XXX:80)
    Connecting to registry.aliyuncs.com (120.55.XXX.XXX:443)
    wget: note: TLS certificate validation not implemented
    index.html           100% |***********************************************************|  462k  0:00:00 ETA

    100% の進行状況は、接続が成功したことを示します。

ユースケース 4:Pod のパブリックネットワークアクセス制御

重要

本操作は、パブリックネットワークにアクセスするサービスに影響を与える可能性があります。空の名前空間で実行することを推奨します。

コンソール

  1. ネットワーク ポリシー」ページの右上隅で、[作成] をクリックします。[作成] パネルで、ネットワーク ポリシーを設定します。

    パラメーターの詳細および手順については、「ネットワークポリシーを使用した特定のラベルを持つアプリケーションへのサービスアクセス制限」をご参照ください。以下の表に、例としての構成を示します。

    パラメーター

    名前

    deny-public-net

    Pod セレクター

    タイプをすべてに設定します。

    Ingress

    以下の 2 つのルールを追加します:

    • namespaceSelector に対するすべて許可ルール。

    • ipBlock に対するすべて許可ルール。

    来源

    アウトバウンド

    プライベートネットワークへのアウトバウンドトラフィックのみを許可するルールを追加します:

    • namespaceSelectorすべて に設定し、Pod が内部ネットワーク内のすべての Pod にアクセスできるようにします。

    • ipBlock に対して 3 つのルールを作成し、以下の 3 つのプライベートネットワーク CIDR ブロックへのアウトバウンドトラフィックを許可します:

      • 10.0.0.0/8

      • 172.16.0.0/12

      • 192.168.0.0/16

      説明

      単一の ipBlock ルールで複数の CIDR ブロックを追加することはできません。

      公网 去向

  2. 次へ をクリックし、その後 OK をクリックします。

  3. クラスターの詳細ページの [基本情報] タブで、内部 IP アドレスおよびポートを取得します。

    image.png

  4. busybox ターミナルで、以下のコマンドを実行して、Pod のパブリックネットワークおよびプライベートネットワークへのアクセスをテストします。

    nc -vz -w 1 www.aliyun.com 443

    期待される出力:Pod はパブリックネットワークにアクセスできず、接続がタイムアウトします。

    nc: www.aliyun.com (60.191.xx.xx:443): Connection timed out

    プライベートネットワークへのアクセスをテストします。

    nc -vz -w 1 10.134.xx.xx:<Port> # 実際のプライベート IP アドレスに置き換えてください。

    期待される出力:Pod はプライベートネットワークアドレスにアクセスできます。

    10.134.xx.xx:<Port> (10.134.xx.xx:<Port>) open

CLI

  1. アクセス制限の検証のためにテスト用名前空間を作成するため、以下のコマンドを実行します。

    test-np という名前の名前空間を作成します。

    kubectl create ns test-np

    期待される出力:

    namespace/test-np created
  2. この名前空間向けのデフォルトネットワークポリシーを作成し、プライベートネットワークへのアウトバウンドトラフィックのみを許可します。

    vim default-deny.yaml

    以下の内容は、default-deny.yaml ファイルの例としてのテンプレートです:

    # 以下の内容は YAML ファイルの内容です。
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      namespace: test-np
      name: deny-public-net
    spec:
      podSelector: {}
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      egress:
      - to:
        - ipBlock:
            cidr: 192.168.0.0/16
        - ipBlock:
            cidr: 172.16.0.0/12
        - ipBlock:
            cidr: 10.0.0.0/8

    kubectl apply コマンドを実行して、default-deny.yaml ファイルからネットワークポリシーを作成します。

    kubectl apply -f default-deny.yaml

    期待される出力:

    networkpolicy.networking.k8s.io/deny-public-net created

    ネットワークポリシーを表示します:

    kubectl get networkpolicy -n test-np

    期待される出力:

    NAME                              POD-SELECTOR          AGE
    deny-public-net                   <none>                1m
  3. 特定のラベルを持つ Pod がパブリックネットワークにアクセスできるようにするネットワークポリシーを作成します。

    vim allow-specify-label.yaml

    例としてのラベルは public-network=true に設定します。

    # 以下の内容は YAML ファイルの内容です。
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-public-network-for-labels
      namespace: test-np
    spec:
      podSelector:
        matchLabels:
          public-network: "true"
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      egress:
      - to:
        - ipBlock:
            cidr: 0.0.0.0/0
        - namespaceSelector:
            matchLabels:
              ns: kube-system  # CoreDNS などのキーサービスへのアクセスを許可します。これは例です。必要に応じて設定してください。

    以下のコマンドを実行して、ネットワークポリシーを作成します:

    kubectl apply -f allow-specify-label.yaml

    期待される出力:

    networkpolicy.networking.k8s.io/allow-public-network-for-labels created

    ネットワークポリシーを表示します:

    kubectl get networkpolicy -n test-np

    期待される出力:

    NAME                              POD-SELECTOR          AGE
    allow-public-network-for-labels   public-network=true    1m
    deny-public-net                   <none>                 3m
  4. 特別なラベルを持たない Pod がパブリックネットワークにアクセスできないことを確認するため、以下のコマンドを実行します。

    kubectl run -it --namespace test-np --rm --image registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 busybox-intranet
    ping aliyun.com

    期待される出力:

    PING aliyun.com (106.11.2xx.xxx): 56 data bytes
    ^C
    --- aliyun.com ping statistics ---
    9 packets transmitted, 0 packets received, 100% packet loss

    0 packets received が表示された場合、アクセスは失敗しています。

    説明

    アクセス失敗の原因は、deny-public-net ネットワークポリシールールにあります。このルールにより、test-np 名前空間内の Pod に対するデフォルトのパブリックネットワークアクセスが拒否されます。その結果、この名前空間で起動したデフォルトのラベルを持つ Pod はパブリックネットワークにアクセスできません。

  5. public-network=true を持つ Pod がサービスにアクセスできることを確認するため、以下のコマンドを実行します。

    kubectl run -it --namespace test-np --labels public-network=true --rm --image registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 busybox-internet
    ping aliyun.com

    期待される出力:

    PING aliyun.com (106.11.1xx.xx): 56 data bytes
    64 bytes from 106.11.1xx.xx: seq=0 ttl=47 time=4.235 ms
    64 bytes from 106.11.1xx.xx: seq=1 ttl=47 time=4.200 ms
    64 bytes from 106.11.1xx.xx: seq=2 ttl=47 time=4.182 ms
    ^C
    --- aliyun.com ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max = 4.182/4.205/4.235 ms

    0% packet loss が表示された場合、サービスへのアクセスが成功しています。

    説明

    busybox-internet Pod はパブリックネットワークにアクセスできます。これは、allow-public-network-for-labels ネットワークポリシーに、public-network=true ラベルを持つ Pod に対するパブリックネットワークアクセスを許可するルールが含まれているためです。