๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Container/Kubernetes

[Kubernetes] ํŒŒ๋“œ๋ฅผ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•˜๊ธฐ: ์„œ๋น„์Šค(Service)

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์‹œ์ž‘ํ•˜์„ธ์š”! ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ์ ์„ ์ฝ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ชฉ์  ํ•˜์— ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
 

Kubernetes


์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์†Œ๊ฐœํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ์ดˆ ๊ฐœ๋…์— ํฌํ•จ๋˜๋Š” ์„œ๋น„์Šค(Service)๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณธ๋‹ค. ์ €๋ฒˆ ํฌ์ŠคํŒ… ๋งˆ์ง€๋ง‰์— ๋ฐฐ์šด ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ๋“œ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํ•œ ๋ฒˆ์— ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ณ , ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ๊นŒ์ง€ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋“ฑ ์†์‰ฝ๊ฒŒ ๋ ˆํ”Œ๋ฆฌ์นด์…‹(ํŒŒ๋“œ๋“ค์˜ ๋ชจ์Œ)์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ํ•œ ๊ฐ€์ง€ ์žˆ๋Š”๋ฐ, ์™ธ๋ถ€(์™ธ๋ถ€๋ผ ํ•จ์€ ๋กœ์ปฌ ๋˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์™ธ๋ถ€)์—์„œ ํŒŒ๋“œ๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„œ๋น„์Šค๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ด ์„œ๋น„์Šค๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž.

1. ์™ธ๋ถ€์—์„œ๋„ ํŒŒ๋“œ์— ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ, ์„œ๋น„์Šค!

์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ํŒŒ๋“œ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ๋ฐฐ์šฐ๋ฉด์„œ ์ž‘์„ฑํ•œ YAML ํŒŒ์ผ์„ ๋ณด๋ฉด ํŒŒ๋“œ ํ…œํ”Œ๋ฆฟ ์˜์—ญ์—์„œ ํŒŒ๋“œ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉํ•  ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ containerPort ๋ผ๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค๊ณ  ํ•ด์„œ ์™ธ๋ถ€์—์„œ๋„ ํ•ด๋‹น ํŒŒ๋“œ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์„œ๋น„์Šค๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋Š” ํŒŒ๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™์„ ์ •์˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์„œ๋น„์Šค์—๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ, ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋งŒ ์—ด๊ฑฐํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ๋“œ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ณ ์œ ํ•œ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๋ถ€์—ฌ
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ๋•Œ, ์š”์ฒญ์„ ๋ถ„์‚ฐํ•˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰
  • ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ, ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์˜ ํฌํŠธ ๋“ฑ์„ ํ†ตํ•ด ํŒŒ๋“œ๋ฅผ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ

์œ„์—์„œ ์—ด๊ฑฐํ•œ ๊ธฐ๋Šฅ ์™ธ์— ์„œ๋น„์Šค๋Š” ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ์œ„ 3๊ฐ€์ง€ ๊ธฐ๋Šฅ๋งŒ ์•Œ์•„๋‘๋„๋ก ํ•˜์ž. ์ฐธ๊ณ ๋กœ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์˜ ํŒŒ๋“œ๋“ค ๊ฐ„์— ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์ฒ˜์Œ์— ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„ค์น˜ํ•  ๋•Œ ๊ฐ™์ด ์„ค์น˜ํ•œ calico ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋•๋ถ„์ด๋‹ค. ์ด calico๊ฐ€ ์ž๋™์œผ๋กœ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์˜ ํŒŒ๋“œ ๊ฐ„์— ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋„์ปค ์Šค์›œ๋•Œ์™€ ๋น„์Šทํ•˜๋‹ค.

 

