Alibaba Cloud Container Compute Service (ACS) は、Kubernetes ネットワークポリシーを使用して、ポリシーベースのネットワーク制御を提供します。IP アドレスまたはポートレベルでネットワークトラフィックを制御するには、クラスター内の特定のアプリケーションにネットワークポリシーを適用できます。このトピックでは、ACS クラスターでネットワークポリシーを使用する方法について説明し、一般的なシナリオの例を示します。
範囲
この機能は、汎用およびコンピューティング最適化 CPU Pod でのみ利用可能です。
考慮事項
コンソールでネットワークポリシーを使用するには、クォータセンターコンソールで申請を提出する必要があります。
コマンドラインを使用してネットワークポリシーを管理する場合、申請を提出する必要はありません。
NetworkPolicy ルールでは、LabelSelector を使用して名前空間または Pod を選択できます。ただし、多数の NetworkPolicy を使用すると、レイテンシーが増加し、クラスターの管理とトラブルシューティングが複雑になる可能性があります。クラスター内に作成する NetworkPolicy は 40 未満にすることをお勧めします。
ステップ 1: ネットワークポリシーを有効にする
Poseidon コンポーネントをインストールします。
ACS コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、ターゲットクラスターを見つけてその ID をクリックします。左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。
[アドオン]ページで、[ネットワーク]タブをクリックします。[Poseidon] カードで、[インストール]をクリックします。
[Poseidon のインストール] パネルで、[NetworkPolicy の有効化] を選択し、[OK] をクリックします。

