Service Mesh ์์๋ณด๊ธฐ
- [Service Mesh] 1. Service Mesh๋?
- [Service Mehs] 2. Envoy Proxy
- [Service Mesh] 3. Istio?
- [Service Mesh] 4. Istio Traffic Management (1) - Virtual Service & Destination Rule
- [Service Mesh] 5. Istio Traffic Managerment (2) - Gateway & Service Entry
- [Service Mesh] 6. Service Monitoring in Istio
- [Service Mesh] 7. Logging
์ด๋ฒ ๊ธ์์๋ Istio์ Traffic Management์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. Istio์ ์ค์ํ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋ค์ด์ค๋ ์์ฒญ์ ์ ์ ํ๊ฒ ๋ผ์ฐํ ํด์ฃผ๋ ํธ๋ํฝ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๋๋ค. Istio์์ ์ด๋ป๊ฒ ํธ๋ํฝ ๊ด๋ฆฌ๋ฅผ ์ํํ๋์ง ์๊ธฐ ์ํด์๋ Virtual Service์ Destination Rule์ด๋ผ๋ ๊ฐ๋ ์ ๋ํด ์์์ผ ํฉ๋๋ค.
Virtual Service?
Virtual Service๋ ์ฟ ๋ฒ๋คํฐ์ค์์ Ingress๊ฐ L7 ๊ธฐ๋ฐ ์๋น์ค ๋ผ์ฐํ ์ ํด์ฃผ๋ ๊ฒ์ฒ๋ผ ํธ๋ํฝ์ ์ ์ ํ Service์ ๋ผ์ฐํ ํ๊ฒ ๋ฉ๋๋ค.
Destination Rule?
Destination Rule์ ํธ๋ํฝ์ ์ ์ฉ๋ ๋ผ์ฐํ ์ ์ฑ ์ ์ ์ํฉ๋๋ค. Virtual Service์ ํท๊ฐ๋ฆด ์๋ ์๋๋ฐ ๋จผ์ ์์ฒญ์ด ์ด๋ค Service์ ๋ผ์ฐํ ๋๋์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฒ์ด Virtual Service, ์ดํ Service์์ ์ด๋ป๊ฒ ํธ๋ํฝ์ ์ ์กํ ๊ฒ์ธ์ง ์ ํ๋ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ด Destination Rule์ ๋๋ค. ์ถ๊ฐ๋ก Destination Rule์์๋ Load Balancing, Connection Pool Size, ์ด์ ํ์ง ์ค์ ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ๋ ์ค์ ํ ์ ์์ต๋๋ค.
์ค๋ช ์ผ๋ก๋ ์ดํด๊ฐ ์ ๊ฐ์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ ์ดํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์ ํตํด ํธ๋ํฝ ๊ด๋ฆฌ๋ฅผ ์ํํด๋ณด๊ฒ ์ต๋๋ค.
Trrafic Management Tutorial
๋ค์์ผ๋ก Destination Rule ๋ฐ Virtual Service๋ฅผ ํ
์คํธํ๊ธฐ ์ํด ๊ฐ๋จํ Spring Boot ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ดํ๋ฆฌ์ผ์ด์
์ Front Application๊ณผ Server Application์ผ๋ก ๊ตฌ์ฑํ์์ต๋๋ค. ๋จผ์ Front Application์ Minikube ํ๊ฒฝ์์ ํ
์คํธ๋ฅผ ์ํด NodePort ํ์
์ Service๋ก ๋
ธ์ถ๋๋ฉฐ /hello๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ฐ์ผ๋ฉด RestTemplate์ ํตํด http://webservice:80/๋ก GET ์์ฒญ์ ๋ณด๋
๋๋ค.
Server Application์ /๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํ์ฌ ์๊ฐ๊ณผ ํด๋น ์ดํ๋ฆฌ์ผ์ด์
์ Version์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.
Front ๋ฐ Server Application์ ์ฝ๋๋ ๊ธ์ ๋ด์ฉ๊ณผ ๋ฌด๊ดํ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ธ๊ธํ์ง ์๊ฒ ์ต๋๋ค. ์ฝ๋๊ฐ ๊ถ๊ธํ์๊ฑฐ๋ ํ ์คํธ๋ฅผ ์ง์ ๊ตฌ๋ํด๋ณด๊ธฐ ์ํ์๋ ๋ถ์ Github์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ค ์ ์์ต๋๋ค.
1. ๋์ปค ์ด๋ฏธ์ง ์์ฑ
Front Application๊ณผ ๋ค๋ฅธ ๋ฒ์ ์ ๊ฐ๋ Server Application์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด์ค๋๋ค.
//front
โ docker build . -t front:1.0
//server
โ docker build . -t server:1.0 --build-arg version=1.0
โ docker build . -t server:2.0 --build-arg version=2.0
2. ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค ์์ฑ (Front Application)
์ด์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ํด๋น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ ์๋น์ค๋ฅผ ํตํด ๋ ธ์ถ์์ผ์ผ ํฉ๋๋ค. ๋จผ์ Front Application์ ์ํ Service์ Deployment๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Minikube ํ๊ฒฝ์์ ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒ ์งํํ๊ธฐ ์ํด Front Application๋ NodePort ํ์ ์ผ๋ก ๋ ธ์ถ๋๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
Service (Front Application)
apiVersion: v1
kind: Service
metadata:
name: frontservice
spec:
selector:
app: front
type: NodePort
ports:
- name: http-frontservice
port: 8080
protocol: TCP
targetPort: 8080
Deployment(Front Application)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-front
labels:
app: front
spec:
replicas: 1
selector:
matchLabels:
app: front
template:
metadata:
labels:
app: front
spec:
containers:
- name: front
image: front:1.0
ports:
- containerPort: 8080
3. ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค ์์ฑ (Server Application)
๋ค์์ผ๋ก Server Application์ ์ํ ๋ฆฌ์์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ ๋ ๋ฒ์ ์ ๋ฐ๋ฅธ Subset ๊ตฌ์ฑ๊ณผ ๋ผ์ฐํ ์ ํ ์คํธ ํด๋ณด๊ธฐ ์ํด Server Application์ webservice๋ผ๋ ํ๋์ Service๋ฅผ ํตํด ๋ ธ์ถํ๊ณ ๊ฐ ๋ฒ์ ์ ๋ฐ๋ฅธ Deployment๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค.
Service (Server Application)
apiVersion: v1
kind: Service
metadata:
name: webservice
spec:
selector:
app: server
ports:
- name: http-webservice
port: 80
protocol: TCP
targetPort: 8080
Deployment-v1.0/v2.0 (Server Application)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server-v1
labels:
app: server
version: v1.0
spec:
replicas: 1
selector:
matchLabels:
app: server
template:
metadata:
labels:
app: server
version: v1.0
spec:
containers:
- name: server
image: server:1.0
ports:
- containerPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server-v2
labels:
app: server
version: v2.0
spec:
replicas: 1
selector:
matchLabels:
app: server
template:
metadata:
labels:
app: server
version: v2.0
spec:
containers:
- name: server
image: server:2.0
ports:
- containerPort: 8080
4. Destination Rule ์ค์
Destination Rule์ Subset์ v1.0๊ณผ v2.0๋ฅผ ์ ์ํด์ค๋๋ค. ์๋ ์ค์ ์์ webservice๋ผ๋ host๋ก ์ค๋ ์์ฒญ์ v1(v1.0 ๋ฒ์ ๋ ์ด๋ธ์ ์ง๋ ๊ทธ๋ฃน)๊ณผ v2(v2.0 ๋ฒ์ ๋ ์ด๋ธ์ ์ง๋ ๊ทธ๋ฃน)์ผ๋ก ๊ตฌ๋ถ๋์ด์ง๋๋ค.
Destination Rule
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: web-destination
spec:
host: webservice
subsets:
- name: v1
labels:
version: v1.0
- name: v2
labels:
version: v2.0
์ถ๊ฐ๋ก subset ์ ์ ์ด์ธ์๋ Connection Pool, Load Balancing, Outlier Detection๊ณผ ๊ฐ์ ๊ธฐ๋ฅ๋ค๋ ์ํํ ์ ์์ต๋๋ค.
1) Connection Pool
Connection Pool์ ๋ชจ๋ ์ฐ๊ฒฐ์ ์๋ก ๋ง๋๋ ๊ฒ์ ๋ํ ๋น์ฉ์ ๊ฐ์ ํ๊ธฐ ์ํด ํ์ํฉ๋๋ค. ํนํ, ์๋น์ค ๋ฉ์ ์ํคํ ์ณ์์ TLS๋ฅผ ํ์ฑํ ํ์ ๊ฒฝ์ฐ ์ฐ๊ฒฐ์ ๋งบ๋๋ฐ ๋ฐ์ํ๋ ๋น์ฉ์ ํจ๊ณผ์ ์ผ๋ก ๊ฐ์์ํฌ ์ ์์ต๋๋ค. Istio์์๋ ์ด๋ฐ ์ค์ ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๊ณ ์์ต๋๋ค. ๋ง์ ์ค์ ์ด ์กด์ฌํ์ง๋ง ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ช๊ฐ์ง ์ค์ ๋ค๋ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
- maxConnections : Connection ์์ ์ต๋๊ฐ
- connectionTimeout: TCP ์ฐ๊ฒฐ์ ๋ฐ์ํ๋ timeout ์ ํ
- Http1MaxPendingRequests: Pending ์ํ์ HTTP ์์ฒญ ์ ์ ํ
์ฐธ๊ณ ๋ก, Connection Pool์ Envoy Proxy๋ฅผ ํตํด ๋ชจ๋ํฐ๋ง๋๋ฉฐ ์ค์ ํ ์ ํ๊ฐ๋ค์ ๋๋ฌํ๊ฒ ๋๋ฉด ํ๋ก ์ฐจ๋จ๊ธฐ ๋ฉ์ปค๋์ฆ์ ํตํด Connection Pool์ ์ํ๋ฅผ ์กฐ์ ํฉ๋๋ค.
2) Load Balancing
Destination Rule์์๋ Subset๊ฐ์ ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ํด ๋ค์ํ ๋ฉ์ปค๋์ฆ์ ์ง์ํฉ๋๋ค.
- Round Robin : ์๊ฐ ํํ ๋ง๋ค ์์ ๋ฐฐ๋ถ
- Least Connection : ๊ฐ์ฅ ์ ์ ์์ ์ฐ๊ฒฐ์ ์ ๊ณตํ๋ ํธ์คํธ ์ ํ
- Random : ์์ ๋ฐฐ๋ถ
- Consistent Hash : ์์ฒญ ํค๋ ๋ฐ ์ฟ ํค ๊ธฐ๋ฐ ํด์ฑ
3) Outlier Detection
Istio์์๋ ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋์ ํธ์คํธ์์ ๋น์ ์์ ์ธ ๋์์ ํ๋ ํธ์คํธ๋ฅผ ํ์งํด ๋ก๋ ๋ฐธ๋ฐ์ฑ ํธ์คํธ์์ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค. Istio๋ ์๋น์ค์์ ๋ฐ์ํ ์ฐ์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋ฉฐ ์ด ๋ ์ฐ๊ฒฐ ํ์์์, 5xx ์๋ต๊ณผ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ๋ฉด ์ค๋ฅ๋ก ๊ธฐ๋กํ๊ฒ ๋ฉ๋๋ค.
์์ ์ค์ ์์ v1.0์ Load Balacing ๋ฐ Connection Pool ์ค์ ์ ์ ์ฉํด Destination Rule์ ์์ ํ์ฌ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: web-destination
spec:
host: webservice
subsets:
- name: v1
labels:
version: v1.0
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
connectionPool:
tcp:
maxConnections: 100
connectTimeout: 30ms
tcpKeepalive:
time: 7200s
interval: 75s
- name: v2
labels:
version: v2.0
5. Virtual Service ์ค์
Virtual Service๋ ์์ฒญ์ ์๋น์ค ๋ฉ์์ ์ ์๋ ์๋น์ค์ ๋งคํํ๋ ๊ธฐ๋ฅ์ ๋ด๋นํฉ๋๋ค. ์ด ๋ ๊ตฌ์ฑ ์์์ ๋ํ ๋ถ์์ Destination Rule์ ํตํด ์ํ๋ฉ๋๋ค. ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๊ฒ ์กด์ฌํฉ๋๋ค.
1) Forwarding
์์ฒญ์ ์๋น์ค์ ๊ทธ๋๋ก ์ ๋ฌํฉ๋๋ค.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: webservice-vs
spec:
hosts:
- web-server
http:
- route:
- destination:
host: webservice
subset: v1
์์ ์ค์ ์ ์ด์ฉํ๊ฒ ๋๋ฉด ๋ชจ๋ ์์ฒญ์ webservice์ subset v1(v1.0)์ผ๋ก ๋ผ์ฐํ ํ๊ฒ ๋ฉ๋๋ค.
2) Rewrite
์์ฒญ์ ์ฌ์์ฑํฉ๋๋ค. ์์ฒญ์ ์ฌ์์ฑํ ๋์๋ match ์์ฑ์ ํตํด ์ฌ์์ฑํ ์์ฒญ์ ์ ์ํ๊ณ , rewrite ์์ฑ์ ํตํด ์๋ก์ด URI๋ฅผ ์ ์ํฉ๋๋ค.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: webservice-vs
spec:
hosts:
- web-server
http:
- match:
- headers:
x-upgrade:
exact: "TRUE"
- uri:
prefix: /hello
rewrite:
uri: /
route:
- destination:
host: webservice
subset: v1
์์ ์ค์ ์ ์ด์ฉํ๊ฒ ๋๋ฉด /hello๋ก ๋ค์ด์ค๋ ์์ฒญ ์ค Header์ x-upgrade๊ฐ TRUE์ธ ์์ฒญ์ ์ฌ์์ฑํ์ฌ subset v1์ /๋ก ์ ์กํ๊ฒ ๋ฉ๋๋ค.
3) Weight
Istio๋ ์๋น์ค ๊ฐ์ ์์ฒญ์ ์ ์ํ ๋น์จ๋ก ๋ถ๋ฐฐํ ์ ์์ต๋๋ค. ์์์ ์ค์ ํ v1.0, v2.0์ ๋ํด 50:50์ผ๋ก ๋ถ๋ฐฐํ๋ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: webservice-vs
spec:
hosts:
- web-server
http:
- route:
- destination:
host: webservice
subset: v1
weight: 50
- destination:
host: webservice
subset: v2.0
weight: 50
์ฐธ๊ณ ๋ก match ์์ฑ๊ณผ weight๋ฅผ ํตํด ์๋น์ค์ ํธ๋ํฝ์ ์ ์ดํ์ฌ ์นด๋๋ฆฌ ๋ฐฐํฌ ๋ฐ ๋ธ๋ฃจ-๊ทธ๋ฆฐ ๋ฐฐํฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
์ด๋ฒ ํ ์คํธ์์๋ weight ๋ฐฉ์์ ์ฌ์ฉํ์ฌ v1๊ณผ v2์ 50:50์ ๊ฐ์ค์น๋ก ๋ผ์ฐํ ๋๋ ๊ฒ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. Virtual Service๋ ์์ weight ์ค์ ์ ์ฌ์ฉํ์์ต๋๋ค.
6. Test ์ํ
๋จผ์ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ Istio๊ฐ ์ค์น๋ Minikube ํด๋ฌ์คํฐ์ ๋ฐฐํฌํ ํ, Front Application Service๋ก ์ ๊ทผํด์ค๋๋ค.
โ minikube service frontservice
|-----------|--------------|------------------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|--------------|------------------------|---------------------------|
| default | frontservice | http-frontservice/8080 | http://192.168.64.2:31410 |
|-----------|--------------|------------------------|---------------------------|
๐ Opening service default/frontservice in default browser...
weight๋ฅผ 50:50์ผ๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ ์์ URL์ ์ ์ํ๋ฉด v1.0๊ณผ v2.0์ ๋ํ ์๋ต์ ํ์ธํ ์ ์์ต๋๋ค. (๊ธ์ ์ฐ๋ค๊ฐ v2.0 ์บก์ณ ์ ์ minikube cluster๊ฐ ๋ฉ์ถฐ๋ฒ๋ ค์ ์บก์ณ๋ณธ์ ์์ต๋๋ค... ๋งฅ๋ถ ํ๋ก ์ฌ๊ณ ์ถ๋ค.....)
์ด๋ฒ ๊ธ์์๋ Destination Rule ๋ฐ Virtual Service๋ฅผ ํตํด ์๋น์ค ๋ฉ์์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ํ ๋ผ์ฐํ ์ ๋ํด ์์๋ดค์ต๋๋ค. ํ์ง๋ง, ์ด๋ฒ๊ธ์์ ๋ค๋ฃฌ ์์ ๋ค์ ์๋น์ค ๋ฉ์ ๋ด๋ถ์์ ๋ฐ์ํ๋ ์์ฒญ๋ค์ ๋ํด์๋ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง ์ธ๋ถ์์ ๋ฐ์ํ๋ ์์ฒญ๋ค์ ๋ํด์๋ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ์ธ๋ถ ๊ตฌ์ฑ ์์๋ค๊ณผ ์ํธ์์ฉํ๊ธฐ ์ํด ํ์ํ Istio์ ์ปดํฌ๋ํธ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ธ๋ก๊ทธ์ ์ฌ์ฉ๋ ๋ชจ๋ ์์ ๋ Github์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
'๐ Service Mesh' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Service Mesh] 6. Service Monitoring in Istio (0) | 2021.01.19 |
---|---|
[Service Mesh] 5. Istio Traffic Management (2) - Gateway & Service Entry (0) | 2021.01.16 |
[Service Mesh] 3. Istio? (0) | 2020.12.22 |
[Service Mesh] 2. Envoy Proxy (0) | 2020.12.21 |
[Service Mesh] 1. Service Mesh๋? (0) | 2020.12.20 |
๋๊ธ