์„œ๋น„์Šค์—๋Š” ์ข…๋ฅ˜๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ์„ค์ •ํ•˜๋Š” ์„œ๋น„์Šค ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํŒŒ๋“œ๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ  ์—†๊ณ ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ์ด์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์šฐ์„ ์€ ํŒŒ๋“œ๋ž‘ ์„œ๋น„์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด๊ธฐ ์œ„ํ•ด, ์•„๋ž˜ ๋‚ด์šฉ์˜ YAML ํŒŒ์ผ๋กœ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž. ํŒŒ๋“œ ์ƒ์„ฑ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€๋Š” ํŒŒ๋“œ์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ง์ ‘ ์ œ์ž‘์•ˆ ์ฑ… ์ €์ž๋ถ„์˜ ์ปค์Šคํ…€ ์ด๋ฏธ์ง€์ด๋‹ค.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zedd-hostname-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      name: zedd-webserver
      labels:
        app: webserver
    spec:
      containers:
      - name:  zedd-webserver-pod
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์„œ๋น„์Šค์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์งš์–ด๋ณด์ž.

2. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค, ClusterIP ์œ ํ˜•

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

 

apiVersion: v1
kind: Service
metadata:
  name: zedd-hostname-svc-clusterip
spec:
  ports:
  - name: web-port
    port: 8080
    targetPort: 80
  selector:
    app: webserver
  type: ClusterIP

 

์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•  ๋•Œ๋„ kubectl apply ๋ช…๋ น์–ด๋ฅผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด์ œ ์œ„ YAML ํŒŒ์ผ ๋‚ด์šฉ์˜ ๊ฐ ํ•ญ๋ชฉ์„ ์‚ดํŽด๋ณด์ž.

 

  • spec.selector : ํ•ด๋‹น ์„œ๋น„์Šค์—์„œ ์–ด๋– ํ•œ ๋ผ๋ฒจ์„ ๊ฐ–๋Š” ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ '๋ผ๋ฒจ'์ด๋ผ๋Š” ๊ฒƒ์€ ์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์šด ๋ ˆํ”Œ๋ฆฌ์นด์…‹๊ณผ ํŒŒ๋“œ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฆ‰ ํŒŒ๋“œ ํ…œํ”Œ๋ฆฟ ๋‚ด์— ์ •์˜ํ•˜๋Š” LabelSelector๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • spec.ports.port : ์ƒ์„ฑ๋œ ์„œ๋น„์Šค๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ ํ•œ IP(ClusterIP ๋ผ๊ณ  ๋ถ€๋ฆ„)๋ฅผ ํ• ๋‹น ๋ฐ›๋Š”๋ฐ, port ํ•ญ๋ชฉ์—๋Š” ๊ทธ ๊ณ ์œ ํ•œ IP์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•  ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • spec.ports.targetPort : ์œ„์—์„œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ์ ์šฉํ•œ YAML ํŒŒ์ผ ์ฆ‰, ํŒŒ๋“œ ํ…œํ”Œ๋ฆฟ ๋‚ด์—์„œ ์ •์˜ํ•œ ํŒŒ๋“œ๊ฐ€ ์‚ฌ์šฉํ•  ํฌํŠธ ์ฆ‰, containerPort ํ•ญ๋ชฉ์— ์„ค์ •๋œ ํฌํŠธ๋ฒˆํ˜ธ์™€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

 

์„œ๋น„์Šค๋ฅผ ์ž˜ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ ์„œ๋น„์Šค ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•ด๋ณด์ž.

 

 

๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š์€ kubernetes ๋ผ๋Š” ์ด๋ฆ„์˜ ์„œ๋น„์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ๋„ ClusterIP ์œ ํ˜•์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” ํŒŒ๋“œ ๋‚ด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ API์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋น„์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ง€๊ธˆ ์ƒํ™ฉ์—์„œ๋Š” ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด ์•„๋‹ˆ๋‹ˆ ์Šคํ‚ตํ•˜์ž.

 

๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•œ ClusterIP ์„œ๋น„์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ํŒŒ๋“œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์œ„ ์ถœ๋ ฅํ™”๋ฉด์—์„œ CLUSTER-IP ์™€ PORT(S) ํ•ญ๋ชฉ์— ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” ๊ฐ’๋“ค์„ ์ด์šฉํ•ด์„œ ์š”์ฒญ์„ ํ•˜๋ฉด ๋œ๋‹ค. ๋‹ค๋ฅธ ์›Œ์ปค ๋…ธ๋“œ๋กœ ์ ‘์†ํ•ด์„œ ํ•ด๋‹น "IP:ํฌํŠธ๋ฒˆํ˜ธ" ํ˜•ํƒœ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ณด์ž.

 

 

