Alibaba Cloud Container Compute Service (ACS) では、Kubernetes NetworkPolicy を使用して、ポリシーベースのネットワーク制御を実装できます。ネットワークポリシーを使用して、クラスター内の特定のアプリケーションに対して、IP アドレスまたはポートレベルでネットワークトラフィックを制御します。このトピックでは、ACS クラスターでネットワークポリシーを使用する方法を説明し、一般的なユースケースを紹介します。
適用範囲
-
汎用およびコンピューティング最適化の CPU Pod のみがサポートされています。
-
IPv4 のみがサポートされています。
注意事項
-
NetworkPolicy ルールでは、LabelSelector を使用して名前空間または Pod を選択できます。ただし、Pod に適用する NetworkPolicy が多いほど、ルールが有効になるまでの時間が長くなります。また、多くの NetworkPolicy ルールは、クラスター管理とトラブルシューティングを複雑にする可能性があります。そのため、クラスター内の NetworkPolicy の数は 40 未満にしてください。
ステップ 1: NetworkPolicy の有効化
-
Poseidon コンポーネントをインストールします。
-
ACS コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、対象のクラスターの名前をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。
-
[コンポーネント管理] ページで、[ネットワーク] タブをクリックします。Poseidon カードで、[インストール] をクリックします。
-
[コンポーネント Poseidon のインストール] ページで、[NetworkPolicy の有効化] を選択し、[確認] をクリックします。
コンポーネントがインストールされると、カードの右上に [インストール済み] と表示されます。
-
-
Pod アノテーションで NetworkPolicy を有効にします。
Pod の 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: 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 12s -
busybox という名前の 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: ラベルによるアクセスの許可
kubectl
-
次の YAML テンプレートを使用し、
vim policy.yamlコマンドを実行して policy.yaml ファイルを作成します。vim policy.yamlYAML ファイルの内容は次のとおりです。
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 ブロックによるアクセスの制限
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.説明接続が失敗する理由は次のとおりです:
-
ネットワークポリシーは、ラベル
access=trueを持つアプリケーションからのアクセスのみを許可します。 -
SLB IP アドレスからのトラフィックはクラスターの外部から発信されます。現在のネットワークポリシーは、特定のラベルを持つ Pod からのトラフィックのみを許可し、外部トラフィックは許可しません。
解決策:ネットワークポリシーを変更して、許可された送信元 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 アドレス。これは一例です。実際のアドレスは異なる場合があります。更新されたポリシーを適用します:
kubectl apply -f policy.yaml期待される出力:
networkpolicy.networking.k8s.io/access-nginx unchanged説明-
一部のネットワークには複数の Egress IP アドレスがあります。この場合は /24 アドレス範囲を使用してください。
-
SLB ヘルスチェックアドレスは
100.64.0.0/10アドレスブロックにあります。したがって、100.64.0.0/10を設定する必要があります。
-
-
テスト Pod を実行して 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 アクセスの制限
Kubectl
-
www.aliyun.com ドメインを解決します。
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.yamlbusybox-policy.yamlファイルには次の内容が含まれます:# 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.yamlファイルのegressルールは、アプリケーションのアウトバウンドアクセスを制限します。DNS 解決が機能するように、ポリシーはポート 53 での UDP リクエストも許可する必要があります。 -
busybox-policy.yamlファイルからネットワークポリシーを作成します。kubectl apply -f busybox-policy.yaml期待される出力:
networkpolicy.networking.k8s.io/busybox-policy created -
ポリシーをテストするために
busyboxPod を作成します。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 outcan'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 のパブリックネットワークアクセスの制御
この操作は、パブリックネットワークにアクセスしているオンラインサービスに影響を与える可能性があります。以下の手順は、空の名前空間で実行することを推奨します。
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 loss0 packets receivedというメッセージは、アクセスが失敗したことを示します。説明アクセスが失敗するのは、
deny-public-netネットワークポリシーが、test-np名前空間内のすべての 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 ms0% packet lossというメッセージは、パブリックネットワークへのアクセスが成功したことを示します。説明アクセスが成功するのは、
allow-public-network-for-labelsネットワークポリシーが、busybox-internetPod のようなpublic-network=trueラベルを持つ Pod にパブリックネットワークアクセスを許可するためです。