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

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

最終更新日:Nov 09, 2025

Container Service for Kubernetes (ACK) ネットワークポリシーは、ポリシーベースのネットワーク制御を提供します。Terway コンテナーネットワークプラグインを使用する場合、ネットワークポリシーを使用して、クラスター内の特定のアプリケーションの IP アドレスまたはポートレベルでネットワークトラフィックを制御できます。このトピックでは、ACK クラスターでネットワークポリシーを使用する方法と、一般的なシナリオの例について説明します。

前提条件

使用上の注意

  • コンソールでネットワークポリシーを使用するには、クォータセンターコンソールで申請を送信する必要があります。

  • コマンドラインを使用してネットワークポリシーを管理する場合、申請を送信する必要はありません。

  • NetworkPolicy ルールは LabelSelectors を使用して名前空間または Pod を選択します。ただし、クラスター内に多数の NetworkPolicy があると、ルールが有効になるまでの時間が長くなり、クラスターの管理とトラブルシューティングが複雑になる可能性があります。クラスター内に作成する NetworkPolicy は 100 未満にすることをお勧めします。

  • この機能は、Terway CNI プラグインを使用し、共有 ENI モードで構成されているノードにのみ適用されます。排他的な 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 より前の場合、NetworkPolicy 機能は動作しません。

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

1.9.0 より前

コンポーネント

NetworkPolicy の実装

terway-eniip および IPvlan または DataPath V2 が有効になっていない

iptables

terway-eniip および IPvlan または DataPath V2 が有効になっている

eBPF

重要
  • クラスター内の Pod を照合するには、podSelector または namespaceSelector を使用します。eBPF の実装では、ipBlock セレクターはクラスター外のアドレスのみを照合できます。

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

  • eBPF ベースの NetworkPolicy の実装には、カーネルバージョン 4.19 以降が必要です。ノードのカーネルバージョンが 4.19 より前の場合、NetworkPolicy 機能は iptables モードにフォールバックします。NetworkPolicy ルールが期待どおりに機能しない場合があることに注意してください。

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

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

クラスターの作成時または既存のクラスターに対してネットワークポリシーを有効にできます。

新しいクラスター

クラスターを作成するときに、[Support For NetworkPolicy] を選択してネットワークポリシー機能を有効にします。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。

作成済みのクラスター

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

  2. クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。

  3. [ネットワーク] タブで、terway-eniip コンポーネントを見つけ、右下隅にある [設定] をクリックします。[Enable NetworkPolicy] を選択し、[OK] をクリックします。

    image

    重要

    DataPath V2 が有効になっていないクラスターの場合、NetworkPolicy 機能を有効にしても、既存のノードではすぐには有効になりません。変更を有効にするには、ノードを再起動する必要があります。

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

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

次の手順に従って、他の Pod がアクセスできる Nginx テストアプリケーションを作成します。

コンソールの使用

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

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

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

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

    設定項目

    説明

    設定例

    基本情報

    アプリケーション名

    カスタム名。

    nginx

    レプリカ数

    必要に応じて選択します。

    1

    コンテナー設定

    イメージ名

    コンテナーの起動に使用されるイメージの名前。

    nginx:latest

    サービス設定

    サービス

    [サービス] の右側にある [作成] をクリックして、サービス設定項目を設定します。

    名前: nginx

    サービスタイプ:

    • 仮想クラスター IP (ClusterIP)

    • Server Load Balancer (LoadBalancer)

    • ノードポート (NodePort)

    ポートマッピング:

    • 名前: nginx

    • サービスポート: 80

    • コンテナーポート: 80

    • プロトコル: TCP

  4. [ステートレス] ページで、[イメージから作成] をクリックします。表示される [作成] ウィザードで、busybox という名前のクライアントアプリケーションを作成し、前のステップで作成した nginx Service へのアクセスをテストします。

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

    設定項目

    説明

    設定例

    基本情報

    アプリケーション名

    カスタム名。

    busybox

    レプリカ数

    必要に応じて値を設定します。

    1

    コンテナー開始項目

    イメージ名

    コンテナーの起動に使用されるイメージの名前。

    busybox:latest

    コンテナー開始項目

    なし

    [stdin][tty] を選択します

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

    1. [ステートレス] ページで、busybox アプリケーション名をクリックします。

    2. [Pod] タブで、busybox-{hash value} Pod を見つけ、[アクション] 列の [ターミナル] をクリックします。

      image.png

    3. busybox コマンドラインターミナルで、wget nginx コマンドを実行して Nginx へのアクセスをテストします。

      connection

      出力は、busybox が Nginx Service にアクセスできることを示しています。