curl ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ, ๋ฆฌํ„ด๋˜๋Š” response๋ฅผ ๋ณด๋ฉด ํŒŒ๋“œ์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„์ด ๋ฆฌํ„ด๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์•„๊นŒ ์œ„์—์„œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ฐ™์ด ์ƒ์„ฑ๋œ ํŒŒ๋“œ๋“ค์ด๋‹ค. ์‹ค์ œ๋กœ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋กœ ์ด๋™์• ์„œ ํŒŒ๋“œ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์ด๋ฆ„์ด ๋™์ผํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

๋˜ ํ•œ ๊ฐ€์ง€ ์‚ดํŽด๋ณผ ๊ฒƒ์€ curl ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค response ๋˜๋Š” ํŒŒ๋“œ์˜ ์ด๋ฆ„์ด ๋งค๋ฒˆ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋“œ์— ์ž๋™์œผ๋กœ ์š”์ฒญ์ด ๋ถ„์‚ฐ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ณ„๋„์˜ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ์„œ๋น„์Šค๋Š” ์—ฐ๊ฒฐ๋œ ํŒŒ๋“œ๋“ค์— ๋Œ€ํ•ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ๋Š” IP ๋ฐ ํฌํŠธ๋ฒˆํ˜ธ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ์ง€๋งŒ, ์ƒ์„ฑํ•œ ClusterIP ์„œ๋น„์Šค ์ด๋ฆ„ ์ž์ฒด๋งŒ์œผ๋กœ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋‚ด๋ถ€์ ์œผ๋กœ DNS๋ฅผ ๊ตฌ๋™ํ•˜๊ณ  ์žˆ๊ณ , ํŒŒ๋“œ๋“ค์€ ์ž๋™์œผ๋กœ ์ด DNS๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” CoreDNS ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ, ์ฃผ์˜ํ•  ์ ์€ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•˜๋ ค๋ฉด ํŠน์ • ํŒŒ๋“œ ๋‚ด๋ถ€์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋งŒ์•ฝ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋ฉด ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ๋Š” ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ์„œ๋น„์Šค์˜ ClusterIP ์ฃผ์†Œ๋กœ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.(์ €์ž๋ถ„ Q&A)

3. ํŒŒ๋“œ๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋Š” ์„œ๋น„์Šค, NodePort ์œ ํ˜•

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

 

apiVersion: v1
kind: Service
metadata:
  name: zedd-hostname-svc-nodeport
spec:
  ports:
  - name: web-port
    port: 8080
    targetPort: 80
  selector:
    app: webserver
  type: NodePort

 

์œ„ ํŒŒ์ผ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๊ณ  NodePort ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด๋„๋ก ํ•˜์ž.

 

 

์ƒ์„ฑํ•œ NodePort ์„œ๋น„์Šค๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž. ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์€ PORT(S) ํ•ญ๋ชฉ์— 31033 ์ด๋ผ๋Š” ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํฌํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋‚ด๋ถ€ IP ๋˜๋Š” ์™ธ๋ถ€ IP๋ฅผ ํ†ตํ•ด 31033 ํฌํŠธ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋™์ผํ•œ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์‹ค์ œ๋กœ, ๋ชจ๋“  ๋…ธ๋“œ์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์‚ดํŽด๋ณด์ž. ์šฐ์„  ๋…ธ๋“œ์˜ ๋‚ด๋ถ€ IP๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.

 

 

์ด์ œ ๊ฐ ๋…ธ๋“œ์˜ ๋‚ด๋ถ€ IP ๋ฒˆํ˜ธ์™€ ํฌํŠธ๋ฒˆํ˜ธ 31033์„ ๊ฒฐํ•ฉํ•ด์„œ ์š”์ฒญ์„ ๋‚ ๋ ค๋ณด์ž. ์ž˜ ์‘๋‹ต์ด ๋˜๊ณ  ์žˆ๋‹ค.

 

 

๋งŒ์•ฝ GKE๋‚˜ EKS๋ฅผ ์“ฐ๊ณ  ์„ค์ •์„ ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ๊ฐ ๋…ธ๋“œ์˜ ๋žœ๋คํ•œ ํฌํŠธ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ฐฉํ™”๋ฒฝ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ์ฑ… ๋‚ด์šฉ์˜ 322ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์ž. 

 

