2022. 11. 14. 09:40ใ๐ฏ OpenSource/K8S
Service ?
Worker Node์์ ์์ฑ๋ pod๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ธ๋ถ์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
Service๋ฅผ ์ด์ฉํ์ฌ ์ธ๋ถ ์ฌ์ฉ์์ pod ์ ๊ทผ ๋ฐ pod <-> pod ์ ํจ์จ์ ์ธ ๋ด๋ถ์ ๊ทผ์ ๊ตฌ์ฑํ ์ ์๋ค.
Service์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
- Cloud platform์ ๋ก๋๋ฐธ๋ฐ์ or ํด๋ฌ์คํฐ์ ์ํ worker node์ port๋ฅผ ํตํด pod๋ฅผ ์ธ๋ถ์ ๋ ธ์ถ
- ์ฌ๋ฌ pod์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ ๊ณ ์ ํ ๋๋ฉ์ธ ์ด๋ฆ ๋ถ์ฌ
- ์ฌ๋ฌ pod์ ์ ๊ทผํ ๋ ์์ฒญ์ ๋ถ์ฐํ๋ LB ๊ธฐ๋ฅ ์ํ
Service์๋ 3๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
NodePort / ClusterPort / LoadBalancer ํ์
์ด๋ค. ํ๋์ฉ ์์๋ณด๋๋ก ํ์!
NodePort Type
Worker Node์ ํน์ port๋ฅผ ๊ฐ๋ฐฉํ์ฌ ์ธ๋ถ์์ pod์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ง์ฝ Worker Node๊ฐ ์ฆ์ค๋๋ฉด์ pod๊ฐ ์๋ก์ด node์ ์ค์ผ์ค๋ง ๋์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋
ธ๋์ ๋์ผํ๊ฒ port ๋ฅผ ๊ฐ๋ฐฉํ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์ถ๊ฐ์ ์ธ ์ค์ ์์ด ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
Node port๋ definition ํ์ผ์์ ์ง์ ํ ์ ์์ง๋ง ๋ฐ๋ก ์ ํ์ง ์์ ๊ฒฝ์ฐ 30000~32767 ์ฌ์ด์์ ๋๋คํ๊ฒ ๋ถ์ฌ๋๋ค.
๋ง์ฝ ์ํ๋ NodePort๋ฅผ ๋ช
์ํ๋ ค๋ฉด ports: ์น์
์ nodePort: 30000
์ด๋ฐ์์ผ๋ก ์ถ๊ฐํ๋ฉด ๋๋ค.
NodePort Service ์์ฑํ๊ธฐ
spec.selector : ํด๋น ์๋น์ค๊ฐ ์ ์ฉ๋ pod์ ๋ผ๋ฒจ์ ์ง์
spec.ports.port : ์๋น์ค๋ k8s cluster ๋ด์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ณ ์ ํ cluster ip๋ฅผ ๋ถ์ฌ ๋ฐ๋๋ค . ์ด๋ ๋ถ์ฌ๋ฐ์ IP์ ์ ๊ทผํ ๋ ์ฌ์ฉํ ํฌํธ.
spec.ports.targetPort : ๋์์ด ๋๋ pod๋ค์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ port. ์ฆ, pod template์ containerPort์ ๊ฐ์์ผ ํ๋ค.
spec.type : ํด๋น ์๋น์ค์ ํ์
์ง์
apiVersion: v1
kind: Service
metadata:
name: service-nodeport
spec:
ports:
- name: web-port
port: 8080
targetPort: 80
selector:
app: webserver
type: NodePort
NodePort ํ์
์ ์๋น์ค๊ฐ ์์ฑ๋์๋ค.
์ด๋ 8080:30642/TCP ( ์ฌ๊ธฐ์ 8080์ ์๋น์ค์ port )์์ 30642๋ ๋ชจ๋ node์์ ํด๋น ์๋น์ค๋ก ๋์ผํ๊ฒ ์ ๊ทผํ ์ ์๋ NodePort๋ฅผ ์๋ฏธํ๋ค. ์ด๋ ํ ๋
ธ๋๋ก ๋ค์ด์ค๋ ์ง ๋ด๋ถIP or ์ธ๋ถIP์ 30642 ํฌํธ๋ก ์ ๊ทผํ๋ฉด ๋์ผํ ์๋น์ค์ ์ฐ๊ฒฐ๋๋ค.
root@master001:~/script/service# kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40m <none>
service-nodeport NodePort 10.103.32.57 <none> 8080:30642/TCP 63s app=webserver
node internal ip์ 30642 ํฌํธ๋ก ์ ๊ทผํ์๋ service-nodeport ์๋น์ค๋ฅผ ํ๊ณ 3๊ฐ์ ์น pod์ ๋๋คํ๊ฒ ์ ๊ทผํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
root@master001:~/script/service# curl 10.10.11.10:30642 --silent | grep Hello
<p>Hello, hostname-deployment-7dfd748479-9n9v2</p> </blockquote>
root@master001:~/script/service# curl 10.10.11.10:30642 --silent | grep Hello
<p>Hello, hostname-deployment-7dfd748479-tx99m</p> </blockquote>
root@master001:~/script/service# curl 10.10.11.20:30642 --silent | grep Hello
<p>Hello, hostname-deployment-7dfd748479-9n9v2</p> </blockquote>
root@master001:~/script/service# curl 10.10.11.20:30642 --silent | grep Hello
<p>Hello, hostname-deployment-7dfd748479-j299p</p> </blockquote>
์ด๋ฒ์๋ cluster node์ external ip๋ก ์ ๊ทผํด ๋ณด๋๋ก ํ๋ค.
ํ์ฌ cluster์ externel network ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.
[root@wglee ~]# virsh net-dumpxml study-external
<network>
<name>study-external</name>
<uuid>664d3619-a64f-4388-a74b-e833e96b03b2</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr2' stp='on' delay='0'/>
<mac address='52:54:00:01:d3:a9'/>
<dns enable='no'/>
<ip family='ipv4' address='172.16.110.1' prefix='24'>
<dhcp>
<range start='172.16.110.2' end='172.16.110.254'/>
<host mac='52:54:00:76:9D:11' name='study-master001' ip='172.16.110.10'/>
<host mac='52:54:00:36:8E:1D' name='study-worker001' ip='172.16.110.20'/>
<host mac='52:54:00:32:56:44' name='study-deploy' ip='172.16.110.100'/>
<host mac='52:54:00:02:C8:FB' name='study-worker002' ip='172.16.110.21'/>
</dhcp>
</ip>
</network>
node์ ExternalIP:NodePort ๋ก curl ์ ํด์ ์ธ๋ถ์์๋ ์ ์๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ช ๋ฒ ๊ณ์ ํ๋ค๋ณด๋ฉด ์์ฒญ์ด ๋๋คํ๊ฒ ๋ถ์ฐ ๋๊ณ ์๋๊ฑธ ๋ณผ ์ ์๋ค.
์ด์ฒ๋ผ ์๋น์ค๋ ๋ณ๋์ ์ค์ ์ ํ์ง ์์๋ ์๋์ผ๋ก ์์ฒญ์ ๋ก๋๋ฐธ๋ฐ์ฑํ๋ค.
[root@wglee ~]# curl 172.16.110.20:30642 --silent | grep Hello
<p>Hello, hostname-deployment-7dfd748479-j299p</p> </blockquote>
[root@wglee ~]# curl 172.16.110.20:30642 --silent | grep Hello
<p>Hello, hostname-deployment-7dfd748479-tx99m</p> </blockquote>
[root@wglee ~]# curl 172.16.110.20:30642 --silent | grep Hello
<p>Hello, hostname-deployment-7dfd748479-j299p</p> </blockquote>
[root@wglee ~]# curl 172.16.110.21:30642 --silent | grep Hello
<p>Hello, hostname-deployment-7dfd748479-tx99m</p> </blockquote>
ClusterIP Type
ClusterIP๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ด๋ถ์ pod๋ผ๋ฆฌ ์ ๊ทผํ ๋ ์ฌ์ฉ๋๋ค. (์ด๋ pod๋ฅผ ์ธ๋ถ์ ๋
ธ์ถํ๋ ๋ฐฉ๋ฒ์ ์๋๋ค. )
์๋์ ๊ฐ์ ์ํฉ์ ๊ฐ์ ํด ๋ณด์.
frontend / backend application ์ด ๋์ํ๋ pod๊ฐ ๊ฐ๊ฐ ๋์ํ๊ณ ์๋ค.
frontend pod์ backend pod๋ ์๋ก ํต์ ํด์ผ ํ๋๋ฐ ๊ฐ pod ip๋ฅผ ๋ชฉ์ ์ง๋ก ํด์ ํต์ ํ๋ ๊ฒ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋๋ฌด ๋ง์ ๋ฟ๋๋ฌ, pod๊ฐ ์ฌ์์ฑ ๋ ๊ฒฝ์ฐ pod ip ๋ํ ๋ณ๋์ด ์์ ์ ์์ด ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค.
์ด๋ Service๋ฅผ ClusterIP ํ์
์ผ๋ก ๋ฐฐํฌํจ์ผ๋ก์จ ํ๋์ Service object๋ฅผ ๊ฑฐ์ฒ ์๋ก ํต์ ํ๋๋ก ํ ์ ์๋ค.
ClusterIP Service ์์ฑํ๊ธฐ
spec.selector : ํด๋น ์๋น์ค๊ฐ ์ ์ฉ๋ pod์ ๋ผ๋ฒจ์ ์ง์
spec.ports.port : ์๋น์ค๋ k8s cluster ๋ด์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ณ ์ ํ cluster ip๋ฅผ ๋ถ์ฌ ๋ฐ๋๋ค . ์ด๋ ๋ถ์ฌ๋ฐ์ IP์ ์ ๊ทผํ ๋ ์ฌ์ฉํ ํฌํธ.
spec.ports.targetPort : ๋์์ด ๋๋ pod๋ค์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ port. ์ฆ, pod template์ containerPort์ ๊ฐ์์ผ ํ๋ค.
spec.type : ํด๋น ์๋น์ค์ ํ์
์ง์
apiVersion: v1
kind: Service
metadata:
name: clusterip_service
spec:
ports:
- name: web-port
port: 8080
targetPort: 80
selector:
app: webserver
type: ClusterIP
์์ฑํ definition ํ์ผ๋ก ClusterIP ํ์ ์ ์๋น์ค๋ฅผ ์์ฑํ๋ค.
root@master001:~/script/service# kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
clusterip-service ClusterIP 10.106.34.37 <none> 8080/TCP 8m42s app=webserver
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9m23s <none>
์๋น์ค๋ฅผ ํตํด pod์ ์ด๋ป๊ฒ ์ ๊ทผ ๋๋์ง ๋ณด๊ธฐ ์ํด curl์ ๋ ๋ ค ๋ณธ๋ค.
clusterIP์ 8080(10.106.34.37:8080)์ ํตํด pod์ 80์ผ๋ก ๋ ์๋ ์น์๋ฒ์ ์ ๊ทผํ๋ค.
NodeIP ํ์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ์ ์์ฒญ์ ๋ ๋ฆฌ๋ค ๋ณด๋ฉด 3๊ฐ์ pod์ ์์ฒญ์ด ๋๋คํ๊ฒ ๋ถ์ฐ ๋๊ณ ์๋ค.
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
<p>Hello, hostname-deployment-7dfd748479-tx99m</p> </blockquote>
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
<p>Hello, hostname-deployment-7dfd748479-j299p</p> </blockquote>
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
<p>Hello, hostname-deployment-7dfd748479-tx99m</p> </blockquote>
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
<p>Hello, hostname-deployment-7dfd748479-9n9v2</p> </blockquote>
root@master001:~/script/service# curl 10.106.34.37:8080 --silent | grep hostname
<p>Hello, hostname-deployment-7dfd748479-j299p</p> </blockquote>
Service์ label selector์ Pod์ label์ด ๋งค์นญ๋์ด Service๊ฐ ๋ชจ๋ํฐ๋งํ Pod๋ค์ด ์ ํด์ง๋ฉด ์๋์ผ๋ก endpoint ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋๋ค.
endpoint ์ค๋ธ์ ํธ์๋ POD_IP:SERVICE_PORT ์ ๋ณด๊ฐ ๋ฑ๋ก๋๋ค.
root@master001:~/script/service# kubectl get endpoints
NAME ENDPOINTS AGE
clusterip-service 172.30.254.10:80,172.30.254.17:80,172.30.65.153:80 24m
kubernetes 172.16.110.10:6443 24m
LoadBalancer Type
์๋น์ค ์์ฑ๊ณผ ๋์์ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์์ฑํด pod์ ์ฐ๊ฒฐํ๋ค.
AWS, GCP์ ๊ฐ์ ํด๋ผ์ฐ๋ ํ๋ซํผ์์ ์ ์ฉ ๊ฐ๋ฅํ๋ค. ๋ง์ฝ ์จํ๋ ๋ฏธ์ค ์๋ฒ์์ Load Balancer ํ์
์ ์ฌ์ฉํ ๊ฒฝ์ฐ, MetalLB ๊ฐ์ ํ๊ฒฝ์ ๊ตฌ์ถํด์ผ ํ๋ค๊ณ ํ๋ค.
์ฐธ๊ณ ๋ฌธ์
- ์์ํ์ธ์ ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค
- udemy Certified Kubernetes Administrator (CKA) with Practice Tests ๊ฐ์
'๐ฏ OpenSource > K8S' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
12. Accessing to Pod metadata from application (2) | 2021.05.09 |
---|---|
11. Secret (0) | 2021.05.09 |
10. ConfigMap (0) | 2021.05.08 |
09. Job์ผ๋ก ์๋ฃ ๊ฐ๋ฅํ ๋จ์ผ task ๊ตฌํํ๊ธฐ (0) | 2021.04.05 |
08. DaemonSet (0) | 2021.04.05 |