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

Container Service for Kubernetes:NetworkPolicy の使用

最終更新日:Sep 21, 2026

ACK Serverless クラスターでネットワークポリシーを有効にすると、Poseidon アドオンを使用してポッドレベルのトラフィックを制御できます。

前提条件

制限事項

  • Network Policy は ACK Serverless Pro と ACK managed cluster Pro クラスターでのみサポートされています。

  • NetworkPolicy は IPv6 アドレスをサポートしていません。

  • NetworkPolicy の endPort フィールドはサポートされていません。

  • NetworkPolicy ルールは、ラベルセレクターを使用して名前空間または Pod を照合します。NetworkPolicy リソースが多すぎると、ルールの伝播が遅くなり、管理とトラブルシューティングが複雑になります。クラスターあたりの NetworkPolicy リソースは 40 未満に制限してください。

ステップ 1: NetworkPolicy の有効化

ACK Serverless Pro クラスターでネットワークポリシーを有効にするには、Poseidon アドオンをインストールします。

  1. Poseidon アドオンをインストールします。

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

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

    3. [コンポーネントとアドオン] ページで、インストール をクリックします。ネットワーク タブで Poseidon カードを見つけ、[次へ] をクリックします。

    4. コンポーネントのインストール ダイアログボックスで、[ACS/ECI インスタンスの NetworkPolicy を有効化] を選択して [次へ] をクリックし、OK をクリックします。

      インストール後、カードに インストール済み と表示されます。

ステップ 2: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

ステップ 3:NetworkPolicy の使用

NetworkPolicy リソースを適用して、ラベル、CIDR ブロック、egress の宛先、またはパブリックネットワークアクセスによって Pod のトラフィックを制限します。

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

  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 アプリケーション向けの 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 のアウトバウンドを特定のアドレスに制限

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

    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 に対するパブリックネットワークアクセスを許可するルールが含まれているためです。