コンポーネントがインストールされると、カードの右上隅に[インストール済み]と表示されます。
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 アプリケーションを作成する
コンソール
[クラスター] ページで、管理するクラスターを見つけてその ID をクリックします。クラスター詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[デプロイメント] タブで、[イメージから作成] をクリックします。
[作成] ページで、nginx という名前のアプリケーションを作成し、サービスを使用して公開します。アプリケーションを構成した後、[作成] をクリックします。
この Nginx アプリケーションでは、次のパラメーターのみを構成し、その他はデフォルト値を使用します。詳細については、「デプロイメントの作成」をご参照ください。
ページ
構成項目
説明
値の例
基本情報
アプリケーション名
カスタム名を入力します。
nginx
レプリカ数
適切なオプションを選択します。
1
コンテナー構成
イメージ名
[イメージの選択] をクリックし、目的のイメージを選択してから [OK] をクリックします。
この例では、公式の Nginx イメージを使用します。[検索] タブで、[Artifact Center] を選択します。テキストボックスに nginx と入力してイメージを検索し、目的のイメージバージョンを選択します。
詳細構成
サービス
[サービス] の右側にある [作成] をクリックして、サービス構成を設定します。
名前: nginx
タイプ:
Server Load Balancer
パブリックネットワークアクセス
SLB の作成
ポートマッピング:
名前: nginx
サービスポート: 80
コンテナーポート: 80
プロトコル: TCP
[デプロイメント] ページに戻り、[イメージから作成] をクリックします。[作成] ページで、busybox という名前のクライアントアプリケーションを作成し、前のステップで作成した nginx サービスへのアクセスをテストします。
この busybox クライアントアプリケーションでは、次のパラメーターのみを構成し、その他はデフォルト値を使用します。詳細については、「イメージからデプロイメントを作成する」をご参照ください。
ページ
構成項目
説明
値の例
基本情報
アプリケーション名
カスタム名を入力します。
busybox
レプリカ数
必要に応じて値を設定します。
1
コンテナー構成
イメージ名
イメージアドレスを直接入力します。
この例では、イメージアドレス
registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2を使用しますコンテナー開始項目
なし
[stdin] と [tty] を選択します
busybox クライアントアプリケーションが nginx サービスにアクセスできることを確認します。
[デプロイメント] ページで、busybox アプリケーションの名前を見つけてクリックします。
[コンテナーグループ] タブで、busybox-{ハッシュ値} Pod を見つけ、右側の列にある [ターミナル] をクリックします。
busybox コマンドラインターミナルで、
wget nginxコマンドを実行して Nginx への接続をテストします。説明200 応答は、busybox が nginx サービスにアクセスできることを示します。
kubectl
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 12sbusybox という名前の 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: 特定のラベルを持つアプリケーションへのサービスアクセスを制限する
コンソール
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、 を選択します。
[ネットワークポリシー] ページの上部で、ネットワークポリシーの名前空間を選択します。この例では [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 を使用する必要があります。
この例では、宛先ルールは追加しません。
[次へ] をクリックし、次に [OK] をクリックします。
busybox コマンドラインターミナルで、
wget nginxコマンドを実行して nginx サービスへの接続をテストします。詳細については、「ステップ 2.e」をご参照ください。説明ネットワークポリシーが busybox からのアクセスを許可していないため、接続はタイムアウトします。

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

kubectl
次の 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"policy.yaml ファイルからネットワークポリシーを作成します。
kubectl apply -f policy.yaml期待される出力:
networkpolicy.networking.k8s.io/access-nginx createdアクセスラベルを定義せずに、nginx サービスへのアクセスをテストします。接続はタイムアウトして失敗します。
kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /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アクセスラベルを定義します。
kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /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' saved100% の接続進行状況は、リクエストが成功し、nginx サービスにアクセスできることを示します。
シナリオ 2: インターネット向けサービスにアクセスできるソース CIDR ブロックを制限する
コンソール
nginx サービスにネットワークポリシーを設定します。パラメーターの詳細については、「特定のラベルを持つアプリケーションへのサービスアクセスを制限する」をご参照ください。
サービスリストの [外部エンドポイント] 列で、ステップ 2: 他の Pod からアクセス可能なテスト Nginx アプリケーションを作成する で作成した nginx サービスのパブリック IP アドレス (47.xxx.xx.x) を見つけます。次に、ブラウザから IP アドレスにアクセスしてみてください。
説明ネットワークポリシーが nginx サービスに適用されているため、デフォルトではアクセスは失敗します。
許可された CIDR ブロックをネットワークポリシーに追加して、クライアントアクセスを許可します。
ローカルのパブリック 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 サービスにアクセスできます。
kubectl
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: LoadBalancernginx-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 サービスは、特定のラベル
access=trueを持つアプリケーションによってのみアクセスできます。SLB の IP アドレスへのアクセスは Kubernetes への外部アクセスであり、ネットワークポリシーを使用して特定のラベルを持つアプリケーションへのサービスアクセスを制限するのとは異なります。
解決策: ネットワークポリシーを変更して、許可されたソース CIDR ブロックを追加します。
ローカル IP アドレスを表示します。
curl myip.ipip.net期待される出力:
現在の 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/10アドレス範囲内にあります。このため、許可された CIDR ブロックに100.64.0.0/10を追加する必要があります。
Nginx サービスを作成します。
kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /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
[ルール] の右側にある [+追加] をクリックします。名前空間セレクターを使用して、すべての名前空間のルールを追加します。
[ポート] の右側にある [+追加] をクリックします。アプリケーションが 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 ルールを追加します。

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

kubectl
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 ファイルを作成します。
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 リクエストを許可する必要があります。
busybox-policy ファイルからネットワークポリシーを作成します。
kubectl apply -f busybox-policy.yaml期待される出力:
networkpolicy.networking.k8s.io/busybox-policy createdbusybox を作成します。
kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /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 outメッセージ can'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 ETA100% の結果は、接続が成功したことを示します。
シナリオ 4: 名前空間内の Pod のパブリックネットワークアクセス権限を制御する
この操作は、インターネットにアクセスしているオンラインサービスに影響を与える可能性があります。空の名前空間で次の操作を実行することをお勧めします。
コンソール
[ネットワークポリシー] ページの右上隅にある [作成] をクリックします。[作成] パネルで、ネットワークポリシー ルールを構成します。
パラメーターの説明と操作の詳細については、「特定のラベルを持つアプリケーションへのサービスアクセスを制限する」をご参照ください。以下は構成例です。
構成項目
値の例
名前
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 ルールに複数のネットワークセグメントを追加することはできません。

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

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

kubectl
制限機能を検証するためにテスト名前空間を作成します。
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次のコマンドを実行して、ネットワークポリシーを作成します:
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.aliyuncs.com/acs/busybox:v1.29.2 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 lossメッセージ 0 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.aliyuncs.com/acs/busybox:v1.29.2 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 msメッセージ 0% packet loss は、接続が成功したことを示します。
説明アクセスが成功したのは、allow-public-network-for-labels ネットワークポリシールールが public-network=true ラベルを持つ Pod のパブリックネットワークアクセスを許可するためです。したがって、このラベルを持つ busybox-internet Pod は、パブリックネットワークにアクセスできます。