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

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๋“ , AWS EKS๋‚˜ GCP GKE ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์“ฐ๋“  ๊ฐ„์—, pod๋งŒ ๋„์šด๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๋Š”๊ฒŒ ๋๋‚˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค.

Pod๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๊ทธ๋ƒฅ private ๋‚ด๋ถ€ ์•„์ดํ”ผ๋งŒ ํ• ๋‹น์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์™„์ „ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ public endpoint(ํ˜น์€ IP)๋ฅผ ์—ด๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ž์ฒด์ ์ธ ๋„คํŠธ์›Œํฌ ์ถ”์ƒํ™” ๊ณ„์ธต์ธ "์„œ๋น„์Šค"๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Service์˜ ์‹ค์งˆ์ ์ธ ์šด์˜ ๋ฐฉ๋ฒ•์€ ํ•˜๋“œ์›จ์–ด ํ™˜๊ฒฝ์— ๋”ฐ๋ผ์„œ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค.
AWS ๊ฐ™์€ Cloud์—์„œ ๊ด€๋ฆฌํ˜• ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ์—๋Š” Service์— IP๋‚˜ ๋„๋ฉ”์ธ์„ ๋ถ™์—ฌ์ฃผ๋Š”๊ฑธ ํด๋ผ์šฐ๋“œ์—์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.
ํ•˜์ง€๋งŒ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์ผ ๊ฒฝ์šฐ์—๋Š” ์ข€ ๋ณต์žกํ•ด์ง„๋‹ค. IP๋ฅผ ์ง์ ‘ ๋ถ™์ด๊ฑฐ๋‚˜ ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ด๊ฒƒ๋„ ์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๊ฐ€ ๋˜๊ณ , ๋‹ค๋ฅธ ์ปจํŠธ๋กค๋Ÿฌ์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
์กฐํšŒ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

kubectl get service

์ฒ˜์Œ์— ๋ณด๋ฉด ์™ธ๋ถ€ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ณธ ๋‚ด๋ถ€ ์•„์ดํ”ผ๋งŒ ์žˆ๋‹ค.




์„œ๋น„์Šค ๊ตฌ์„ฑํ•ด๋ณด๊ธฐ

์„œ๋น„์Šค๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด์„œ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

์„œ๋น„์Šค๋Š” ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๊ณ , ์š”์ฒญ์„ ์‹ค์ œ Pod๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ๋งŒ ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Deployment๋ฅผ ํ†ตํ•ด Pod๋ฅผ ๋„์šฐ๊ณ  Service๋ฅผ ๊ฑฐ๊ธฐ์— ๋ถ™์ด๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ๋ฒ•์ด๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test-server
  template:
    metadata:
      labels:
        app: test-server
    spec:
      imagePullSecrets:
        - name: harbor-secret
      containers:
        - name: test-server
          image: "myyrakle/node-server-for-test:latest"
---
apiVersion: v1
kind: Service
metadata:
  name: test-service
spec:
  ports:
    - port: 80
      protocol: TCP
  selector:
    app: test-server
  type: ClusterIP

selector ํ‘œํ˜„์‹์„ ํ†ตํ•ด์„œ ์–ด๋–ค label์„ ๊ฐ€์ง„ pod์™€ ๋งค์นญํ• ์ง€๋ฅผ ์ง€์ •ํ•œ๋‹ค.


๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ serivce๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ ์ด ์ƒํƒœ์—์„œ๋Š” ๋ญ”๊ฐ€ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธด ์–ด๋ ต๋‹ค. ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ๋Š” ์™ธ๋ถ€ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.




External IP ํ• ๋‹น

Service๋ฅผ ์™ธ๋ถ€ ๊ณต๊ฐœํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€, ๊ทธ๋ƒฅ ๋ช…์‹œ์ ์œผ๋กœ IP๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
External IP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Service์˜ ํƒ€์ž…๊ณผ ๋ณ„๊ฐœ๋กœ ๋งคํ•‘ํ•ด์„œ ๊ทธ๋ƒฅ ์—ด์–ด๋ฒ„๋ฆฐ๋‹ค.

ํ˜„์žฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋…ธ๋“œ๊ฐ€์˜ ๋‚ด๋ถ€ IP๋ฅผ ํ™•์ธํ•˜๊ณ 

๊ทธ๊ฑธ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿผ ์ด๋Ÿฐ ์‹์œผ๋กœ External IP๊ฐ€ ์ถ”๊ฐ€๋ ํ…๋ฐ


์ด๋ ‡๊ฒŒ ์‹ค์ œ ์ ‘๊ทผ๋„ ๊ฐ€๋Šฅํ•ด์งˆ ๊ฒƒ์ด๋‹ค.

