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

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

最終更新日:Nov 09, 2025

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

範囲

この機能は、汎用およびコンピューティング最適化 CPU Pod でのみ利用可能です。

考慮事項

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

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

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

ステップ 1: ネットワークポリシーを有効にする

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

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

    2. [クラスター] ページで、ターゲットクラスターを見つけてその ID をクリックします。左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

    3. [アドオン]ページで、[ネットワーク]タブをクリックします。[Poseidon] カードで、[インストール]をクリックします。

    4. [Poseidon のインストール] パネルで、[NetworkPolicy の有効化] を選択し、[OK] をクリックします。

      image.png

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

  2. Pod 構成にアノテーションを追加して NetworkPolicy を有効にします。

    NetworkPolicy をコンテナーに適用するには、network.alibabacloud.com/enable-network-policy-agent: "true" アノテーションを Pod 構成に追加する必要があります。次のコードブロックに例を示します。

    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 アプリケーションを作成する

コンソール

  1. [クラスター] ページで、管理するクラスターを見つけてその ID をクリックします。クラスター詳細ページの左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。

  2. [デプロイメント] タブで、[イメージから作成] をクリックします。

  3. [作成] ページで、nginx という名前のアプリケーションを作成し、サービスを使用して公開します。アプリケーションを構成した後、[作成] をクリックします。

    この Nginx アプリケーションでは、次のパラメーターのみを構成し、その他はデフォルト値を使用します。詳細については、「デプロイメントの作成」をご参照ください。

    ページ

    構成項目

    説明

    値の例

    基本情報

    アプリケーション名

    カスタム名を入力します。

    nginx

    レプリカ数

    適切なオプションを選択します。

    1

    コンテナー構成

    イメージ名

    [イメージの選択] をクリックし、目的のイメージを選択してから [OK] をクリックします。

    この例では、公式の Nginx イメージを使用します。[検索] タブで、[Artifact Center] を選択します。テキストボックスに nginx と入力してイメージを検索し、目的のイメージバージョンを選択します。

    詳細構成

    サービス

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

    名前: nginx

    タイプ:

    • Server Load Balancer

    • パブリックネットワークアクセス

    • SLB の作成

    ポートマッピング:

    • 名前: nginx

    • サービスポート: 80

    • コンテナーポート: 80

    • プロトコル: TCP

  4. [デプロイメント] ページに戻り、[イメージから作成] をクリックします。[作成] ページで、busybox という名前のクライアントアプリケーションを作成し、前のステップで作成した nginx サービスへのアクセスをテストします。

    この busybox クライアントアプリケーションでは、次のパラメーターのみを構成し、その他はデフォルト値を使用します。詳細については、イメージからデプロイメントを作成する」をご参照ください。

    ページ

    構成項目

    説明

    値の例

    基本情報

    アプリケーション名

    カスタム名を入力します。

    busybox

    レプリカ数

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

    1

    コンテナー構成

    イメージ名

    イメージアドレスを直接入力します。

    この例では、イメージアドレス registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 を使用します

    コンテナー開始項目

    なし

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

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

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

    2. [コンテナーグループ] タブで、busybox-{ハッシュ値} Pod を見つけ、右側の列にある [ターミナル] をクリックします。

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

      説明

      200 応答は、busybox が 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. busybox という名前の Pod を作成し、nginx という名前のサービスにアクセスします。

    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: 特定のラベルを持つアプリケーションへのサービスアクセスを制限する

コンソール

  1. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、[ネットワーク] > [ネットワークポリシー] を選択します。

  2. [ネットワークポリシー] ページの上部で、ネットワークポリシーの名前空間を選択します。この例では [default] を使用します。ページの右上隅にある [作成] をクリックします。[作成] パネルで、ネットワークポリシーを構成します。

    構成項目

    説明

    値の例

    名前

    ネットワークポリシーのカスタム名を入力します。

    access-nginx

    Pod セレクター

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

    説明

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

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

    • タイプ: [ステートレス]

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

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

    ソース

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

    • [ルール]:

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

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

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

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

    説明
    • ルールを追加しない場合、選択した Pod にアクセスできる Pod はありません。

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

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

    宛先

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

    • [ルール]:

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

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

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

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

    説明

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

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

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

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

    説明

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

    timeout

  5. ネットワークポリシーを変更して、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 サービスにアクセスできます。

      正常访问

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

    期待される出力:

    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 サービスにネットワークポリシーを設定します。パラメーターの詳細については、「特定のラベルを持つアプリケーションへのサービスアクセスを制限する」をご参照ください。

  2. サービスリストの [外部エンドポイント] 列で、ステップ 2: 他の Pod からアクセス可能なテスト Nginx アプリケーションを作成する で作成した nginx サービスのパブリック IP アドレス (47.xxx.xx.x) を見つけます。次に、ブラウザから IP アドレスにアクセスしてみてください。en

    説明

    ネットワークポリシーが nginx サービスに適用されているため、デフォルトではアクセスは失敗します。

  3. 許可された CIDR ブロックをネットワークポリシーに追加して、クライアントアクセスを許可します。

    1. ローカルのパブリック 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 サービスにアクセスできます。

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 への外部アクセスであり、ネットワークポリシーを使用して特定のラベルを持つアプリケーションへのサービスアクセスを制限するのとは異なります。

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

  3. ローカル IP アドレスを表示します。

    curl myip.ipip.net

    期待される出力:

    現在の 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=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 が特定のアドレスにのみアクセスできるように制限する

コンソール

このセクションでは、www.aliyun.comregistry.aliyuncs.com を例として、Pod が registry.aliyuncs.com にのみアクセスできるようにするネットワークポリシーを構成する方法を示します。

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

    image

  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

      [宛先] の右側にある [+追加] をクリックします。名前空間セレクターを使用して、すべての名前空間の UDP ポート 53 へのアクセスルールを追加します。これにより、アプリケーションが DNS を解決できるようになります。

      • [ルール] の右側にある [+追加] をクリックします。名前空間セレクターを使用して、すべての名前空間のルールを追加します。

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

      • ルール:

        • セレクター: namespaceSelector

        • 名前空間: すべて

      • ポート:

        • プロトコル: UDP

        • ポート: 53

      image.png

    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

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 ファイルのエグレスルールは、アプリケーションのアウトバウンドアクセスを制限します。DNS 解決を有効にするには、UDP リクエストを許可する必要があります。

  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 のパブリックネットワークアクセス権限を制御する

説明

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

コンソール

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

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

    構成項目

    値の例

    名前

    deny-public-net

    Pod セレクター

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

    ソース

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

    • namespaceSelector に all を許可するルールを設定します。

    • ipBlock に all を許可するルールを設定します。

    来源

    宛先

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

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

    • ipBlock に、次の 3 つの内部ネットワークセグメントを含む、内部ネットワークセグメントの 3 つのルールを設定します:

      • 10.0.0.0/8

      • 172.16.0.0/12

      • 192.168.0.0/16

      説明

      1 つの ipBlock ルールに複数のネットワークセグメントを追加することはできません。

      公网 去向

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

  3. クラスター詳細ページの [基本情報] タブで、内部 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公网访问

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 は、パブリックネットワークにアクセスできます。