Post

[Kubernetes] ์„œ๋น„์Šค(Service)

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํ‚น์˜ ํ•ต์‹ฌ์ธ ์„œ๋น„์Šค(Service)๋ฅผ ์ •๋ฆฌํ•œ๋‹ค. ํŒŒ๋“œ๋Š” ์žฌ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค IP๊ฐ€ ๋ฐ”๋€Œ๋Š”๋ฐ, ์„œ๋น„์Šค๋Š” ๊ณ ์ •๋œ ์ ‘์ ์„ ์ œ๊ณตํ•ด ์•ˆ์ •์ ์ธ ํ†ต์‹ ์„ ๋ณด์žฅํ•œ๋‹ค. ์ข…๋ฅ˜(ClusterIPยทNodePortยทLoadBalancerยทExternalName)์™€ ๋™์ž‘ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณธ๋‹ค.

Service๋ž€? ์—ฌ๋Ÿฌ ํŒŒ๋“œ์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์ ‘์†์„ ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ถ”์ƒ ๊ฐ์ฒด. ํŒŒ๋“œ IP๋Š” ๋ณ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„œ๋น„์Šค๋Š” ๊ณ ์ • IP + DNS ์ด๋ฆ„์„ ์ œ๊ณตํ•˜๊ณ , ํŠธ๋ž˜ํ”ฝ์„ ํŒŒ๋“œ์— ๋ถ€ํ•˜ ๋ถ„์‚ฐํ•œ๋‹ค.


1. ์™œ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•œ๊ฐ€

ํŒŒ๋“œ์˜ IP๋Š” ์žฌ์ƒ์„ฑ ์‹œ ๋ฐ”๋€๋‹ค. ํŒŒ๋“œ IP๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๋ฉด ํ†ต์‹ ์ด ๋Š๊ธด๋‹ค. ์„œ๋น„์Šค๊ฐ€ ๊ทธ ์•ž์—์„œ ๊ณ ์ • ์ ‘์  ์—ญํ• ์„ ํ•œ๋‹ค.

flowchart LR
    Client(("ํด๋ผ์ด์–ธํŠธ"))
    SVC["๐Ÿ”Œ Service<br/>(๊ณ ์ • IPยทDNS)"]
    P1["๐Ÿ“ฆ Pod"]
    P2["๐Ÿ“ฆ Pod"]
    P3["๐Ÿ“ฆ Pod"]
    Client --> SVC
    SVC --> P1 & P2 & P3
๊ธฐ๋Šฅ์„ค๋ช…
๊ณ ์ • IP/DNSํŒŒ๋“œ IP๊ฐ€ ๋ณ€ํ•ด๋„ ์„œ๋น„์Šค๋Š” ๊ทธ๋Œ€๋กœ
๋ถ€ํ•˜ ๋ถ„์‚ฐ์—ฌ๋Ÿฌ ํŒŒ๋“œ์— ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
์ž๋™ DNS ๋“ฑ๋ก์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผ

2. ์„œ๋น„์Šค ์ข…๋ฅ˜

๋…ธ์ถœ ๋ฒ”์œ„์— ๋”ฐ๋ผ 4๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค. NodePort๋Š” ClusterIP๋ฅผ, LoadBalancer๋Š” NodePort๋ฅผ ํฌํ•จํ•˜๋Š” ๋ˆ„์  ๊ตฌ์กฐ๋‹ค.

์ข…๋ฅ˜๋…ธ์ถœ ๋ฒ”์œ„์šฉ๋„
ClusterIPํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€๋งŒ(๊ธฐ๋ณธ๊ฐ’)ํŒŒ๋“œ ๊ฐ„ ๋‚ด๋ถ€ ํ†ต์‹ 
NodePort๋…ธ๋“œ IP:ํฌํŠธ๋กœ ์™ธ๋ถ€๊ฐ„๋‹จํ•œ ์™ธ๋ถ€ ๋…ธ์ถœ
LoadBalancerํด๋ผ์šฐ๋“œ ์™ธ๋ถ€ IP์‹ค์„œ๋น„์Šค ์™ธ๋ถ€ ๋…ธ์ถœ
ExternalName์™ธ๋ถ€ ๋„๋ฉ”์ธ ๋ณ„์นญ์™ธ๋ถ€ ์„œ๋น„์Šค ์ฐธ์กฐ

ClusterIP (๊ธฐ๋ณธ)

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-svc
spec:
  selector:
    app: myapp
  ports:
    - port: 80          # Service ํฌํŠธ
      targetPort: 8080  # Pod ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ
  type: ClusterIP

NodePort

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-svc
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30000   # ์™ธ๋ถ€ ์ ‘๊ทผ ํฌํŠธ(30000~32767)
  type: NodePort

LoadBalancer

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-svc
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080
  type: LoadBalancer