์œ„ YAML ์˜ˆ์‹œ์—์„œ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์— ๊ณตํ†ต์ ์œผ๋กœ ๊ฐœ๋ฐฉํ•  ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋žœ๋ค์œผ๋กœ ์„ค์ •ํ•˜๋„๋ก ํ–ˆ์ง€๋งŒ, ์ด๊ฒƒ๋„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. YAML ํŒŒ์ผ ๋‚ด spec.ports.nodePort ํ•ญ๋ชฉ์— ๋ณ„๋„๋กœ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

๊ทธ๋Ÿฐ๋ฐ, NodePort ์œ ํ˜•์˜ ์„œ๋น„์Šค์—ฌ๋„ CLUSTER-IP ํ•ญ๋ชฉ์— ๋‚ด๋ถ€ IP๊ฐ€ ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” NodePort ์„œ๋น„์Šค๊ฐ€ ClusterIP์˜ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ NodePort ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ ์–‘์ชฝ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒƒ์ด๋‹ค. 

 

๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ๋กœ ์šด์˜ ํ™˜๊ฒฝ์—์„œ NodePort ์„œ๋น„์Šค๋ฅผ ์™ธ๋ถ€์— ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ง€ ์•Š๋‹ค. ์™œ๋ƒํ•˜๋ฉด NodePort์—์„œ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ 80 ๋˜๋Š” 443์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ์—๋Š” ์ ์ ˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์„ค๊ณ„ ์ƒ,  NodePort๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํฌํŠธ๋ฒˆํ˜ธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 30000 ~ 32767 ๋ฒˆ ์‚ฌ์ด๋กœ ์ œํ•œ์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ 80๋ฒˆ์ด๋‚˜ 443๋ฒˆ์€ ํ•ด๋‹น ๋ฒˆํ˜ธ์˜ ๋ฒ”์œ„ ๋ฐ–์— ์žˆ๋‹ค. ๋˜ํ•œ SSL ์ธ์ฆ์„œ ์ ์šฉ, ๋ผ์šฐํŒ… ๋“ฑ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ์„ค์ •์„ NodePort ์„œ๋น„์Šค์— ์ ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ, NodePort ์„œ๋น„์Šค ๊ทธ ์ž์ฒด๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ์™ธ๋ถ€๋กœ ์ œ๊ณตํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ธ๊ทธ๋ ˆ์Šค(Ingress)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์˜ค๋ธŒ์ ํŠธ์—์„œ ๊ฐ„์ ‘์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ธ๊ทธ๋ ˆ์Šค์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„์— ๋ฐฐ์šธ ์˜ˆ์ •์ด์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” '์™ธ๋ถ€ request ์š”์ฒญ์„ ์‹ค์ œ๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ๊ด€๋ฌธ'์œผ๋กœ๋งŒ ๊ฐœ๋…์ ์œผ๋กœ ์ดํ•ดํ•ด๋‘์ž. ์ธ๊ทธ๋ ˆ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ์•„๋ž˜์—์„œ ๋ฐฐ์šธ LoadBalancer ์™€ NodePort๋ฅผ ํ•ฉ์ณ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ž‘ ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค, LoadBalancer ์œ ํ˜•

๋‹ค์Œ์€ ์„œ๋น„์Šค ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•ด ํŒŒ๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์„œ๋น„์Šค์ด๋‹ค. NodePort ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋…ธ๋“œ์˜ IP๋ฅผ ์•Œ์•„์•ผ๋งŒ ํŒŒ๋“œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์— ๋ฐฐ์šธ LoadBalancer ์œ ํ˜•์˜ ์„œ๋น„์Šค๋Š” ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์œผ๋กœ๋ถ€ํ„ฐ ๋„๋ฉ”์ธ ์ด๋ฆ„๊ณผ IP๋ฅผ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค. ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์— ์˜์กดํ•˜๋‹ค ๋ณด๋‹ˆ ๋ฐ˜๋“œ์‹œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” GCP, AWS์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋ฌผ๋ก  ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ๋„ MetaLB๋ผ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๊ธด ํ•˜์ง€๋งŒ MetalLB๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๊ณต์‹ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ง€์†์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ํ•„์ž๋„ GKE, EKS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— LoadBalancer ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ฑ… ์›๋ณธ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜๋„๋ก ํ•˜์ž. ์—ฌ๊ธฐ์—์„œ๋Š” ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

