[k8s] Network Policy
k8s๋ฅผ ํตํ ์์ฒด ํด๋ผ์ฐ๋ ๊ตฌ์ถ์ ์์ด์ ์ค์ํ ๊ฒ ์ค ํ๋๋, ๋น์ฐํ ๋ณด์์ด๋ค.
network policy์ Pod ๊ฐ ๋คํธ์ํฌ ํต์ ์ ์์ด์ ์ธ๋ฐ์ด๋์ ์์๋ฐ์ด๋ ์ ํ์ ์ค์ ํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
AWS๋ฅผ ์จ๋ดค๋ค๋ฉด, VPC์์ ๋ค๋ฃจ๋ ๋ณด์๊ทธ๋ฃน๊ณผ ๋์น๋ผ๊ณ ํ ์ ์๋ค.
https://medium.com/google-cloud/deep-dive-kubernetes-network-policy-in-gke-e9842ec6b1be
๋จ, networkpolicy๋ pod๋ค ๊ฐ์ ๋ด๋ถ ํต์ ์๋ง ๊ด์ฌํ๋ค๋ ์ ์ ์์๋๊ธธ ๋ฐ๋๋ค.
์ธ๋ถ ํต์ ์ ๋ํ ์ ์ด๋ ์ ๊ฒฝ์ฐ์ง ์๋๋ค.
๊ธฐ๋ณธ ๋์
๋ณ๋ค๋ฅธ ์ค์ ์ ํ์ง ์์ผ๋ฉด, Pod๋ค๋ผ๋ฆฌ๋ ๋ด๋ถ IP๋ฅผ ํตํ ํต์ ์ด ์ ๋ถ ๋ซ๋ ค์๋ค.
์๋ฅผ ๋ค์ด ์ด๋ ๊ฒ Pod๋ค์ด ์์ ๋
nginx-pod์ ๋ค์ด๊ฐ๋ฉด ๋๋จธ์ง test-deploy pod๋ค์ ๋ํด์๋ ์์ฒญ์ ์๊ณ ์๋ต์ ๋ฐ์๋ณผ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋ง์ด๋ค.
network policy๋ ์ฝ๊ฒ ๋งํด์ ๋ฐฉํ๋ฒฝ์ ๊น์์ฃผ๋ ๊ธฐ๋ฅ์ ํ๋ค.
NetworkPolicy ํ์ฑํ
networkpolicy๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ํด๋ฌ์คํฐ ๋จ์์์ ๊ธฐ๋ฅ์ ํ์ฑํํด์ผ ํ๋ค.
๋ฐฉ๋ฒ์ ๋คํธ์ํฌ ๊ตฌ์ฑ ํ๊ฒฝ์ ๋ฐ๋ผ์ ๋ค๋ฅด๋ฉฐ, CNI ๊ตฌ์ฑ์ ๋ฐ๋ผ์๋ ์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ์๋ ์๋ค.
๋ํ์ ์ผ๋ก flannel์ Network Policy ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋ CNI๋ค.
GKE๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋ค์ CLI ๋ช ๋ น์ ์ฌ์ฉํ๊ฑฐ๋
gcloud container clusters create CLUSTER_NAME --enable-network-policy --region=๋ฆฌ์
์)
gcloud container clusters create cluster-1 --enable-network-policy --region=us-central1-c
์ฝ์์์ ์ ์ต์ ์ ์ผ๋ฉด ๋๋ค.

์ดํ์๋ ๊ฐ์ ์
๊ทธ๋ ์ด๋ ๊ฐ์๊ฑธ ํตํด์ node๊ฐ ์ฌ๋ฐฐ์น๋๋๋ก ์ ๋ํด์ผ ํ๋ค.
node๋ฅผ ์ง์ฐ๊ณ ๋ค์ ๋์์ผ ๋ฐ์์ด ๋๋ค.
gcloud container clusters upgrade CLUSTER_NAME --master --region=๋ฆฌ์