External IP์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๊ฑด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋…ธ๋“œ๋“ค์˜ ๋‚ด๋ถ€ IP๋‹ค.
์ƒ๋šฑ๋งž์„๊ฑธ ๋„ฃ์œผ๋ฉด ์˜ค๋ฅ˜๋Š” ์—†์ง€๋งŒ ๊ทธ๋ƒฅ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

์ด External IP์˜ ๋ผ์šฐํŒ…์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋งค๊ฐœํ•˜๋Š” ์ฃผ์ฒด๋Š” kube-proxy ๊ฐ™์€ Service Proxy๋‹ค.




Service์˜ ์ข…๋ฅ˜

Service์—๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€ ํƒ€์ž…์ด ์žˆ๋‹ค. ClusterIP์™€ NodePort, LoadBalancer๊ฐ€ ๊ทธ๊ฒƒ์ด๋‹ค.
์ด ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฐœ๋ฐฉํ• ์ง€๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.



1. Cluster IP

ClusterIP๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€์žฅ ์›์ดˆ์ ์ธ Service ํƒ€์ž…์ด๋‹ค.
๊ทธ๋ž˜์„œ ์œ„์—์„œ ๋ฐฉ๊ธˆ ๋งŒ๋“  Service๋„ Cluster IP๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

์ด๊ฑด ๋…ผ๋ฆฌ๊ฐ€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค. ๊ทธ๋ƒฅ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ์ € Cluster IP๋กœ ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ๊ณ ,

Pod ๋‚ด๋ถ€์—์„œ๋Š” ์ด๋ฆ„์„ ํ†ตํ•ด์„œ ๋‚ด๋ถ€ DNS๋กœ ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

kubectl run curl-test --image=curlimages/curl -i --tty --rm --restart=Never -- sh -c "curl http://test-service"



2. NodePort

ClusterIP๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด, NodePort๋Š” ๋ชจ๋“  Node์˜ IP๋ฅผ ํ†ตํ•ด์„œ ์ ‘๊ทผ ๊ฒฝ๋กœ๋ฅผ ์—ด์–ด์ฃผ๋Š” Service ํƒ€์ž…์ด๋‹ค.

๋งŒ์•ฝ ๋…ธ๋“œ A(192.168.1.2), ๋…ธ๋“œ B(192.168.1.3)๊ฐ€ ์žˆ๊ณ  31000 ํฌํŠธ๋กœ NodePort๋ฅผ ์—ฐ๋‹ค๋ฉด, 192.168.1.2:31000, 192.168.1.3:31000 2๊ฐ€์ง€๋กœ ์™ธ๋ถ€ ์ ‘๊ทผ์ด ๊ฐœ๋ฐฉ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ€์‹  ํฌํŠธ ์˜์—ญ์€ 30000-32767๋กœ ์ œ์•ฝ๋˜์–ด์žˆ๋‹ค. ์ด ๋ฒ”์œ„๋Š” ํ• ๋‹น ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ ์–ด๋ ต์ง€ ์•Š๋‹ค. type๋งŒ NodePort๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด

์ฆ‰์‹œ Port๊ฐ€ ์ƒ๊ธด๋‹ค. NodePort๋Š” ํฌํŠธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฒ”์œ„ ๋‚ด์—์„œ ์ž๋™์œผ๋กœ ํฌํŠธ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ 32527 ํฌํŠธ๊ฐ€ ํ• ๋‹น๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ


์ด๋ ‡๊ฒŒ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.


์›ํ•œ๋‹ค๋ฉด ports.nodePort ํ•„๋“œ๋ฅผ ํ†ตํ•ด ํฌํŠธ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.




3. LoadBalancer Type

LoadBalancer ํƒ€์ž…์€ ์กฐ๊ธˆ ๋ณต์žกํ•˜๋‹ค. ์ด๊ฑด ๊ทธ ์ž์ฒด๋กœ ๊ณ ์œ ํ•œ ๋™์ž‘์„ ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
์ด ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•˜๋ฉด "๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ˆ ์•Œ์•„์„œ External IP๋ฅผ ์ž˜ ํ• ๋‹นํ•ด๋‹ฌ๋ผ"๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

AWS ๊ฐ™์€ ํด๋ผ์šฐ๋“œ๋ฅผ ์“ด๋‹ค๋ฉด ํด๋ผ์šฐ๋“œ์—์„œ ์•Œ์•„์„œ ์‹ค์ œ๋กœ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๋ถ™์—ฌ์ค„ ๊ฒƒ์ด๋‹ค.
์˜จํ”„๋ ˆ๋ฏธ์Šค๋ผ๋ฉด ๊ทธ๋Ÿฐ๊ฑธ ํ•ด์ฃผ๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด์ค˜์•ผ ํ•œ๋‹ค. MetalLB๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค.




