ACK Serverless クラスターでネットワークポリシーを有効にすると、Poseidon アドオンを使用してポッドレベルのトラフィックを制御できます。
前提条件
ACK マネージドクラスターまたはACK 専用クラスターが作成されています。 詳細については、「ACK マネージドクラスターの作成」または「ACK 専用クラスターの作成 (提供終了)」をご参照ください。
重要ACK マネージドクラスター Pro および ACK サーバーレス Pro クラスターでは、ネットワークポリシーは異なるアドオンによって実装されます。
ACK マネージドクラスター Proでは、(エラスティックコンテナインスタンスではないノードの場合) ネットワークポリシーは Terway ネットワークプラグインによって実装されています。 詳細については、「ACK クラスターでネットワークポリシーを有効にする」をご参照ください。
ACK Serverless クラスターおよびACK マネージド Pro クラスター内のエラスティックコンテナインスタンス (ECI) では、ネットワークポリシーは Poseidon アドオンによって実装されます。
ACK 仮想ノードアドオンが v2.10.0 以降にアップグレードされていること。詳細については、「コンポーネントの管理」をご参照ください。
制限事項
Network Policy は ACK Serverless Pro と ACK managed cluster Pro クラスターでのみサポートされています。
NetworkPolicy は IPv6 アドレスをサポートしていません。
NetworkPolicy の
endPortフィールドはサポートされていません。NetworkPolicy ルールは、ラベルセレクターを使用して名前空間または Pod を照合します。NetworkPolicy リソースが多すぎると、ルールの伝播が遅くなり、管理とトラブルシューティングが複雑になります。クラスターあたりの NetworkPolicy リソースは 40 未満に制限してください。
ステップ 1: NetworkPolicy の有効化
ACK Serverless Pro クラスターでネットワークポリシーを有効にするには、Poseidon アドオンをインストールします。
Poseidon アドオンをインストールします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[コンポーネントとアドオン] ページで、インストール をクリックします。ネットワーク タブで Poseidon カードを見つけ、[次へ] をクリックします。
コンポーネントのインストール ダイアログボックスで、[ACS/ECI インスタンスの NetworkPolicy を有効化] を選択して [次へ] をクリックし、OK をクリックします。
インストール後、カードに インストール済み と表示されます。
ステップ 2: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
ステップ 3:NetworkPolicy の使用
NetworkPolicy リソースを適用して、ラベル、CIDR ブロック、egress の宛先、またはパブリックネットワークアクセスによって Pod のトラフィックを制限します。
シナリオ 1:ラベルによるアクセス許可
以下の 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 アプリケーション向けの 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 が解決する 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 のパブリックネットワークアクセス制御
本操作は、パブリックネットワークにアクセスするサービスに影響を与える可能性があります。空の名前空間で実行することを推奨します。
アクセス制限の検証のためにテスト用名前空間を作成するため、以下のコマンドを実行します。
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 に対するパブリックネットワークアクセスを許可するルールが含まれているためです。