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

Container Compute Service:ACS クラスターでのネットワークポリシーの使用

最終更新日:Mar 05, 2026

Alibaba Cloud Container Compute Service (ACS) は、Kubernetes NetworkPolicy を使用したポリシーベースのネットワーク制御を提供します。クラスター内の特定のアプリケーションに対して IP アドレスまたはポートレベルでネットワークトラフィックを制御するには、ネットワークポリシーを使用できます。このトピックでは、ACS クラスターでネットワークポリシーを使用する方法について、一般的なシナリオを含めて説明します。

適用範囲

  • 汎用およびコンピューティング最適化インスタンスタイプの CPU Pod のみがサポートされています。

  • IPv4 のみがサポートされており、IPv6 はサポートされていません。

注意事項

  • NetworkPolicy ルールでは、LabelSelector を使用して名前空間または Pod を選択できます。ただし、Pod に適用される NetworkPolicy の数が増えるにつれて、ルールが有効になるまでに必要な時間も長くなります。さらに、多くの NetworkPolicy ルールは、クラスターの管理とトラブルシューティングを複雑にする可能性があります。したがって、クラスター内の NetworkPolicy の数は 40 未満にしてください。

ステップ 1: ネットワークポリシーの有効化

  1. Poseidon コンポーネントをインストールします。

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

    2. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。

    3. [コンポーネント管理] ページで、[ネットワーク] タブをクリックします。Poseidon コンポーネントカードの右下隅にある [インストール] をクリックします。

    4. [コンポーネント Poseidon のインストール] ページで、[NetworkPolicy の有効化] を選択し、[確認] をクリックします。

      image.png

      コンポーネントがインストールされると、カードの右上隅に [インストール済み] と表示されます。

  2. Pod アノテーションで NetworkPolicy を有効にします。

    NetworkPolicy が必要なコンテナーには、次のアノテーションを追加します: network.alibabacloud.com/enable-network-policy-agent: "true"。以下に例を示します:

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        network.alibabacloud.com/enable-network-policy-agent: "true"
      name: example
      namespace: default
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: example

ステップ 2: 他の Pod からアクセス可能な Nginx テストアプリケーションの作成

kubectl

  1. クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続します

  2. 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
  3. nginx という名前のサービスにアクセスするために、busybox という名前の Pod を作成します。

    kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /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

ステップ 3: ネットワークポリシーの使用

必要に応じて、以下のシナリオでネットワークポリシーを使用できます。

シナリオ 1: ネットワークポリシーを使用して特定のラベルを持つアプリケーションからのアクセスのみを許可する

kubectl

  1. 以下の YAML テンプレートを使用し、vim policy.yaml コマンドを実行して policy.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 サービスへのアクセスをテストします。リクエストはタイムアウトし、アクセスは失敗します。

    kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /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. アクセスラベルを定義します。

    kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/sh

    nginx サービスへのアクセスをテストします

    wget nginx

    期待される出力:

    nginx (172.21.XX.XX:80) への接続中
    'index.html' に保存中
    index.html           100% |****************************************************************************************************************************************************|   612  0:00:00 ETA
    'index.html' を保存しました

    Nginx への接続進捗が 100% に達すると、リクエストは成功し、Nginx サービスにアクセスできます。

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

kubectl

  1. nginx アプリケーション用に Alibaba Cloud 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

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

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

    解決策:許可されたソース IP アドレス範囲を追加するようにネットワークポリシーを変更します。

  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 のアドレス範囲内にあります。したがって、100.64.0.0/10 を設定する必要があります。

  5. Nginx サービスを作成します。

    kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /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 が指定されたアドレスにのみアクセスできるように制限する

kubectl

  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 ファイルを作成します。

    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: 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 ファイルでは、アプリケーションのアウトバウンドアクセスを制限するエグレスルールが設定されています。ここでは UDP リクエストを許可する必要があります。そうしないと、DNS 名前解決が失敗します。

  3. busybox-policy ファイルからネットワークポリシーを作成します。

    kubectl apply -f busybox-policy.yaml 

    期待される出力:

    networkpolicy.networking.k8s.io/busybox-policy created
  4. busybox を作成します。

    kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /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 のパブリックネットワークアクセスを制御する

説明

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

kubectl

  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

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

    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.aliyuncs.com/acs/busybox:v1.29.2  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.aliyuncs.com/acs/busybox:v1.29.2  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 はパブリックネットワークにアクセスできます。