ACK のネットワークポリシーは、ポリシーに基づくネットワーク制御を提供します。Terway コンテナネットワークを使用する場合、クラスター内の特定のアプリケーションに対して IP アドレスまたはポートレベルでネットワークトラフィックを制御するネットワークポリシーを利用できます。本トピックでは、ACK クラスターでのネットワークポリシーの使用方法および一般的な利用シーンについて説明します。
前提条件
ACK マネージドクラスター または Terway をネットワークプラグインとして使用する ACK 専用クラスター をご利用ください。詳細については、「ACK マネージドクラスターの作成」および「ACK 専用クラスターの作成(非推奨)」をご参照ください。
kubectl を使用したクラスターへの接続が完了している必要があります。
制限事項
コンソールからネットワークポリシー機能を利用するには、ホワイトリストに登録されたユーザーである必要があります。アクセス権限の申請は、クォータセンターコンソール コンソールで実施してください。
コマンドラインからネットワークポリシーを管理する場合は、ホワイトリスト登録は不要です。
NetworkPolicy ルールでは、ラベルセレクターを使用して名前空間または Pod を選択します。ただし、クラスター内に多数の NetworkPolicy が存在すると、ルールの適用に要する時間が増加し、クラスター管理およびトラブルシューティングが複雑化する可能性があります。クラスターあたりの NetworkPolicy の最大数は 100 件を推奨します。
本機能は、Terway CNI プラグインを使用し、共有 ENI(Elastic Network Interface)モードで構成されたノードにのみ適用されます。排他的な 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 より前のノードでは、本機能は動作しません。
これらの注意事項は、Terway コンポーネントを実行する通常の ECS ノードにのみ適用されます。仮想ノードでネットワークポリシーを有効にするには、「ネットワークポリシーを使用する」をご参照ください。
1.9.0 より前
コンポーネント | NetworkPolicy 実装 |
IPvlan または DataPath V2 が無効化された terway-eniip | iptables |
IPvlan または DataPath V2 が有効化された terway-eniip | eBPF |
ルールでクラスター内の Pod をマッチさせる必要がある場合は、
podSelectorまたはnamespaceSelectorを使用してください。eBPF 実装では、ipBlockはクラスター外のアドレスのみをマッチさせることができます。初期 Terway バージョンが 1.9.0 より前のクラスターを作成した場合、Terway を 1.9.0 以降にアップグレードしても、NetworkPolicy の実装は変更されません。
eBPF をベースとした NetworkPolicy 実装には、カーネルバージョン 4.19 以降が必要です。カーネルバージョンが 4.19 より前のノードでは、本機能は iptables モードにフォールバックします。これにより、NetworkPolicy ルールが正しく機能しない可能性があります。
これらの注記は、Terway コンポーネントを実行する通常の ECS ノードにのみ適用されます。仮想ノードでネットワークポリシーを有効にするには、「ネットワークポリシーを使用する」をご参照ください。
ネットワークポリシーの有効化
新規または既存のクラスターに対して、ネットワークポリシー機能を有効化できます。
新規クラスター
クラスターを作成する際に、NetworkPolicies のサポート オプションを選択して、ネットワークポリシー機能を有効化します。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。
既存のクラスター
まず、ACK コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
「クラスターリスト」ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、「アドオン管理」をクリックします。
ネットワーク タブをクリックし、terway-eniip コンポーネントを検索して、右下隅の 設定 をクリックします。NetworkPolicy を有効化 のチェックボックスをオンにし、OK をクリックします。
重要DataPath V2 が有効化されていないクラスターの場合、既存のノードでネットワークポリシー機能が有効化されるには、ノードの再起動が必要です。
ネットワークポリシーの例
サンプルアプリケーションの準備
他の Pod からアクセス可能な Nginx テストアプリケーションを作成する手順を以下に示します。
コンソール
まず、ACK コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで対象のクラスターの名前をクリックし、左側のナビゲーションウィンドウで を選択します。
[デプロイメント] ページで、[イメージから作成] をクリックします。[作成] ウィザードで、nginx という名前のアプリケーションを作成し、サービスとして公開します。アプリケーションを設定した後、[作成] をクリックします。
本例では、Nginx アプリケーションの以下のパラメーターのみを設定し、その他のパラメーターはすべてデフォルト設定を使用します。詳細については、「設定の詳細」をご参照ください。
パラメーター
説明
例
基本情報
名前
アプリケーションの名前。
nginx
レプリカ
Pod の数。
1
コンテナ
イメージ名
コンテナのイメージ。
nginx:latest
高度な設定
サービス
サービス の横にある 作成 をクリックして、サービスのパラメーターを設定します。
名前:nginx
タイプ:
ClusterIP
LoadBalancer
NodePort
ポートマッピング:
名前:nginx
サービスポート:80
コンテナポート:80
プロトコル:TCP
[デプロイメント] ページで、[イメージから作成] を再度クリックします。[作成] ウィザードで、nginx サービスへのネットワーク接続をテストするための、busybox という名前のクライアントアプリケーションを作成します。
本例では、busybox クライアントアプリケーションの以下のパラメーターのみを設定し、その他のパラメーターはすべてデフォルト設定を使用します。詳細については、「設定の詳細」をご参照ください。
パラメーター
説明
例
基本情報
名前
アプリケーションの名前。
busybox
レプリカ
Pod の数。
1
コンテナ
イメージ名
コンテナのイメージ。
busybox:latest
開始コマンド
このパラメーターは空欄のままにしてください。
stdin および tty を選択します。
busybox クライアントアプリケーションが nginx サービスにアクセスできることを確認します。
[デプロイメント] ページで、busybox アプリケーションを見つけ、その名前をクリックします。
Pod タブをクリックします。次に、busybox-{hash} Pod を見つけ、操作 列の ターミナル をクリックします。

