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

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

最終更新日:Dec 27, 2024

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

前提条件

kubectl クライアントがクラスタに接続されていること。詳細については、クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する を参照してください。

使用上の注意

  • ACS コンソールでネットワークポリシーを使用するには、クォータセンターコンソール ページにアクセスして申請を送信してください。

  • CLI を介してネットワークポリシーを使用する場合、ホワイトリストに追加申請する必要はありません。

  • ネットワークポリシーでラベルセレクタを使用して、名前空間とポッドを選択できます。クラスタに多数のネットワークポリシーを作成すると、リクエストとネットワークポリシーのルールを照合するプロセスに時間がかかります。さらに、クラスタに多数のネットワークポリシーが存在する場合、クラスタの管理とトラブルシューティングが複雑になります。クラスタには 40 個未満のネットワークポリシーを作成することをお勧めします。

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

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

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

    2. クラスタ ページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。

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

    4. Poseidon のインストール ダイアログボックスで、ネットワークポリシーを有効にする を選択し、OK をクリックします。

      image.png

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

  2. ポッドのネットワークポリシーを有効にするアノテーションを追加します。

    ポッドのネットワークポリシーを有効にするには、alibabacloud.com/enable-network-policy-agent: "true" アノテーションをポッドの YAML ファイルに追加します。例:

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        alibabacloud.com/enable-network-policy-agent: "true"  // ポッドのネットワークポリシーエージェントを有効にする
      name: example
      namespace: default
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: example

ステップ 2: 他のポッドからのアクセスを許可する NGINX アプリケーションを作成する

ACS コンソールの使用

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

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

  3. デプロイメント タブで、イメージから作成 をクリックします。作成 ページで、nginx という名前のアプリケーションを作成し、サービスを使用してアプリケーションを公開します。アプリケーションの設定が完了したら、作成 をクリックします。

    次の表の説明に基づいて以下のパラメータを設定し、その他のパラメータにはデフォルト設定を使用できます。詳細については、イメージからデプロイメントを作成する. を参照してください。

    ページ

    パラメータ

    説明

    基本情報

    名前

    カスタムアプリケーション名を指定します。

    nginx

    レプリカ

    ビジネス要件に基づいて値を指定します。

    1

    コンテナ

    イメージ名

    イメージを選択 をクリックします。表示されるダイアログボックスで、イメージを選択し、OK をクリックします。

    この例では、NGINX イメージが選択されています。検索 タブで、ドロップダウンリストから Docker イメージ を選択し、検索ボックスに NGINX と入力して、検索をクリックします。

    詳細設定

    サービス

    作成サービス の右側にある をクリックします。サービスの作成ダイアログボックスで、パラメータを設定します。

    名前: nginx

    タイプ:

    • サーバーロードバランサ

    • パブリックアクセス

    • SLB インスタンスの作成

    ポートマッピング:

    • 名前: nginx

    • サービスポート: 80

    • コンテナポート: 80

    • プロトコル: TCP

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

    次の表の説明に基づいて busybox クライアントアプリケーションの以下のパラメータを設定し、その他のパラメータにはデフォルト設定を使用できます。詳細については、イメージからデプロイメントを作成する. を参照してください。

    ページ

    パラメータ

    説明

    基本情報

    名前

    カスタムアプリケーション名を指定します。

    busybox

    レプリカ

    ビジネス要件に基づいて値を指定します。

    1

    コンテナ起動パラメータ

    イメージ名

    イメージを選択 をクリックします。表示されるダイアログボックスで、イメージを選択し、OK をクリックします。

    この例では、busybox イメージが選択されています。検索 タブで、ドロップダウンリストから Docker イメージ を選択し、検索ボックスに busybox と入力して、検索をクリックします。

    コンテナ起動パラメータ

    なし。

    stdintty を選択します。

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

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

    2. ポッド ページで、busybox-{ハッシュ値} という名前のポッドを選択し、アクション列の ターミナル をクリックします。

      image.png

    3. ターミナルで、wget nginx コマンドを実行して nginx サービスにアクセスします。

      connection

      上記の出力は、busybox が nginx サービスにアクセスできることを示しています。

