Container Service for Kubernetes (ACK) ネットワークポリシーは、ポリシーベースのネットワーク制御を提供します。Terway コンテナーネットワークプラグインを使用する場合、ネットワークポリシーを使用して、クラスター内の特定のアプリケーションの IP アドレスまたはポートレベルでネットワークトラフィックを制御できます。このトピックでは、ACK クラスターでネットワークポリシーを使用する方法と、一般的なシナリオの例について説明します。
前提条件
Terway をネットワークプラグインとして使用する ACK マネージドクラスターまたは ACK 専用クラスターを作成済みであること。詳細については、「ACK マネージドクラスターの作成」および「ACK 専用クラスターの作成 (廃止)」をご参照ください。
使用上の注意
コンソールでネットワークポリシーを使用するには、クォータセンターコンソールで申請を送信する必要があります。
コマンドラインを使用してネットワークポリシーを管理する場合、申請を送信する必要はありません。
NetworkPolicy ルールは LabelSelectors を使用して名前空間または Pod を選択します。ただし、クラスター内に多数の NetworkPolicy があると、ルールが有効になるまでの時間が長くなり、クラスターの管理とトラブルシューティングが複雑になる可能性があります。クラスター内に作成する NetworkPolicy は 100 未満にすることをお勧めします。
この機能は、Terway CNI プラグインを使用し、共有 ENI モードで構成されているノードにのみ適用されます。排他的な ENI モードで構成されたノードプール内のノードではサポートされていません。
このドキュメントでは、さまざまなコンピューティングシナリオの特定の設定と制限については説明しません。ハイブリッドクラウドやエラスティックインスタンスなどの特定のコンピューティング環境でこの機能を使用するには、対応するコンピューティングプロダクトのドキュメントをご参照ください。
ACK は、標準の Kubernetes ネットワークポリシーのみをサポートします。Calico や Cilium などのサードパーティのカスタムネットワークポリシーはサポートしていません。
サポートされる項目
クラスターを作成するとき、NetworkPolicy の実装は Terway の初期バージョンに依存します。
1.9.0 以降
コンポーネント | NetworkPolicy の実装 |
terway-eniip | eBPF |
クラスター内の Pod を照合するには、
podSelectorまたはnamespaceSelectorを使用します。ipBlockセレクターは、クラスター外のアドレスのみを照合できます。Terway バージョン 1.9.0 より前のクラスターを作成した場合、Terway を 1.9.0 以降にアップグレードしても、NetworkPolicy の実装は変更されません。
eBPF ベースの NetworkPolicy の実装には、カーネルバージョン 4.19 以降が必要です。ノードのカーネルバージョンが 4.19 より前の場合、NetworkPolicy 機能は動作しません。
上記は、Terway コンポーネントを実行する通常の ECS ノードにのみ適用されます。仮想ノードで NetworkPolicy を有効にするには、「ネットワークポリシーを使用する」をご参照ください。
1.9.0 より前
コンポーネント | NetworkPolicy の実装 |
terway-eniip および IPvlan または DataPath V2 が有効になっていない | iptables |
terway-eniip および IPvlan または DataPath V2 が有効になっている | eBPF |
クラスター内の Pod を照合するには、
podSelectorまたはnamespaceSelectorを使用します。eBPF の実装では、ipBlockセレクターはクラスター外のアドレスのみを照合できます。初期 Terway バージョンが 1.9.0 より前のクラスターを作成した場合、Terway を 1.9.0 以降にアップグレードしても、NetworkPolicy の実装は変更されません。
eBPF ベースの NetworkPolicy の実装には、カーネルバージョン 4.19 以降が必要です。ノードのカーネルバージョンが 4.19 より前の場合、NetworkPolicy 機能は iptables モードにフォールバックします。NetworkPolicy ルールが期待どおりに機能しない場合があることに注意してください。
上記は、Terway コンポーネントを実行する通常の ECS ノードにのみ適用されます。仮想ノードで NetworkPolicy を有効にするには、「ネットワークポリシーを使用する」をご参照ください。
ネットワークポリシーの有効化
クラスターの作成時または既存のクラスターに対してネットワークポリシーを有効にできます。
新しいクラスター
クラスターを作成するときに、[Support For NetworkPolicy] を選択してネットワークポリシー機能を有効にします。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。
作成済みのクラスター
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。
[ネットワーク] タブで、terway-eniip コンポーネントを見つけ、右下隅にある [設定] をクリックします。[Enable NetworkPolicy] を選択し、[OK] をクリックします。
重要DataPath V2 が有効になっていないクラスターの場合、NetworkPolicy 機能を有効にしても、既存のノードではすぐには有効になりません。変更を有効にするには、ノードを再起動する必要があります。
ネットワークポリシーの使用例
サンプルアプリケーションの準備
次の手順に従って、他の Pod がアクセスできる Nginx テストアプリケーションを作成します。
コンソールの使用
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスターの名前をクリックし、左側のナビゲーションウィンドウで を選択します。
[ステートレス] ページで、[イメージから作成] をクリックします。[作成] ウィザードで、nginx という名前のアプリケーションを作成し、Service を使用して公開します。アプリケーションを設定した後、[作成] をクリックします。
この例では、Nginx アプリケーションの次の項目のみを設定し、他のパラメーターはデフォルト設定のままにします。設定の詳細については、「設定項目」をご参照ください。
設定項目
説明
設定例
基本情報
アプリケーション名
カスタム名。
nginx
レプリカ数
必要に応じて選択します。
1
コンテナー設定
イメージ名
コンテナーの起動に使用されるイメージの名前。
nginx:latest
サービス設定
サービス
[サービス] の右側にある [作成] をクリックして、サービス設定項目を設定します。
名前: nginx
サービスタイプ:
仮想クラスター IP (ClusterIP)
Server Load Balancer (LoadBalancer)
ノードポート (NodePort)
ポートマッピング:
名前: nginx
サービスポート: 80
コンテナーポート: 80
プロトコル: TCP
[ステートレス] ページで、[イメージから作成] をクリックします。表示される [作成] ウィザードで、busybox という名前のクライアントアプリケーションを作成し、前のステップで作成した nginx Service へのアクセスをテストします。
この例では、busybox クライアントアプリケーションの次の項目のみを設定し、他のパラメーターはデフォルト設定のままにします。設定の詳細については、「設定項目」をご参照ください。
設定項目
説明
設定例
基本情報
アプリケーション名
カスタム名。
busybox
レプリカ数
必要に応じて値を設定します。
1
コンテナー開始項目
イメージ名
コンテナーの起動に使用されるイメージの名前。
busybox:latest
コンテナー開始項目
なし
[stdin] と [tty] を選択します
busybox クライアントアプリケーションが Nginx Service にアクセスできることを確認します。
[ステートレス] ページで、busybox アプリケーション名をクリックします。
[Pod] タブで、busybox-{hash value} Pod を見つけ、[アクション] 列の [ターミナル] をクリックします。

