求ム!Cloud Nativeアプリケーション開発のTips!【PR】日本マイクロソフト Advent Calendar 2020 の23日目の記事です。
Kubernetesのデフォルトでは、Namespace間の通信は全て許可されています。
Namespace毎に異なるワークロードを動かしていた場合、アクセス制御を掛けたいシーンがあると思いAKS上(Azure Network Policy)で実現可能か試してみました。
Azure Kubernetes Service (AKS) のネットワーク ポリシーを使用したポッド間のトラフィックの保護 に手順がありますが、独自に検証したものやハマったポイントなどを書き残します。
AKS作成
こちら にAzure CLIでAKSを作成するコマンドがありますのでそれに倣って作成します。
ここで注意すべきは、作成したvNetのIAMでAKS ServicePrincipalに対して共同作成者ロールを割り当てることです。
これをやっておかないとNetworkPolicyが反応しませんでした。
Azure Portalから作った場合は忘れずに設定しないといけないです。
Network Policy設定
今回はproduction Namespaceに、他のNamespaceからアクセスできないように設定してみます。
- テスト用Namespaceを作ります。
# kubectl create ns production
# kubectl label namespace/production env=production
# kubectl create ns development
# kubectl label namespace/development env=development
- NginxをProductionに作ります。
# kubectl create deployment nginx --image=nginx -n production
# kubectl expose deployment nginx --port=80 -n production
# kubectl get all -n production
- テスト用のPodをProduction Namespaceに作ります。remote file existsが出れば疎通できています。
# kubectl run busybox --rm -ti --image=busybox -n production -- /bin/sh
/ # wget --spider --timeout=1 nginx
remote file exists
/ # exit
- テスト用のPodをDevelopment Namespaceに作ります。まだNetworkPolicyを当ててないので疎通できます。
# kubectl run busybox --rm -ti --image=busybox -n development -- /bin/sh
/ # wget --spider --timeout=1 nginx.production
remote file exists
/ # exit
- network-policy.yamlを作成します。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: network-policy
namespace: production
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
env: production
- Production Namespaceに適用します。
# kubectl apply -f network-policy.yaml
- テスト用のPodをDevelopment Namespaceに作ります。timeoutになるはずです。
# kubectl run busybox --rm -ti --image=busybox -n development -- /bin/sh
/ # wget --spider --timeout=1 nginx.production
wget: download timed out
/ # exit
- テスト用のPodをProduction Namespaceに作ります。同じNamespace内では疎通できるはずです。
# kubectl run busybox --rm -ti --image=busybox -n production -- /bin/sh
/ # wget --spider --timeout=1 nginx
remote file exists
/ # exit