CLI の使用

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

    nginx という名前のアプリケーションを作成します。

    kubectl run nginx --image=nginx

    期待される出力:

    pod/nginx created

    アプリケーションのポッドが起動されているかどうかをクエリします。

    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 という名前のポッドを作成し、そのポッドを使用して nginx サービスにアクセスします。

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

    期待される出力:

    If you don't see a command prompt, try pressing enter. // コマンドプロンプトが表示されない場合は、Enter キーを押してみてください。
    / #
    / #

    nginx サービスを取得します。

    If you don't see a command prompt, try pressing enter. // コマンドプロンプトが表示されない場合は、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: 特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにする

ACS コンソールの使用

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

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

  3. ネットワークポリシー ページの上部で、ネットワークポリシーを作成する名前空間を選択します。この例では、default 名前空間が選択されています。ページの右上隅にある 作成 をクリックします。作成 パネルで、ネットワークポリシーを設定します。

    パラメータ

    説明

    パラメータ

    カスタムネットワークポリシー名を指定します。

    access-nginx

    ポッドセレクタ

    + ワークロードタイプとラベルを指定 をクリックし、ネットワークポリシーのポッドセレクタを指定します。

    説明

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

    この例では、次の設定が使用されます。

    • タイプ: デプロイメント

    • ワークロード: nginx

    • ラベル: app=nginx

    送信元

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

    • ルール:

      • podSelector: ネットワークポリシーと同じ名前空間にあるポッドを選択し、これらのポッドからのインバウンドトラフィックを許可します。

      • namespaceSelector: 指定された名前空間からポッドを選択し、これらのポッドからのインバウンドトラフィックを許可します。

      • ipBlock: 指定された CIDR ブロックを選択し、これらの CIDR ブロックからのインバウンドトラフィックを許可します。

    • ポート: TCP と UDP がサポートされています。

    説明
    • ルールを追加しない場合、ネットワークポリシーが適用されるポッドにはどのポッドからもアクセスできません。

    • クラスタで IPVLAN が有効になっている場合は、ipBlock セレクタではなく podSelector セレクタを使用して、許可されるポッドを制限する必要があります。

    この例では、イングレスルールは追加されていません。

    宛先

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

    • ルール:

      • podSelector: ネットワークポリシーと同じ名前空間にあるポッドを選択し、これらのポッドへのアウトバウンドトラフィックを許可します。

      • namespaceSelector: 指定された名前空間からポッドを選択し、これらのポッドへのアウトバウンドトラフィックを許可します。

      • ipBlock: 指定された CIDR ブロックを選択し、これらの CIDR ブロックへのアウトバウンドトラフィックを許可します。

    • ポート: TCP と UDP がサポートされています。

    説明

    IPVLAN がクラスターで有効になっている場合は、ipBlock セレクターではなく podSelector セレクターを使用して、許可されるポッドを制限する必要があります。

    この例では、送信規則は追加されていません。

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

  5. nginx Serviceへのアクセス性をテストするために、busyboxポッドのターミナルでwget nginxコマンドを実行します。詳細は、手順 5を参照してください。

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

    timeout

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

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

    2. イングレスルールを追加します。

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

      • ルール の右側にある + 追加 をクリックします。次の表に、ルールのパラメーターを示します。

        パラメーター

        セレクター

        podSelector

        タイプ

        デプロイメント

        ワークロード

        busybox

        ラベル

        app=busybox

      • ポート の右側にある + 追加 をクリックします。次の表に、ポートのパラメーターを示します。

        パラメーター

        プロトコル

        TCP

        ポート

        80

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

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

      イングレスルールがネットワークポリシーに追加されると、busybox ポッドは nginx サービスにアクセスできます。正常访问

CLI の使用

  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 サービスにアクセスするには、次のコマンドを実行します。Pod に指定されたラベルがないため、接続タイムアウトエラーが返されます。

    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

    出力は、接続の進捗状況が 100% であることを示しています。これは、Pod が想定どおりに nginx サービスにアクセスできることを示しています。

