[K8S] Service (NodePort / ClusterIP / LoadBalancer)

2022. 11. 14. 09:40ใ†๐ŸŽฏ OpenSource/K8S

Service ?

Worker Node์œ„์— ์ƒ์„ฑ๋œ pod๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
Service๋ฅผ ์ด์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž์˜ pod ์ ‘๊ทผ ๋ฐ pod <-> pod ์˜ ํšจ์œจ์ ์ธ ๋‚ด๋ถ€์ ‘๊ทผ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
Service์˜ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Cloud platform์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ or ํด๋Ÿฌ์Šคํ„ฐ์— ์†ํ•œ worker node์˜ port๋ฅผ ํ†ตํ•ด pod๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœ
  • ์—ฌ๋Ÿฌ pod์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ ํ•œ ๋„๋ฉ”์ธ ์ด๋ฆ„ ๋ถ€์—ฌ
  • ์—ฌ๋Ÿฌ pod์— ์ ‘๊ทผํ•  ๋•Œ ์š”์ฒญ์„ ๋ถ„์‚ฐํ•˜๋Š” LB ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

 

Service์—๋Š” 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.
NodePort / ClusterPort / LoadBalancer ํƒ€์ž…์ด๋‹ค. ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž!

 

NodePort Type

Worker Node์˜ ํŠน์ • port๋ฅผ ๊ฐœ๋ฐฉํ•˜์—ฌ ์™ธ๋ถ€์—์„œ pod์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
๋งŒ์•ฝ Worker Node๊ฐ€ ์ฆ์„ค๋˜๋ฉด์„œ pod๊ฐ€ ์ƒˆ๋กœ์šด node์— ์Šค์ผ€์ค„๋ง ๋˜์–ด๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ๋™์ผํ•˜๊ฒŒ port ๋ฅผ ๊ฐœ๋ฐฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ถ”๊ฐ€์ ์ธ ์„ค์ • ์—†์ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
Node port๋Š” definition ํŒŒ์ผ์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋”ฐ๋กœ ์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ 30000~32767 ์‚ฌ์ด์—์„œ ๋žœ๋คํ•˜๊ฒŒ ๋ถ€์—ฌ๋œ๋‹ค.
๋งŒ์•ฝ ์›ํ•˜๋Š” NodePort๋ฅผ ๋ช…์‹œํ•˜๋ ค๋ฉด ports: ์„น์…˜์— nodePort: 30000 ์ด๋Ÿฐ์‹์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

 

NodePort Service ์ƒ์„ฑํ•˜๊ธฐ
spec.selector : ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ ์ ์šฉ๋  pod์˜ ๋ผ๋ฒจ์„ ์ง€์ •
spec.ports.port : ์„œ๋น„์Šค๋Š” k8s cluster ๋‚ด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณ ์œ ํ•œ cluster ip๋ฅผ ๋ถ€์—ฌ ๋ฐ›๋Š”๋‹ค . ์ด๋•Œ ๋ถ€์—ฌ๋ฐ›์€ IP์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•  ํฌํŠธ.
spec.ports.targetPort : ๋Œ€์ƒ์ด ๋˜๋Š” pod๋“ค์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” port. ์ฆ‰, pod template์˜ containerPort์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
spec.type : ํ•ด๋‹น ์„œ๋น„์Šค์˜ ํƒ€์ž… ์ง€์ •

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

 

NodePort ํƒ€์ž…์˜ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค.
์ด๋•Œ 8080:30642/TCP ( ์—ฌ๊ธฐ์„œ 8080์€ ์„œ๋น„์Šค์˜ port )์—์„œ 30642๋Š” ๋ชจ๋“  node์—์„œ ํ•ด๋‹น ์„œ๋น„์Šค๋กœ ๋™์ผํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” NodePort๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์–ด๋– ํ•œ ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋“ ์ง€ ๋‚ด๋ถ€IP or ์™ธ๋ถ€IP์˜ 30642 ํฌํŠธ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋™์ผํ•œ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋œ๋‹ค.

root@master001:~/script/service# kubectl get service -o wide
NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE   SELECTOR
kubernetes          ClusterIP   10.96.0.1      <none>        443/TCP          40m   <none>
service-nodeport    NodePort    10.103.32.57   <none>        8080:30642/TCP   63s   app=webserver

 

