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

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

最終更新日:Oct 31, 2024

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

前提条件

使用上の注意

  • ACKコンソールでネットワークポリシーを使用するには、クォータセンターコンソールページに移動してアプリケーションを送信します。

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

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

サポートされているアイテム

クラスターを作成する場合、ネットワークポリシーの実装はTerwayプラグインのバージョンによって異なります。

バージョン1.9.0以降

コンポーネント

ネットワークポリシーの実装

terway-eniip

eBPF

重要
  • ネットワークポリシーを使用してクラスター内のポッドを照合する場合は、podSelectorまたはnamespaceSelectorを使用できます。 ipBlockセレクターを使用して、クラスター外のアドレスを照合できます。

  • クラスターを作成するときにTerwayの初期バージョンが1.9.0より前の場合、Terwayが1.9.0以降に更新された後もネットワークポリシーの実装は変更されません。

  • 拡張バークレーパケットフィルタ (eBPF) ベースのネットワークポリシーに必要なカーネルバージョンは、4.19またはそれ以降である必要があります。 ノードのカーネルバージョンが4.19より前の場合、ネットワークポリシーは有効になりません。

  • 上記の説明は、Terwayを実行する通常のElastic Containerインスタンスにのみ適用されます。 仮想ノードでネットワークポリシーを有効にする方法の詳細については、「ネットワークポリシーの使用」をご参照ください。

1.9.0より前のバージョン

コンポーネント

ネットワークポリシーの実装

terway-eniipコンポーネントがインストールされ、DataPath V2またはIPVLANが無効になります。

iptables

terway-eniipコンポーネントがインストールされ、DataPath V2またはIPVLANが有効になります。

eBPF

重要
  • ネットワークポリシーを使用してクラスター内のポッドを照合する場合は、podSelectorまたはnamespaceSelectorを使用できます。 eBPFベースのネットワークポリシーでは、ipBlockセレクターを使用してクラスター外のアドレスを照合できます。

  • クラスターを作成するときにTerwayの初期バージョンが1.9.0より前の場合、Terwayが1.9.0以降に更新された後もネットワークポリシーの実装は変更されません。

  • eBPFベースのネットワークポリシーに必要なカーネルバージョンは、4.19以降である必要があります。 ノードのカーネルバージョンが4.19より前の場合、ネットワークポリシー機能はiptablesモードに戻ります。 ネットワークポリシーは期待どおりに有効にならない場合があります。

  • 上記の説明は、Terwayを実行する通常のElastic Containerインスタンスにのみ適用されます。 仮想ノードでネットワークポリシーを有効にする方法の詳細については、「ネットワークポリシーの使用」をご参照ください。

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

ネットワークポリシーは、クラスターの作成時またはクラスターの作成後に有効にできます。

作成されたクラスター

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

既存のクラスター

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

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

  3. [ネットワーキング] タブをクリックし、terway-eniipコンポーネントを見つけて、[設定] をクリックします。 表示されるダイアログボックスで、[ネットワークポリシーの有効化] を選択し、[OK] をクリックします。

    image

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

アプリケーションの準備

次の手順を実行して、他のポッドからのアクセスを許可するNGINXアプリケーションを作成します。

ACKコンソールの使用

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

  2. クラスターページで、管理するクラスターの名前をクリックし、ワークロード > デプロイメント左側のナビゲーションウィンドウに表示されます。

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

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

    パラメーター

    説明

    基本情報

    名前

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

    nginx

    レプリカ

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

    1

    Container

    イメージ名

    コンテナイメージの名前を指定します。

    nginx: 最新

    高度

    サービス

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

    名前: nginx

    データ型:

    • Server Load Balancer

    • パブリックアクセス

    • SLBインスタンスの作成

    ポートマッピング:

    • 名前: nginx

    • サービスポート: 80

    • コンテナポート: 80

    • プロトコル: TCP

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

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

    パラメーター

    説明

    基本情報

    名前

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

    busybox

    レプリカ

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

    1

    コンテナー開始パラメーター

    イメージ名

    コンテナイメージの名前を指定します。

    busybox: 最新

    コンテナー開始パラメーター

    なし。

    stdinttyを選択します。

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

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

    2. [ポッド] ページで、busybox-{hash value} という名前のポッドを選択し、[操作] 列の [ターミナル] をクリックします。

      image.png

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

      connection

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

