# 07์žฅ ์„œ๋น„์Šค

Assembled by GimunLee


# ์„œ๋น„์Šค

  • ํŒŒ๋“œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ํ•œ๊ตฐ๋ฐ์— ๊ณ ์ •ํ•ด์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์„ ์˜ฎ๊ฒจ๋‹ค๋‹ˆ๋Š”๋ฐ ์ด ๊ณผ์ •์—์„œ ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ๋„ ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ํŒŒ๋“œ์˜ IP๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ๋„ ํ•จ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค๋Š” ์œ„์ฒ˜๋Ÿผ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ํŒŒ๋“œ๋“ค์— ๊ณ ์ •์ ์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ
  • ์„œ๋น„์Šค๋Š” ์ฃผ๋กœ L4 ์˜์—ญ(์ „์†ก๊ณ„์ธต)์—์„œ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉ๋จ

# ์„œ๋น„์Šค ํƒ€์ž…

  • ClustserIP

    • ๊ธฐ๋ณธ ์„œ๋น„์Šค ํƒ€์ž…์ด๋ฉฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ
    • ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ๋…ธ๋“œ๋‚˜ ํŒŒ๋“œ์—์„œ๋Š” ClusterIP๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋œ ํŒŒ๋“œ์— ์ ‘๊ทผ
    • ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ด์šฉ ๋ถˆ๊ฐ€
  • NodePort

    • ์„œ๋น„์Šค ํ•˜๋‚˜์— ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ง€์ •๋œ ํฌํŠธ๋ฅผ ํ• ๋‹น
    • ๋…ธ๋“œ์— ์ƒ๊ด€์—†์ด ์„œ๋น„์Šค์— ์ง€์ •๋œ ํฌํŠธ ๋ฒˆํ˜ธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํŒŒ๋“œ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํŠน์ง•์ด ์žˆ์Œ
    • ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ํŒŒ๋“œ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•
  • LoadBalancer

    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์žฅ๋น„์—์„œ ์‚ฌ์šฉ

    • ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์™€ ํŒŒ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ ํ›„ ํ•ด๋‹น ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ IP๋ฅผ ์ด์šฉํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ํŒŒ๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋กํ•จ

    • kubectl get service ๋ช…๋ น์œผ๋กœ ์„œ๋น„์Šค ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ฉด EXTERNAL-IP ํ•ญ๋ชฉ์— ์™ธ๋ถ€์—์„œ ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP ํ‘œ์‹œ

  • ExternalName

    • ์„œ๋น„์Šค๋ฅผ .spec.externalName ํ•„๋“œ์— ์„ค์ •ํ•œ ๊ฐ’๊ณผ ์—ฐ๊ฒฐ
    • ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ์™ธ๋ถ€์— ์ ‘๊ทผํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
    • ์ด ์„œ๋น„์Šค๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ์ ‘๊ทผํ•˜๋ฉด ์„ค์ •ํ•ด๋‘” CNAME๊ฐ’์„ ์ด์šฉํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ์™ธ๋ถ€์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์ด๋ฏ€๋กœ ์„ค์ •ํ•  ๋•Œ ์…€๋ ‰ํ„ฐ(.spec.selector ํ•„๋“œ)๊ฐ€ ํ•„์š” ์—†์Œ

# ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

# ๊ธฐ๋ณธ์ ์ธ ์„ค์ •

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP # ์„œ๋น„์Šค ํƒ€์ž… ์„ค์ • (default: ClusterIP)
  clusterIP: 10.0.10.10 # ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ IP ์„ค์ •
  selector:
    app: MyApp # ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐํ•œ ํŒŒ๋“œ์— ์„ค์ •ํ•œ .labes ํ•„๋“œ ๊ฐ’ ์„ค์ •
  ports: # ์„œ๋น„์Šค์—์„œ ํ•œ๊บผ๋ฒˆ์— ํฌํŠธ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์™ธ๋ถ€์— ์ œ๊ณตํ•  ๋•Œ๋Š” ํ•˜์œ„์— ํ•„๋“œ๊ฐ’์œผ๋กœ ์„ค์ •
  - protocol: TCP
    port: 80
    targetPort: 9376

