【EKS】NetworkPolicyを使って通信制御する

構成は一般的なアプリケーションサーバの構成。
ingress(ALB ingress Controllerで生成) – AppPod – DBPOD
まず、Ingress、Egressの両方のアクセスをブロック。
この際にnamespaceを指定しているため、このnamespaceのみ作用される。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all namespace: test-20210401-01 spec: podSelector: {} policyTypes: - Ingress - Egress
ingressからAppPodへの通信を許可するための設定。
fromでは、ingressが配置されるサブネットのCIDRブロックを指定。
egressでは、DBPODへの通信を許可する設定をいれている。
ちなみに、この場合はnamespaceとpodのlabelを両方チェックする。and条件のようなもの。
「 podSelector:」の前に「-」を入れないと、and条件になる。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-app-from-ingress namespace: test-20210401-01 spec: podSelector: matchLabels: app: test-20210401-01-app policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 10.4.0.0/16 - namespaceSelector: matchLabels: project: test namespace: test-20210401-01 egress: - to: - namespaceSelector: matchLabels: namespace: test-20210401-01 podSelector: matchLabels: app: test-20210401-01-db
AppPODからDBPODへの通信許可設定。
PodSelectorでDBPODを指定して、ingress,egressそれぞれにAPPPODへの通信許可設定を入れている。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-db-from-app namespace: test-20210401-01 spec: podSelector: matchLabels: app: test-20210401-01-db policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: namespace: test-20210401-01 podSelector: matchLabels: app: test-20210401-01-app egress: - to: - namespaceSelector: matchLabels: namespace: test-20210401-01 podSelector: matchLabels: app: test-20210401-01-app
展開したあと
⋊> /h/A/kubernetes on master ◦ kubectl get networkpolicy -A 04:01:47 NAMESPACE NAME POD-SELECTOR AGE test-20210401-01 allow-app-from-ingress app=test-20210401-01-app 5s test-20210401-01 allow-db-from-app app=test-20210401-01-db 8s test-20210401-01 deny-all <none> 12s
lable selectorでingressを指定することはできないため、ipBlocksで無理やり指定する必要がある模様。