シナリオ 2: 特定の送信元 IP アドレスのみがインターネットに接続された SLB インスタンスを介してサービスにアクセスできるようにする

ACS コンソールを使用する

  1. nginx サービスのネットワークポリシーを作成します。詳細については、特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにするを参照してください。

  2. [サービス] ページで、ACK クラスタでネットワークポリシーを使用するで作成した nginx サービスを見つけ、外部エンドポイント列にある IP アドレス (47.xxx.xx.x) をコピーします。ブラウザで IP アドレスにアクセスします。en

    事前設定されたネットワークポリシーのため、nginx サービスにアクセスできません。

  3. 特定の IP アドレスがサービスにアクセスできるようにネットワークポリシーを変更します。

    1. ブラウザで myip.ipip.net にアクセスして、オンプレミスマシンの IP アドレスを取得します。

    2. [ネットワークポリシー] ページで、access-nginx ネットワークポリシーを見つけ、[アクション] 列の編集をクリックします。編集パネルでイングレスルールを追加します。

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

      • ルールの右側にある+ 追加をクリックします。オンプレミスマシンの IP アドレスをルールに追加します。

        パラメータ

        セレクタ

        ipBlock

        cidr

        <オンプレミスマシンの IP アドレス>/32

        例: 42.xx.xx.xx/32.

      • ルールの右側にある+ 追加をクリックします。サーバーロードバランサー (SLB) のヘルスチェックに使用される CIDR ブロックをルールに追加します。

        パラメータ

        セレクタ

        ipBlock

        cidr

        100.0.0.0/8

      • ポートの右側にある+ 追加をクリックします。次の表にポートパラメータを示します。

        パラメータ

        プロトコル

        TCP

        ポート

        80

      ipblock

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

    4. [サービス] ページで、nginx サービスを見つけ、[外部エンドポイント] 列の IP アドレス (47.xxx.xx.x:80) をクリックします。

      image.png

      ネットワークポリシーが変更されると、オンプレミスマシンからインターネットに接続された SLB インスタンスを介して nginx サービスにアクセスできるようになります。

CLI を使用する

  1. 次のコマンドを実行して、上記の nginx アプリケーションの SLB インスタンスを作成します。サービスの種類を 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 サービスには、access=true ラベルが付いているアプリケーションからのみアクセスできます。

    • オンプレミスマシンから SLB インスタンスの IP アドレスに接続する場合、Kubernetes クラスタの外部から nginx サービスにアクセスしています。これは、ネットワークポリシーを使用して、指定されたラベルを持つアプリケーションのみが nginx サービスにアクセスできるようにする場合とは異なります。

    解決策: 送信元 IP アドレスが nginx サービスにアクセスできるようにネットワークポリシーを変更します。

  3. 次のコマンドを実行して、オンプレミスマシンの IP アドレスをクエリします。

    curl myip.ipip.net

    予期される出力:

    IP address: 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.1/24      # これは例です。実際の IP アドレスを使用してください。

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

    kubectl apply -f policy.yaml 

    予期される出力:

    networkpolicy.networking.k8s.io/access-nginx unchanged
    説明
    • リクエストは異なる IP アドレスから来る可能性があります。したがって、マスク長が 24 の CIDR ブロックを指定します。

    • SLB がヘルスチェックに使用する IP アドレスは、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: ポッドが特定のアドレスにアクセスできるようにする

ACS コンソールを使用する

このセクションでは、www.aliyun.comregistry.aliyuncs.com を例として使用します。ネットワークポリシーにより、ポッドは registry.aliyuncs.com にのみアクセスできます。

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

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

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

    2. パラメーターの詳細については、特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにする を参照してください。次の表に設定例を示します。

      パラメーター

      説明

      パラメーター

      カスタムネットワークポリシー名を指定します。

      busybox-policy

      ポッドセレクター

      + ワークロードの種類とラベルを指定 をクリックし、ネットワークポリシーのポッドセレクターを指定します。

      説明

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

      この例では、次の設定が使用されます。

      • 種類: デプロイメント

      • ワークロード: busybox

      • ラベル: app=busybox

      宛先

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

      ipBlock を選択し、registry.aliyuncs.com が解決される IP アドレスを追加します。この例では、IP アドレスは 120.55.XXX.XXX/32 です。

      • セレクター: ipBlock

      • CIDR: 120.55.XXX.XXX/32

      image.png

      + 追加宛先 の右側にクリックします。 namespaceSelector を選択し、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