node internal ip์˜ 30642 ํฌํŠธ๋กœ ์ ‘๊ทผํ–ˆ์„๋•Œ service-nodeport ์„œ๋น„์Šค๋ฅผ ํƒ€๊ณ  3๊ฐœ์˜ ์›น pod์— ๋žœ๋คํ•˜๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

root@master001:~/script/service# curl 10.10.11.10:30642 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-9n9v2</p>     </blockquote>
root@master001:~/script/service# curl 10.10.11.10:30642 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-tx99m</p>     </blockquote>
root@master001:~/script/service# curl 10.10.11.20:30642 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-9n9v2</p>     </blockquote>
root@master001:~/script/service# curl 10.10.11.20:30642 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-j299p</p>     </blockquote>

 

์ด๋ฒˆ์—๋Š” cluster node์˜ external ip๋กœ ์ ‘๊ทผํ•ด ๋ณด๋„๋ก ํ•œ๋‹ค.
ํ˜„์žฌ cluster์˜ externel network ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

[root@wglee ~]# virsh net-dumpxml study-external
<network>
  <name>study-external</name>
  <uuid>664d3619-a64f-4388-a74b-e833e96b03b2</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr2' stp='on' delay='0'/>
  <mac address='52:54:00:01:d3:a9'/>
  <dns enable='no'/>
  <ip family='ipv4' address='172.16.110.1' prefix='24'>
    <dhcp>
      <range start='172.16.110.2' end='172.16.110.254'/>
      <host mac='52:54:00:76:9D:11' name='study-master001' ip='172.16.110.10'/>
      <host mac='52:54:00:36:8E:1D' name='study-worker001' ip='172.16.110.20'/>
      <host mac='52:54:00:32:56:44' name='study-deploy' ip='172.16.110.100'/>
      <host mac='52:54:00:02:C8:FB' name='study-worker002' ip='172.16.110.21'/>
    </dhcp>
  </ip>
</network>

 

node์˜ ExternalIP:NodePort ๋กœ curl ์„ ํ•ด์„œ ์™ธ๋ถ€์—์„œ๋„ ์ ‘์†๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๋ช‡ ๋ฒˆ ๊ณ„์† ํ•˜๋‹ค๋ณด๋ฉด ์š”์ฒญ์ด ๋žœ๋คํ•˜๊ฒŒ ๋ถ„์‚ฐ ๋˜๊ณ  ์žˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ด์ฒ˜๋Ÿผ ์„œ๋น„์Šค๋Š” ๋ณ„๋„์˜ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์š”์ฒญ์„ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑํ•œ๋‹ค.

[root@wglee ~]# curl 172.16.110.20:30642 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-j299p</p>     </blockquote>
[root@wglee ~]# curl 172.16.110.20:30642 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-tx99m</p>     </blockquote>
[root@wglee ~]# curl 172.16.110.20:30642 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-j299p</p>     </blockquote>
[root@wglee ~]# curl 172.16.110.21:30642 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-tx99m</p>     </blockquote>

 

ClusterIP Type

ClusterIP๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋‚ด๋ถ€์˜ pod๋ผ๋ฆฌ ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. (์ด๋Š” pod๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค. )
์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด ๋ณด์ž.
frontend / backend application ์ด ๋™์ž‘ํ•˜๋Š” pod๊ฐ€ ๊ฐ๊ฐ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋‹ค.
frontend pod์™€ backend pod๋Š” ์„œ๋กœ ํ†ต์‹ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ฐ pod ip๋ฅผ ๋ชฉ์ ์ง€๋กœ ํ•ด์„œ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์„ ๋ฟ๋”๋Ÿฌ, pod๊ฐ€ ์žฌ์ƒ์„ฑ ๋  ๊ฒฝ์šฐ pod ip ๋˜ํ•œ ๋ณ€๋™์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.
์ด๋•Œ Service๋ฅผ ClusterIP ํƒ€์ž…์œผ๋กœ ๋ฐฐํฌํ•จ์œผ๋กœ์จ ํ•˜๋‚˜์˜ Service object๋ฅผ ๊ฑฐ์ฒ˜ ์„œ๋กœ ํ†ต์‹ ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ClusterIP Service ์ƒ์„ฑํ•˜๊ธฐ
spec.selector : ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ ์ ์šฉ๋  pod์˜ ๋ผ๋ฒจ์„ ์ง€์ •
spec.ports.port : ์„œ๋น„์Šค๋Š” k8s cluster ๋‚ด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณ ์œ ํ•œ cluster ip๋ฅผ ๋ถ€์—ฌ ๋ฐ›๋Š”๋‹ค . ์ด๋•Œ ๋ถ€์—ฌ๋ฐ›์€ IP์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•  ํฌํŠธ.
spec.ports.targetPort : ๋Œ€์ƒ์ด ๋˜๋Š” pod๋“ค์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” port. ์ฆ‰, pod template์˜ containerPort์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
spec.type : ํ•ด๋‹น ์„œ๋น„์Šค์˜ ํƒ€์ž… ์ง€์ •

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

 

