Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.23] 3๋ถ€ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ #7 | Istio์—์„œ ๋„คํŠธ์›Œํฌ ์ •์ฑ…(NetworkPolicy) ํ™œ์šฉํ•˜๊ธฐ

ygtoken 2025. 3. 18. 12:09
728x90

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์—์„œ ๋„คํŠธ์›Œํฌ ์ •์ฑ…(NetworkPolicy)์„ ํ™œ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Kubernetes์˜ NetworkPolicy๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ L3/L4(Network Layer)์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์ œํ•œํ•˜์ง€๋งŒ,
Istio๋ฅผ ํ™œ์šฉํ•˜๋ฉด L7(Application Layer)๊นŒ์ง€ ์ •์ฑ…์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ Kubernetes ๋„คํŠธ์›Œํฌ ์ •์ฑ…๊ณผ Istio์˜ AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•œ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Kubernetes ๋„คํŠธ์›Œํฌ ์ •์ฑ…(NetworkPolicy) ๊ฐœ์š”

โœ… 1.1 NetworkPolicy๋ž€?

NetworkPolicy๋Š” Kubernetes์—์„œ Pod ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๋Š” ๋ณด์•ˆ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ Kubernetes๋Š” ๋ชจ๋“  Pod ๊ฐ„์˜ ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ,
NetworkPolicy๋ฅผ ์ ์šฉํ•˜๋ฉด ํŠน์ • ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ๋งŒ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NetworkPolicy์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” ๋ผ๋ฒจ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด
  • L3/L4(Network Layer) ์ˆ˜์ค€์—์„œ ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ์ œํ•œ
  • Ingress(๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ) ๋ฐ Egress(๋‚˜๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ) ์ •์ฑ… ์„ค์ • ๊ฐ€๋Šฅ

โœ… 1.2 ๊ธฐ๋ณธ์ ์ธ Kubernetes NetworkPolicy ์˜ˆ์ œ

์•„๋ž˜ NetworkPolicy๋Š” ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋ผ๋ฒจ์ด role: backend์ธ Pod๋งŒ role: frontend์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: backend  # backend ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ •์ฑ… ์ ์šฉ
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              role: frontend  # frontend์—์„œ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ๋งŒ ํ—ˆ์šฉ
      ports:
        - protocol: TCP
          port: 8080

์„ค๋ช…:

  • podSelector.matchLabels.role: backend โ†’ backend ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ •์ฑ… ์ ์šฉ
  • policyTypes: Ingress โ†’ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ด
  • from.podSelector.matchLabels.role: frontend โ†’ frontend ์„œ๋น„์Šค์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ๋งŒ ํ—ˆ์šฉ
  • ports.protocol: TCP, port: 8080 โ†’ TCP 8080 ํฌํŠธ๋กœ์˜ ์š”์ฒญ๋งŒ ํ—ˆ์šฉ

๐Ÿ’ก NetworkPolicy๋Š” ๋„คํŠธ์›Œํฌ ๊ณ„์ธต(L3/L4)์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์ œํ•œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 2. Istio์˜ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๋ฐ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด

โœ… 2.1 Istio์˜ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ฐœ๋…

Istio์—์„œ๋Š” Kubernetes์˜ NetworkPolicy ๋Œ€์‹  AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Istio์˜ ๋ณด์•ˆ ์ •์ฑ…์€ L7(Application Layer)๊นŒ์ง€ ์ œ์–ด ๊ฐ€๋Šฅํ•˜์—ฌ, HTTP ์š”์ฒญ ์ˆ˜์ค€์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Istio์˜ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ธฐ๋Šฅ

  • L7 ๊ธฐ๋ฐ˜์˜ ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง (HTTP ๋ฉ”์„œ๋“œ, ํ—ค๋”, JWT ์ธ์ฆ ๋“ฑ)
  • ์„œ๋น„์Šค ๊ฐ„ mTLS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์•”ํ˜ธํ™” ๊ฐ€๋Šฅ
  • AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•˜์—ฌ API ์—”๋“œํฌ์ธํŠธ๋ณ„ ์ ‘๊ทผ ์ œ์–ด ๊ฐ€๋Šฅ