CLIの使用

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

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

    kubectl run nginx -- image=nginx

    期待される出力:

    pod/nginx作成

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

    kubectl getポッド

    期待される出力:

    の名前準備ができているステータスの履歴書
    nginx 1/1ランニング0 45s 

    nginxという名前のサービスを作成します。

    kubectl公開ポッドnginx -- port=80

    期待される出力:

    service/nginx公開

    サービスを見る:

    kubectl getサービス

    期待される出力:

    名タイプCLUSTER-IP EXTERNAL-IPポート年齢
    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

    期待される出力:

    コマンドプロンプトが表示されない場合は、enterキーを押してみてください。
    / #
    / #

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

    コマンドプロンプトが表示されない場合は、enterキーを押してみてください。
    /#
    / # wget nginx# wget nginxを入力します。

    期待される出力:

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

シナリオ1: 特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにする

ACKコンソールの使用

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

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ネットワーク] > [ネットワークポリシー] を選択します。

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

    パラメーター

    説明

    項目

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

    access-nginx

    ポッドセレクター

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

    説明

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

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

    • タイプ: Deployment

    • ワークロード: nginx

    • ラベル: app=nginx

    ソース

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

    • ルール:

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

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

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

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

    説明
    • ルールを追加しない場合、ネットワークポリシーが適用されるポッドへのアクセスは許可されません。

    • クラスターに対してDataPath V2またはIPVLANが有効になっている場合は、ipBlockセレクターの代わりにpodSelectorセレクターを使用して、ネットワークポリシーが適用されるポッドへのアクセスを許可するポッドを制限する必要があります。

    この例では、入力ルールは追加されません。

    目的地

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

    • ルール:

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

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

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

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

    説明

    クラスターに対してDataPath V2またはIPVLANが有効になっている場合は、ipBlockセレクターの代わりにpodSelectorセレクターを使用して、ネットワークポリシーが適用されるポッドにアクセスできるポッドを制限する必要があります。

    この例では、出力ルールは追加されません。

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

  5. busyboxポッドの端末でwget nginxコマンドを実行して、nginxサービスのアクセシビリティをテストします。 詳細については、「ステップ5」をご参照ください。

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

    timeout

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

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

    2. ingressルールを追加します。

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

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

        パラメーター

        セレクター

        podSelector

        タイプ

        Deployment

        ワークロード

        busybox

        ラベル

        app=busybox

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

        パラメーター

        プロトコル

        TCP

        ポート

        80

    3. クリック次へをクリックし、OK.

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

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

CLIの使用

  1. vimを実行するpolicy.yamlという名前のファイルを作成するには、policy.yamlを次のYAMLテンプレートに置き換えます。

    vim policy.yaml

    次のコードブロックは、YAMLテンプレートの内容を示しています。

    種類: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    メタデータ:
      名前: access-nginx
    spec:
      podSelector:
        matchLabels:
          run: nginx
      ingress:
      - from:
        - podSelector:
            matchLabels:
              access: "true" 
  2. 次のコマンドを実行して、上記のpolicy.yamlファイルを使用してネットワークポリシーを作成します。

    kubectl apply -f policy.yaml

    期待される出力:

    networkpolicy.net working.k8s.io/access-nginx created
  3. 次のコマンドを実行して、nginxサービスにアクセスします。 指定されたラベルがポッドにないため、接続タイムアウトエラーが返されます。

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

    nginxサービスのアクセシビリティのテスト:

    wget nginx

    期待される出力:

    nginxへの接続 (172.19.XX.XX:80)
    wget: リモートホストに接続できません (172.19.XX.XX): 接続がタイムアウト 
  4. 次のコマンドを実行して、指定したラベルをポッドに追加します。

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

    nginxサービスのアクセシビリティのテスト:

    wget nginx

    期待される出力:

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

    出力は、接続の進行が100% であることを示す。 これは、ポッドが期待どおりにnginxサービスにアクセスできることを示します。

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

