Alibaba Cloud Container Compute Service (ACS) は、Kubernetes ネットワークポリシーに基づくポリシーベースのアクセス制御を提供します。IP アドレスまたはポートに基づいて特定のアプリケーションへのネットワークトラフィックを制御する場合、ネットワークポリシーを設定できます。このトピックでは、ACS クラスタでのネットワークポリシーの使用方法と、ネットワークポリシーの一般的な使用シナリオについて説明します。
前提条件
kubectl クライアントがクラスタに接続されていること。詳細については、クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する を参照してください。
使用上の注意
ACS コンソールでネットワークポリシーを使用するには、クォータセンターコンソール ページにアクセスして申請を送信してください。
CLI を介してネットワークポリシーを使用する場合、ホワイトリストに追加申請する必要はありません。
ネットワークポリシーでラベルセレクタを使用して、名前空間とポッドを選択できます。クラスタに多数のネットワークポリシーを作成すると、リクエストとネットワークポリシーのルールを照合するプロセスに時間がかかります。さらに、クラスタに多数のネットワークポリシーが存在する場合、クラスタの管理とトラブルシューティングが複雑になります。クラスタには 40 個未満のネットワークポリシーを作成することをお勧めします。
ステップ 1: ネットワークポリシーを有効にする
Poseidon コンポーネントをインストールします。
ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。
クラスタ ページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。
アドオン ページで、ネットワーキング タブをクリックします。Poseidon カードで、インストール をクリックします。
Poseidon のインストール ダイアログボックスで、ネットワークポリシーを有効にする を選択し、OK をクリックします。
コンポーネントがインストールされると、カードの右上に インストール済み と表示されます。
ポッドのネットワークポリシーを有効にするアノテーションを追加します。
ポッドのネットワークポリシーを有効にするには、
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 コンソールの使用
ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。
クラスタ ページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、
を選択します。デプロイメント タブで、イメージから作成 をクリックします。作成 ページで、nginx という名前のアプリケーションを作成し、サービスを使用してアプリケーションを公開します。アプリケーションの設定が完了したら、作成 をクリックします。
次の表の説明に基づいて以下のパラメータを設定し、その他のパラメータにはデフォルト設定を使用できます。詳細については、イメージからデプロイメントを作成する. を参照してください。
ページ
パラメータ
説明
例
基本情報
名前
カスタムアプリケーション名を指定します。
nginx
レプリカ
ビジネス要件に基づいて値を指定します。
1
コンテナ
イメージ名
イメージを選択 をクリックします。表示されるダイアログボックスで、イメージを選択し、OK をクリックします。
この例では、NGINX イメージが選択されています。検索 タブで、ドロップダウンリストから Docker イメージ を選択し、検索ボックスに NGINX と入力して、検索をクリックします。
詳細設定
サービス
作成サービス の右側にある をクリックします。サービスの作成ダイアログボックスで、パラメータを設定します。
名前: nginx
タイプ:
サーバーロードバランサ
パブリックアクセス
SLB インスタンスの作成
ポートマッピング:
名前: nginx
サービスポート: 80
コンテナポート: 80
プロトコル: TCP
デプロイメント ページに戻り、イメージから作成 をクリックします。作成 ページで、busybox という名前のクライアントアプリケーションを作成し、前のステップで作成した nginx サービスのアクセス可能性をテストします。
次の表の説明に基づいて busybox クライアントアプリケーションの以下のパラメータを設定し、その他のパラメータにはデフォルト設定を使用できます。詳細については、イメージからデプロイメントを作成する. を参照してください。
ページ
パラメータ
説明
例
基本情報
名前
カスタムアプリケーション名を指定します。
busybox
レプリカ
ビジネス要件に基づいて値を指定します。
1
コンテナ起動パラメータ
イメージ名
イメージを選択 をクリックします。表示されるダイアログボックスで、イメージを選択し、OK をクリックします。
この例では、busybox イメージが選択されています。検索 タブで、ドロップダウンリストから Docker イメージ を選択し、検索ボックスに busybox と入力して、検索をクリックします。
コンテナ起動パラメータ
なし。
stdin と tty を選択します。
busybox クライアントアプリケーションが nginx サービスにアクセスできるかどうかを確認します。
デプロイメント ページで、busybox アプリケーションを見つけて、その名前をクリックします。
ポッド ページで、busybox-{ハッシュ値} という名前のポッドを選択し、アクション列の ターミナル をクリックします。
ターミナルで、
wget nginx
コマンドを実行して nginx サービスにアクセスします。上記の出力は、busybox が nginx サービスにアクセスできることを示しています。
CLI の使用
次のコマンドを実行して、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
次のコマンドを実行して、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 コンソールの使用
ACS コンソール にログインします。左側のナビゲーションペインで、クラスタ をクリックします。
クラスタ ページで、管理するクラスタを見つけて、その名前をクリックします。左側のペインで、 を選択します。
ネットワークポリシー ページの上部で、ネットワークポリシーを作成する名前空間を選択します。この例では、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 セレクターを使用して、許可されるポッドを制限する必要があります。
この例では、送信規則は追加されていません。
次へ をクリックします。次に、OK をクリックします。
nginx Serviceへのアクセス性をテストするために、busyboxポッドのターミナルで
wget nginx
コマンドを実行します。詳細は、手順 5を参照してください。ネットワークポリシーでbusyboxポッドからのアクセスが許可されていないため、接続がタイムアウトしました。
busybox ポッドからのアクセスを許可するようにネットワークポリシーを変更します。
[ネットワークポリシー] ページで、access-nginx ネットワークポリシーを見つけ、[アクション] 列の 編集 をクリックします。
イングレスルールを追加します。
送信元 の右側にある + 追加 をクリックし、次の手順を実行します。
ルール の右側にある + 追加 をクリックします。次の表に、ルールのパラメーターを示します。
パラメーター
例
セレクター
podSelector
タイプ
デプロイメント
ワークロード
busybox
ラベル
app=busybox
ポート の右側にある + 追加 をクリックします。次の表に、ポートのパラメーターを示します。
パラメーター
例
プロトコル
TCP
ポート
80
次へ をクリックします。次に、OK をクリックします。
ネットワークポリシーが変更された後、
wget -O /dev/null nginx
コマンドを実行して、busybox ポッドから nginx サービスへのアクセス可能性をテストします。イングレスルールがネットワークポリシーに追加されると、busybox ポッドは nginx サービスにアクセスできます。
CLI の使用
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 サービスにアクセスするには、次のコマンドを実行します。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
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 コンソールを使用する
nginx サービスのネットワークポリシーを作成します。詳細については、特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにするを参照してください。
[サービス] ページで、ACK クラスタでネットワークポリシーを使用するで作成した nginx サービスを見つけ、外部エンドポイント列にある IP アドレス (47.xxx.xx.x) をコピーします。ブラウザで IP アドレスにアクセスします。
事前設定されたネットワークポリシーのため、nginx サービスにアクセスできません。
特定の IP アドレスがサービスにアクセスできるようにネットワークポリシーを変更します。
ブラウザで myip.ipip.net にアクセスして、オンプレミスマシンの IP アドレスを取得します。
[ネットワークポリシー] ページで、access-nginx ネットワークポリシーを見つけ、[アクション] 列の編集をクリックします。編集パネルでイングレスルールを追加します。
送信元の右側にある+ 追加をクリックし、次の手順を実行します。
ルールの右側にある+ 追加をクリックします。オンプレミスマシンの IP アドレスをルールに追加します。
パラメータ
例
セレクタ
ipBlock
cidr
<オンプレミスマシンの IP アドレス>/32
例: 42.xx.xx.xx/32.
ルールの右側にある+ 追加をクリックします。サーバーロードバランサー (SLB) のヘルスチェックに使用される CIDR ブロックをルールに追加します。
パラメータ
例
セレクタ
ipBlock
cidr
100.0.0.0/8
ポートの右側にある+ 追加をクリックします。次の表にポートパラメータを示します。
パラメータ
例
プロトコル
TCP
ポート
80
次へをクリックします。次に、OKをクリックします。
[サービス] ページで、nginx サービスを見つけ、[外部エンドポイント] 列の IP アドレス (47.xxx.xx.x:80) をクリックします。
ネットワークポリシーが変更されると、オンプレミスマシンからインターネットに接続された SLB インスタンスを介して nginx サービスにアクセスできるようになります。
CLI を使用する
次のコマンドを実行して、上記の 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
次のコマンドを実行して、作成された 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 サービスにアクセスできるようにネットワークポリシーを変更します。
次のコマンドを実行して、オンプレミスマシンの IP アドレスをクエリします。
curl myip.ipip.net
予期される出力:
IP address: 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.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
をルールに追加してください。
次のコマンドを実行して、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.com と registry.aliyuncs.com を例として使用します。ネットワークポリシーにより、ポッドは registry.aliyuncs.com にのみアクセスできます。
Ping コマンドを使用して、registry.aliyuncs.com ドメイン名が解決される IP アドレス (120.55.XXX.XXX) をクエリします。
ネットワークポリシーを作成し、busybox アプリケーションが registry.aliyuncs.com のみにアクセスできるように egress ルールを追加します。
ネットワークポリシー ページの右上隅にある 作成 をクリックします。 作成 パネルで、パラメーターを設定します。
種類: デプロイメント
ワークロード: 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 443
nc -vz -w 1 registry.aliyuncs.com 443
ネットワークポリシーが追加されると、busybox アプリケーションは registry.aliyuncs.com にのみアクセスできます。
パラメーターの詳細については、特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにする を参照してください。次の表に設定例を示します。
パラメーター
説明
例
パラメーター
カスタムネットワークポリシー名を指定します。
busybox-policy
ポッドセレクター
+ ワークロードの種類とラベルを指定 をクリックし、ネットワークポリシーのポッドセレクターを指定します。
説明ポッドセレクターを設定しない場合、ネットワークポリシーは指定された名前空間内のすべてのポッドに適用されます。
この例では、次の設定が使用されます。
宛先
+ 追加 を 宛先 の右側にクリックします。次に、+ 追加 を ルール の右側にクリックします。
ipBlock を選択し、registry.aliyuncs.com が解決される IP アドレスを追加します。この例では、IP アドレスは 120.55.XXX.XXX/32 です。
+ 追加 を 宛先 の右側にクリックします。 namespaceSelector を選択し、UDP ポート 53 を介してすべての名前空間のポッドへの送信トラフィックを許可します。これにより、アプリケーションが DNS ルックアップを実行できるようになります。
CLI を使用する
次のコマンドを実行して、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
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 にアクセスできるようにする必要があります。そうしないと、ドメイン名を解決できません。
busybox-policy ファイルに基づいてネットワークポリシーを作成するには、次のコマンドを実行します。
kubectl apply -f busybox-policy.yaml
予期される出力:
networkpolicy.networking.k8s.io/busybox-policy created
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 メッセージが表示されます。これは、アプリケーションがドメイン名にアクセスできなかったことを示しています。
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 コンソールを使用する
ネットワークポリシーページの右上隅にある作成をクリックします。作成パネルで、パラメーターを設定します。
パラメーターの詳細については、特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにするを参照してください。次の表に設定例を示します。
パラメーター
例
パラメーター
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 ブロックを指定することはできません。
次へをクリックします。次に、OK をクリックします。
クラスター詳細ページの基本情報タブで、プライベート IP アドレスとポートを取得します。
busybox ポッドのターミナルで次のコマンドを実行して、ポッドがインターネットと内部ネットワークにアクセスできるかどうかをテストします。
nc -vz -w 1 www.aliyunc.com 443
nc -vz -w 1 10.xx.xx.xx:<IP port> # プライベート IP アドレスを指定します。
出力は、ポッドが内部ネットワークにはアクセスできるが、インターネットにはアクセスできないことを示しています。
CLI を使用する
次のコマンドを実行して、テスト用の名前空間を作成します。
test-np という名前の名前空間を作成します。
kubectl create ns test-np
予想される出力:
namespace/test-np created
次のコマンドを実行して、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
次のコマンドを実行して、特定のラベルを持つポッドがインターネットにアクセスできるようにします。
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
次のコマンドを実行して、指定されたラベルのないポッドがインターネットにアクセスできないことを確認します。
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 名前空間内のポッドがインターネットにアクセスすることを許可していないためです。そのため、デフォルトのラベルを持つポッドはインターネットにアクセスできません。
次のコマンドを実行して、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 ポッドにはこのラベルが付いているため、インターネットにアクセスできます。