๊ฐ์ธ์ ์ผ๋ก Kubernetes ๋คํธ์ํฌ๊ฐ ๋ณต์กํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ ์ด์ฉ ์ ์๋ ๊ฒ ํด๋ฌ์คํฐ ๋ด๋ถ์ ์ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์
๋ค์ ์ฐ๊ฒฐ์ํค๊ธฐ ์ํด์๋ ๊ทธ๋ด ์ ๋ฐ์ ์์์ ๊ฒ์ด๋ผ~ ์๊ฐํฉ๋๋ค.
๊ทธ๋๋ ๋๋ฆ ๊ฐ๋จํ๊ฒ ํ๊ธฐ ์ํ ๋
ธ๋ ฅ๋ ๋ณด์ด๋ ์ฐ๋ฆฌ ํจ๊ป ์ต๋ํ ์ดํดํด๋ด
์๋ค!
Kubernetes Service ์ ํ์ํด? ๐ค
๋จผ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํด๋ด์ผํ ๊ฒ ์์ต๋๋ค.
์ ์ด๊ฒ ํ์ํ ๊น์?
Pod์ ์ฑ์ง
์ด๋ Pod์ ์ฑ์ง์ ๊ด๋ จ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด Deployment๋ฅผ ํตํด์ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ๋ฅผ ๊ด๋ฆฌํ๊ณ ์๋๋ฐ, Pod๊ฐ ๋ชจ์ข
์ ์ด์ ๋ก ์ฃฝ๊ฒ๋๊ณ ๋ค์ ์ด์๋ฌ๋ค๋ฉด
์ด ์ Pod๊ฐ ์ฌ์ฉํ๋ IP์ ์๋ก ์์ฑ๋ Pod์ IP๋ ๋ค๋ฅด๊ฒ ์์ฑ๋ฉ๋๋ค.
๊ทธ๋์ Pod IP๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์ํํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Deployment์ Pod์ ๋ผ๋ฒจ๋ง์ ํ๊ฒ ๋๊ณ , ์๋น์ค๋ ์ด ๋ผ๋ฒจ๋ง์ ์ฐพ์์ ํธ๋ํฝ์ ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์๋์ ์๋น์ค์ ์ ๊ทผํ๋ ํธ๋ํฝ์ app.kubernetes.io/name: proxy์ธ Pod๋ค์ ๋งคํ๋๊ฒ ๋ฉ๋๋ค.
์๋น์ค ์ ๊ทผ์ ๋ณดํต http://{service name}.{namespace} ๋ก ๊ฐ๋ฅํฉ๋๋ค.
(์๋ ์๋น์ค ์ ๊ทผ ์์ http://nginx-service.system)
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namspace: system
spec:
selector: # label์ด 'app.kubernetes.io/name: proxy'๋ฅผ ๊ฐ์ง Pod๋ฅผ ๋์์ผ๋กํจ
app.kubernetes.io/name: proxy
ports:
- name: name-of-service-port
protocol: TCP
port: 80
targetPort: 8080
Kubernetes์ ๋ณต์ก์ฑ
์์ ์ธ๊ธํ ๋๋ก Kubernetes์ ๋คํธ์ํฌ๋ ๋ณต์กํฉ๋๋ค. ๋ฐ๋ผ์ ํธ๋ํฝ์ด ์ํ๋ ๋๋ก ์ ๋ฌ๋๊ฒ ํ๊ธฐ ์ํ ๊ณผ์ ์ด ๋ณต์กํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ธ๋ถ IP ํธ์ถ์ ํตํด์ ๋ด๊ฐ ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์
๊น์ง ํธ๋ํฝ์ด ์ ๋ฌ๋๊ณ ์ถ๋ค๊ณ ํฉ์๋ค.
1. ๊ทธ๋ ๋ค๋ฉด ๋จผ์ etcd์ ์ ์ฅ์ ํด์ผํฉ๋๋ค. ๋ด๊ฐ ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ด๋ ๋
ธ๋์ ์๋์ง ์์์ผํ๊ธฐ ๋๋ฌธ์
๋๋ค.
2. kube-proxy๋ ๊ฐ ๋
ธ๋์ ๋คํธ์ํฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ๋ฑ๋ก์ด ๋์ด์ผ ํ๋ฉฐ, ์ ํํ๋ iptable ๋๋ IP Virtual Service์ ๋ฑ๋ก๋๊ฒ ๋ฉ๋๋ค.
3. ๋ํ ์๋น์ค ์ด๋ฆ์ผ๋ก ํด๋ฌ์คํฐ ๋ด๋ถ DNS๋ฅผ ๋ฑ๋ก์ ํ๊ธฐ ๋๋ฌธ์ Coredns์ ๊ฐ์ DNS ์์คํ
์ ๋ฑ๋กํด์ผํฉ๋๋ค.
์ด๋ฌํ ๋คํธ์ํฌ ์ค์ ๋ค์ ์๋น์ค ๋ฑ๋ก์ ํตํด์ ๋น๊ต์ ๊ฐ๋จํ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ด๋์? ์๊ณ ๋ณด๋ ์ ๋ ๊ฐ์ฃ ? ๐
Kubernetes Service ์ข ๋ฅ
Kubernetes์์๋ ํฌ๊ฒ 3๊ฐ์ง์ type์ ์ ๊ณตํฉ๋๋ค.
ClusterIP
๊ฐ์ฅ ๊ธฐ๋ณธ ํ์
์ด๋ฉฐ, ํด๋ฌ์คํฐ ๋ด๋ถ ํต์ ์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
ํธ๋ํฝ์ ๋ก๋๋ฐธ๋ฐ์ฑํด์ฃผ๋ฉฐ, ์ด๋ฅผ ํตํด ํธ๋ํฝ ๋ถ์ฐ์ ์ด๋ฃฐ ์ ์์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด Proxy๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์๋๋ฐ์.
์์ ์ธ๊ธํ๋ค์ํผ ๊ฐ ๋
ธ๋์ ๋คํธ์ํฌ๋ฅผ ๊ด์ฅํ๋ Kube-Proxy์ ์๋น์ค์ ์ ๋ณด๊ฐ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์,
ํธ๋ํฝ์ด ์์ ๋ ์ ์ ํ ์๋น์ค๋ก ๋งคํ๋๊ฒ ๋ฉ๋๋ค.

apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector: # label์ด 'app.kubernetes.io/name: proxy'๋ฅผ ๊ฐ์ง Pod๋ฅผ ๋์์ผ๋กํจ
app.kubernetes.io/name: proxy
ports:
- name: name-of-service-port
protocol: TCP
port: 80 # ์ธ๋ถ์์ Service์ ์ ๊ทผํ ๋ ์ฌ์ฉ๋๋ ํฌํธ ๋ฒํธ
targetPort: 8080 # Pod ๋ด๋ถ์ ํฌํธ
NodePort
ClsuterIP์ ๊ธฐ๋ฅ์ ๋ํด, ๋ชจ๋ ๋
ธ๋์ ํน์ ํฌํธ๋ฅผ ๊ฐ๋ฐฉํฉ๋๋ค.
์ด๋ ํด๋ฌ์คํฐ ์ธ๋ถ์์ ๋
ธ๋์ IP์ ํ ๋น๋ ํฌํธ๋ฅผ ํตํด์ ํด๋ฌ์คํฐ ๋ด๋ถ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด VM(Virtual Machine = Node)์ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋
ธ๋ ํฌํธ๋ค์ ์ด๋ฏธ ์ธ๋ถ์ ์คํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ๊ฒ ์ธ๋ถ ํธ์ถ์ ๋ฐ๋ ๋ฐฉ์์ด์์.
๋
ธ๋ ํฌํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋
ธ๋ IP๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด์ ์ํฅ์ ๋ฐ๋๋ค๋ ์ ๊ณผ ๋
ธํธ ํฌํธ๊ฐ ํ์ ์ (30000-32767) ์ด๋ผ๋ ์ ์ด ๋จ์ ์
๋๋ค.
๊ทธ๋์ ๋ณดํต ์ด์ํ ๋๋ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ฃ .

piVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app.kubernetes.io/name: MyApp
ports:
- port: 80 # ์๋น์ค ๋
ธ์ถ ํฌ๋
targetPort: 80 # Pod์์ ๋
ธ์ถํ๋ ํฌํธ
# ์ ํ์ ํ๋ (๋ช
์ํ์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ํฌํธ๋ฅผ ์๋์ผ๋ก ํ ๋น)
# ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ํธ์์ ์ฟ ๋ฒ๋คํฐ์ค ์ปจํธ๋กค ํ๋ ์ธ์ ํฌํธ ๋ฒ์์์ ํ ๋นํ๋ค(๊ธฐ๋ณธ๊ฐ: 30000-32767)
nodePort: 30007 # ๋ง์ฝ 30007 ํฌํธ๊ฐ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด ์คํจ
LoadBalancer
NodePort์ ๊ธฐ๋ฅ์ ํฌํจํ๋ฉฐ, ์ถ๊ฐ๋ก ํด๋ผ์ฐ๋ ์ ๊ณต์์ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ณดํต ๋ก๋๋ฐธ๋ฐ์๋ ํด๋ฌ์คํฐ ์ธ๋ถ์ ์กด์ฌํ๋ฉฐ, AWS, GCP ๋ฑ์ ํด๋ผ์ฐ๋ ์๋น์ค๊ฐ ์ ๊ณตํ๋ ํ๋ก๋น์ ๋๋ ๋ก๋ ๋ฐธ๋ฐ์์ ํด๋ฌ์คํฐ๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ธ๋ถ์์๋ ๋ก๋ ๋ฐธ๋ฐ์์ IP๋ฅผ ํตํด์ ํด๋ฌ์คํฐ ๋ด๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ทผํ ์ ์์ต๋๋ค.
ํ๋์ IP๋ฅผ ํตํด์ ์๋น์ค๋ฅผ ๋
ธ์ถ์ํค๊ธฐ ๋๋ฌธ์ ๊ด๋ฆฌ์ ์ธก๋ฉด์์๋ ํธํด์ง๋ฉฐ, ์ด์ ์ค์ธ ์๋น์ค์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์
๋๋ค.
๋จ์ ์ ์ธ๋ถ Load Balancer๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์
๋๋ค.

apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80 # ์๋น์ค๋ฅผ ๋
ธ์ถํ๋ ํฌํธ
targetPort: 80 # ์ ํ๋ฆฌ์ผ์ด์
(ํ๋)๋ฅผ ๋
ธ์ถํ๋ ํฌํธ
clusterIP: 10.0.171.239 # ํด๋ฌ์คํฐ IP
selector:
app: myapp
type: frontend
status:
loadBalancer: # ํ๋ก๋น์ ๋๋ ๋ก๋ ๋ฐธ๋ฐ์ ์ ๋ณด
ingress:
- ip: 192.0.2.127
์ ๋ฆฌ
์ฟ ๋ฒ๋คํฐ์ค๋ ๋์ IP๋ฅผ ๊ฐ์ง๋ Pod ํ๊ฒฝ์์ ์์ ์ ์ธ ๋คํธ์ํฌ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ์์ฃผ์์ฃผ ํต์ฌ ์์์ ๋๋ค.
๋ฌผ๋ก ์ฟ ๋ฒ๋คํฐ์ค์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ฌํญ์ ์ถฉ์กฑ์ํค์ง ๋ชป ํด์ Istio์ ๊ฐ์ ์ธ๋ถ ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
์ด๋ ๋์ค์ ๋ ์์๋ณด๋ ๊ฑธ๋ก ํ๊ฒ ์ต๋๋ค ~~
์ฐธ๊ณ
๋ชจ๋ ๊ทธ๋ฆผ์ ์๋ ์ฌ์ดํธ์์ ๊ฐ์ ธ์์ต๋๋ค.
https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0
์์ธํ ๋ด์ฉ์ด ์๊ณ ์ถ๋ค๋ฉด Kubernetes ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
https://kubernetes.io/ko/docs/concepts/services-networking/service/