4-1. ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ, externalTrafficPolicy

๋Œ€์‹  ์—ฌ๊ธฐ์„œ๋Š” LoadBalancer ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ์œผ๋กœ์จ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„๋ฐฐํ•˜๋Š” ์ •์ฑ…์„ ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ ๊ฐ’์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐ”๋กœ externalTrafficPolicy ๋ผ๋Š” ์†์„ฑ๊ฐ’์ด๋‹ค. ์†์„ฑ ๊ฐ’์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ธฐ ์ „์— LoadBalancer ์œ ํ˜•์˜ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ, ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜จ ํŠธ๋ž˜ํ”ฝ์„ ์–ด๋–ป๊ฒŒ ๊ฐ ๋…ธ๋“œ, ๊ฐ ํŒŒ๋“œ์— ๋ถ„์‚ฐ์‹œํ‚ค๋Š”์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.

 

 

์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์€ ์›Œ์ปค ๋…ธ๋“œ 1 ์ฆ‰, Node 1๋กœ ๋“ค์–ด์˜จ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ ์š”์ฒญ์ด (1)๋ฒˆ ๋ฃจํŠธ๋ฅผ ํƒ€์ง€ ์•Š๊ณ  ๊ตณ์ด (2)๋ฒˆ ๋ฃจํŠธ๋ฅผ ํƒ€๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํ™‰(๋„คํŠธ์›Œํฌ ํ™‰์ด๋ž€)์ด ํ•œ ๋‹จ๊ณ„ ๋” ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ณ  ๋…ธ๋“œ ๊ฐ„์˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์–ด ํŠธ๋ž˜ํ”ฝ์˜ ์ถœ๋ฐœ์ง€ ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ๋Š” SNAT(SNAT์ด๋ž€)๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ IP ์ฃผ์†Œ ๋˜ํ•œ ๋ณด์กด๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์„œ๋น„์Šค ์ƒ์„ฑ ์‹œ ์„ค์ •ํ•˜๋Š” YAML ํŒŒ์ผ์—์„œ externalTrafficPolicy ํ•ญ๋ชฉ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  ์œ„์™€ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๋ฐฉ์‹์€ Cluster ๋ผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ Local ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ๋…ธ๋“œ์—์„œ๋งŒ ํŒŒ๋“œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์œ„ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด, Node 1๋กœ ๋“ค์–ด์˜ค๊ฒŒ ๋œ ์š”์ฒญ๋“ค์€ ๋ชจ๋‘ Node 1 ๋‚ด์˜ ํŒŒ๋“œ๋“ค์—๊ฒŒ๋งŒ ์š”์ฒญ์ด ๊ฐ€๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹น์—ฐํžˆ Cluster ๋ฐฉ์‹์—์„œ ๋ฐœ์ƒ๋˜์—ˆ๋˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ Local ๋ฐฉ์‹์ด ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ ๋…ธ๋“œ์— ํŒŒ๋“œ๊ฐ€ ๊ณ ๋ฅด์ง€ ์•Š๊ฒŒ ์Šค์ผ€์ฅด๋ง ๋˜์—ˆ๋‹ค๋ฉด ์š”์ฒญ์ด ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ๋˜์ง€ ์•Š๊ฒŒ ๋˜์–ด ๊ฐ ํŒŒ๋“œ๊ฐ€ ๋ฐ›๋Š” ๋ถ€ํ•˜์˜ ์–‘์ด ๋™์ผํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์–ด๋–ค ํŒŒ๋“œ๋Š” ๋งŽ์€ ์–‘์˜ ๋ถ€ํ•˜๋ฅผ ๋ฐ›๊ฒŒ ๋˜๊ณ , ๋‹ค๋ฅธ ํŒŒ๋“œ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ ์€ ์–‘์˜ ๋ถ€ํ•˜๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

 

 

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋˜๋ฉด ์›Œ์ปค ๋…ธ๋“œ 3์—์žˆ๋Š” ํŒŒ๋“œ๋งŒ ์œ ์ผํ•˜๊ฒŒ ํŠธ๋ž˜ํ”ฝ์˜ 50% ๋ถ€ํ•˜๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ž์› ํ™œ์šฉ๋ฅ  ์ธก๋ฉด์—์„œ ๋ถ€์ ์ ˆํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ Local ๋ฐฉ์‹๋„ ๋‹จ์ ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ ๋ฐฉ์‹ ์ค‘์— ์ •๋‹ต์€ ์—†๋‹ค. ๊ฐ ์ƒํ™ฉ์—์„œ ์–ด๋–ค ์š”์†Œ๋ฅผ ๋” ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ คํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