๐Ÿ’ก Istio์˜ AuthorizationPolicy๋Š” L3, L4, L7 ๋ ˆ๋ฒจ์—์„œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.2 Istio์˜ AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•œ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ ์šฉ

์•„๋ž˜ AuthorizationPolicy๋Š” role: frontend๊ฐ€ ์„ค์ •๋œ Pod๋งŒ backend ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/default/sa/frontend"]  # frontend ์„œ๋น„์Šค๋งŒ ํ—ˆ์šฉ
      to:
        - operation:
            methods: ["GET"]  # GET ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
            paths: ["/api/data"]  # ํŠน์ • ๊ฒฝ๋กœ๋งŒ ํ—ˆ์šฉ

์„ค๋ช…:

  • action: ALLOW โ†’ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
  • source.principals: ["cluster.local/ns/default/sa/frontend"] โ†’ frontend ์„œ๋น„์Šค์—์„œ ์˜ค๋Š” ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
  • operation.methods: ["GET"] โ†’ GET ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
  • operation.paths: ["/api/data"] โ†’ ํŠน์ • API ์—”๋“œํฌ์ธํŠธ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๐Ÿ’ก Istio๋Š” ๋„คํŠธ์›Œํฌ ๊ณ„์ธต(L3/L4)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต(L7)๊นŒ์ง€ ์„ธ๋ฐ€ํ•œ ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 3. Istio์˜ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ํ™œ์šฉ ์‚ฌ๋ก€

โœ… 3.1 ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ

์•„๋ž˜ AuthorizationPolicy๋Š” namespace: production์˜ ์„œ๋น„์Šค๋Š” namespace: staging์˜ ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-staging-to-production
  namespace: production
spec:
  action: DENY
  rules:
    - from:
        - source:
            namespaces: ["staging"]  # staging ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ

๐Ÿ’ก ์šด์˜(Production) ํ™˜๊ฒฝ์˜ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋ถˆํ•„์š”ํ•œ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


โœ… 3.2 ๋‚ด๋ถ€ ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ์ œํ•œ ๋ฐ ํŠน์ • IP ํ—ˆ์šฉ

์•„๋ž˜ AuthorizationPolicy๋Š” ์™ธ๋ถ€ IP(์˜ˆ: ๋กœ์ปฌ VPN IP)์—์„œ๋งŒ ํŠน์ • API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: allow-vpn-access
  namespace: default
spec:
  action: ALLOW
  rules:
    - from:
        - source:
            ipBlocks: ["192.168.1.0/24"]  # VPN IP ๋Œ€์—ญ์—์„œ๋งŒ ์ ‘๊ทผ ํ—ˆ์šฉ
      to:
        - operation:
            paths: ["/secure-api"]

๐Ÿ’ก ๋‚ด๋ถ€ VPN ์‚ฌ์šฉ์ž๋งŒ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 4. Istio ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ ์šฉ ํ›„ ํ™•์ธ ๋ฐฉ๋ฒ•

โœ… 4.1 ์ ์šฉ๋œ AuthorizationPolicy ํ™•์ธ

ํ˜„์žฌ ์ ์šฉ๋œ AuthorizationPolicy๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get authorizationpolicy -n default

โœ… 4.2 ํŠน์ • ์„œ๋น„์Šค์˜ ์ ‘๊ทผ ํ…Œ์ŠคํŠธ

curl -H "Authorization: Bearer " https://api.example.com/secure-api

๐Ÿ’ก ์œ ํšจํ•œ JWT๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ์ •์ฑ…์— ์˜ํ•ด ์ฐจ๋‹จ๋œ ์š”์ฒญ์ด๋ฉด 403 Forbidden ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

  • Kubernetes์˜ NetworkPolicy๋Š” L3/L4(Network Layer)์—์„œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ œํ•œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Istio์˜ AuthorizationPolicy๋Š” L7(Application Layer)๊นŒ์ง€ ์ œ์–ด ๊ฐ€๋Šฅํ•˜์—ฌ, HTTP ์š”์ฒญ ์ˆ˜์ค€์˜ ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์ œํ•œํ•˜๊ณ , ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” IP ๊ธฐ๋ฐ˜์œผ๋กœ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Istio์˜ ๋ณด์•ˆ ์ •์ฑ…์„ ํ™œ์šฉํ•˜๋ฉด ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ์–ดํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90