๐Ÿ’ก ๋ˆ„์  ๊ตฌ์กฐ๋ฅผ ๊ธฐ์–ตํ•˜์ž. NodePort๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ClusterIP๋ฅผ ๊ฐ–๊ณ , LoadBalancer๋Š” NodePort๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ฆ‰ LoadBalancer๋ฅผ ๋งŒ๋“ค๋ฉด ClusterIPยทNodePort ๊ธฐ๋Šฅ๋„ ํ•จ๊ป˜ ๋”ธ๋ ค์˜จ๋‹ค. ์™ธ๋ถ€ ๋…ธ์ถœ์€ ํด๋ผ์šฐ๋“œ๋ฉด LoadBalancer, ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ…Œ์ŠคํŠธ๋ฉด NodePort๊ฐ€ ์ผ๋ฐ˜์ ์ด๋‹ค.


3. ์‹ค์Šต โ€” ๋ช…๋ น์–ด๋กœ ์„œ๋น„์Šค ์ƒ์„ฑ

kubectl expose๋กœ ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ํŒŒ๋“œ ์ƒ์„ฑ
kubectl run mypod --image=nginx --port=80

# ClusterIP (๋‚ด๋ถ€)
kubectl expose pod mypod --name=mypod-svc --type=ClusterIP --port=80

# NodePort (์™ธ๋ถ€: ๋…ธ๋“œIP:30001)
kubectl expose pod mypod --name=mypod-svc-nodeport --type=NodePort \
  --port=80 --target-port=80 --node-port=30001
curl <๋…ธ๋“œ IP>:30001

# LoadBalancer (ํด๋ผ์šฐ๋“œ ์™ธ๋ถ€ IP)
kubectl expose pod mypod --name=mypod-svc-lb --type=LoadBalancer --port=80 --target-port=80
kubectl get svc mypod-svc-lb

4. ์„œ๋น„์Šค ๋™์ž‘ ์›๋ฆฌ โ€” kube-proxy

์„œ๋น„์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ ๋…ธ๋“œ์˜ kube-proxy๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค. kube-proxy๋Š” iptablesยทIPVS ๊ทœ์น™์œผ๋กœ ์„œ๋น„์Šค์˜ ClusterIP๋กœ ์˜จ ํŠธ๋ž˜ํ”ฝ์„ ์ ์ ˆํ•œ ํŒŒ๋“œ๋กœ ๋ผ์šฐํŒ…ํ•œ๋‹ค.

๐Ÿ’ก ์„œ๋น„์Šค๋Š” ์‹ค์ฒด๊ฐ€ ์žˆ๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋‹ค. ClusterIP๋Š” ๊ฐ€์ƒ IP์ด๊ณ , ์‹ค์ œ ๋ผ์šฐํŒ…์€ ๊ฐ ๋…ธ๋“œ์˜ kube-proxy๊ฐ€ ๋งŒ๋“  iptables ๊ทœ์น™์ด ๋‹ด๋‹นํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํŒŒ๋“œ๊ฐ€ ๋Š˜๊ฑฐ๋‚˜ ์ค„์–ด๋„ kube-proxy๊ฐ€ ๊ทœ์น™์„ ๊ฐฑ์‹ ํ•ด ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค
โ”œโ”€ ์ด์œ     ํŒŒ๋“œ IP ๋ณ€๋™ โ†’ ๊ณ ์ • ์ ‘์  ํ•„์š”
โ”œโ”€ ์ข…๋ฅ˜    ClusterIP(๋‚ด๋ถ€) โŠ‚ NodePort(๋…ธ๋“œํฌํŠธ) โŠ‚ LoadBalancer(์™ธ๋ถ€IP)
โ”œโ”€ ๋ถ€ํ•˜๋ถ„์‚ฐ selector๋กœ ํŒŒ๋“œ ๊ทธ๋ฃน์— ๋ถ„์‚ฐ
โ””โ”€ ์›๋ฆฌ    kube-proxy + iptables/IPVS
์ข…๋ฅ˜ํ•œ ์ค„ ์ •์˜
ClusterIP๋‚ด๋ถ€ ์ „์šฉ ๊ณ ์ • IP
NodePort๋…ธ๋“œ ํฌํŠธ๋กœ ์™ธ๋ถ€ ๋…ธ์ถœ
LoadBalancerํด๋ผ์šฐ๋“œ ์™ธ๋ถ€ IP

์„œ๋น„์Šค์˜ ํ•ต์‹ฌ์€ ๋ณ€ํ•˜๋Š” ํŒŒ๋“œ IP ์•ž์— ๊ณ ์ • ์ ‘์ ์„ ๋‘๊ณ  ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋…ธ์ถœ ๋ฒ”์œ„์— ๋”ฐ๋ผ ClusterIP โ†’ NodePort โ†’ LoadBalancer๋กœ ํ™•์žฅ๋˜๋ฉฐ, ์‹ค์ œ ๋™์ž‘์€ kube-proxy๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.