5. ํŒŒ๋“œ๊ฐ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๊ฒฐ๋˜๋„๋ก ํ•˜๋Š” ์„œ๋น„์Šค, ExternalName ์œ ํ˜•

๋‹ค์Œ์œผ๋กœ ์•Œ์•„๋ณผ ์„œ๋น„์Šค ์œ ํ˜•์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ExternalName ์„œ๋น„์Šค์ด๋‹ค. ์ด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์„œ๋น„์Šค๊ฐ€ ์™ธ๋ถ€ ๋„๋ฉ”์ธ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ YAML ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

apiVersion: v1
kind: Service
metadata:
  name: externalname-svc
spec:
  type: ExternalName
  externalName: my.database.com

 

์œ„ ํŒŒ์ผ๋กœ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ํŒŒ๋“œ๋“ค์€ externalname-svc ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒฝ์šฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋‚ด๋ถ€ DNS๊ฐ€ my.database.com์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก CNAME ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ํŒŒ๋“œ๊ฐ€ externalname-svc๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด my.database.com์— ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํŒŒ๋“œ๊ฐ€ ๊ธฐ์กด์— ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ๋ฐฉ๊ธˆ CNAME ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, CNAME ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ? ์ž‘์€ ๋ฐฐ๊ฒฝ์ง€์‹์œผ๋กœ ์•Œ์•„๋‘๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค. Canonical Name์˜ ์ค„์ž„๋ง๋กœ, ๋„๋ฉ”์ธ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๋œปํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, DNS์—๋Š” ํฌ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด 2๊ฐœ ์ข…๋ฅ˜์˜ ๋งคํ•‘ ๊ฐ’๋“ค์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. DNS ํ…Œ์ด๋ธ”์ด ์•„๋ž˜์™€ ๊ฐ™๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

์‚ฌ์šฉํ•˜๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„ ๋ณ€ํ™˜๋˜๋Š” ์‹ค์งˆ์ ์ธ ์ฃผ์†Œ
externalname-svc my.database.com
zedd-hostname-nodeport 11.22.33.44.55

 

๋‘ ๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž. ์šฐ๋ฆฌ๋Š” ์•„๊นŒ NodePort ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ zedd-hostname-nodeport ๋ผ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„์„ ๋ช…์‹œํ–ˆ๊ณ , ์ด๋Š” ClusterIP์™€ ๋งคํ•‘๋œ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค. ์ด๋ ‡๊ฒŒ ํŠน์ • ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ์ˆซ์ž ํ˜•ํƒœ์˜ IP ์ฃผ์†Œ๋กœ ๋งคํ•‘๋˜๋Š” ๊ฒƒ์„ A ๋ ˆ์ฝ”๋“œ๋ผ๊ณ  ํ•œ๋‹ค. 

 

๋ฐ˜๋ฉด์—, ์ฒซ ๋ฒˆ์งธ ํ–‰์ฒ˜๋Ÿผ ํŠน์ • ๋„๋ฉ”์ธ ์ด๋ฆ„(externalname-svc)์ด ์ˆซ์ž ํ˜•ํƒœ์˜ IP ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ๋˜ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ์ด๋ฆ„(my.database.com)์œผ๋กœ ๋งคํ•‘๋˜๋Š” ๊ฒƒ์„ CNAME ๋ ˆ์ฝ”๋“œ๋ผ๊ณ  ํ•œ๋‹ค.


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

๋ฐ˜์‘ํ˜•