busybox コマンドラインターミナルで、
wget nginxコマンドを実行して Nginx へのアクセスをテストします。
出力は、busybox が Nginx Service にアクセスできることを示しています。
コマンドラインの使用
次のコマンドを実行して Nginx アプリケーションを作成し、nginx という名前の Service を使用して公開します。
Nginx アプリケーションを作成します:
kubectl run nginx --image=nginx期待される出力:
pod/nginx createdPod が起動したかどうかを確認します:
kubectl get pod期待される出力:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 45snginx という名前の Service を作成します:
kubectl expose pod nginx --port=80期待される出力:
service/nginx exposedService を表示します:
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次のコマンドを実行して busybox という名前の Pod を作成し、nginx という名前の Service にアクセスします。
kubectl run busybox --rm -ti --image=busybox /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
シナリオ 1: ネットワークポリシーを使用して、特定のラベルを持つアプリケーションへのサービスアクセスを制限する
コンソールの使用
コンソールでネットワークポリシーを使用するには、ホワイトリストに追加するための申請を送信する必要があります。詳細については、「使用上の注意」をご参照ください。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、 を選択します。
[ネットワークポリシー] ページで、ページの上部から名前空間を選択します。この例では、[default] 名前空間を使用します。右上隅で、[作成] をクリックします。[作成] パネルで、ポリシーを設定します。
設定項目
説明
設定例
名前
ネットワークポリシーのカスタム名。
access-nginx
Pod セレクター
[+ ワークロードを選択してラベルを追加] をクリックして、ネットワークポリシーが適用される Pod を設定します。
説明Pod セレクターが空の場合、ネットワークポリシーは名前空間内のすべての Pod に適用されます。
この例では、次の設定を使用します:
[タイプ] を [ステートレス] に設定します
[ワークロード] を nginx に設定します
[ラベル] を app=nginx に設定します
ソース
各ネットワークポリシーには、ソース (イングレス) ルールのホワイトリストを含めることができます。各ルールは、ソースルールと指定されたポートセクションの両方に一致するトラフィックを許可します。
ルール:
podSelector: このセレクターは、ネットワークポリシーと同じ名前空間内の特定の Pod を選択し、インバウンドトラフィックのソースとして許可します。
namespaceSelector: このセレクターは、特定の名前空間を選択し、その中のすべての Pod をインバウンドトラフィックのソースとして使用します。
ipBlock: このセレクターは、特定の IP CIDR 範囲を選択して、インバウンドトラフィックのソースとして使用します。
ポート: TCP および UDP プロトコルをサポートします。
説明ルールを追加しない場合、選択した Pod へのアクセスはどの Pod にも許可されません。
クラスターで DataPathv2 または IPvlan が有効になっている場合、ipBlock を使用して Pod CIDR ブロックからのトラフィックを制限することはできません。podSelector を使用する必要があります。
この例では、ソースルールは追加しません。
宛先
各ネットワークポリシーには、エグレスルールのホワイトリストを含めることができます。各ルールは、宛先ルールと指定されたポートセクションに一致するトラフィックを許可します。
ルール:
podSelector: このセレクターは、ネットワークポリシーと同じ名前空間内の特定の Pod を選択し、アウトバウンドトラフィックの宛先として許可します。
namespaceSelector: このセレクターは、特定の名前空間を選択し、その中のすべての Pod をアウトバウンドトラフィックの宛先として使用します。
ipBlock: このセレクターは、特定の IP CIDR 範囲をアウトバウンドトラフィックの宛先として選択します。
ポート: TCP および UDP プロトコルをサポートします。
説明クラスターで DataPathv2 または IPvlan が有効になっている場合、ipBlock を使用して Pod CIDR ブロックからのトラフィックを制限することはできません。podSelector を使用する必要があります。
この例では、宛先ルールは追加しません。
[次へ] をクリックし、次に [OK] をクリックします。
busybox コマンドラインターミナルで、
wget nginxコマンドを実行して nginx Service へのアクセスをテストします。詳細については、「ステップ 5」をご参照ください。ネットワークポリシーが busybox からのアクセスを許可していないため、アクセスはタイムアウトします。

