์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์๋ DNS Server๊ฐ ๋ณ๋๋ก ์กด์ฌํ๋ค. DNS Server์๋ Service์ ๋๋ฉ์ธ ์ด๋ฆ๊ณผ IP๊ฐ ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ Pod๊ฐ Service1์ ๋๋ฉ์ธ์ ์ง์ํ๋ฉด ip๋ฅผ ์๋ ค์ค๋ค.
๋ง์ฝ Pod๊ฐ User1์ ์ง์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น??
๋ด๋ถ๋ง์๋ DNS์๋ฒ ๊ตฌ์ถ๋์ด ์์ ๊ฒ์ด๊ณ ๋ด๋ถ ์๋ฒ๋ค์ด ์๊ฒผ์ ๋ ํด๋น ์ด๋ฆ๋ค์ด DNS์ ๋ฑ๋ก๋๋ค. Pod๊ฐ User1์ ์ฐพ์์ ๋ ์ฟ ๋ฒ๋คํฐ์ค๋ ์์ ์ DNS Server์ User1์ด ์๊ธฐ ๋๋ฌธ์ ์์ DNS Server์์ ์ด๋ฆ์ ์ฐพ๊ฒ ๋๊ณ ip๋ฅผ ์ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ถ ๋คํธ์ํฌ๋ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋์ํ๋ค.
Headless
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Pod๊ฐ Pod1์ ์ ๊ทผํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํ ์ ์์๊น?
headless๋ฅผ ์ด์ฉํ๋ฉด DNS Server์ pod๋ค์ DNS์ IP๋ค์ด ๋ฑ๋ก๋๊ณ ์ง์๋ฅผ ํตํด Pod์ IP๋ฅผ ์์๋ด ์ ๊ทผํ ์ ์๋ค.
์ด DNS Server๋ Pod๋ Service๋ ์์ฑ๋๋ฉด ์๋์ผ๋ก ๋๋ฉ์ธ๊ณผ IP๊ฐ ์ ์ฅ๋๋ค.
์ง์ ๋๋ ๊ท์น์ ์๋์ ๊ฐ๋ค.
# {service์ ์ด๋ฆ}.{namespace}.{svc}.cluster.local
service1.default.svc.cluster.local
# {Pod์ IP}.{namespace}.{pod}.cluster.local
20-109-5-11.default.pod.cluster.local
์ด๋ฌํ ๊ท์น์ ๊ฐ์ง๊ณ ๋ง๋ค์ด์ง Domain Name์ FQDN(Fully Qualified Domain Name)์ด๋ผ๊ณ ํ๋ค.
Headless Service๋ 2๊ฐ์ง ์ค์ ์ผ๋ก ๋ง๋ค ์ ์๋ค.
1. ClusterIP ์์ฑ์ None์ด๋ผ๊ณ ์ง์ . ํด๋น ์๋น์ค์ IP๋ฅผ ์์ฑํ์ง ์๊ฒ ๋ค๋ ๊ฒ์ ์๋ฏธ
2. Pod์ ์์ฑ์ hostname ์ง์ . domain name์ ๋ฃ๊ณ subdomain์ service์ ์ด๋ฆ์ ๋ฃ์ด์ค.
์ด๋ ๊ฒ headless service๋ฅผ ์์ฑ ๋ฐ ์ฐ๊ฒฐํ๊ฒ ๋ ๊ฒฝ์ฐ, DNS Server์ Service์ IP๊ฐ ์๊ธฐ ๋๋ฌธ์ Service์ ์ด๋ฆ์ ํธ์ถํ๊ฒ ๋๋ฉด ์ฐ๊ฒฐ๋ ๋ชจ๋ Pod์ IP๋ฅผ ๋ฐํํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋จ์ Pod๋ฅผ ๋ณด๋ฉด pod์ hostname์ด ์์ ๋ถ์ด์๊ณ ๋ค์๋ subdomain์ด ๋ค์ด์๋ค. ๋ฐ๋ผ์ pod4.headless1 (hostname.subdomain) ํ์์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
Service ์์ฑ ์ ClusterIP์ผ๋์ Headless์ผ ๋์ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
Headless์์ Service์ IP๊ฐ ์ฌ๋ผ์ง๊ณ Service๊ฐ ํฌํจํ๊ณ ์๋ Pod๋ค์ IP๋ค์ด ์กฐํ๋๋ค.
pod์์ ๋ค๋ฅธ pod๋ก ์ ๊ทผํ๋ ํ ์คํธ๋ฅผ ํด๋ณด์๋ค.
1. Pod์์ Service๋ฅผ ๊ฑฐ์ณ Pod๋ก ์์ฒญ
apiVersion: v1
kind: Service
metadata:
name: clusterip1
spec:
selector:
svc: clusterip
ports:
- port: 80
targetPort: 8080
apiVersion: v1
kind: Pod
metadata:
name: pod1
labels:
svc: clusterip
spec:
containers:
- name: container
image: kubetm/app
apiVersion: v1
kind: Pod
metadata:
name: request-pod
spec:
containers:
- name: container
image: kubetm/init
request pod์์ service๋ก curl ์์ฒญ์ ๋ณด๋ด๋ฉด Hostname์ด ์ ๋จ๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
2. pod์์ ๋ค๋ฅธ pod๋ก service๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์์ฒญ ๋ณด๋ด๊ธฐ
Service์ Pod2๊ฐ๋ฅผ ์์ฑํด์ค๋ค.
apiVersion: v1
kind: Service
metadata:
name: headless1
spec:
selector:
svc: headless
ports:
- port: 80
targetPort: 8080
clusterIP: None
-----------------------
apiVersion: v1
kind: Pod
metadata:
name: pod4
labels:
svc: headless
spec:
hostname: pod-a # hostname ์ค์
subdomain: headless1 # service ์ด๋ฆ
containers:
- name: container
image: kubetm/app
-----------------------
apiVersion: v1
kind: Pod
metadata:
name: pod5
labels:
svc: headless
spec:
hostname: pod-b # hostname ์ค์
subdomain: headless1 # service ์ด๋ฆ
containers:
- name: container
image: kubetm/app
nslookup headless1 ๋ช ๋ น์ด๋ก dns์ ์ง์๋ฅผ ํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์จ๋ค.
DNS Server์๋ ๋ฑ๋ก๋์ด์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์ง์๋ฅผ ํด๋ ํด๋น Pod์ IP๋ฅผ ํ์ธํ ์ ์๋ค.
nslookup headless1
nslookup pod-a.headless1
nslookup pod-b.headless1
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด curl๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฌ๋ฉด ์ ์๋ต์ด ์จ๋ค.
curl pod-a.headless1:8080/hostname
curl pod-b.headless1:8080/hostname
Endpoint
์ฌ์ฉ์ ์ ์ฅ์์๋ Service์ Pod๊ฐ ๋ค์ด๋ ํธ๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ ๊ฐ์ง๋ง, ์ฟ ๋ฒ๋คํฐ์ค ๋ด๋ถ์ ์ผ๋ก๋ EndPoint๋ผ๋ ๊ฒ์ด ์์ฑ๋์ด ์ฐ๊ฒฐ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ Service์ ์ด๋ฆ๊ณผ ๋์ผํ ์ด๋ฆ์ผ๋ก EndPoint๋ฅผ ์ค์ ํ๊ณ ๋ด๋ถ์๋ pod์ ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ๊ท์น๋ง ์๊ณ ์๋ค๋ฉด label/selector์ ๋ง๋ค์ง ์๊ณ ๋ Service์ Pod๋ฅผ ์ง์ ์ฐ๊ฒฐ์ํฌ ์ ์๋ค.
์ด๋ IP๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ DNS Server๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์ด๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ExternalName์ด๋ค.
EndPoint ์๋ ์์ฑ, ์ง์ ์์ฑ์ ๋น๊ตํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ํ ์คํธ๋ฅผ ์งํํ๋ค.
1. ์๋ํฌ์ธํธ ์๋ ์์ฑ ํ์ธ
apiVersion: v1
kind: Service
metadata:
name: endpoint1
spec:
selector:
svc: endpoint
ports:
- port: 8080
apiVersion: v1
kind: Pod
metadata:
name: pod7
labels:
svc: endpoint
spec:
containers:
- name: container
image: kubetm/app
service์ ์ด๋ฆ์ธ endpoint1์ด๋ผ๋ ์ด๋ฆ์ endpoint object๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ฒฐ๊ตญ label/selector๋ฅผ ์ง์ ํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค๊ฐ service์ ์ด๋ฆ๊ณผ ๋์ผํ endpoint๋ฅผ ์์์ ๋ง๋ ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
2. ์๋ํฌ์ธํธ ์ง์ ์ง์
apiVersion: v1
kind: Service
metadata:
name: endpoint2
spec:
ports:
- port: 8080
apiVersion: v1
kind: Pod
metadata:
name: pod9
spec:
containers:
- name: container
image: kubetm/app
apiVersion: v1
kind: Endpoints
metadata:
name: endpoint2
subsets:
- addresses:
- ip: 192.168.226.109 # ์์์ ๋ง๋ค์ด์ง pod์ ip.
ports:
- port: 8080
์ด์ request pod์ ์ ์ํ์ฌ curl ๋ช ๋ น์ ๋ ๋ฆฌ๋ฉด ์ ์์ ์ผ๋ก pod๊ฐ ์ฐ๊ฒฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
curl endpoint2:8080/hostname
ExternalName
Service์ ExternalName์ด๋ผ๋ ์์ฑ์ ๋ฃ์ด์ Domain ์ด๋ฆ์ ์ถ๊ฐํ๋ฉด DNS cache๊ฐ ๋ด๋ถ/์ธ๋ถ DNS Server๋ฅผ ํ์ธํ์ฌ IP๋ฅผ ์์๋ธ๋ค.
๋ง์ฝ Pod์์ ์ ๊ทผํ๋ ์ฌ์ดํธ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ Pod๋ Service๋ง ๊ฐ๋ฅดํค๊ณ ์๋ค๋ฉด ๋ฐ๋ก ์ฌ๋ฐฐํฌ ํ ํ์๊ฐ ์๋ค.
์๋์ ๊ฐ์ด Service๋ฅผ ์์ฑํ ๋ ExternalName์ ์ค์ ํด์ค ์ ์๋ค.
apiVersion: v1
kind: Service
metadata:
name: externalname1
spec:
type: ExternalName
externalName: github.github.io
์์ ๊ฐ์ด ExternalName์ ์ค์ ํ๋ค๋ฉด Service์ด๋ฆ์ผ๋ก curl์์ฒญ์ ๋ ๋ ธ์ ๋ ์ ๋์ํ๋ค.
curl -O externalname1/kubetm/kubetm.github.io/blob/master/sample/practice/intermediate/service-sample.md