๋„คํŠธ์›Œํฌ ์ •์ฑ… ๊ตฌ์„ฑ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋“œ๊ฐ€ ๋“ค์–ด์˜ค๋Š”(๋˜๋Š” ์ธ๊ทธ๋ ˆ์Šค) ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๊ณ  ๋‚˜๊ฐ€๋Š”(๋˜๋Š” ์ด๊ทธ๋ ˆ์Šค) ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋ฉด ํฌ๋“œ ๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋…ธ์ถœ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ์ •์ฑ…์€ OSI ๋ชจ๋ธ์˜ ๋ ˆ์ด์–ด 3 ๋˜๋Š” ๋ ˆ์ด์–ด 4์—์„œ ๋ฐฉํ™”๋ฒฝ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธ ๋˜๋Š” ์•”ํ˜ธํ™”์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํฌ๋“œ ๊ฐ์ฒด๋กœ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ ์ œํ•œ

NetworkPolicy ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฌ๋“œ์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์•ก์„ธ์Šค ์ •์ฑ…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NetworkPolicy ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ์ •์ฑ…์ด ์ ์šฉ๋˜๋Š” ํฌ๋“œ ๊ฐ์ฒด. ๋ผ๋ฒจ ๋ฐ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋“œ ๊ฐ์ฒด ๋ฐ ์›Œํฌ๋กœ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ์ •์ฑ…์ด ์˜ํ–ฅ์„ ์ฃผ๋Š” ํŠธ๋ž˜ํ”ฝ ์œ ํ˜•: ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ๊ทธ๋ ˆ์Šค, ๋‚˜๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ด๊ทธ๋ ˆ์Šค ๋˜๋Š” ๋‘˜ ๋‹ค

  • ์ธ๊ทธ๋ ˆ์Šค ์ •์ฑ…์˜ ๊ฒฝ์šฐ ์ง€์ •๋œ ํฌ๋“œ ๊ฐ์ฒด์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋“œ ๊ฐ์ฒด

  • ์ด๊ทธ๋ ˆ์Šค ์ •์ฑ…์˜ ๊ฒฝ์šฐ ์ง€์ •๋œ ํฌ๋“œ ๊ฐ์ฒด๊ฐ€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋“œ ๊ฐ์ฒด

์ˆ˜์‹  ํŠธ๋ž˜ํ”ฝ ์ œํ•œ ์˜ˆ์‹œ

์ด ์„น์…˜์—์„œ๋Š” ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ ์ œํ•œ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ๋ฅผ ์ž์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

  1. app=hello ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•ด์„œ ์›น ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ์ด๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    kubectl run hello-web --labels app=hello \
        --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 \
        --port 8080 --expose
    
  2. app=foo ํฌ๋“œ ๊ฐ์ฒด์—์„œ๋งŒ hello-web ํฌ๋“œ์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋„๋ก NetworkPolicy๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. AWS์šฉ GKE๋Š” ์ด ๋ผ๋ฒจ์ด ์—†๋Š” ํฌ๋“œ ๊ฐ์ฒด์—์„œ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ๊ณผ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ, ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํฌํ•จ๋œ ํฌ๋“œ ๊ฐ์ฒด์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” app=hello ๋ผ๋ฒจ์ด ์žˆ๋Š” ํฌ๋“œ ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•˜๊ณ  app=foo ๋ผ๋ฒจ์ด ์žˆ๋Š” ํฌ๋“œ ๊ฐ์ฒด์˜ ํŠธ๋ž˜ํ”ฝ๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์ธ๊ทธ๋ ˆ์Šค ์ •์ฑ…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: hello-allow-from-foo
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: hello
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app: foo
  3. ์ด ์ •์ฑ…์„ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    kubectl apply -f hello-allow-from-foo.yaml
    