busybox ターミナルで、
wget nginxコマンドを実行して、Nginx へのネットワーク接続をテストします。
出力結果より、busybox Pod が nginx サービスにアクセスできることを確認できます。
CLI
以下のコマンドを実行して、Nginx アプリケーションを作成し、nginx という名前のサービスでアプリケーションを公開します。
Nginx アプリケーションを作成します。
kubectl run nginx --image=nginx期待される出力:
pod/nginx createdPod が実行中であることを確認します。
kubectl get pod期待される出力:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 45snginx という名前のサービスを作成します。
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以下のコマンドを実行して、busybox という名前の Pod を作成し、その Pod から nginx という名前のサービスにアクセスします。
kubectl run busybox --rm -ti --image=busybox /bin/sh期待される出力:
If you don't see a command prompt, try pressing enter. / # / #プロンプトが表示されたら、以下のコマンドを実行して 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 コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、クラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 をクリックします。
[ネットワークポリシー] ページで、上部から名前空間を選択します。この例では、[デフォルト] を選択します。右上隅の [作成] をクリックし、[作成] パネルでネットワークポリシーを設定します。
パラメーター
説明
例
名前
ネットワークポリシーの名前。
access-nginx
Pod セレクター
+ ワークロードのラベルを追加して選択 をクリックし、ネットワークポリシーを適用する Pod を指定します。
説明Pod セレクターを設定しない場合、ネットワークポリシーは選択した名前空間内のすべての Pod に適用されます。
本例では、以下の設定を使用します:
タイプ を Deployment に設定
ワークロード を nginx に設定
ラベル を app=nginx に設定
Ingress
各ネットワークポリシーには、インバウンドルールの許可リストが含まれます。各ルールは、
fromおよびportsの両方のセクションに一致するトラフィックを許可します。ルール:
podSelector:ネットワークポリシーと同じ名前空間内の特定の Pod を選択し、それらをインバウンドトラフィックの送信元として許可します。
namespaceSelector:特定の名前空間を選択し、その名前空間内のすべての Pod をインバウンドトラフィックの送信元として許可します。
ipBlock:CIDR 表記で指定された特定の IP アドレス範囲を選択し、その IP アドレスをインバウンドトラフィックの送信元として許可します。
ポート:TCP および UDP プロトコルがサポートされます。
説明ルールを追加しない場合、選択した Pod へのインバウンドトラフィックは拒否されます。
クラスターで DataPath v2 または IPvlan が有効化されている場合、ipBlock を使用して Pod CIDR ブロックからのトラフィックを制限することはできません。代わりに podSelector を使用する必要があります。
本例では、インバウンドルールは追加しません。
アウトバウンド
各ネットワークポリシーには、アウトバウンドルールの許可リストが含まれます。各ルールは、
toおよびportsの両方のセクションに一致するトラフィックを許可します。ルール:
podSelector:ネットワークポリシーと同じ名前空間内の特定の Pod を選択し、それらをアウトバウンドトラフィックの送信先として許可します。
namespaceSelector:特定の名前空間を選択し、その名前空間内のすべての Pod をアウトバウンドトラフィックの送信先として許可します。
ipBlock:CIDR 表記で指定された特定の IP アドレス範囲を選択し、その IP アドレスをアウトバウンドトラフィックの送信先として許可します。
ポート:TCP および UDP プロトコルがサポートされます。
説明クラスターで DataPath v2 または IPvlan が有効化されている場合、ipBlock を使用して Pod CIDR ブロックからのトラフィックを制限することはできません。代わりに podSelector を使用する必要があります。
本例では、アウトバウンドルールは追加しません。
次へ をクリックし、その後 OK をクリックします。
busybox ターミナルで、
wget nginxコマンドを実行して、nginx サービスへのネットワーク接続をテストします。詳細については、「ステップ 5」をご参照ください。ネットワークポリシーが busybox Pod からのアクセスを許可しないため、接続がタイムアウトします。