busybox アプリケーションからのアクセスを許可するようにネットワークポリシーを変更します。
ネットワークポリシーリストで access-nginx ネットワークポリシーを見つけ、[アクション] 列の [編集] をクリックします。
ソースルールを追加します。
[ソース] の右側にある [+ 追加] をクリックし、次の手順を実行します:
[ルール] の右側にある [+ 追加] をクリックします。podSelector のアクセスルールを次のように設定します:
設定項目
設定例
セレクター
podSelector
タイプ
ステートレス
ワークロード
busybox
ラベル
app=busybox
[ポート] の右側にある [+ 追加] をクリックし、ポートを次のように設定します:
設定項目
設定例
プロトコル
TCP
ポート
80
[次へ] をクリックし、次に [OK] をクリックします。
ネットワークポリシーを変更した後、
wget -O /dev/null nginxコマンドを実行して busybox から nginx へのアクセスをテストします。busybox アプリケーションのルールがネットワークポリシーに追加された後、busybox は nginx にアクセスできます。

コマンドラインの使用
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"次のコマンドを実行して、policy.yaml ファイルからネットワークポリシーを作成します。
kubectl apply -f policy.yaml期待される出力:
networkpolicy.networking.k8s.io/access-nginx created次のコマンドを実行して、nginx Service へのアクセスをテストします。アクセスラベルが定義されていないため、リクエストはタイムアウトします。
kubectl run busybox --rm -ti --image=busybox /bin/shnginx Service へのアクセスをテストします:
wget nginx期待される出力:
Connecting to nginx (172.19.XX.XX:80) wget: can't connect to remote host (172.19.XX.XX): Connection timed out次のコマンドを実行して、アクセスラベルを定義します。
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shNginx Service へのアクセスをテストします:
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 ブロックを制限する
コンソールの使用
Nginx Service のネットワークポリシーを作成します。設定の詳細については、「ネットワークポリシーを使用して、特定のラベルを持つアプリケーションへのサービスアクセスを制限する」をご参照ください。
サービスリストの [外部エンドポイント] 列で、Nginx サンプルアプリケーション Service のパブリックアクセスアドレス (47.xxx.xx.x) を見つけ、ブラウザでアクセスします。

