πΉ Kubernetes λ€νΈμν¬ μ μ± (Network Policy)μ΄λ?
Kubernetes λ€νΈμν¬ μ μ±
(Network Policy) λ Pod κ°μ νΈλν½μ μ μ΄νμ¬ λ³΄μμ κ°ννλ κΈ°λ₯μ
λλ€.
κΈ°λ³Έμ μΌλ‘ Kubernetesλ λͺ¨λ Pod κ°μ ν΅μ μ νμ©νμ§λ§, λ€νΈμν¬ μ μ±
μ μ μ©νλ©΄ νΉμ νΈλν½λ§ νμ©ν μ μμ΅λλ€.
β λ€νΈμν¬ μ μ± μ μ£Όμ κΈ°λ₯
β νΉμ Pod κ°μ νΈλν½μ νμ© λλ μ°¨λ¨
β νΉμ λ€μμ€νμ΄μ€ λ΄μμ νΈλν½μ μ ν
β μΈλΆ λ€νΈμν¬μμ μ€λ νΈλν½μ μ°¨λ¨
β GitOps λ°©μμΌλ‘ λ€νΈμν¬ μ μ± μ κ΄λ¦¬νλ μ΄μ
β 보μ μ μ±
μ μ½λλ‘ κ΄λ¦¬νμ¬ μΌκ΄λ μ΄μ κ°λ₯
β Git λ³κ²½ μ΄λ ₯μ ν΅ν΄ λ€νΈμν¬ μ μ±
λ³κ²½ μ¬νμ μΆμ κ°λ₯
β Argo CDλ₯Ό ν΅ν΄ μλμΌλ‘ λ€νΈμν¬ μ μ±
μ λκΈ°ννμ¬ μλ μ€μ λΆνμ
πΉ 1. Argo CDλ₯Ό νμ©ν λ€νΈμν¬ μ μ± μ μ© λ°©λ²
Argo CDλ Kubernetes λ§€λνμ€νΈλ₯Ό Gitμμ λκΈ°ννλ λ°©μμ΄λ―λ‘,
λ€νΈμν¬ μ μ±
λ Gitμ μ μΈμ μΌλ‘ μ μνκ³ μλμΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€.
β λ€νΈμν¬ μ μ± μ μ μ©νλ Argo CD Application μμ
apiVersion: argoproj.io/v1alpha1 # Argo CDμ API λ²μ
kind: Application # Argo CDμμ κ΄λ¦¬νλ μ ν리μΌμ΄μ
metadata:
name: network-policy-app # μ ν리μΌμ΄μ
μ΄λ¦
namespace: argocd # Argo CD λ€μμ€νμ΄μ€
spec:
project: default # Argo CD νλ‘μ νΈ μ§μ
source:
repoURL: https://github.com/example/repo.git # Git μ μ₯μ URL
targetRevision: main # μ¬μ©ν Git λΈλμΉ
path: network-policies # λ€νΈμν¬ μ μ±
μ΄ μ μ₯λ Git κ²½λ‘
destination:
server: https://kubernetes.default.svc # λ°°ν¬ν Kubernetes ν΄λ¬μ€ν°
namespace: example-namespace # λ€νΈμν¬ μ μ±
μ΄ μ μ©λ λ€μμ€νμ΄μ€
syncPolicy:
automated:
prune: true # Gitμμ μμ λ 리μμ€λ₯Ό Kubernetesμμλ μμ
selfHeal: true # Kubernetes 리μμ€κ° λ³κ²½λμμ κ²½μ° Git μνλ‘ μλ 볡ꡬ
β
μ€λͺ
:
β source.repoURL → λ€νΈμν¬ μ μ±
μ΄ ν¬ν¨λ Git μ μ₯μμ URL
β source.path → Git μ μ₯μ λ΄μμ λ€νΈμν¬ μ μ±
μ΄ μμΉν κ²½λ‘
β destination.namespace → ν΄λΉ λ€μμ€νμ΄μ€μ λ€νΈμν¬ μ μ±
μ΄ μ μ©λ¨
β syncPolicy.automated → Git λ³κ²½ μ¬νμ μλμΌλ‘ μ μ©
πΉ 2. Kubernetes λ€νΈμν¬ μ μ± μμ
Argo CDμμ λ€νΈμν¬ μ μ± μ μ μΈμ λ°©μμΌλ‘ κ΄λ¦¬νλ €λ©΄, NetworkPolicy 리μμ€λ₯Ό μ μν΄μΌ ν©λλ€.
β 1οΈβ£ κΈ°λ³Έμ μΌλ‘ λͺ¨λ νΈλν½μ μ°¨λ¨νλ μ μ±
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all # λͺ¨λ λ€νΈμν¬ νΈλν½μ μ°¨λ¨νλ μ μ±
namespace: example-namespace # μ μ©ν λ€μμ€νμ΄μ€
spec:
podSelector: {} # λͺ¨λ Podμ μ μ©
policyTypes:
- Ingress # μΈλΆμμ λ€μ΄μ€λ νΈλν½ μ°¨λ¨
- Egress # μΈλΆλ‘ λκ°λ νΈλν½ μ°¨λ¨
β
μ€λͺ
:
β podSelector: {} → λͺ¨λ Podμ μ μ©
β policyTypes → Ingress(μμ ) λ° Egress(λ°μ ) νΈλν½μ λͺ¨λ μ°¨λ¨
β κΈ°λ³Έμ μΌλ‘ Pod κ° ν΅μ μ μ°¨λ¨νμ¬ λ³΄μμ κ°ν
β 2οΈβ£ νΉμ μ ν리μΌμ΄μ μλ§ Ingress νΈλν½ νμ© (νλ‘ νΈμλ → λ°±μλ)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: example-namespace
spec:
podSelector:
matchLabels:
app: backend # backend λΌλ²¨μ΄ μλ Podμ μ μ±
μ μ©
policyTypes:
- Ingress # μμ νΈλν½ μ μ΄
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # frontend λΌλ²¨μ΄ μλ Podμμ μ€λ μμ² νμ©
ports:
- protocol: TCP
port: 8080 # 8080 ν¬νΈμμλ§ νΈλν½ νμ©
β
μ€λͺ
:
β podSelector.matchLabels.app: backend → backend μ ν리μΌμ΄μ
Podμ μ μ±
μ μ©
β ingress.from.podSelector.app: frontend → frontend μ ν리μΌμ΄μ
μμλ§ μ κ·Ό νμ©
β ports.port: 8080 → 8080 ν¬νΈμμλ§ νμ©νμ¬ λ³΄μ κ°ν
β 3οΈβ£ μΈλΆ μΈν°λ·(0.0.0.0/0)μμ μ€λ νΈλν½μ μ°¨λ¨νλ μ μ±
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-external-access
namespace: example-namespace
spec:
podSelector: {} # λͺ¨λ Podμ μ μ©
policyTypes:
- Ingress # μμ νΈλν½ μ°¨λ¨
ingress:
- from:
- ipBlock:
cidr: 10.0.0.0/8 # λ΄λΆ λ€νΈμν¬μμ μ€λ μμ²λ§ νμ© (AWS VPC μμ )
β
μ€λͺ
:
β ipBlock.cidr: 10.0.0.0/8 → AWS VPC λ΄λΆμμ μ€λ νΈλν½λ§ νμ©
β μΈλΆ(μΈν°λ·)μμ μ κ·Όμ μ°¨λ¨νμ¬ λ³΄μ κ°ν
πΉ 3. Argo CDλ₯Ό νμ©ν λ€νΈμν¬ μ μ± μλν λ°°ν¬
β Argo CD CLIλ₯Ό μ¬μ©νμ¬ λ€νΈμν¬ μ μ± λ°°ν¬ μν νμΈ
argocd app get network-policy-app
β λ€νΈμν¬ μ μ± λκΈ°ν μ€ν
argocd app sync network-policy-app
β λ°°ν¬λ λ€νΈμν¬ μ μ± νμΈ (Kubernetes λͺ λ Ήμ΄ μ¬μ©)
kubectl get networkpolicy -n example-namespace
πΉ 4. Argo CD λ€νΈμν¬ μ μ± μ μ© μ κ³ λ €ν μ
β 1οΈβ£ λ€νΈμν¬ μ μ± μ μ© ν μ μ ν μ€νΈ νμ
β λ€νΈμν¬ μ μ±
μ μ© ν kubectl exec λλ curl λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμ¬ νΈλν½μ΄ μ μμ μΌλ‘ μ νλλμ§ ν
μ€νΈ
β μμν λλ‘ νΈλν½μ΄ μ°¨λ¨λμ§ μλλ€λ©΄, μ μ±
μ΄ μ¬λ°λ₯΄κ² μ μλμλμ§ νμΈ νμ
β 2οΈβ£ GitOps λ°©μμΌλ‘ λ³κ²½ κ΄λ¦¬
β Gitμ λ€νΈμν¬ μ μ±
μ μ μ₯νκ³ Argo CDλ₯Ό ν΅ν΄ λ°°ν¬νλ©΄ μ μ±
λ³κ²½ μ΄λ ₯μ μΆμ κ°λ₯
β git log λλ argocd app history λͺ
λ Ήμ΄λ₯Ό νμ©νμ¬ λ³κ²½ μ¬νμ μΆμ
β 3οΈβ£ RBAC(Role-Based Access Control)μ ν¨κ» μ¬μ©
β λ€νΈμν¬ μ μ±
λ§μΌλ‘λ μΆ©λΆνμ§ μμΌλ―λ‘, RBACμ μ μ©νμ¬ λ³΄μμ λμ± κ°ν
β RoleBinding λ° ClusterRoleBindingμ νμ©νμ¬ νΉμ λ€μμ€νμ΄μ€μ λν κΆνμ μ ν
πΉ κ²°λ‘ : μ΄λ² κΈμμ λ°°μ΄ ν΅μ¬ λ΄μ© μ 리
π’ Kubernetes λ€νΈμν¬ μ μ±
(NetworkPolicy)μ νμ©νλ©΄ Pod κ°μ νΈλν½μ μ μ΄νμ¬ λ³΄μμ κ°νν μ μμ
π’ Argo CDλ₯Ό μ¬μ©νλ©΄ λ€νΈμν¬ μ μ±
μ GitOps λ°©μμΌλ‘ κ΄λ¦¬νκ³ μλ λ°°ν¬ κ°λ₯
π’ Pod κ°μ νΉμ νΈλν½λ§ νμ©νμ¬ μΈλΆ μ κ·Όμ μ°¨λ¨νκ³ , 보μμ΄ κ°νλ Kubernetes ν΄λ¬μ€ν° μ΄μ κ°λ₯
π’ RBACκ³Ό ν¨κ» νμ©νλ©΄ λ³΄λ€ κ°λ ₯ν 보μ μ μ±
μ μ μ© κ°λ₯