์ƒ์„ฑํ•œ definition ํŒŒ์ผ๋กœ ClusterIP ํƒ€์ž…์˜ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

root@master001:~/script/service# kubectl get service -o wide
NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE     SELECTOR
clusterip-service   ClusterIP   10.106.34.37   <none>        8080/TCP   8m42s   app=webserver
kubernetes          ClusterIP   10.96.0.1      <none>        443/TCP    9m23s   <none>

 

์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด pod์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผ ๋˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด curl์„ ๋‚ ๋ ค ๋ณธ๋‹ค.
clusterIP์˜ 8080(10.106.34.37:8080)์„ ํ†ตํ•ด pod์— 80์œผ๋กœ ๋–  ์žˆ๋Š” ์›น์„œ๋ฒ„์— ์ ‘๊ทผํ•œ๋‹ค.
NodeIP ํƒ€์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณ„์† ์š”์ฒญ์„ ๋‚ ๋ฆฌ๋‹ค ๋ณด๋ฉด 3๊ฐœ์˜ pod์— ์š”์ฒญ์ด ๋žœ๋คํ•˜๊ฒŒ ๋ถ„์‚ฐ ๋˜๊ณ  ์žˆ๋‹ค.

root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
        <p>Hello,  hostname-deployment-7dfd748479-tx99m</p>     </blockquote>
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
        <p>Hello,  hostname-deployment-7dfd748479-j299p</p>     </blockquote>
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
        <p>Hello,  hostname-deployment-7dfd748479-tx99m</p>     </blockquote>
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
        <p>Hello,  hostname-deployment-7dfd748479-9n9v2</p>     </blockquote>
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
        <p>Hello,  hostname-deployment-7dfd748479-j299p</p>     </blockquote>

 

Service์˜ label selector์™€ Pod์˜ label์ด ๋งค์นญ๋˜์–ด Service๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋งํ•  Pod๋“ค์ด ์ •ํ•ด์ง€๋ฉด ์ž๋™์œผ๋กœ endpoint ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
endpoint ์˜ค๋ธŒ์ ํŠธ์—๋Š” POD_IP:SERVICE_PORT ์ •๋ณด๊ฐ€ ๋“ฑ๋ก๋œ๋‹ค.

root@master001:~/script/service# kubectl get endpoints
NAME                ENDPOINTS                                            AGE
clusterip-service   172.30.254.10:80,172.30.254.17:80,172.30.65.153:80   24m
kubernetes          172.16.110.10:6443                                   24m

 

LoadBalancer Type

์„œ๋น„์Šค ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•ด pod์™€ ์—ฐ๊ฒฐํ•œ๋‹ค.
AWS, GCP์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์—์„œ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋งŒ์•ฝ ์˜จํ”„๋ ˆ๋ฏธ์Šค ์„œ๋ฒ„์—์„œ Load Balancer ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, MetalLB ๊ฐ™์€ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

์ฐธ๊ณ  ๋ฌธ์„œ

  • ์‹œ์ž‘ํ•˜์„ธ์š” ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค
  • udemy Certified Kubernetes Administrator (CKA) with Practice Tests ๊ฐ•์˜

'๐ŸŽฏ OpenSource > K8S' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

12. Accessing to Pod metadata from application  (2) 2021.05.09
11. Secret  (0) 2021.05.09
10. ConfigMap  (0) 2021.05.08
09. Job์œผ๋กœ ์™„๋ฃŒ ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ task ๊ตฌํ˜„ํ•˜๊ธฐ  (0) 2021.04.05
08. DaemonSet  (0) 2021.04.05