ネットワークポリシーがデフォルトでアクセスを拒否するため、アクセスは失敗します。
クライアントアクセスを許可するために、許可された CIDR ブロックをネットワークポリシーに追加します。
ブラウザで myip.ipip.net にアクセスして、お使いのマシンのパブリック IP アドレスを取得します。
ネットワークポリシーリストで、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

[次へ] をクリックし、次に [OK] をクリックします。
サービスリストの [外部エンドポイント] 列で、外部エンドポイントの IP アドレス (47.xxx.xx.x:80) をクリックして Nginx サービスにアクセスします。

ネットワークポリシーが変更された後、クライアントはインターネット向け SLB を介して Nginx サービスにアクセスできます。
コマンドラインの使用
次のコマンドを実行して、nginx アプリケーション用の Alibaba Cloud SLB インスタンスを作成します。nginx サービスをインターネットに公開するために
type=LoadBalancerを指定します。vim nginx-service.yamlnginx-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次のコマンドを実行して、新しく作成された 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 Service には、特定のラベル
access=trueを持つアプリケーションのみがアクセスできます。SLB インスタンスの IP アドレスへのアクセスは、Kubernetes への外部アクセスと見なされます。これは、特定のラベルを持つアプリケーションへのサービスアクセスを制限するシナリオとは異なります。
解決策: 許可されたソース CIDR ブロックを追加するようにネットワークポリシーを変更します。
次のコマンドを実行して、ローカル IP アドレスを表示します。
curl myip.ipip.net期待される出力:
Current IP: 10.0.x.x From: China Beijing Beijing # これは一例です。実際のデバイス情報を使用してください。次のコマンドを実行して、policy.yaml ファイルを変更します。
vim policy.yamlpolicy.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/10CIDR ブロックにあります。したがって、許可リストに100.64.0.0/10を追加する必要があります。
次のコマンドを実行して、Nginx サービスにアクセスします。
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shnginx サービスにアクセスします:
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.com と registry.aliyuncs.com を例として、Pod が registry.aliyuncs.com にのみアクセスできるようにするネットワークポリシーを設定する方法を示します。
`ping` コマンドを使用して、registry.aliyuncs.com が解決する IP アドレス (120.55.XXX.XXX) をクエリします。
busybox アプリケーションが registry.aliyuncs.com にのみアクセスできるように制限するネットワークポリシールールを作成します。
[ネットワークポリシー] ページの右上隅にある [作成] をクリックし、[作成] パネルでネットワークポリシールールを設定します。
タイプをステートレスに設定
ワークロードを busybox に設定
ラベルを app=busybox に設定
セレクター: ipBlock
cidr: 120.55.XXX.XXX/32
[ルール] の右側にある [+ 追加] をクリックします。すべての名前空間を選択するルールを追加します。
[ポート] の右側にある [+ 追加] をクリックします。アプリケーションが DNS 解決を実行できるように、UDP 53 のルールを追加します。
ルール:
セレクター: namespaceSelector
名前空間: すべて
ポート:
プロトコル: UDP
ポート: 53
[次へ] をクリックし、次に [OK] をクリックします。
busybox ターミナルで、次のコマンドを実行して www.aliyun.com と registry.aliyuncs.com にアクセスします。
nc -vz -w 1 www.aliyunc.com 443nc -vz -w 1 registry.aliyuncs.com 443出力は、ネットワークポリシーが追加された後、busybox アプリケーションは registry.aliyuncs.com にのみアクセスでき、他のアドレスにはアクセスできないことを示しています。

パラメーターの詳細については、「ネットワークポリシーを使用して、特定のラベルを持つアプリケーションへのサービスアクセスを制限する」をご参照ください。以下は設定例です。
設定項目
説明
設定例
名前
ネットワークポリシーのカスタム名。
busybox-policy
Pod セレクター
[+ ワークロードを選択してラベルを追加] をクリックして、ネットワークポリシーが適用される Pod を設定します。
説明Pod セレクターが空の場合、ネットワークポリシーは名前空間内のすべての Pod に適用されます。
この例では、次の設定を使用します:
宛先
[宛先] の右側にある [+ 追加] をクリックし、次に [ルール] の右側にある [+ 追加] をクリックします。
以前に取得した registry.aliyuncs.com の解決済み IP アドレス (120.55.XXX.XXX)/32 を持つ ipBlock のルールを追加します。