# ๊ด€๋ จ ๋ช…๋ น์–ด

# ์ž์„ธํ•œ ์„œ๋น„์Šค ์ •๋ณด ์กฐํšŒ
$ kubectl describe service {์„œ๋น„์Šค ์ด๋ฆ„}

# ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ๋“ค์˜ IP ํ™•์ธ
$ kubectl get pods -o wide

# netshoot ์ปจํ…Œ์ด๋„ˆ ํ™œ์šฉํ•˜๊ธฐ

  • ClusterIP๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜ ๋„์›Œ์•ผํ•˜๋Š”๋ฐ, ์ด๋•Œ netshoot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ

    # ์ปจํ…Œ์ด๋„ˆ, ํŒŒ๋“œ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰
    $ kubectl run -it --generator=run-pod/v1 --image=nicolaka/netshoot --overrides='{"spec": {"nodeSelector": {"kubernetes.io/hostname": "{์›Œ์ปค๋ช…}" }}}' netshoot - bash
    
    # ์„œ๋น„์Šค ์ƒ์„ฑ
    $ kubectl expose deployment hello-kube --type=NodePort --name=hello-kube-service
    

# netshoot ์ปจํ…Œ์ด๋„ˆ

  • ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ์ถ”์ ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•œ ๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ

# ํ™œ์šฉ ์Šคํ…

$ kubectl run -it --image nicolaka/netshoot testnet bash

$ curl {clusterIP} # ๋งˆํฌ์—… ์ถœ๋ ฅ

# NodePort ํƒ€์ž… ์„œ๋น„์Šค ์‚ฌ์šฉ

  • NodePort ํƒ€์ž… ์„œ๋น„์Šค๋Š” ClusterIP์—์„œ ์„œ๋น„์Šค ์ด๋ฆ„, ํƒ€์ž… ์„ค์ •, ์ ‘์† ํฌํŠธ ์ด์™ธ์—๋Š” ์„ค์ •์ด ๊ฐ™์Œ

# LoadBalancer ํƒ€์ž… ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

  • LoadBalancer ํƒ€์ž… ์„œ๋น„์Šค๋Š” ClusterIP์—์„œ ์„œ๋น„์Šค ์ด๋ฆ„, ํƒ€์ž… ์„ค์ • ์ด์™ธ์—๋Š” ์„ค์ •์ด ๊ฐ™์Œ

# ExternalName ํƒ€์ž… ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

apiVersion: v1
kind: Service
metadata:
  name: externalname-service
spec:
  type: ExternalName # ํ•„๋“œ๊ฐ’ ์„ค์ •
  externalName: google.com # ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ์™ธ๋ถ€ ๋„๋ฉ”์ธ ๊ฐ’ ์„ค์ •

# ํ—ค๋“œ๋ฆฌ์Šค ์„œ๋น„์Šค

  • .spec.clusterIP ํ•„๋“œ ๊ฐ’์„ None์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ IP๊ฐ€ ์—†๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๋˜๋Š” ๋‹จ์ผ ์„œ๋น„์Šค IP๊ฐ€ ํ•„์š” ์—†์„ ๋•Œ ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • ํ—ค๋“œ๋ฆฌ์Šค ์„œ๋น„์Šค์— ์…€๋ ‰ํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ์—”๋“œํฌ์ธํŠธ์™€ ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐ๋œ ํŒŒ๋“œ๋ฅผ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ค๋Š” DNS A ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋จ
  • ์…€๋ ‰ํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„ DNS ์‹œ์Šคํ…œ์€ ExternalName ํƒ€์ž…์˜ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  CNAME ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋จ

# kube-proxy

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ํด๋Ÿฌ์Šคํ„ฐ IP๋‚˜ ๋…ธ๋“œ ํฌํŠธ๋กœ ์ ‘๊ทผํ• ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์‹ค์ œ ์กฐ์ž‘ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋ฉด์„œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ IP๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ์š”์ฒญ์„ ์ ์ ˆํ•œ ํŒŒ๋“œ๋กœ ์ „๋‹ฌ
  • kube-proxy๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ userspace, iptables, IPVS๊ฐ€ ์žˆ์Œ

