Alibaba Cloud Container Compute Service (ACS) は、Kubernetes NetworkPolicy を使用したポリシーベースのネットワーク制御を提供します。クラスター内の特定のアプリケーションに対して IP アドレスまたはポートレベルでネットワークトラフィックを制御するには、ネットワークポリシーを使用できます。このトピックでは、ACS クラスターでネットワークポリシーを使用する方法について、一般的なシナリオを含めて説明します。
適用範囲
汎用およびコンピューティング最適化インスタンスタイプの CPU Pod のみがサポートされています。
IPv4 のみがサポートされており、IPv6 はサポートされていません。
注意事項
NetworkPolicy ルールでは、LabelSelector を使用して名前空間または Pod を選択できます。ただし、Pod に適用される NetworkPolicy の数が増えるにつれて、ルールが有効になるまでに必要な時間も長くなります。さらに、多くの NetworkPolicy ルールは、クラスターの管理とトラブルシューティングを複雑にする可能性があります。したがって、クラスター内の NetworkPolicy の数は 40 未満にしてください。
ステップ 1: ネットワークポリシーの有効化
Poseidon コンポーネントをインストールします。
-
ACS コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。
[コンポーネント管理] ページで、[ネットワーク] タブをクリックします。Poseidon コンポーネントカードの右下隅にある [インストール] をクリックします。
[コンポーネント Poseidon のインストール] ページで、[NetworkPolicy の有効化] を選択し、[確認] をクリックします。

コンポーネントがインストールされると、カードの右上隅に [インストール済み] と表示されます。
-
Pod アノテーションで NetworkPolicy を有効にします。
NetworkPolicy が必要なコンテナーには、次のアノテーションを追加します:
network.alibabacloud.com/enable-network-policy-agent: "true"。以下に例を示します: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 テストアプリケーションの作成
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 12snginx という名前のサービスにアクセスするために、busybox という名前の Pod を作成します。
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: ネットワークポリシーを使用して特定のラベルを持つアプリケーションからのアクセスのみを許可する
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期待される出力:
nginx (172.21.XX.XX:80) への接続中 'index.html' に保存中 index.html 100% |****************************************************************************************************************************************************| 612 0:00:00 ETA 'index.html' を保存しましたNginx への接続進捗が 100% に達すると、リクエストは成功し、Nginx サービスにアクセスできます。
シナリオ 2: ネットワークポリシーを使用してインターネット向けサービスにアクセスできるソース CIDR ブロックを制限する
kubectl
nginx アプリケーション用に Alibaba Cloud SLB サービスを作成し、
type=LoadBalancerを設定して nginx サービスをインターネットユーザーに公開します。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: 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 への外部アクセスであり、ネットワークポリシーを使用してサービスアクセスを特定のラベルを持つアプリケーションに制限するのとは異なります。
解決策:許可されたソース IP アドレス範囲を追加するようにネットワークポリシーを変更します。
ローカルマシンの 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/10のアドレス範囲内にあります。したがって、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 ETA接続進捗が 100% と表示されたら、Nginx サービスへのアクセスは成功です。
シナリオ 3: ネットワークポリシーを使用して Pod が指定されたアドレスにのみアクセスできるように制限する
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.yamlbusybox-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 ファイルでは、アプリケーションのアウトバウンドアクセスを制限するエグレスルールが設定されています。ここでは UDP リクエストを許可する必要があります。そうしないと、DNS 名前解決が失敗します。
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 ETA進捗が 100% と表示されたら、サービスへのアクセスは成功です。
シナリオ 4: ネットワークポリシーを使用して名前空間内の 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 はパブリックネットワークにアクセスできます。