[宛先] の右側にある [+ 追加] をクリックします。アプリケーションが DNS 解決を実行できるように、すべての名前空間に対して UDP ポート 53 へのアクセスを許可するルールを追加します。

コマンドラインの使用
次のコマンドを実行して、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.3busybox-policy.yaml という名前のファイルを作成します。
vim busybox-policy.yamlbusybox-policy.yaml ファイルには次のテンプレートを使用します:
# 以下は 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.yaml ファイルでは、アプリケーションのアウトバウンドアクセスを制限するために egress ルールが設定されています。UDP リクエストを許可するようにルールを設定する必要があります。そうしないと、DNS 解決が失敗します。
次のコマンドを実行して、busybox-policy.yaml ファイルからネットワークポリシーを作成します。
kubectl apply -f busybox-policy.yaml期待される出力:
networkpolicy.networking.k8s.io/busybox-policy created次のコマンドを実行して busybox Pod を作成し、アクセスをテストします。
kubectl run busybox --rm -ti --image=busybox /bin/shwww.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 outcan't connect to remote host メッセージは、アクセスが失敗したことを示します。
次のコマンドを実行して 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 のパブリックネットワークアクセスを制御する
この操作は、パブリックネットワークにアクセスしているオンラインサービスに影響を与える可能性があります。空の名前空間で次の操作を実行することをお勧めします。
コンソールの使用
[ネットワークポリシー] ページの右上隅にある [作成] をクリックし、[作成] パネルでネットワークポリシールールを設定します。
パラメーターと操作の詳細については、「ネットワークポリシーを使用して、特定のラベルを持つアプリケーションへのサービスアクセスを制限する」をご参照ください。以下は設定例です。
設定項目
設定例
名前
deny-public-net
Pod セレクター
タイプを [すべて] に設定します。
ソース
次の 2 つのルールを追加します:
namespaceSelector に [すべて] を許可するルールを設定します。
ipBlock に [すべて] を許可するルールを設定します。

宛先
内部ネットワークへのアクセスのみを許可するルールを追加します:
Pod が内部ネットワーク上のすべての Pod にアクセスできるように、[namespaceSelector] に [すべて] を許可するルールを設定します。
次の 3 つの内部ネットワーク CIDR ブロックに対して、[ipBlock] に 3 つのルールを設定します:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
説明単一の ipBlock ルールに複数の CIDR ブロックを追加することはできません。

[次へ] をクリックし、次に [OK] をクリックします。
クラスター詳細ページの [基本情報] タブで、API サーバーの内部 IP アドレスとポートを取得します。

busybox ターミナルで、次のコマンドを実行して、Pod のパブリックおよび内部ネットワークアクセスをテストします。
nc -vz -w 1 www.aliyunc.com 443nc -vz -w 1 10.xx.xx.xx:<IP port> # これは内部 IP アドレスです。出力は、Pod が内部アドレスにのみアクセスでき、パブリックアドレスにはアクセスできないことを示しています。

コマンドラインの使用
次のコマンドを実行して、テスト用の名前空間を作成します。
test-np という名前の名前空間を作成します。
kubectl create ns test-np期待される出力:
namespace/test-np created次のコマンドを実行して、プライベートネットワークへのアウトバウンドアクセスのみを許可する、名前空間のデフォルトのネットワークポリシーを作成します。
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/8default-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次のコマンドを実行して、特定のラベルを持つ 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 # Pod が 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次のコマンドを実行して、特別なラベルのない Pod がパブリックネットワークにアクセスできないことを確認します。
kubectl run -it --namespace test-np --rm --image registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 busybox-intranetping 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 loss0 packets received メッセージは、アクセスが失敗したことを示します。
説明アクセスが失敗したのは、deny-public-net ネットワークポリシーがデフォルトで test-np 名前空間の Pod のパブリックネットワークアクセスを制限しているためです。したがって、この名前空間でデフォルトのラベルで起動された Pod は、パブリックネットワークにアクセスできません。
次のコマンドを実行して、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-internetping 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 ms0% packet loss メッセージは、サービスに正常にアクセスできたことを示します。
説明アクセスが成功したのは、allow-public-network-for-labels ネットワークポリシーが public-network=true ラベルを持つ Pod のパブリックネットワークアクセスを許可しているためです。したがって、このラベルを持つ busybox-internet Pod は、パブリックネットワークにアクセスできます。