ํด๋ผ์šฐ๋“œ์—์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์‚ฌ์šฉํ•˜๊ธฐ

AWS์˜ EKS, GCP์˜ GKE ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ํด๋ผ์šฐ๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๊ธฐ๋Šฅ์„ ํ† ๋Œ€๋กœ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ”๋กœ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ƒฅ ์ƒ๊ธฐํ•œ๋Œ€๋กœ LoadBalancer ํƒ€์ž…์˜ Service๋ฅผ ๋งŒ๋“ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ€์ฒด๋กœ๋Š” ๊ทธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ง„์งœ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋Š” ๊ฒƒ์ด๋ผ์„œ, ๋น„์šฉ ์ง€์ ์ด ์ถ”๊ฐ€๋œ๋‹ค. ๋น„์šฉ ๊ด€๋ฆฌ์— ์œ ์˜ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

๋‚ด ๊ฒฝ์šฐ์—๋Š” GKE๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

Service๋ฅผ ์ž‘์„ฑํ•ด์„œ apply๋กœ ์ถ”๊ฐ€๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: test-service
spec:
  selector:
    app: test-server
  ports:
    - protocol: TCP
      port: 80
  type: LoadBalancer

๊ทธ๋Ÿผ ์ฒ˜์Œ์—๋Š” pending ์ƒํƒœ์ด๋‹ค๊ฐ€

์ง„์งœ external ip๊ฐ€ ๋œฐ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์ง„์งœ ๋œฌ ๊ฒƒ์ด๊ณ 

์ ‘์†๋„ ๋  ๊ฒƒ์ด๋‹ค.

์ด๊ฒŒ ๋์ด๋‹ค.
ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋งˆ๋‹ค ์„ธ๋ถ€์ ์ธ ๋ถ€๋ถ„์—์„œ ์ฐจ์ด๊ฐ€ ์ข€ ์žˆ๊ธด ํ•œ๋ฐ, ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ„์€ ๋™์ผํ•˜๋‹ค.

service๋ฅผ deleteํ•˜๋ฉด ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋„ ํ•จ๊ป˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ •๋ฆฌ๋œ๋‹ค.




์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์‚ฌ์šฉํ•˜๊ธฐ

์˜จํ”„๋ ˆ๋ฏธ์Šค์—์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋ ค๋ฉด ๊ฝค๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…๋“ค์ด ํ•„์š”ํ•˜๋‹ค.
ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ๋„ ์„ธํŒ… ๋ฐฉ๋ฒ•์ด ์ข€ ๋‹ฌ๋ผ์งˆ ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ metallb๋ผ๋Š” ์˜คํ”ˆ์†Œ์Šค ์‹œ์Šคํ…œ์ด๋‹ค.
์ด๊ฑธ ์“ฐ๋ฉด ๋ฏธ๋ฆฌ IP ํ’€์„ ์ •์˜ํ•ด๋†“๊ณ , ๊ทธ๊ฒƒ๋“ค ์ค‘์— ํ•˜๋‚˜๊ฐ€ ๋žœ๋ค์œผ๋กœ LoadBalancer์˜ External IP๋กœ ํ• ๋‹น๋˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://blog.naver.com/sssang97/223330537493




Service Proxy

Service๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์‹ค์ œ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ๋™์ž‘์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ฑ…์ž„์ด ์•„๋‹ˆ๊ณ , Service Proxy๋ผ๋Š” ๋ณ„๋„ ๊ณ„์ธต์„ ํ†ตํ•ด์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. kube-proxy ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค.

Service๋ฅผ ํ™œ์šฉํ•จ์— ์žˆ์–ด์„œ ์„ฑ๋Šฅ์ด๋‚˜ ๋ณด์•ˆ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ด ๋˜ํ•œ ์–ด๋А์ •๋„ ์•Œ๊ณ  ์žˆ๋Š” ํŽธ์ด ์ข‹๋‹ค.
์„ ํƒ์ง€๊ฐ€ ์—ฌ๋Ÿฟ์ด๊ณ , ๊ทธ ์„ ํƒ์— ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ œ๋ฐ˜์‚ฌํ•ญ๋“ค์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.
https://blog.naver.com/sssang97/224174739370



์ฐธ์กฐ
https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/
https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer
https://itnext.io/kubernetes-service-type-lb-for-on-prem-deployments-89e9b2a73a0c
https://kubernetes.io/ko/docs/tutorials/stateless-application/expose-external-ip-address/