busybox アプリケーションからのアクセスを許可するようにネットワークポリシーを変更します。
ネットワークポリシー一覧で access-nginx ネットワークポリシーを見つけ、操作 列の 編集 をクリックします。
インバウンドルールを追加します。
[Ingress] セクションの右側で、[+ 追加] をクリックし、次の手順を実行します。
ルール の右側にある + 追加 をクリックし、podSelector を使用したアクセスルールを追加します。以下の設定を使用します:
パラメーター
例
セレクター
podSelector
タイプ
Deployment
ワークロード
busybox
ラベル
app=busybox
ポート の右側にある + 追加 をクリックし、以下の設定を構成します:
パラメーター
例
プロトコル
TCP
ポート
80
次へ をクリックし、その後 OK をクリックします。
ネットワークポリシーを変更した後に、busybox と nginx 間のネットワーク接続をテストするために、
wget -O /dev/null nginxコマンドを実行します。busybox アプリケーション向けのルールをネットワークポリシーに追加した後、busybox Pod が nginx Pod にアクセスできるようになります。

CLI
以下の YAML テンプレートを使用し、
vim policy.yamlコマンドを実行して、policy.yaml という名前のファイルを作成します。vim policy.yamlkind: 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 サービスへのネットワーク接続をテストします。アクセスラベルが指定されていないため、リクエストがタイムアウトします。
kubectl run busybox --rm -ti --image=busybox /bin/shnginx サービスへのネットワーク接続をテストします:
wget nginx期待される出力:
Connecting to nginx (172.19.XX.XX:80) wget: can't connect to remote host (172.19.XX.XX): Connection timed out必要なアクセスラベルを持つ Pod を起動するため、以下のコマンドを実行します。
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shnginx サービスへのネットワーク接続をテストします:
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出力結果より、リクエストが成功し、nginx サービスにアクセスできることを確認できます。
ユースケース 2:送信元 CIDR ブロックによるアクセス制限
コンソール
nginx サービス向けのネットワークポリシーを構成します。構成の詳細については、「ユースケース 1:特定のラベルを持つアプリケーションへのサービスアクセス制限」をご参照ください。
サービス一覧で、外部エンドポイント 列(例:47.xxx.xx.x)から nginx サービスのパブリック IP アドレスを検索し、ブラウザでそのアドレスにアクセスしてみてください。

