๐ ํด๋น ํฌ์คํ
์ ์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค ์์ ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ๋ชฉ์ ํ์ ์์ฑ๋๋ ๊ธ์
๋๋ค. ํฌ์คํ
์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์๋ฃ๋ ์ ๊ฐ ์ง์ ์ฌ๊ตฌ์ฑํ์์์ ์๋ฆฝ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ ๋ฒ ํฌ์คํ ์์ ์๊ฐํ ์ฟ ๋ฒ๋คํฐ์ค ๊ธฐ์ด ๊ฐ๋ ์ ํฌํจ๋๋ ์๋น์ค(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 ๋ ์ฝ๋๋ผ๊ณ ํ๋ค.
์ด๋ ๊ฒ ํด์ ์ฟ ๋ฒ๋คํฐ์ค์ ๊ธฐ์ด ๊ฐ๋ ์ธ ์๋น์ค๊น์ง ๋ชจ๋ ๋ค๋ฃจ์ด๋ณด์๋ค. ๋ค์ ํฌ์คํ ๋ถํฐ๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค์ ๊ด๋ฆฌ์ ์ค์ ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์ธ ์์ ์ด๋ค. ๋ค์ ํฌ์คํ ๋ง ์งํํ๊ณ ๋๋ฉด ์ฟ ๋ฒ๋คํฐ์ค์ ๊ธฐ์ด๋ ๋ชจ๋ ๋์ด ๋๋ค. ๊ทธ ์ดํ๋ ๊ณ ๊ธ ๊ธฐ๋ฒ์ ์ ์ฉ๋๋ ์ฑํฐ๋ค์ธ๋ฐ, ์ด๋ ์ง๊ธ ๋น์ฅ ํ์์๊ฒ ํ์ํ ๋ด์ฉ์ ์๋๊ธฐ ๋๋ฌธ์ ๋ฐฑ๋ก๊ทธ ํํ๋ก ๋จ๊ฒจ๋์ผ๋ ค๊ณ ํ๋ค.