1. ๊ฐœ์š”

Pod ๋Š” ์ผํšŒ์šฉ์ด๋ผ ์ฃฝ๊ณ  ๋‹ค์‹œ ๋œฐ ๋•Œ๋งˆ๋‹ค IP ๊ฐ€ ๋ฐ”๋€๋‹ค. ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋ฉด ์ „๋ถ€ ๋ฐ”๋€๋‹ค. ๋‹ค๋ฅธ ์•ฑ์ด Pod IP ๋ฅผ ์ง์ ‘ ์ ์–ด ๋‘๋ฉด ๊ธˆ๋ฐฉ ๊นจ์ง„๋‹ค. Service ๋Š” ์ด ๋ฌธ์ œ์˜ ๋‹ต์ด๋‹ค. ๋ฐ”๋€Œ๋Š” Pod ๋“ค ์•ž์— ๊ณ ์ •๋œ ์ฃผ์†Œ ํ•˜๋‚˜๋ฅผ ๋‘๊ณ , ์š”์ฒญ์„ ์ง€๊ธˆ ์‚ด์•„ ์žˆ๋Š” Pod ๋กœ ๋‚˜๋ˆ  ์ค€๋‹ค.


2. ํ•ต์‹ฌ ๋‚ด์šฉ

2-1. ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ๋กœ Pod ๋ฅผ ์ฐพ๋Š”๋‹ค

Service ๋Š” Pod ์˜ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ๋ผ๋ฒจ๋กœ ๋Œ€์ƒ์„ ๊ณ ๋ฅธ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web          # app=web ๋ผ๋ฒจ์ด ๋ถ™์€ Pod ๊ฐ€ ๋Œ€์ƒ
  ports:
    - port: 80        # Service ๊ฐ€ ๋ฐ›๋Š” ํฌํŠธ
      targetPort: 8080 # Pod ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ

Deployment ๊ฐ€ Pod ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด๋„ ๊ฐ™์€ ๋ผ๋ฒจ์ด ๋ถ™์–ด ์žˆ์œผ๋‹ˆ Service ๋Š” ์ž๋™์œผ๋กœ ์ƒˆ Pod ๋ฅผ ๋Œ€์ƒ์— ๋„ฃ๋Š”๋‹ค. ๋ฐ˜๋Œ€๋กœ ์…€๋ ‰ํ„ฐ ๋ผ๋ฒจ์ด Pod ์˜ ๋ผ๋ฒจ๊ณผ ํ•œ ๊ธ€์ž๋ผ๋„ ๋‹ค๋ฅด๋ฉด ๋Œ€์ƒ์ด 0๊ฐœ๊ฐ€ ๋œ๋‹ค. Service ๋Š” ๋งŒ๋“ค์–ด์ง€๊ณ  ์•„๋ฌด ์—๋Ÿฌ๋„ ์—†๋Š”๋ฐ ์—ฐ๊ฒฐ๋งŒ ์•ˆ ๋œ๋‹ค.

2-2. EndpointSlice

์…€๋ ‰ํ„ฐ์— ๋งž๋Š” Pod ๋“ค์˜ ์‹ค์ œ ์ฃผ์†Œ ๋ชฉ๋ก์€ EndpointSlice ๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ์— ๊ธฐ๋ก๋œ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ด ๋ชฉ๋ก์„ ๊ณ„์† ๊ฐฑ์‹ ํ•œ๋‹ค.

kubectl get endpointslices -l kubernetes.io/service-name=web

์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ€๋Š” ์กฐ๊ฑด์ด ์ค‘์š”ํ•˜๋‹ค. readiness ๋ฅผ ํ†ต๊ณผํ•œ Pod ๋งŒ ํŠธ๋ž˜ํ”ฝ ๋Œ€์ƒ์ด ๋œ๋‹ค. 2ํŽธ์—์„œ readiness ์‹คํŒจ๊ฐ€ โ€œService ๋Œ€์ƒ์—์„œ ๋น ์ง„๋‹คโ€ ์˜€๋˜ ๊ฒŒ ์ด ๋ชฉ๋ก์—์„œ ์ฃผ์†Œ๊ฐ€ ๋น ์ง„๋‹ค๋Š” ๋œป์ด๋‹ค. Service ๋กœ ์—ฐ๊ฒฐ์ด ์•ˆ ๋  ๋•Œ endpoints ๊ฐ€ ๋น„์–ด ์žˆ๋Š”์ง€๋ถ€ํ„ฐ ๋ณด๋ฉด ์›์ธ์ด ๋ผ๋ฒจ์ธ์ง€ readiness ์ธ์ง€ ๊ฐˆ๋ฆฐ๋‹ค.

2-3. ํƒ€์ž… ์„ธ ๊ฐ€์ง€

ํƒ€์ž…์ ‘๊ทผ ๋ฒ”์œ„์šฉ๋„
ClusterIP (๊ธฐ๋ณธ)ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ๋งŒ์„œ๋น„์Šค ๊ฐ„ ๋‚ด๋ถ€ ํ†ต์‹ 
NodePort๋ชจ๋“  ๋…ธ๋“œ์˜ ํŠน์ • ํฌํŠธ(๊ธฐ๋ณธ 30000-32767)๊ฐ„๋‹จํ•œ ์™ธ๋ถ€ ๋…ธ์ถœ, ํ…Œ์ŠคํŠธ
LoadBalancerํด๋ผ์šฐ๋“œ๋‚˜ ๋ณ„๋„ ๊ตฌํ˜„์ฒด๊ฐ€ ์™ธ๋ถ€ IP ๋ฅผ ํ• ๋‹น์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ ์ง„์ž…์ 