コマンドラインの使用

  1. 次のコマンドを実行して Nginx アプリケーションを作成し、nginx という名前の Service を使用して公開します。

    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 という名前の Service を作成します:

    kubectl expose pod nginx --port=80

    期待される出力:

    service/nginx exposed

    Service を表示します:

    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 を作成し、nginx という名前の Service にアクセスします。

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

    期待される出力:

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

    nginx にアクセスします:

    If you don't see a command prompt, try pressing enter.
    / #
    / # wget 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. [ネットワークポリシー] ページで、ページの上部から名前空間を選択します。この例では、[default] 名前空間を使用します。右上隅で、[作成] をクリックします。[作成] パネルで、ポリシーを設定します。

    設定項目

    説明

    設定例

    名前

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

    access-nginx

    Pod セレクター

    [+ ワークロードを選択してラベルを追加] をクリックして、ネットワークポリシーが適用される Pod を設定します。

    説明

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

    この例では、次の設定を使用します:

    • [タイプ] を [ステートレス] に設定します

    • [ワークロード] を nginx に設定します

    • [ラベル] を app=nginx に設定します

    ソース

    各ネットワークポリシーには、ソース (イングレス) ルールのホワイトリストを含めることができます。各ルールは、ソースルールと指定されたポートセクションの両方に一致するトラフィックを許可します。

    • ルール:

      • podSelector: このセレクターは、ネットワークポリシーと同じ名前空間内の特定の Pod を選択し、インバウンドトラフィックのソースとして許可します。

      • namespaceSelector: このセレクターは、特定の名前空間を選択し、その中のすべての Pod をインバウンドトラフィックのソースとして使用します。

      • ipBlock: このセレクターは、特定の IP CIDR 範囲を選択して、インバウンドトラフィックのソースとして使用します。

    • ポート: TCP および UDP プロトコルをサポートします。

    説明
    • ルールを追加しない場合、選択した Pod へのアクセスはどの Pod にも許可されません。

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

    この例では、ソースルールは追加しません。

    宛先

    各ネットワークポリシーには、エグレスルールのホワイトリストを含めることができます。各ルールは、宛先ルールと指定されたポートセクションに一致するトラフィックを許可します。

    • ルール:

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

      • namespaceSelector: このセレクターは、特定の名前空間を選択し、その中のすべての Pod をアウトバウンドトラフィックの宛先として使用します。

      • ipBlock: このセレクターは、特定の IP CIDR 範囲をアウトバウンドトラフィックの宛先として選択します。

    • ポート: TCP および UDP プロトコルをサポートします。

    説明

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

    この例では、宛先ルールは追加しません。

  4. [次へ] をクリックし、次に [OK] をクリックします。

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

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

    timeout

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

    1. ネットワークポリシーリストで access-nginx ネットワークポリシーを見つけ、[アクション] 列の [編集] をクリックします。

    2. ソースルールを追加します。

      [ソース] の右側にある [+ 追加] をクリックし、次の手順を実行します:

      • [ルール] の右側にある [+ 追加] をクリックします。podSelector のアクセスルールを次のように設定します:

        設定項目

        設定例

        セレクター

        podSelector

        タイプ

        ステートレス

        ワークロード

        busybox

        ラベル

        app=busybox

      • [ポート] の右側にある [+ 追加] をクリックし、ポートを次のように設定します:

        設定項目

        設定例

        プロトコル

        TCP

        ポート

        80

    3. [次へ] をクリックし、次に [OK] をクリックします。

    4. ネットワークポリシーを変更した後、wget -O /dev/null nginx コマンドを実行して busybox から nginx へのアクセスをテストします。

      busybox アプリケーションのルールがネットワークポリシーに追加された後、busybox は nginx にアクセスできます。正常访问