์ธ๊ทธ๋ ˆ์Šค ์ •์ฑ… ํ™•์ธ

  1. ๋ผ๋ฒจ์ด app=foo์ธ ์ž„์‹œ ํฌ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด hello-web:8080 ์—”๋“œํฌ์ธํŠธ์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

    kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \
        -- wget -qO- --timeout=2 http://hello-web:8080
    

    ํฌ๋“œ app=foo์—์„œ app=hello ํฌ๋“œ ๊ฐ์ฒด๋กœ์˜ ํŠธ๋ž˜ํ”ฝ์ด ์‚ฌ์šฉ ์„ค์ •๋˜๋ฉด ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    Hello, world!
    Version: 1.0.0
    Hostname: hello-web-2258067535-vbx6z
    
  2. ๋‹ค๋ฅธ ๋ผ๋ฒจ(app=other)์ด ์žˆ๋Š” ์ž„์‹œ ํฌ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋™์ผํ•œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \
        -- wget -qO- --timeout=2 http://hello-web:8080
    

    ์ถœ๋ ฅ์—์„œ ์—ฐ๊ฒฐ์ด ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    wget: download timed out
    

ํฌ๋“œ ๊ฐ์ฒด์—์„œ ๋‚˜๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ ์ œํ•œ

๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ hello-web๊ณผ ๊ฐ™์€ ๋‚ด๋ถ€ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ ๋˜๋Š” www.example.com๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์ฟผ๋ฆฌํ•˜๋ ค๋ฉด TCP ๋ฐ UDP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌํŠธ 53์—์„œ DNS ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋Š” ์ด๊ทธ๋ ˆ์Šค ์ •์ฑ…์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ทธ๋ ˆ์Šค ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด DNS ํŠธ๋ž˜ํ”ฝ์€ ๋ฌผ๋ก  ๋ผ๋ฒจ์ด app=hello์ธ ํฌ๋“œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ๋งŒ ํ—ˆ์šฉํ•˜๋ฉด์„œ ๋ผ๋ฒจ์ด app=foo์ธ ํฌ๋“œ ๊ฐ์ฒด์—์„œ ์•„์›ƒ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๋Š” NetworkPolicy๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ํ—ˆ์šฉ ๋Œ€์ƒ 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ผ๋ฒจ์ด app=foo์ธ ํฌ๋“œ ๊ฐ์ฒด์—์„œ ์ด๊ทธ๋ ˆ์Šค ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๋Š” NetworkPolicy๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ผ๋ฒจ์ด app=hello์ธ ๋™์ผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํฌ๋“œ ๊ฐ์ฒด
  2. ํฌํŠธ 53์˜ ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€ ์—”๋“œํฌ์ธํŠธ(UDP ๋ฐ TCP)
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: foo-allow-to-hello
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: foo
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: hello
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP

์ด ์ •์ฑ…์„ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

kubectl apply -f foo-allow-to-hello.yaml

์ด๊ทธ๋ ˆ์Šค ์ •์ฑ… ๊ฒ€์ฆ

  1. hello-web-2๋ผ๋Š” ์ƒˆ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ์ด๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    kubectl run hello-web-2 --labels app=hello-2 \
      --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
    
  2. app=foo ๋ผ๋ฒจ๋กœ ์ž„์‹œ ํฌ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํฌ๋“œ๊ฐ€ hello-web:8080์— ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
      -- wget -qO- --timeout=2 http://hello-web:8080
    

    ํฌ๋“œ๊ฐ€ ์š”์ฒญ์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

    Hello, world!
    Version: 1.0.0
    Hostname: hello-web-2258067535-vbx6z
    
  3. ํฌ๋“œ๊ฐ€ hello-web-2:8080์— ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
        -- wget -qO- --timeout=2 http://hello-web-2:8080
    

    ์ถœ๋ ฅ์—์„œ ์—ฐ๊ฒฐ์ด ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    wget: download timed out
    
  4. ํฌ๋“œ๊ฐ€ www.example.com๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์›น ์‚ฌ์ดํŠธ์— ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \
        -- wget -qO- --timeout=2 http://www.example.com
    

    ์ถœ๋ ฅ์—์„œ ์—ฐ๊ฒฐ์ด ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    wget: download timed out
    

์‚ญ์ œ

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ ๋งŒ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml

๋‹ค์Œ ๋‹จ๊ณ„