Search

[CKA] 12. Services

Date
2024/11/21
Category
Devops
Tag
Kubernetes
CKA
Core Concept
๋ชฉ์ฐจ

Services

Service๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ (Users - Frontend - Backend - ์™ธ๋ถ€ DB Source)

ย External Networking

์•„๋ž˜์™€ ๊ฐ™์€ ์…‹์—…์ผ ๋•Œ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž๊ฐ€ ์›นํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋Š” ๋ฐฉ๋ฒ•
Client IP
192.168.1.10
Node IP
192.168.1.2
Internal Pod Network
10.244.0.0
Pod IP
10.244.0.2
1.
ssh๋ฅผ ํ†ตํ•ด Node ์ ‘๊ทผ ํ›„ curl์„ ์คŒ curl http://10.244.0.2 Node์— GUI๊ฐ€ ์žˆ๋‹ค๋ฉด ์ธํ„ฐ๋„ท ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘๊ทผ
2.
Kubernetes Service๋ฅผ ์‚ฌ์šฉ โ†’ Node IP๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ curl http://192.168.1.2:30008

ย Service Types

โ€ข
NodePort: ๋‚ด๋ถ€ ํฌํŠธ๋ฅผ ๋…ธ๋“œ์˜ ํฌํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ (Node Port๋ฅผ Listenํ•˜๊ณ  ํ•ด๋‹น ํฌํŠธ์˜ ์š”์ฒญ์„ ์—ฐ๊ฒฐ๋œ Pod์˜ Port๋กœ ์ „๋‹ฌํ•จ)
โ€ข
ClusterIP: ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ๊ฐ€์ƒ IP๋ฅผ ๋งŒ๋“ค์–ด ๋‹ค๋ฅธ ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ (ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„-๋ฐฑ์—”๋“œ ์„œ๋ฒ„)
โ€ข
LoadBalancer: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์— ํ”„๋กœ๋น„์ „ํ•จ

ย NodePort

์„œ๋น„์Šค๊ฐ€ ๋…ธ๋“œ์˜ ํฌํŠธ๋กœ๋ถ€ํ„ฐ Pod์— ๋งคํ•‘ํ•ด ์คŒ. NodePort๋Š” 30,000~32,767์˜ ์œ ํšจํ•œ ๋ฒ”์œ„ ๋‚ด์— ์กด์žฌ
ํฌํŠธ ์šฉ์–ด๋“ค์€ ์„œ๋น„์Šค์˜ ๊ด€์ ์œผ๋กœ ์ƒ๊ฐ
โ€ข
TargetPort: Pod์˜ ํฌํŠธ
โ€ข
Port: Servicedml ํฌํŠธ
โ€ข
NodePort: ๋…ธ๋“œ ์ž์ฒด์˜ ํฌํŠธ (์™ธ๋ถ€์—์„œ Pod์— ์•ก์„ธ์Šคํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ)
# service-definition.yml apiVersion: v1 kind: Service metadata: name: myapp-service spec: type: NodePort ports: - targetPort: 80 # ์ •์˜ํ•˜์ง€ ์•Š์„ ์‹œ port์™€ ๊ฐ™๋‹ค๊ณ  ์—ฌ๊ฒจ์ง port: 80 # ํ•„์ˆ˜ ํ•„๋“œ nodePort: 30008 # ์ •์˜ํ•˜์ง€ ์•Š์„ ์‹œ ๋žœ๋ค ํ• ๋‹น selector: # 80๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ์•ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค Pod์™€ ์—ฐ๊ฒฐํ•˜๋Š”์ง€ ๊ธฐ์ž… app: myapp type: front-end
YAML
๋ณต์‚ฌ

ย NodePort - Multi-Pod in One Node

๊ณ ๊ฐ€์šฉ์„ฑ๊ณผ ๋ถ€ํ•˜ ๋ถ„์‚ฐ์˜ ๋ชฉ์ ์œผ๋กœ Pod๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ, ๋ชจ๋‘ ๊ฐ™์€ Label์„ ๊ฐ€์ง ์ด ๊ฒฝ์šฐ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด Label์ด ์žˆ๋Š” ๋ชจ๋“  Pod๋ฅผ Endpoint๋กœ ์„ ํƒํ•ด ์™ธ๋ถ€ ์š”์ฒญ์„ ์ „๋‹ฌํ•จ
์ด ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌด์ž‘์œ„์ž„
โ€ข
Algorithm: Random
โ€ข
SessonAffinity: Yes