ACKコンソールの使用

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

  2. [サービス] ページで、nginxサービスを見つけ、そのIPアドレス (47.xxx. xx.x) を [外部エンドポイント] 列にコピーします。 ブラウザでIPアドレスにアクセスします。en

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

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

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

    2. [NetworkPolicies] ページで、access-nginxネットワークポリシーを見つけ、[操作] 列の [編集] をクリックします。 [編集] パネルにingressルールを追加します。

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

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

        パラメーター

        セレクター

        ipBlock

        cidr

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

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

      • [ルール] の右側にある [+ 追加] をクリックします。 Server Load Balancer (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
    種類: サービス
    メタデータ:
      ラベル:
        run: nginx
      名前: nginx-slb
    spec:
      externalTrafficPolicy: Local
      ポート:
      - port: 80
        protocol: TCP
        targetPort: 80
      セレクタ:
        run: nginx
      タイプ: LoadBalancer 

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

    kubectl apply -f nginx-service.yaml

    期待される出力:

    service/nginx-slbが作成されました

    nginxサービスを使用してアプリケーションが公開されているかどうかを確認します。

    kubectl get service nginx-slb

    期待される出力:

    名タイプCLUSTER-IP EXTERNAL-IPポート年齢
    nginx-slb LoadBalancer 172.19.xx.xxx 47.110.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 /
    47.110への接続。XX.XX:80... 失敗: 接続が拒否されました。
    説明

    次の理由で接続に失敗しました。

    • nginxサービスには、access=trueラベルを持つアプリケーションのみがアクセスできます。

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

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

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

    cur l myip.ipip.net

    期待される出力:

    IPアドレス: 10.0.x.x。 から: 中国北京北京# これは例です。 実際のIPアドレスを使用します。

  4. 次のコマンドを実行して、policy.yamlファイルを変更します。

    vim policy.yaml

    policy.yamlファイルの例:

    # 次の内容は、YAMLファイルの例です。 
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    メタデータ:
      名前: 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.net working.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

    期待される出力:

    47.110.XX.XXへの接続 (47.110.XX.XX:80)
    index.html 100% | *********************************************************** | 612 0:00:00 ETA 

    出力が100% を示す場合、これはnginxサービスにアクセスできることを示します。

シナリオ3: ポッドが特定のアドレスにアクセスできるようにする

ACKコンソールの使用

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

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

  2. ネットワークポリシーを作成し、busyboxアプリケーションへのアクセスのみを許可する出力ルールを追加します。registry.aliyuncs.com.

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

    2. パラメーターの詳細については、「特定のラベルを持つアプリケーションのみにサービスへのアクセスを許可する」をご参照ください。 次の表に、構成のサンプルを示します。

      パラメーター

      説明

      項目

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

      busybox-ポリシー

      ポッドセレクター

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

      説明

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

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

      • タイプ: Deployment

      • ワークロード: 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ルックアップを実行できるようになります。

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

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

      • ルール:

        • セレクター: namespaceSelector

        • 名前空間: すべて

      • ポート:

        • プロトコル: UDP

        • ポート: 53

      image

    3. クリック次へをクリックし、OK.

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

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

      nc-

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

      ネットワークポリシーが追加された後、busyboxアプリケーションは1つのy registry.aliyuncs.comにアクセスできます。dns

CLIの使用

  1. 次のコマンドを実行して、www.aliyun.comが解決されるIPアドレスを照会します。

    dig + shor t 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
    メタデータ:
      名前: 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: {}
        ポート:
        - protocol: UDP
          ポート: 53 
    説明

    エグレスルールは、アプリケーションからのアウトバウンドアクセスを制限するためにbusybox-policyファイルで構成されています。 アプリケーションがUDPポート53にアクセスできるようにする必要があります。 それ以外の場合、ドメインネームシステム (DNS) 解決は機能しません。

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

    kubectl apply -f busybox-policy.yaml

    期待される出力:

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

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

    アクセスwww.aliyun.com以外のWebサイト (www.taobao.comなど):

    wge t www.taobao.com

    期待される出力:

    接続t o www.taobao.com (64.13.XX.XX:80)
    wget: リモートホストに接続できません (64.13.XX.XX): 接続がタイムアウト 

    出力には、[リモートホストに接続できません] メッセージが表示されます。 これは、アプリケーションがドメイン名にアクセスできなかったことを示します。

  5. 次のコマンドを実行してwww.aliyun.comにアクセスします。

    wge t www.aliyun.com

    期待される出力:

    接続t o www.aliyun.com (140.205.XX.XX:80)
    接続t o www.aliyun.com (140.205.XX.XX:443)
    wget: note: TLS証明書の検証が実装されていません
    index.html 100% | *********************************************************** | 462k 0:00:00 ETA 

    出力は、接続の進行が100% であることを示す。 これは、アプリケーションが期待どおりにドメイン名にアクセスできることを示します。

シナリオ4: 特定の名前空間でのインターネットへのポッドアクセスの制御

説明

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

ACKコンソールの使用

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

    パラメーターの詳細については、「特定のラベルを持つアプリケーションのみにサービスへのアクセスを許可する」をご参照ください。 次の表に、構成のサンプルを示します。

    パラメーター

    項目

    deny-public-net

    ポッドセレクター

    TypeをAllに設定します。

    ソース

    次のingressルールを追加します。

    • namespaceSelectorをAllに設定します。

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

    来源

    目的地

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

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

    • 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> # Specify the private IP address.

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

CLIの使用

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

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

    kubectl create ns test-np

    期待される出力:

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

    vim default-deny.yaml

    default-deny.yamlファイルの例:

    # 次のコンテンツはサンプルYAMLファイルです。 
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    メタデータ:
      名前空間: test-np
      名前: 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.net working.k8s.io/deny-public-net created

    ネットワークポリシーを表示する:

    kubectl get networkpolicy -n test-np

    期待される出力:

    名POD-セレクター年齢
    deny-public-net <none> 1m 
  3. 次のコマンドを実行して、特定のラベルを持つポッドがインターネットにアクセスできるようにします。

    vim allow-specify-label.yaml

    この例では、public-network=trueラベルが使用されます。

    # 次のコンテンツはサンプルYAMLファイルです。 
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    メタデータ:
      name: allow-public-network-for-labels
      名前空間: 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.net working.k8s.io/allow-public-network-for-labels created

    ネットワークポリシーを表示する:

    kubectl get networkpolicy -n test-np

    期待される出力:

    名POD-セレクター年齢
    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
    ピンg aliyun.com

    期待される出力:

    PIN G aliyun.com (106.11.2xx.xxx): 56データバイト
    ^ C
    --- aliyun.com ping統計 ---
    9パケット送信、0パケット受信、100% パケット損失 

    出力は、0パケット受信を示す。 これは、ポッドがインターネットにアクセスできなかったことを示します。

    説明

    deny-public-netネットワークポリシーではtest-np名前空間のポッドがインターネットにアクセスできないため、ポッドはインターネットにアクセスできませんでした。 したがって、デフォルトラベルのポッドはインターネットにアクセスできません。

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

    kubectl run -it -- namespace test-np -- labels public-network=true -- rm -- image busybox busybox-internet
    ピンg aliyun.com

    期待される出力:

    PIN G aliyun.com (106.11.1xx.xx): 56データバイト
    106.11.1xx.xxから64バイト: seq=0 ttl=47 time=4.235 ms
    106.11.1xx.xxから64バイト: seq=1 ttl=47 time=4.200 ms
    106.11.1xx.xxから64バイト: seq=2 ttl=47 time=4.182 ms
    ^ C
    --- aliyun.com ping統計 ---
    3パケット送信、3パケット受信、0% パケット損失
    ラウンドトリップmin/avg/max = 4.182/4.205/4.235 ms 

    出力は0% パケット損失を示す。 これは、ポッドがインターネットにアクセスできることを示します。

    説明

    allow-public-network-for-labelsネットワークポリシーでは、public-network=trueラベルを持つポッドがインターネットにアクセスできるため、ポッドはインターネットにアクセスできます。 busybox-internetのポッドにはこのラベルが付いているため、インターネットにアクセスできます。