[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/