CLI を使用する

  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 ファイルに egress ルールが設定されています。アプリケーションが UDP ポート 53 にアクセスできるようにする必要があります。そうしないと、ドメイン名を解決できません。

  3. busybox-policy ファイルに基づいてネットワークポリシーを作成するには、次のコマンドを実行します。

    kubectl apply -f busybox-policy.yaml 

    予期される出力:

    networkpolicy.networking.k8s.io/busybox-policy created
  4. busybox アプリケーションを作成するには、次のコマンドを実行します。

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

    www.aliyun.com 以外の Web サイト (例: 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: 特定の名前空間でインターネットへのポッドアクセスを制御する

説明

このセクションの操作は、インターネットと通信するサービスに影響を与える可能性があります。空の名前空間を作成して、以下の操作を実行することをお勧めします。

ACS コンソールを使用する

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

    パラメーターの詳細については、特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにするを参照してください。次の表に設定例を示します。

    パラメーター

    パラメーター

    deny-public-net

    ポッドセレクター

    種類をすべてに設定します。

    送信元

    次のイングレスルールを追加します。

    • namespaceSelector をすべてに設定します。

    • ipBlock を 0.0.0.0/0 に設定します。

    来源

    宛先

    ポッドが内部ネットワークのみにアクセスできるようにするエグレスルールを追加します。

    • namespaceSelectorすべてに設定します。これにより、ポッドは内部ネットワーク内の他のすべてのポッドにアクセスできます。

    • 3 つのルールを作成し、ipBlock を次の CIDR ブロックに順番に設定します。

      • 10.0.0.0/8

      • 172.16.0.0/12

      • 192.168.0.0/16

      説明

      1 つのルールで ipBlock パラメーターに複数の CIDR ブロックを指定することはできません。

      公网 去向

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

  3. クラスター詳細ページの基本情報タブで、プライベート IP アドレスとポートを取得します。

    image.png

  4. busybox ポッドのターミナルで次のコマンドを実行して、ポッドがインターネットと内部ネットワークにアクセスできるかどうかをテストします。

    nc -vz -w 1 www.aliyunc.com 443
    nc -vz -w 1 10.xx.xx.xx:<IP port> # プライベート IP アドレスを指定します。

    出力は、ポッドが内部ネットワークにはアクセスできるが、インターネットにはアクセスできないことを示しています。Pod公网访问

CLI を使用する

  1. 次のコマンドを実行して、テスト用の名前空間を作成します。

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

    kubectl create ns test-np

    予想される出力:

    namespace/test-np created
  2. 次のコマンドを実行して、test-np 名前空間内のポッドが内部サービスのみにアクセスできるようにするデフォルトのネットワークポリシーを作成します。

    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. 次のコマンドを実行して、特定のラベルを持つポッドがインターネットにアクセスできるようにします。

    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. 次のコマンドを実行して、指定されたラベルのないポッドがインターネットにアクセスできないことを確認します。

    kubectl run -it --namespace test-np --rm --image busybox  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 名前空間内のポッドがインターネットにアクセスすることを許可していないためです。そのため、デフォルトのラベルを持つポッドはインターネットにアクセスできません。

  5. 次のコマンドを実行して、public-network=true ラベルを持つポッドがインターネットにアクセスできることを確認します。

    kubectl run -it --namespace test-np --labels public-network=true --rm --image busybox  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 ラベルを持つポッドがインターネットにアクセスすることを許可しているためです。busybox-internet ポッドにはこのラベルが付いているため、インターネットにアクセスできます。