コマンドラインの使用

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

    vim 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"
  2. 次のコマンドを実行して、policy.yaml ファイルからネットワークポリシーを作成します。

    kubectl apply -f policy.yaml 

    期待される出力:

    networkpolicy.networking.k8s.io/access-nginx created
  3. 次のコマンドを実行して、nginx Service へのアクセスをテストします。アクセスラベルが定義されていないため、リクエストはタイムアウトします。

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

    nginx Service へのアクセスをテストします:

    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. 次のコマンドを実行して、アクセスラベルを定義します。

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

    Nginx Service へのアクセスをテストします:

    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

    出力は、接続の進行状況が 100% であることを示しています。これは、リクエストが成功し、Nginx サービスにアクセスできることを意味します。

シナリオ 2: ネットワークポリシーを使用して、インターネット向けサービスにアクセスできるソース CIDR ブロックを制限する

コンソールの使用

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

  2. サービスリストの [外部エンドポイント] 列で、Nginx サンプルアプリケーション Service のパブリックアクセスアドレス (47.xxx.xx.x) を見つけ、ブラウザでアクセスします。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 サービスにアクセスできます。

コマンドラインの使用

  1. 次のコマンドを実行して、nginx アプリケーション用の Alibaba Cloud SLB インスタンスを作成します。nginx サービスをインターネットに公開するために type=LoadBalancer を指定します。

    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

    アプリケーションが Nginx サービスを公開しているかどうかを確認します:

    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 Service には、特定のラベル access=true を持つアプリケーションのみがアクセスできます。

    • SLB インスタンスの IP アドレスへのアクセスは、Kubernetes への外部アクセスと見なされます。これは、特定のラベルを持つアプリケーションへのサービスアクセスを制限するシナリオとは異なります。

    解決策: 許可されたソース CIDR ブロックを追加するようにネットワークポリシーを変更します。

  3. 次のコマンドを実行して、ローカル IP アドレスを表示します。

    curl myip.ipip.net

    期待される出力:

    Current IP: 10.0.x.x From: China Beijing Beijing        # これは一例です。実際のデバイス情報を使用してください。
  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.1/24      # ローカル IP アドレス。これは一例です。実際のデバイス情報を使用してください。

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

    kubectl apply -f policy.yaml 

    期待される出力:

    networkpolicy.networking.k8s.io/access-nginx unchanged
    説明
    • 一部のネットワークには複数のエグレス IP アドレスがあります。/24 アドレス範囲を使用することをお勧めします。

    • SLB ヘルスチェックアドレスは 100.64.0.0/10 CIDR ブロックにあります。したがって、許可リストに 100.64.0.0/10 を追加する必要があります。

  5. 次のコマンドを実行して、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.comregistry.aliyuncs.com を例として、Pod が registry.aliyuncs.com にのみアクセスできるようにするネットワークポリシーを設定する方法を示します。

  1. `ping` コマンドを使用して、registry.aliyuncs.com が解決する IP アドレス (120.55.XXX.XXX) をクエリします。

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

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

    2. パラメーターの詳細については、「ネットワークポリシーを使用して、特定のラベルを持つアプリケーションへのサービスアクセスを制限する」をご参照ください。以下は設定例です。

      設定項目

      説明

      設定例

      名前

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

      busybox-policy

      Pod セレクター

      [+ ワークロードを選択してラベルを追加] をクリックして、ネットワークポリシーが適用される Pod を設定します。

      説明

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

      この例では、次の設定を使用します:

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

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

      • ラベルを app=busybox に設定

      宛先

      [宛先] の右側にある [+ 追加] をクリックし、次に [ルール] の右側にある [+ 追加] をクリックします。

      以前に取得した registry.aliyuncs.com の解決済み IP アドレス (120.55.XXX.XXX)/32 を持つ ipBlock のルールを追加します。

      • セレクター: ipBlock

      • cidr: 120.55.XXX.XXX/32

      image.png

      [宛先] の右側にある [+ 追加] をクリックします。アプリケーションが DNS 解決を実行できるように、すべての名前空間に対して UDP ポート 53 へのアクセスを許可するルールを追加します。

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

      • [ポート] の右側にある [+ 追加] をクリックします。アプリケーションが DNS 解決を実行できるように、UDP 53 のルールを追加します。

      • ルール:

        • セレクター: namespaceSelector

        • 名前空間: すべて

      • ポート:

        • プロトコル: UDP

        • ポート: 53

      image

    3. [次へ] をクリックし、次に [OK] をクリックします。

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

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

      出力は、ネットワークポリシーが追加された後、busybox アプリケーションは registry.aliyuncs.com にのみアクセスでき、他のアドレスにはアクセスできないことを示しています。dns