์ธ๋ฐ์ด๋ ์ ๋ถ ๋ง๊ธฐ
์ถ๊ฐ์ค์ ์ ํ์ง ์์ผ๋ฉด, ๋ชจ๋ pod๋ค๋ผ๋ฆฌ๋ ์ ํ์์ด ํต์ ์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
์ด๋ ๊ฒ ๋ง์ด๋ค.
๊ทผ๋ฐ ์ด๊ฑด ๋ณด์์ ์ธ ๊ด์ ์์ ์ข์ง ์์ ๊ตฌ์กฐ๊ณ .. ๋ฐฉํ๋ฒฝ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณดํต์ ์ ๋ถ ๋ค ๋ง๋๊ฒ ๊ธฐ๋ณธ์ด๋ค.
์ ๋ถ ๋ง์ ๋ค์์ ํ์ํ ๊ฒ๋ง ์ ํ์ ์ผ๋ก ์ฌ๋ ๊ฒ์ด๋ค.
๋ชจ๋ ์ธ๋ฐ์ด๋๋ฅผ ๋ง์ผ๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด NetworkPolicy๋ฅผ ์ ์ํด์ ์์ฑํ๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
podSelector๋ฅผ ๋น์๋๋ฉด ๋ชจ๋ default ๋ค์์คํ์ด์ค์ ํ๋๋ฅผ ์กฐ๊ฑด์ผ๋ก ๊ฑธ๊ฒ ๋๊ณ , ingress์ ๋ํ ์์ธ ์ค์ ๊ฐ์ ์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํ๋๊ฐ ๋งํ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ ์ํ ์ ์, NetworkPolicy๋ ๋ค์์คํ์ด์ค ๋จ์๋ก๋ง ๋์ํ๋ค๋ ๊ฒ์ด๋ค. default์ ๋ง๋ค์์ผ๋ฉด default์ Pod์ ๋ํด์๋ง ์ ์ฝ์ ๊ฑด๋ค.
๋ฌผ๋ก ๋ค๋ฅธ ๋ค์์คํ์ด์ค์์ default๋ก ๋ค์ด์ค๋ ์์ฒญ์ ํต์ ํ ์ ์๋ค.
์๋ฌดํผ ์ ๋๋ก policy๋ฅผ ๋์ฐ๊ณ

๋ค์ ์์ฒญ์ ์ด๋ณด๋ฉด
๋งํ ๊ฒ์ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค.
์ธ๋ฐ์ด๋ ํ์ฉํ๊ธฐ
์ด๋ฒ์๋ ๋ถ๋ถ์ ์ผ๋ก ์ธ๋ฐ์ด๋๋ฅผ ํ์ฉํ๋๋ก ๊ตฌ์ฑํด๋ณด์
java-server์์๋ง node-server์ ํต์ ์ ํ ์ ์๊ณ , ๋ค๋ฅธ pod๋ค์ ์ ์์ด ๋ถ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑํ๋ ค ํ๋ค.
๊ทธ๋ผ ์ด๋ฐ ์์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: node-server
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: java-server
ports:
- protocol: TCP
port: 80
egress:
- to:
- podSelector:
matchLabels:
app: java-server
ports:
- protocol: TCP
port: 80
๋ณดํต์ ์์ ๊ฐ์ด label์ ์ด์ฉํด ํ๋๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค.
java-server ๋ ์ด๋ธ์ ๊ฐ์ง ํ๋์ ๋ํด์๋ง http ์ธ๋ฐ์ด๋์ ์์๋ฐ์ด๋๋ฅผ ํ๊ฐํด์ค ๊ฒ์ด๋ค.
์ํ๋ค๋ฉด IP ๋จ์๋ก๋ ์ค์ ์ด ๊ฐ๋ฅํ๊ธด ํ๋ค.
์ ์ํ๋ก policy๋ฅผ ๋์ฐ๊ณ

์๋ฐ ์๋ฒ์ ๋ค์ด๊ฐ์ ๋ ธ๋์๋ฒ์ ํธ์ถ์ ํ๋ฉด ์ ๋ ๊ฒ์ด๊ณ

nginx ๋ฑ์ ๋ค๋ฅธ pod์์ ํ๋ฉด ๋งํ ๊ฒ์ด๋ค.

์ด๋ฐ์์ผ๋ก ์์ฉํ๋ฉด ๋๋ค.
์ฐธ์กฐ
https://kubernetes.io/ko/docs/concepts/services-networking/network-policies/
https://medium.com/google-cloud/deep-dive-kubernetes-network-policy-in-gke-e9842ec6b1be