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์ Virtual Service์ Destination Rule์ ํตํ ์์ฒญ ๋ผ์ฐํ ์ ๋ํด ์์๋ณด์์ต๋๋ค. ์์ ๊ตฌ์ถํ๋ ์์ ๋ค์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด๋ถ์ ์กด์ฌํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ์์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ์กด์ฌํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ์ธ๋ถ์ ์กด์ฌํ๋ DB์ ์ ๊ทผํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ธ๋ถ ์ปดํฌ๋ํธ์๋ ์ํธ์์ฉ์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ Istio์์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ธ๋ถ ์ปดํฌ๋ํธ์์ ์ํธ์์ฉ์ด ์ฒ๋ฆฌ๋๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Istio Gateway
Istio์์ ์ธ๋ถ์ ๋ชจ๋ ์์ฒญ์ ๋ํ ์
๊ตฌ๋ Istio Gateway๋ฅผ ํตํด ๊ตฌ์ฑ๋ฉ๋๋ค. Istio Gateway๋ HTTP ๋ฐ TCP ์๋น์ค๋ฅผ ๋
ธ์ถ์ํค๋ฉฐ TLS์ ๊ฐ์ ๋ณด์ ๊ด๋ จ ๊ธฐ๋ฅ๋ ์ ๊ณตํฉ๋๋ค. ๋ณดํต Istio Gateway๋ ์ฟ ๋ฒ๋คํฐ์ค์ Load Balancer Service์ ํจ๊ป ๊ตฌ์ฑ๋ฉ๋๋ค. EKS๋ GKE๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ, ํด๋ผ์ฐ๋ ํ๋ซํผ์ L4 ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ์์ฑ๋์ด ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ Public IP๊ฐ ๋ถ์ฌ๋ฉ๋๋ค.
์์ฑ๋ ๋ก๋๋ฐธ๋ฐ์๊ฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด Istio Gateway์ ์์ฒญ์ ์์ํ๊ณ ์ด์ ๊ธ์์ ์ค๋ช
ํ๋ ์์ฒญ ๋ผ์ฐํ
์ ํตํด ์ ์ ํ ์๋น์ค์ ์ ์ก๋ฉ๋๋ค. Istio Gateway์ Kubernetes Ingress๊ฐ ๋น์ทํ ๊ธฐ๋ฅ์ ํ๊ณ ์๋ ๊ฒ์ฒ๋ผ ์๊ฐํ ์๋ ์์ง๋ง Ingress๋ ์์ฒด์ ์ผ๋ก ๊ตฌ์ฑ๋ ๋ผ์ฐํ
๊ท์น์ ๊ฐ์ง๋ ๋ฐ๋ฉด์ Gateway๋ ๋ผ์ฐํ
๊ท์น์ด ๋ด์ฅ๋์ด ์์ง ์๊ณ Virtual Service๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ค๋ ์ฐจ์ด์ ์ด ์กด์ฌํฉ๋๋ค.
Gateway Tutorial
์์ ์ฌ์ฉํ๋ server application๋ฅผ ์ฌ์ฉํด์ Gateway์ ๋ํ ํ ์คํธ๋ฅผ ์งํํด๋ณด๊ฒ ์ต๋๋ค.
1. Gateway ๊ตฌ์ฑ
๋จผ์ Gateway์ ๋ํ ์ค์ ์ ์งํํ๊ฒ ์ต๋๋ค.
Gateway
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: web-gateway
spec:
selector:
app: istio-ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*.greeting.com"
์์ ์ฝ๋์์ selector๋ gateway๋ฅผ ์ํ gateway-controller๋ฅผ ์ง์ ํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฒ ์์ ์์๋ Istio์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋๋ Istio-ingressgateway๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ ํ์์ต๋๋ค. ์์ ๋ฉ๋ํ์คํธ๋ฅผ ์ ์ฉํ๋ฉด Host์ ํ์ ๋๋ฉ์ธ์ด greeting.com์ด๋ฉฐ 80๋ฒ ํฌํธ๋ก ๋ค์ด์ค๋ HTTP ํธ๋ํฝ์ ๋ฉ์๋ก ๋ฐ๊ฒ๋ฉ๋๋ค.
2. Virtual Service ๊ตฌ์ฑ
Gateway์์ ์ธ๋ถ ํธ๋ํฝ์ ๋ฐ์๋ค๋ฉด ์ด๋ฅผ ๋ฉ์ ๋ด๋ถ์์ ๋ผ์ฐํ ํ๊ธฐ ์ํ Virtual Service๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. ์ด๋ฒ์๋ v1/v2 subset์ ๋ํด 80:20์ ๊ฐ์ค์น ๋น์จ๋ก ๋ผ์ฐํ ๋๋๋ก ์ค์ ํ๊ฒ ์ต๋๋ค.
Virtual Service
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: webservice-vs
spec:
hosts:
- webservice
- webservice.greeting.com
gateways:
- web-gateway
http:
- route:
- destination:
host: webservice
subset: v1
weight: 80
- destination:
host: webservice
subset: v2
weight: 20
์ฒ๋ฆฌํ๊ณ ์ ํ๋ ๊ฒ์ดํธ์จ์ด๋ฅผ gateways: ํ๋์ ์ถ๊ฐํ๊ณ , gateway์์ ์ ์ํ๋ host์ ์ผ์นํ๊ฑฐ๋ ์ผ๋ถ์ ์ํ๋๋ก ํธ์คํธ ๋ชฉ๋ก์ ์ถ๊ฐํฉ๋๋ค.
3. Traffic Management Test
์์ Gateway, Virtual Service๊ณผ Server Application์ ํตํด ๊ตฌ์ถํ ์ดํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํด๋ณด๊ฒ ์ต๋๋ค. ์ ๋ Minikube๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Cloud Provider์์ ์ ๊ณตํด์ฃผ๋ ๊ฒ๊ณผ ๊ฐ์ด Load Balancer์ External IP๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค.
ํ์ง๋ง minikube service istio-ingressgateway -n istio-system์ ํตํด ์ธ๋ถ์์ ์ด ์๋น์ค์ ์ ๊ทผํ ์ ์๋๋ก ํด์ค๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ค์ ํ Gateway๋ 80 ํฌํธ์ ๋ํด ์ด๋ ค์๊ธฐ ๋๋ฌธ์ ์ด์ ํด๋นํ๋ http://192.168.64.2:30829๋ก ์ ๊ทผ์ ์๋ํ๋ฉด ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก Gateway์์ Host ์ค์ ์ผ๋ก ํ์ ๋๋ฉ์ธ์ด"greeting.com"์ด์ด์ผ ํฉ๋๋ค. ํ์ ๋๋ฉ์ธ์ ์ค์ ํ ์๋ ์์ง๋ง gateway์์๋ ํค๋์ ์กด์ฌํ๋ Host ํ๋๋ฅผ ํ์ธํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ถ๊ฐํด์ ์์ฒญ์ ๋ณด๋ด๋๋ก ํ๊ฒ ์ต๋๋ค. (10๋ฒ์ ์์ฒญ ๊ฒฐ๊ณผ๋ฅผ output.txt์ ์ ์ฅํ๋ shell script๋ฅผ ์ด์ฉํ์ต๋๋ค.)
Shell Script
#!/bin/bash
for num in `seq 1 10`
do
curl -v -HHost:webservice.greeting.com http://192.168.64.2:30829/ | tail -1 >> ~/output.txt
done
Output
Virtual Service์์ ๊ฐ์ค์น๋ฅผ 80:20์ผ๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ 10๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ฉด 8๋ฒ์ v1๊ณผ 2๋ฒ์ v2์ด ์๋ต๋ฉ๋๋ค.
โ ~ tail -f output.txt
version : 1.0
version : 2.0
version : 1.0
version : 1.0
version : 1.0
version : 2.0
version : 1.0
version : 1.0
version : 1.0
version : 1.0
์ฃผ์ํ ์ ์ Gateway ์ค์ ์ด ์ถ๊ฐ๋ Virtual Service๋ฅผ ๊ตฌ์ฑํ ๋, gateways: ํ๋์ mesh ํค์๋๊ฐ ์๋ค๋ฉด ์ธ๋ถ ์์ฒญ์ด ์๋ ์๋น์ค ๋ฉ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ํ๋ ์๋น์ค์ ๋ํด์๋ Virtual Service๊ฐ ์ ์ฉ๋์ง ์๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์์ ์ค์ ์์ mesh ํค์๋๋ฅผ ์ถ๊ฐํ์ฌ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: webservice-vs
spec:
hosts:
- webservice
- webservice.greeting.com
gateways:
- web-gateway
- mesh
http:
- route:
- destination:
host: webservice
subset: v1
weight: 80
- destination:
host: webservice
subset: v2
weight: 20
Outbound Traffic
์ง๊ธ๊น์ง Istio Gateway๋ฅผ ํตํด ์ธ๋ถ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์์๋ณด์์ต๋๋ค. ํ์ง๋ง ์๋น์ค๋ฅผ ์ด์ํ๋ฉด์ ํด๋ฌ์คํฐ ์ธ๋ถ์ ์๋น์ค์ ์์ธ์ค ํด์ผํ๋ ๊ฒฝ์ฐ๋ ๋ถ๋ช ๋ฐ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Istio๋ ์ธ๋ถ ์๋น์ค์ ์ ๊ทผํ๋ ์๋๋ฅผ ์ ํํ์ง ์์ง๋ง, ๋ณด์๊ณผ ๊ฐ์ ์ด์๋ก ์ธํด Outbound ํธ๋ํฝ์ ๋ํด ์ ์ดํ ํ์๊ฐ ๋ถ๋ช ์กด์ฌํฉ๋๋ค.
๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด Istio๋ outbound ํธ๋ํฝ์ ๋ํด 2๊ฐ์ง ์ ์ฑ ์ ์ง์ํฉ๋๋ค. ๊ธฐ๋ณธ ๊ฐ์ธ ALLOW_ANY๋ ๋ฉ์์ ๋ฑ๋ก๋์ง ์์ ์๋น์ค๋ผ๋ ์ฒ๋ฆฌ๋๋ ๊ฒ์ ์๋ฏธํ๊ณ , REGISTRY_ONLY๋ ๋ฑ๋ก๋์ง ์์ ์๋น์ค๋ผ๋ฉด block ๋๋ ์ ์ฑ ์ ์๋ฏธํฉ๋๋ค. ALLOW_ANY๋ ์์ฒญ์ด ์ฒ๋ฆฌ๋๊ธด ํ์ง๋ง ๋ฑ๋ก๋์ง ์์ ์๋น์ค๋ ํ๋ก์๋ฅผ ๊ฑฐ์น๋ ๊ฒ์ด ์๋๋ผ ์ดํ๋ฆฌ์ผ์ด์ (Pod) ๋คํธ์ํฌ์์ ๋ฐ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ด์ ๋ฐ๋๋ก Istio์ ConfigMap ์ค outbound ์ค์ ์ REGISTRY_ONLY๋ก ๋ณ๊ฒฝํ ํ ๋ค์ ํ ์คํธํ๋ฉด ์ ๊ทผํ ์ ์๋ค๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Service Entry
๋ฌผ๋ก ๋ฉ์ ๋ด๋ถ์ ์๋น์ค๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ฒ๋ผ ๋ฉ์ ์ธ๋ถ์ ์๋น์ค๋ฅผ registry์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํฉ๋๋ค. ์ด๋ฐ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ๋ฐฉ๋ฒ์ Service Entry๋ผ๊ณ ํฉ๋๋ค. ALLOW_ANY ๋ชจ๋์์๋ ๋ถ๋ช ์ธ๋ถ๋ก์ ์์ฒญ์ ๊ฐ๋ฅํ์ง๋ง ํธ๋ํฝ ๊ด๋ฆฌ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง Service Entry๋ฅผ ํตํด ์๋น์ค๋ฅผ ๋ฑ๋กํ๋ฉด Sidecar Proxy๋ฅผ ํตํด ์ธ๋ถ๋ก ์์ฒญ์ด ๋ณด๋ด์ง๊ณ ์ด๋ก ์ธํด ์๋น์ค ๋ฉ์๋ ํธ๋ํฝ ๊ด๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: naver
spec:
hosts:
- www.naver.com
ports:
- number: 443
name: https
protocol: HTTPS
resolution: DNS
location: MESH_EXTERNAL
๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด ์๋น์ค์ ๋ํ host, port๋ฅผ ์ค์ ํ๊ณ resolution์ ํตํด address ์กฐํ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ์์ ์ค์ ์ DNS ๊ธฐ๋ฐ์ ์ฌ์ฉํ์๊ณ ์ ์ ์ผ๋ก ๊ตฌ์ฑํ ์๋ ์์ต๋๋ค. location์ ์๋น์ค์ ์์น๋ฅผ ๋ํ๋ด๊ณ naver.com์ ๋ฉ์ ์ธ๋ถ์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ MESH_EXTERNAL๋ก ์ค์ ํ์์ต๋๋ค.
Egress Gateway
Service Entry๋ฅผ ํตํด ์ธ๋ถ ์๋น์ค์ ๋ํ ์ ํ์ ๋ ์๋ ์์ง๋ง, ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๋ถ ์๋น์ค์ ๋ํด์๋ ๋ฉ์ ๋ด๋ถ์ ๋ชจ๋ ์๋น์ค๊ฐ ์ ๊ทผํ ์ ์์ต๋๋ค. ํ์ง๋ง, ์ธ๋ถ ํธ๋ํฝ์ ๋ํ ์ธ์ฆ ๊ท์น์ด๋ ๊ถํ์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ํด Ingress Gateway์ ๊ฐ์ด ์ธ๋ถ๋ก ๋๊ฐ๋ ๋ชจ๋ ์์ฒญ์ด ๊ฑฐ์น๋ ๊ตฌ์ฑ ์์๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฅผ ์ํด Istio์์๋ Egress Gateway๋ฅผ ์ ์ํฉ๋๋ค.
Egress Gateway
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: naver-egressgateway
spec:
selector:
app: istio-egressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "www.naver.com"
Egress Gateway์์ ๋ฐ์ ์์ฒญ์ ๋ํด ๋ผ์ฐํ ๊ท์น์ ์ ์ํ๋ Virtual Service๋ ์์ฑํ๊ฒ ์ต๋๋ค.
Virtual Service
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: naver-egress-gateway
spec:
hosts:
- www.naver.com
gateways:
- naver-egressgateway
- mesh
http:
- match:
- gateways:
- mesh
port: 80
route:
- destination:
host: istio-egressgateway.istio-system.svc.cluster.local
port:
number: 80
weight: 100
- match:
- gateways:
- naver-egressgateway
port: 80
route:
- destination:
host: www.naver.com
port:
number: 80
weight: 100
์์ Virtual Service๋ www.naver.com์ ๊ดํ ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. mesh(sidecar proxy)์์ ๋ฐ์ํ๋ ์์ฒญ์ istio-egressgateway๋ก ๋ผ์ฐํ ๋๊ณ , egressgateway์ ๊ดํ ์์ฒญ์ Service Entry์์ ๋ฑ๋กํ ์๋น์ค ํฌํธ ๋ฐ ํธ์คํธ์ ์ผ์นํ๊ธฐ ๋๋ฌธ์ sidecar proxy๋ฅผ ๊ฑฐ์ณ www.naver.com์ผ๋ก ๋ผ์ฐํ ๋ฉ๋๋ค. ์ฆ, www.naver.com๋ก ๋๊ฐ๋ ๋ชจ๋ ์์ฒญ์ด egress-gateway๋ฅผ ๊ฑฐ์ณ ๋๊ฐ๊ฒ ๋๋ฉฐ ์ด๋ฅผ ํตํด ์ธ๋ถ ์ฐ๊ฒฐ์ ๋ชจ๋ํฐ๋งํ๊ธฐ์ ์ฉ์ดํ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ Istio Ingress๋ฅผ ํตํ ์ธ๋ถ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ๊ณผ Egress Gateway & Service Entry๋ฅผ ํตํ ์ธ๋ถ ์๋น์ค ์์ฒญ ์ ์ด ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์์ต๋๋ค. ๋ค์ ๊ธ์์๋ Istio ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฉํธ๋ฆญ์ ์ด๋ป๊ฒ ์์งํ๋์ง์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ธ๋ก๊ทธ์ ์ฌ์ฉ๋ ๋ชจ๋ ์์ ๋ Github์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
'๐ Service Mesh' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Service Mesh] 7. Logging (0) | 2021.01.28 |
---|---|
[Service Mesh] 6. Service Monitoring in Istio (0) | 2021.01.19 |
[Service Mesh] 4. Istio Traffic Management (1) - Virtual Service & Destination Rule (0) | 2021.01.14 |
[Service Mesh] 3. Istio? (0) | 2020.12.22 |
[Service Mesh] 2. Envoy Proxy (0) | 2020.12.21 |
๋๊ธ