์…‹์€ ์„œ๋กœ ํฌํ•จ ๊ด€๊ณ„๋‹ค. LoadBalancer ๋Š” NodePort ๋ฅผ ๋งŒ๋“ค๊ณ , NodePort ๋Š” ClusterIP ๋ฅผ ๋งŒ๋“ ๋‹ค. ์˜จํ”„๋ ˆ๋ฏธ์Šค๋‚˜ ํ™ˆ๋žฉ์—์„œ๋Š” LoadBalancer ๋ฅผ ๊ตฌํ˜„ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ๋”ฐ๋กœ ์žˆ์–ด์•ผ ์™ธ๋ถ€ IP ๊ฐ€ ๋ถ™๋Š”๋‹ค. HTTP ์š”์ฒญ์„ ํ˜ธ์ŠคํŠธ๋‚˜ ๊ฒฝ๋กœ๋กœ ๋‚˜๋ˆ  ๋ฐ›๋Š” ๋ฌธ์ œ๋Š” Service ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์Œ ํŽธ์˜ Ingress ์™€ Gateway ๊ฐ€ ๋งก๋Š”๋‹ค.

2-4. ํด๋Ÿฌ์Šคํ„ฐ DNS

Service ๋ฅผ ๋งŒ๋“ค๋ฉด DNS ์ด๋ฆ„์ด ์ƒ๊ธด๋‹ค. ํ˜•์‹์€ ์ด๋ ‡๋‹ค.

<์„œ๋น„์Šค>.<๋„ค์ž„์ŠคํŽ˜์ด์Šค>.svc.cluster.local

๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์—์„œ๋Š” web ๋งŒ ์จ๋„ ๋œ๋‹ค. ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ db ์„œ๋น„์Šค๋Š” db.data ๋‚˜ ์ „์ฒด ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅธ๋‹ค. Pod ์˜ /etc/resolv.conf ์— ๊ฒ€์ƒ‰ ๋„๋ฉ”์ธ์ด ๋“ค์–ด ์žˆ์–ด์„œ ์งง์€ ์ด๋ฆ„์ด ํ’€๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ์ ‘๋ฏธ์‚ฌ cluster.local ์€ ๊ธฐ๋ณธ๊ฐ’์ด๊ณ  ํด๋Ÿฌ์Šคํ„ฐ๋งˆ๋‹ค ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

# ์ž„์‹œ Pod ์—์„œ ์ด๋ฆ„์ด ํ’€๋ฆฌ๋Š”์ง€ ํ™•์ธ
kubectl run tmp --rm -it --image=busybox:1.36 --restart=Never -- nslookup web

2-5. ์–ด๋””์„œ ์‹ค์ˆ˜ํ•˜๋‚˜

  • ์…€๋ ‰ํ„ฐ ๋ผ๋ฒจ๊ณผ Pod ๋ผ๋ฒจ ๋ถˆ์ผ์น˜. kubectl get endpointslices ๊ฐ€ ๋น„์–ด ์žˆ๋‹ค.
  • port ์™€ targetPort ๋ฅผ ํ˜ผ๋™ํ•œ๋‹ค. targetPort ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹ค์ œ๋กœ ๋“ฃ๋Š” ํฌํŠธ๋‹ค.
  • ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์„œ๋น„์Šค๋ฅผ ์งง์€ ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅธ๋‹ค. ์•ˆ ํ’€๋ฆฐ๋‹ค.
  • ์ƒˆ Pod ๊ฐ€ ๋œฌ ์งํ›„ ๋ช‡ ์ดˆ๊ฐ„ ์—ฐ๊ฒฐ์ด ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒƒ์€ Service ๋ฌธ์ œ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์ •์ฑ…์ด ๋ฐ˜์˜๋˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๋‚ด์šฉ์€ NetworkPolicy default-deny ์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ๋ก ์—์„œ ๋‹ค๋ค˜๋‹ค.

3. ๋งˆ๋ฌด๋ฆฌ

์š”์•ฝ

  • Service ๋Š” ๋ฐ”๋€Œ๋Š” Pod IP ์•ž์˜ ๊ณ ์ • ์ฃผ์†Œ์ด๊ณ , ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ๋กœ ๋Œ€์ƒ์„ ๊ณ ๋ฅธ๋‹ค.
  • ๋Œ€์ƒ ์ฃผ์†Œ ๋ชฉ๋ก์€ EndpointSlice ์— ์žˆ๊ณ , readiness ๋ฅผ ํ†ต๊ณผํ•œ Pod ๋งŒ ๋“ค์–ด๊ฐ„๋‹ค.
  • ClusterIP ๋Š” ๋‚ด๋ถ€์šฉ, NodePort ๋Š” ๋…ธ๋“œ ํฌํŠธ ๋…ธ์ถœ, LoadBalancer ๋Š” ์™ธ๋ถ€ IP ํ• ๋‹น์ด๋‹ค.
  • ์ด๋ฆ„์€ ์„œ๋น„์Šค.๋„ค์ž„์ŠคํŽ˜์ด์Šค.svc.cluster.local ์ด๊ณ  ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„๋งŒ์œผ๋กœ ํ’€๋ฆฐ๋‹ค.

๋‹ค์Œ์€ Kubernetes ๊ธฐ์ดˆ 5 - Ingress ์™€ Gateway API์ด๋‹ค.