コマンドラインの使用

  1. 次のコマンドを実行して、www.aliyun.com ドメイン名が解決する IP アドレスのリストを取得します。

    dig +short www.aliyun.com

    期待される出力:

    www-jp-de-intl-adns.aliyun.com.
    www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com.
    v6wagbridge.aliyun.com.
    v6wagbridge.aliyun.com.gds.alibabadns.com.
    106.XX.XX.21
    140.XX.XX.4
    140.XX.XX.13
    140.XX.XX.3
  2. busybox-policy.yaml という名前のファイルを作成します。

    vim busybox-policy.yaml

    busybox-policy.yaml ファイルには次のテンプレートを使用します:

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

    busybox-policy.yaml ファイルでは、アプリケーションのアウトバウンドアクセスを制限するために egress ルールが設定されています。UDP リクエストを許可するようにルールを設定する必要があります。そうしないと、DNS 解決が失敗します。

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

    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 www.aliyun.com

    期待される出力:

    Connecting to www.aliyun.com (140.205.XX.XX:80)
    Connecting to www.aliyun.com (140.205.XX.XX:443)
    wget: note: TLS certificate validation not implemented
    index.html           100% |***********************************************************|  462k  0:00:00 ETA

    出力は、接続の進行状況が 100% であることを示しています。これは、サービスに正常にアクセスできたことを意味します。

シナリオ 4: ネットワークポリシーを使用して、名前空間内の Pod のパブリックネットワークアクセスを制御する

説明

この操作は、パブリックネットワークにアクセスしているオンラインサービスに影響を与える可能性があります。空の名前空間で次の操作を実行することをお勧めします。

コンソールの使用

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

    パラメーターと操作の詳細については、「ネットワークポリシーを使用して、特定のラベルを持つアプリケーションへのサービスアクセスを制限する」をご参照ください。以下は設定例です。

    設定項目

    設定例

    名前

    deny-public-net

    Pod セレクター

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

    ソース

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

    • namespaceSelector に [すべて] を許可するルールを設定します。

    • ipBlock に [すべて] を許可するルールを設定します。

    来源

    宛先

    内部ネットワークへのアクセスのみを許可するルールを追加します:

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

    • 次の 3 つの内部ネットワーク CIDR ブロックに対して、[ipBlock] に 3 つのルールを設定します:

      • 10.0.0.0/8

      • 172.16.0.0/12

      • 192.168.0.0/16

      説明

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

      公网 去向

  2. [次へ] をクリックし、次に [OK] をクリックします。

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

    image.png

  4. busybox ターミナルで、次のコマンドを実行して、Pod のパブリックおよび内部ネットワークアクセスをテストします。

    nc -vz -w 1 www.aliyunc.com 443
    nc -vz -w 1 10.xx.xx.xx:<IP port> # これは内部 IP アドレスです。

    出力は、Pod が内部アドレスにのみアクセスでき、パブリックアドレスにはアクセスできないことを示しています。Pod公网访问

コマンドラインの使用

  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

    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  # Pod が 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 メッセージは、サービスに正常にアクセスできたことを示します。

    説明

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