ย NodePort - Multi-Pod in Multi-Node

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ถ„๋ฆฌ๋œ ๋…ธ๋“œ์— Pod๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  ๋…ธ๋“œ์— ๊ฑธ์ณ Service๋ฅผ ์ƒ์„ฑํ•˜๊ณ  TargetPort๋ฅผ ๊ฐ™์€ NodePort๋กœ ๋งคํ•‘ํ•จ
ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋…ธ๋“œ์˜ IP์™€ ๋™์ผํ•œ Port๋ฅผ ์‚ฌ์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ก์„ธ์Šค ๊ฐ€๋Šฅ
curl http://192.168.1.2:30008
curl http://192.168.1.3:30008
curl http://192.168.1.4:30008

ย ClusterIP

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„œ๋น„์Šค๋‚˜ ๊ณ„์ธต ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ํ™•๋ฆฝ
โ€ข
Pod๋Š” ๋ชจ๋‘ ํ• ๋‹น๋œ IP address๊ฐ€ ์žˆ์ง€๋งŒ ์ •์ ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ ๊ฐ„ ๋‚ด๋ถ€ ํ†ต์‹ ์—์„œ ์ด IP ์ฃผ์†Œ๋งŒ ์˜์กดํ•  ์ˆ˜ ์—†์Œ
โ€ข
๊ฐ™์€ Pod๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ๋‹ค๋ฅธ Pod๊ฐ€ ํ•ด๋‹น ์„œ๋น„์Šค๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต ์š”์ฒญ์€ ๋ฌด์ž‘์œ„๋กœ ํ•˜๋‚˜์˜ Pod๋กœ ์ „๋‹ฌ
โ€ข
๋‹ค๋ฅธ ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ ๊ณ„์ธต์€ ํ•„์š”ํ•œ๋Œ€๋กœ ํ™•์žฅ ๋˜๋Š” ์ด๋™์ด ๊ฐ€๋Šฅ
โ€ข
๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ IP์™€ ๊ทธ์— ํ• ๋‹น๋œ ์ด๋ฆ„์„ ๊ฐ€์ง€๋ฉฐ, Pod๋Š” ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ๋•Œ ๊ทธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•จ
# service-definition.yml apiVersion: v1 kind: Service metadata: name: back-end spec: type: ClusterIP # ์ •์˜ํ•˜์ง€ ์•Š์„ ์‹œ ์ž๋™์œผ๋กœ ClusterIP๋กœ ์„ค์ •๋จ ports: - targetPort: 80 # ์ •์˜ํ•˜์ง€ ์•Š์„ ์‹œ port์™€ ๊ฐ™๋‹ค๊ณ  ์—ฌ๊ฒจ์ง port: 80 # ํ•„์ˆ˜ ํ•„๋“œ selector: # 80๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ์•ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค Pod์™€ ์—ฐ๊ฒฐํ•˜๋Š”์ง€ ๊ธฐ์ž… app: myapp type: back-end
YAML
๋ณต์‚ฌ

ย LoadBalancer

NodePort๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€์—์„œ Pod๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹จ์ผํ™”๋œ ๋„๋ฉ”์ธ์œผ๋กœ ์ ‘๊ทผ์„ ์›ํ•  ๊ฒฝ์šฐ, LoadBalancer๋ฅผ ์‚ฌ์šฉํ•จ
โ€ข
LoadBalancer Type์€ AWS, GCP, Azure์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
โ€ข
VirtualBox ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ๋Š” LoadBalancer๋กœ ํƒ€์ž… ์ง€์ •์„ ํ•˜๋”๋ผ๋„ NodePort์˜ ๊ธฐ๋Šฅ์„ ํ•จ (๋ถ€ํ•˜๋ถ„์‚ฐ์ด ์ด๋ค„์ง€์ง€ ์•Š์Œ)
# service-definition.yml apiVersion: v1 kind: Service metadata: name: myapp-service spec: type: LoadBalancer ports: - targetPort: 80 # ์ •์˜ํ•˜์ง€ ์•Š์„ ์‹œ port์™€ ๊ฐ™๋‹ค๊ณ  ์—ฌ๊ฒจ์ง port: 80 # ํ•„์ˆ˜ ํ•„๋“œ nodePort: 30008 # (Optional) LoadBalancer๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ํ”Œ๋žซํผ์˜ ๊ฒฝ์šฐ NodePort๋กœ ๋Œ€์ฒด๋จ
YAML
๋ณต์‚ฌ

(์ฐธ๊ณ ) LoadBalance Without LoadBalancer

LoadBalancer ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ถ€ํ•˜๋ถ„์‚ฐ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€ VM์„ ์ƒ์„ฑํ•˜๊ณ  HA Proxy๋‚˜ Nginx ๋“ฑ์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•œ๋‹ค.