ネットワークポリシーがデフォルトですべてのインバウンドトラフィックを拒否するため、アクセスは失敗します。
ネットワークポリシーを変更し、特定のクライアント 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 サービスにアクセスできるようになります。
CLI
以下のコマンドを実行して、nginx アプリケーション向けの Alibaba Cloud Server Load Balancer (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: LoadBalancernginx-service.yaml ファイルからサービスを作成するため、以下のコマンドを実行します。
kubectl apply -f nginx-service.yaml期待される出力:
service/nginx-slb createdサービスがインターネットに公開されていることを確認します:
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 サービスは、特定のラベル
access=trueを持つアプリケーションからのみアクセス可能です。SLB の IP アドレスにアクセスすることは、Kubernetes に対する外部アクセスであり、特定のラベルを持つアプリケーションへのサービスアクセス制限というネットワークポリシーの用途とは異なります。
解決策:ネットワークポリシーを変更し、許可する送信元 CIDR ブロックを追加します。
ご自身のローカルパブリック IP アドレスを確認するため、以下のコマンドを実行します。
curl myip.ipip.net期待される出力:
Current IP: 10.0.x.x From: China Beijing Beijing # 出力は参考用です。実際の IP アドレスを使用してください。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.0/24 # ご自身のローカルネットワークのアドレス範囲。これは例です。実際の情報を使用してください。policy.yaml ファイルから変更を適用するため、以下のコマンドを実行します。
kubectl apply -f policy.yaml期待される出力:
networkpolicy.networking.k8s.io/access-nginx unchanged説明/24 アドレス範囲を使用してください。
SLB のヘルスチェックアドレスは
100.64.0.0/10アドレスブロックにあります。そのため、100.64.0.0/10を設定する必要があります。
クライアント Pod を起動し、それを使用して 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 ETA100% の進行状況は、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
ルール の右側にある + 追加 をクリックし、全名前空間を選択するルールを追加します。
ポート の右側にある + 追加 をクリックし、UDP ポート 53 のルールを追加します。
ルール:
セレクター:namespaceSelector
名前空間:すべて
ポート:
プロトコル:UDP
ポート:53
次へ をクリックし、その後 OK をクリックします。
BusyBox ターミナルで、以下のコマンドを実行して www.aliyun.com にアクセスします。
nc -vz -w 1 www.aliyun.com 443期待される出力:
nc: www.aliyun.com (60.191.xx.xx:443): Connection timed outregistry.aliyuncs.com にアクセスします。
nc -vz -w 1 registry.aliyuncs.com 443期待される出力:
registry.aliyuncs.com (120.55.xx.xx:443) open
パラメーターの詳細については、「ユースケース 1:特定のラベルを持つアプリケーションへのサービスアクセス制限」をご参照ください。以下の表に、例としての構成を示します。
パラメーター
説明
例
名前
ネットワークポリシーのカスタム名。
busybox-policy
Pod セレクター
+ ワークロードタイプとラベルを指定 をクリックして、ネットワークポリシーを適用する Pod を選択します。
説明Pod セレクターを指定しない場合、ネットワークポリシーは名前空間内のすべての Pod に適用されます。
本例では、以下の設定を使用します:
出口
アウトバウンド の右側にある + 追加 をクリックし、その後 ルール の右側にある + 追加 をクリックします。
以前に取得した registry.aliyuncs.com の IP アドレスを /32 形式(例:120.55.XXX.XXX/32)で ipBlock として設定するルールを追加します。

アウトバウンド の右側にある + 追加 をクリックして、別のルールを追加します。このルールは、UDP ポート 53 で全名前空間へのアウトバウンドトラフィックを許可し、アプリケーションが DNS 解決を実行できるようにします。

CLI
www.aliyun.com が解決する IP アドレスの一覧を取得するため、以下のコマンドを実行します。
dig +short registry.aliyuncs.com期待される出力:
120.55.XXX.XXXbusybox-policy ファイルを作成するため、以下のコマンドを実行します。
vim busybox-policy.yamlbusybox-policy ファイル のテンプレートは以下のとおりです:
# 以下の内容は YAML ファイルの内容です。 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: busybox-policy spec: podSelector: matchLabels: run: busybox egress: - to: - ipBlock: cidr: 120.55.XXX.XXX/32 - to: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: {} ports: - protocol: UDP port: 53説明busybox-policy ファイルには、アプリケーションのアウトバウンドアクセスを制限するアウトバウンドルールが含まれています。DNS 解決を正常に機能させるためには、UDP 要求を許可するようにこのルールを設定する必要があります。
busybox-policy ファイルからネットワークポリシーを作成するため、以下のコマンドを実行します。
kubectl apply -f busybox-policy.yaml期待される出力:
networkpolicy.networking.k8s.io/busybox-policy createdbusybox 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 registry.aliyuncs.com期待される出力:
Connecting to registry.aliyuncs.com (120.55.XXX.XXX:80) Connecting to registry.aliyuncs.com (120.55.XXX.XXX:443) wget: note: TLS certificate validation not implemented index.html 100% |***********************************************************| 462k 0:00:00 ETA100% の進行状況は、接続が成功したことを示します。
ユースケース 4:Pod のパブリックネットワークアクセス制御
本操作は、パブリックネットワークにアクセスするサービスに影響を与える可能性があります。空の名前空間で実行することを推奨します。
コンソール
「ネットワーク ポリシー」ページの右上隅で、[作成] をクリックします。[作成] パネルで、ネットワーク ポリシーを設定します。
パラメーターの詳細および手順については、「ネットワークポリシーを使用した特定のラベルを持つアプリケーションへのサービスアクセス制限」をご参照ください。以下の表に、例としての構成を示します。
パラメーター
値
名前
deny-public-net
Pod セレクター
タイプをすべてに設定します。
Ingress
以下の 2 つのルールを追加します:
namespaceSelector に対するすべて許可ルール。
ipBlock に対するすべて許可ルール。

アウトバウンド
プライベートネットワークへのアウトバウンドトラフィックのみを許可するルールを追加します:
namespaceSelector を すべて に設定し、Pod が内部ネットワーク内のすべての Pod にアクセスできるようにします。
ipBlock に対して 3 つのルールを作成し、以下の 3 つのプライベートネットワーク CIDR ブロックへのアウトバウンドトラフィックを許可します:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
説明単一の ipBlock ルールで複数の CIDR ブロックを追加することはできません。

次へ をクリックし、その後 OK をクリックします。
クラスターの詳細ページの [基本情報] タブで、内部 IP アドレスおよびポートを取得します。

busybox ターミナルで、以下のコマンドを実行して、Pod のパブリックネットワークおよびプライベートネットワークへのアクセスをテストします。
nc -vz -w 1 www.aliyun.com 443期待される出力:Pod はパブリックネットワークにアクセスできず、接続がタイムアウトします。
nc: www.aliyun.com (60.191.xx.xx:443): Connection timed outプライベートネットワークへのアクセスをテストします。
nc -vz -w 1 10.134.xx.xx:<Port> # 実際のプライベート IP アドレスに置き換えてください。期待される出力:Pod はプライベートネットワークアドレスにアクセスできます。
10.134.xx.xx:<Port> (10.134.xx.xx:<Port>) open
CLI
アクセス制限の検証のためにテスト用名前空間を作成するため、以下のコマンドを実行します。
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/8kubectl applyコマンドを実行して、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特定のラベルを持つ 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 # 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 が表示された場合、サービスへのアクセスが成功しています。
説明busybox-internet Pod はパブリックネットワークにアクセスできます。これは、allow-public-network-for-labels ネットワークポリシーに、public-network=true ラベルを持つ Pod に対するパブリックネットワークアクセスを許可するルールが含まれているためです。