๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์์ Envoy Proxy์ ์ค์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Envoy Proxy๋ Istio ๋ฐ์ดํฐ ํ๋ ์ธ์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก,
์๋ชป๋ ์ค์ ์ด ์ ์ฉ๋๋ฉด ์๋น์ค ๊ฐ ํต์ ์ฅ์ , ํธ๋ํฝ ๋ผ์ฐํ
์ค๋ฅ, ๋์ ์ง์ฐ ์๊ฐ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ Envoy Proxy์ ์ฃผ์ ๋ฌธ์ ์์ธ, ๋๋ฒ๊น ๋ฐฉ๋ฒ ๋ฐ ํด๊ฒฐ์ฑ ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๐น 1. Envoy Proxy์ ์ฃผ์ ์ค๋ฅ ์ ํ
์ค๋ฅ ์ ํ | ์ค๋ช |
503 ์ค๋ฅ (Service Unavailable) | Envoy๊ฐ ๋์ ์๋น์ค๋ฅผ ์ฐพ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ฐ์ |
404 ์ค๋ฅ (Not Found) | Envoy๊ฐ ์ฌ๋ฐ๋ฅธ VirtualService ๊ฒฝ๋ก๋ฅผ ์ฐพ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ฐ์ |
Envoy ์ค์ ๋ฐ์ ์คํจ | Istio ์ปจํธ๋กค ํ๋ ์ธ(istiod)๊ณผ ๋๊ธฐํ๋์ง ์์ ๊ฒฝ์ฐ ๋ฐ์ |
์ฐ๊ฒฐ ์๊ฐ ์ด๊ณผ (Timeout) | Envoy๊ฐ ๋์ ์๋น์ค์์ ์ฐ๊ฒฐ์ ์ค์ ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ฐ์ |
๋์ ๋ ์ดํด์ (High Latency) | Envoy ์ค์ ์ด ๋นํจ์จ์ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ ๊ฒฝ์ฐ ๋ฐ์ |
๐ก Envoy์ ์ค์ ์ค๋ฅ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์งํ๊ณ ํด๊ฒฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๐น 2. Envoy Proxy ๋๋ฒ๊น ๋ฐฉ๋ฒ
โ 2.1 VirtualService ๋ฐ DestinationRule ์ค์ ํ์ธ
Envoy Proxy๊ฐ ํธ๋ํฝ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ผ์ฐํ ํ์ง ์๋๋ค๋ฉด, VirtualService์ DestinationRule ์ค์ ์ ์ ๊ฒํด์ผ ํฉ๋๋ค.
VirtualService ์ค์ ํ์ธ
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
namespace: default
spec:
hosts:
- my-service.default.svc.cluster.local # ์ด VirtualService๊ฐ ์ ์ฉ๋ ์๋น์ค
http:
- match:
- uri:
prefix: /api/v1 # /api/v1 ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌ
route:
- destination:
host: my-service # ํธ๋ํฝ์ ๋ณด๋ผ ๋์ ์๋น์ค
subset: v1 # DestinationRule์์ ์ ์ํ v1 ์๋ธ์
์ผ๋ก ์ ๋ฌ
๐น ํ์ธํ ์ฌํญ:
- hosts์ ์ฌ๋ฐ๋ฅธ ์๋น์ค ์ด๋ฆ์ด ์๋์ง ํ์ธ
- match.uri.prefix๊ฐ ์์ฒญ๊ณผ ์ผ์นํ๋์ง ํ์ธ
- destination.host๊ฐ ์ฌ๋ฐ๋ฅธ ์๋น์ค์ธ์ง ์ ๊ฒ
DestinationRule ์ค์ ํ์ธ
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-service-dr
namespace: default
spec:
host: my-service.default.svc.cluster.local # ํธ๋ํฝ์ ์ ๋ฌํ ์๋น์ค
subsets:
- name: v1 # VirtualService์์ ์ฐธ์กฐํ ์๋ธ์
v1
labels:
version: v1 # version=v1 ๋ ์ด๋ธ์ด ๋ถ์ Pod์ผ๋ก ํธ๋ํฝ ์ ๋ฌ
- name: v2 # ์ถ๊ฐ ์๋ธ์
v2 (ํ์ํ ๊ฒฝ์ฐ)
labels:
version: v2 # version=v2 ๋ ์ด๋ธ์ด ๋ถ์ Pod์ผ๋ก ํธ๋ํฝ ์ ๋ฌ
๐น ํ์ธํ ์ฌํญ:
- host๊ฐ VirtualService์ ์ผ์นํ๋์ง ํ์ธ
- subsets์ name์ด VirtualService์์ ์ฐธ์กฐํ๋ subset๊ณผ ์ผ์นํ๋์ง ํ์ธ
- labels.version์ด ์ค์ Pod์ ๋ ์ด๋ธ๊ณผ ์ผ์นํ๋์ง ํ์ธ
โ 2.2 Envoy Proxy์ ํ์ฑ ์ํ ํ์ธ
Envoy Proxy๊ฐ ์ ์์ ์ผ๋ก ์คํ ์ค์ธ์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl get pods -n default | grep istio-proxy
์ถ๋ ฅ ์์ :
my-app-xyz123 2/2 Running 0 5m
๐ก 2/2 Running ์ํ์ธ์ง ํ์ธํ๊ณ , Proxy๊ฐ ์ ์์ ์ผ๋ก ์คํ ์ค์ธ์ง ํ์ธํด์ผ ํฉ๋๋ค.
โ 2.3 Envoy Proxy์ ๋คํธ์ํฌ ํ๋ฆ ํ์ธ
Envoy Proxy์ ๋คํธ์ํฌ ๋ผ์ฐํ ์ ๋ณด๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
istioctl proxy-status
์ถ๋ ฅ ์์ :
NAME CDS LDS EDS RDS VERSION
my-app-123456-abc.default SYNCED SYNCED SYNCED SYNCED 1.17.0
๐ก SYNCED ์ํ์ธ์ง ํ์ธํ๊ณ , ์ปจํธ๋กค ํ๋ ์ธ(istiod)๊ณผ ์ ์์ ์ผ๋ก ๋๊ธฐํ๋์ด ์๋์ง ์ ๊ฒํด์ผ ํฉ๋๋ค.
๐น 3. Envoy Proxy ํธ๋ฌ๋ธ์ํ ์ค์ ์์
โ 3.1 503 ์ค๋ฅ (Service Unavailable) ํด๊ฒฐ
๐ ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ:
- DestinationRule์์ ์๋ธ์ ์ค์ ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
- Pod์ด ์ ์์ ์ผ๋ก ์คํ ์ค์ธ์ง ํ์ธ
์ฌ๋ฐ๋ฅธ DestinationRule ์ค์
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-service-dr
namespace: default
spec:
host: my-service.default.svc.cluster.local
subsets:
- name: v1
labels:
version: v1 # version=v1 ๋ ์ด๋ธ์ ๊ฐ์ง Pod๋ง ์ ํ
์ฌ๋ฐ๋ฅธ Pod ์คํ ์ฌ๋ถ ํ์ธ
kubectl get pods -l version=v1 -n default
์ถ๋ ฅ ์์ :
NAME READY STATUS RESTARTS AGE
my-service-v1 1/1 Running 0 5m
โ 3.2 404 ์ค๋ฅ (Not Found) ํด๊ฒฐ
๐ ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ:
- VirtualService์ prefix ์ค์ ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
- Envoy Proxy์ ๋ผ์ฐํ ์ ๋ณด ํ์ธ
์ฌ๋ฐ๋ฅธ VirtualService ์ค์
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
namespace: default
spec:
hosts:
- my-service.default.svc.cluster.local
http:
- match:
- uri:
prefix: /api/v1 # /api/v1 ์์ฒญ๋ง ์ฒ๋ฆฌ
route:
- destination:
host: my-service
subset: v1
Envoy Proxy์ ๋ผ์ฐํ ์ ๋ณด ํ์ธ
istioctl proxy-config routes <pod-name> -n default
์ถ๋ ฅ ์์ :
prefix: /api/v1
cluster: outbound|80||my-service.default.svc.cluster.local
โ 3.3 ๋คํธ์ํฌ ์ง์ฐ(Latency) ํด๊ฒฐ
๐ ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ:
- Envoy Proxy์ Connection Pool ๋ฐ Keepalive ์ค์ ์ ์ต์ ํ
์ต์ ํ๋ DestinationRule ์ค์
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-service-dr
namespace: default
spec:
host: my-service.default.svc.cluster.local
trafficPolicy:
connectionPool:
http:
http1MaxPendingRequests: 5 # HTTP ์์ฒญ ๋๊ธฐ์ด ์ ํ
maxRequestsPerConnection: 3 # ํ๋์ ์ฐ๊ฒฐ์์ ์ฒ๋ฆฌํ ์ต๋ ์์ฒญ ์ ์ ํ
tcp:
maxConnections: 50 # TCP ์ต๋ ์ฐ๊ฒฐ ์ ์ ํ
outlierDetection:
consecutiveErrors: 3 # 3ํ ์ฐ์ ์ค๋ฅ ๋ฐ์ ์ ํด๋น ์ฐ๊ฒฐ ํด์
interval: 5s # ์ค๋ฅ ๊ฐ์ง ๊ฐ๊ฒฉ
baseEjectionTime: 10s # ์ฐ๊ฒฐ ํด์ ํ ์ฌ์๋ ๋๊ธฐ ์๊ฐ
๐ก Connection Pool ์ค์ ์ ์ต์ ํํ๋ฉด ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
๐ ๊ฒฐ๋ก
- Envoy Proxy ์ค์ ์ค๋ฅ๋ ์๋น์ค ๊ฐ ํธ๋ํฝ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ์ ์ํ๊ฒ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
- 503 ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด DestinationRule๊ณผ ๋์ Pod์ ์ ๊ฒํด์ผ ํฉ๋๋ค.
- 404 ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด VirtualService์ prefix ์ค์ ์ ํ์ธํด์ผ ํฉ๋๋ค.
- Connection Pool ๋ฐ Keepalive ์ค์ ์ ์ต์ ํํ๋ฉด ๋คํธ์ํฌ ์ฑ๋ฅ์ ํฅ์ํ ์ ์์ต๋๋ค.