๐น Kubernetes์์ ๋คํธ์ํฌ ๋ฐ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ์ ์ค์์ฑ
Kubernetes ํ๊ฒฝ์์๋ ์๋น์ค ๊ฐ์ ํต์ ์ด ํ์์ ์ด๋ฉฐ,
์ฌ๋ฐ๋ฅธ ๋คํธ์ํฌ ์ ์ฑ
๊ณผ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๊ตฌ์ฑ์ ํตํด ์์ ์ ์ธ ๋ฐฐํฌ ๋ฐ ์ด์์ด ๊ฐ๋ฅํฉ๋๋ค.
โ ๋คํธ์ํฌ ๋ฐ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ฅผ ์ต์ ํํด์ผ ํ๋ ์ด์
โ Pod ๊ฐ ์์ ์ ์ธ ํต์ ๋ณด์ฅ
โ ์ธ๋ถ ํธ๋ํฝ์ ์์ ํ๊ฒ ๊ด๋ฆฌ
โ ์๋น์ค ๋ฉ์ฌ(Service Mesh)์ ์ฐ๊ณํ์ฌ ํธ๋ํฝ ์ ์ด
โ Argo CD์ ์ฐ๋ํ์ฌ ๋ฐฐํฌ ์ ๋คํธ์ํฌ ์ ์ฑ
์๋ ์ ์ฉ
๐น 1. Kubernetes ๋คํธ์ํฌ ์ ์ฑ ๊ณผ Argo CD ์ฐ๋
๐ ๋คํธ์ํฌ ์ ์ฑ (NetworkPolicy)์ด ํ์ํ ์ด์
๊ธฐ๋ณธ์ ์ผ๋ก Kubernetes ํด๋ฌ์คํฐ ๋ด ๋ชจ๋ Pod๋ ์๋ก ํต์ ํ ์ ์์ต๋๋ค.
ํ์ง๋ง, ๋ณด์์ ๊ฐํํ๊ณ ๋คํธ์ํฌ ๊ฒฉ๋ฆฌ๋ฅผ ์ํด ๋คํธ์ํฌ ์ ์ฑ
(NetworkPolicy) ์ ์ ์ฉํด์ผ ํฉ๋๋ค.
โ
๋คํธ์ํฌ ์ ์ฑ
์ฃผ์ ๊ธฐ๋ฅ
โ ํน์ ๋ค์์คํ์ด์ค ๋๋ Pod ๊ฐ ํต์ ์ ํ์ฉ ๋๋ ์ฐจ๋จ
โ ์ธ๋ถ ํธ๋ํฝ์ ์ ํํ์ฌ ๋ณด์ ๊ฐํ
โ Argo CD ๋ฐฐํฌ ์ ์๋์ผ๋ก ๋คํธ์ํฌ ์ ์ฑ
์ ์ค์
โ ๋คํธ์ํฌ ์ ์ฑ ์ ์ฉ ์์
๐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ธ๋ฐ์ด๋ ํธ๋ํฝ ์ฐจ๋จ (๊ธฐ๋ณธ ์ฐจ๋จ ์ ์ฑ )
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: example
spec:
podSelector: {} # ๋ชจ๋ Pod์ ์ ์ฉ
policyTypes:
- Ingress # ๋ค์ด์ค๋ ํธ๋ํฝ ์ฐจ๋จ
- Egress # ๋๊ฐ๋ ํธ๋ํฝ ์ฐจ๋จ
โ
์ค๋ช
:
โ podSelector: {} → ๋ค์์คํ์ด์ค ๋ด ๋ชจ๋ Pod์ ์ ์ฉ
โ policyTypes: Ingress, Egress → ๋ค์ด์ค๋ ํธ๋ํฝ๊ณผ ๋๊ฐ๋ ํธ๋ํฝ ๋ชจ๋ ์ฐจ๋จ
โ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ ํต์ ํ์ฉ (Argo CD ์ ์ฉ)
๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ ๋ด๋ถ ํต์ ์ ํ์ฉํ๋ ๋คํธ์ํฌ ์ ์ฑ ์ ์ถ๊ฐํฉ๋๋ค.
๐ ํน์ ๋ผ๋ฒจ์ด ์๋ Pod ๊ฐ ํต์ ํ์ฉ
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-app-communication
namespace: example
spec:
podSelector:
matchLabels:
app: example-app # example-app ๋ ์ด๋ธ์ ๊ฐ์ง Pod์ ์ ์ฉ
ingress:
- from:
- podSelector:
matchLabels:
app: example-api # example-api ๋ ์ด๋ธ์ ๊ฐ์ง Pod๋ง ์ ๊ทผ ํ์ฉ
ports:
- protocol: TCP
port: 8080 # 8080 ํฌํธ๋ก ํต์ ๊ฐ๋ฅ
โ
์ค๋ช
:
โ podSelector.matchLabels.app: example-app → example-app Pod๋ง ์ ์ฉ
โ from.podSelector.matchLabels.app: example-api → example-api Pod๋ง ํต์ ๊ฐ๋ฅ
โ ports.port: 8080 → 8080 ํฌํธ๋ก๋ง ํธ๋ํฝ ํ์ฉ
โ ๋ฐฐํฌ๋ ๋คํธ์ํฌ ์ ์ฑ ํ์ธ
kubectl get networkpolicy -n example
โ ์ถ๋ ฅ ์์:
NAME POD-SELECTOR AGE
deny-all <none> 10m
allow-app-communication app=example-app 2m
โ Argo CD์์ ๋คํธ์ํฌ ์ ์ฑ ์ ์๋ ์ ์ฉํ๋๋ก ์ค์
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-network-policy
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/example/repo.git
targetRevision: main
path: network-policy # ๋คํธ์ํฌ ์ ์ฑ
์ด ์ ์ฅ๋ Git ๊ฒฝ๋ก
destination:
server: https://kubernetes.default.svc
namespace: example
syncPolicy:
automated:
prune: true
selfHeal: true
โ Argo CD์์ ๋คํธ์ํฌ ์ ์ฑ ๋๊ธฐํ
argocd app sync example-network-policy
๐น 2. Argo CD์ Service Mesh ์ฐ๋ (Istio ํ์ฉ)
์๋น์ค ๋ฉ์ฌ(Service Mesh)๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ํธ๋ํฝ์ ๋ณด๋ค ์ ๋ฐํ๊ฒ ์ ์ดํ๊ณ , ๋ณด์๊ณผ ๊ด์ฐฐ์ฑ์ ๊ฐํํ ์ ์๋ ๊ธฐ์ ์ ๋๋ค.
โ
Istio๋ฅผ ํ์ฉํ ํธ๋ํฝ ์ ์ด ์ฃผ์ ๊ธฐ๋ฅ
โ Canary ๋ฐฐํฌ ์ ํน์ ํธ๋ํฝ๋ง ์ ๊ท ๋ฒ์ ์ผ๋ก ๋ผ์ฐํ
๊ฐ๋ฅ
โ TLS ์ํธํ๋ฅผ ํตํ ์๋น์ค ๊ฐ ๋ณด์ ๊ฐํ
โ Argo CD์ ์ฐ๋ํ์ฌ ์๋์ผ๋ก Istio ์ค์ ๋ฐฐํฌ ๊ฐ๋ฅ
โ Istio VirtualService๋ฅผ ํ์ฉํ ํธ๋ํฝ ๊ด๋ฆฌ
๐ ๊ธฐ์กด ๋ฒ์ (Stable)๊ณผ ์ ๊ท ๋ฒ์ (Canary) ํธ๋ํฝ์ 80:20์ผ๋ก ๋ฐฐ๋ถ
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: example-traffic-split
namespace: example
spec:
hosts:
- example-app.example.svc.cluster.local # ๋ด๋ถ ์๋น์ค ์ฃผ์
http:
- route:
- destination:
host: example-app
subset: stable # ๊ธฐ์กด ๋ฒ์
weight: 80 # 80% ํธ๋ํฝ ํ ๋น
- destination:
host: example-app
subset: canary # ์ ๊ท ๋ฒ์
weight: 20 # 20% ํธ๋ํฝ ํ ๋น
โ
์ค๋ช
:
โ route.destination.host: example-app → ํธ๋ํฝ์ ๋ณด๋ผ ๋์ ์๋น์ค
โ subset: stable → ๊ธฐ์กด ๋ฒ์ (stable)์ผ๋ก 80% ํธ๋ํฝ
โ subset: canary → ์ ๊ท ๋ฒ์ (canary)์ผ๋ก 20% ํธ๋ํฝ
โ Argo CD์์ Istio ์ค์ ์ ์๋ ๋ฐฐํฌ
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-istio-config
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/example/repo.git
targetRevision: main
path: istio-config # Istio ์ค์ ์ด ์ ์ฅ๋ Git ๊ฒฝ๋ก
destination:
server: https://kubernetes.default.svc
namespace: example
syncPolicy:
automated:
prune: true
selfHeal: true
โ ๋ฐฐํฌ๋ Istio ์ค์ ํ์ธ
kubectl get virtualservice -n example
โ ์ถ๋ ฅ ์์:
NAME GATEWAYS HOSTS AGE
example-traffic-split <none> example-app.example.svc.cluster.local 5m
๐น 3. ๋คํธ์ํฌ ๋ฐ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ์ด์ ์ ๊ณ ๋ คํ ์
โ
1๏ธโฃ ๋คํธ์ํฌ ์ ์ฑ
์ต์ ๊ถํ ์์น ์ ์ฉ
โ ๋ชจ๋ ๋คํธ์ํฌ ์ ์ฑ
์ ๊ธฐ๋ณธ ์ฐจ๋จํ ํ, ํ์ํ ์๋น์ค ๊ฐ์ ํต์ ๋ง ํ์ฉ
โ
2๏ธโฃ Istio ์๋น์ค ๋ฉ์ฌ ํ์ฉ
โ Istio VirtualService๋ฅผ ํ์ฉํ์ฌ Canary ๋ฐฐํฌ ๋ฐ ํธ๋ํฝ ์ ์ด ์ ์ฉ
โ
3๏ธโฃ Argo CD์ ์ฐ๊ณํ ๋คํธ์ํฌ ์๋ํ
โ GitOps ๋ฐฉ์์ผ๋ก ๋คํธ์ํฌ ์ ์ฑ
๋ฐ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๊ด๋ฆฌ
โ
4๏ธโฃ ์ธ๋ถ ํธ๋ํฝ ์ ํ
โ LoadBalancer ๋๋ Ingress Controller๋ฅผ ํตํด ์ธ๋ถ ์ ๊ทผ์ ์ ์ด
๐น ๊ฒฐ๋ก : ์ด๋ฒ ๊ธ์์ ๋ฐฐ์ด ํต์ฌ ๋ด์ฉ ์ ๋ฆฌ
๐ข ๋คํธ์ํฌ ์ ์ฑ
(NetworkPolicy)์ ์ ์ฉํ์ฌ ์๋น์ค ๊ฐ ํต์ ์ ์์ ํ๊ฒ ๊ด๋ฆฌ ๊ฐ๋ฅ
๐ข Argo CD์ ์ฐ๋ํ์ฌ ๋คํธ์ํฌ ์ ์ฑ
์ ์๋ ๋ฐฐํฌ ๋ฐ ๋๊ธฐํ ๊ฐ๋ฅ
๐ข Istio VirtualService๋ฅผ ํ์ฉํ์ฌ Canary ๋ฐฐํฌ ๋ฐ ํธ๋ํฝ ๋ถ๋ฐฐ ์ต์ ํ ๊ฐ๋ฅ
๐ข GitOps ๋ฐฉ์์ผ๋ก ๋คํธ์ํฌ ๋ฐ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ฅผ ์ด์ํ ์ ์์