# userspace ๋ชจ๋“œ

  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์š”์ฒญ์„ ํ•˜๋ฉด iptables์„ ๊ฑฐ์ณ์„œ kube-proxy ์š”์ฒญ์„ ๋ฐ›๊ณ , ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ IP๋Š” ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ์ ์ ˆํ•œ ํŒŒ๋“œ๋กœ ์—ฐ๊ฒฐํ•ด์คŒ
  • ์š”์ฒญ์„ ํŒŒ๋“œ๋“ค์— ๋‚˜๋ˆ  ์ค„ ๋•Œ๋Š” ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹ ์‚ฌ์šฉ

# i-tables ๋ชจ๋“œ

  • userspace ๋ชจ๋“œ์™€ ๋‹ค๋ฅธ ์ ์€ kube-proxy๊ฐ€ iptables๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ๋งŒ ํ•˜๊ณ  ์ง์ ‘ ํด๋ผ์ด์–ธํŠธ์—์„œ ํŠธ๋ž™ํ”ฝ์„ ๋ฐ›์ง€ ์•Š์Œ
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์€ iptables์„ ๊ฑฐ์ณ์„œ ํŒŒ๋“œ๋กœ ์ง์ ‘ ์ „๋‹ฌ(userspace ๋ชจ๋“œ๋ณด๋‹ค ์š”์ฒญ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ์ข‹์Œ)
  • userspace ๋ชจ๋“œ์—์„œ ์—ฐ๊ฒฐ ์š”์ฒญ์ด ์‹คํŒจํ•˜๋ฉด ์žฌ์‹œ๋„ํ•˜์ง€๋งŒ, i-tables ๋ชจ๋“œ์—์„œ๋Š” ์š”์ฒญ์ด ์‹คํŒจ
  • ์ปจํ…Œ์ด๋„ˆ์— readinessProbe๊ฐ€ ์„ค์ •๋˜์—ˆ๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ ํ—ฌ์Šค ์ฒดํฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋˜์–ด์•ผ ์—ฐ๊ฒฐ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง

# IPVS(IP Virtual Server) ๋ชจ๋“œ

  • ๋ฆฌ๋ˆ…์Šค ์ปค๋„์— ์žˆ๋Š” L4 ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ์ˆ 
  • ์ปค๋„ ๊ณต๊ฐ„์— ๋™์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— iptables ๋ชจ๋“œ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ƒ„

# ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • rr(round-robin): ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘์ง€ ์•Š๊ณ  ์ˆœ์„œ์™€ ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ CPU ํ• ๋‹น
  • lc(least connection): ์ ‘์† ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์€ ์„œ๋ฒ„ ์„ ํƒ
  • dh(destination hashing): ๋ชฉ์ ์ง€ IP ์ฃผ์†Œ๋กœ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ๋ถ„์‚ฐํ•  ์‹ค์ œ ์„œ๋ฒ„ ์„ ํƒ
  • sh(source hashing): ์ถœ๋ฐœ์ง€ IP ์ฃผ์†Œ๋กœ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ๋ถ„์‚ฐํ•  ์‹ค์ œ ์„œ๋ฒ„ ์„ ํƒ
  • sed(shorts expected deplay): ์‘๋‹ต ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅธ ์„œ๋ฒ„ ์„ ํƒ
  • nq(never queue): sed์™€ ๋น„์Šทํ•˜์ง€๋งŒ ํ™œ์„ฑ ์ ‘์† ๊ฐœ์ˆ˜๊ฐ€ 0์ธ ์„œ๋ฒ„๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์„ ํƒ

# Referenses

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ - 90๊ฐ€์ง€ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์ž๋™ํ™” ํ‘œ์ค€ / ๋™์–‘๋ถ์Šค
Last Updated: 8/12/2020, 1:33:42 PM