๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์์ ๋ฐ์ํ๋ ๋คํธ์ํฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Istio๋ ์๋น์ค ๋ฉ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์๋ชป๋ ์ค์ ๋๋ ๊ณผ๋ํ ๋คํธ์ํฌ ๋ถํ๋ก ์ธํด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํนํ ๋์ ๋ ์ดํด์(Latency), ํจํท ์์ค(Packet Loss), ์์ฒญ ํ์์์(Request Timeout) ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ ๋คํธ์ํฌ ์ฑ๋ฅ ๋ฌธ์ ์ ์ฃผ์ ์์ธ, ๋๋ฒ๊น ๋ฐฉ๋ฒ ๋ฐ ํด๊ฒฐ์ฑ ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๐น 1. Istio ๋คํธ์ํฌ ์ฑ๋ฅ ์ ํ ์์ธ
๋ฌธ์ ์ ํ | ์ค๋ช |
๋์ ๋ ์ดํด์ (Latency ์ฆ๊ฐ) | ๊ณผ๋ํ ํธ๋ํฝ ํํฐ๋ง, ์๋ชป๋ ์ค์ ์ผ๋ก ์ธํด ์๋ต ์๊ฐ์ด ์ฆ๊ฐ |
ํจํท ์์ค (Packet Loss) | ๋คํธ์ํฌ ํผ์ก ๋๋ Envoy Proxy์ ๋ฆฌ์์ค ๋ถ์กฑ์ผ๋ก ์ธํด ํจํท ์์ค ๋ฐ์ |
ํ์์์ (Timeout ์ค๋ฅ ๋ฐ์) | ์์ฒญ์ด ์๊ฐ ๋ด์ ์๋ฃ๋์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ฐ์ |
CPU ์ฌ์ฉ๋ ๊ณผ๋ค (๋์ ๋ฆฌ์์ค ์ฌ์ฉ) | Envoy Proxy๊ฐ ๊ณผ๋ถํ ์ํ๋ก ์ธํด ์ฑ๋ฅ์ด ์ ํ๋จ |
๋ถํ์ํ ํธ๋ํฝ ๋ก๊น (Logging Overhead) | ๊ณผ๋ํ ํธ๋ํฝ ๋ก๊น ์ผ๋ก ์ธํด ์ฑ๋ฅ ์ ํ |
๐ก Istio์ ๋คํธ์ํฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด, Envoy Proxy ๋ฐ ๋คํธ์ํฌ ์ ์ฑ ์ ์ต์ ํํด์ผ ํฉ๋๋ค.
๐น 2. Istio ๋คํธ์ํฌ ์ฑ๋ฅ ๋๋ฒ๊น ๋ฐฉ๋ฒ
โ 2.1 ํ์ฌ ๋คํธ์ํฌ ์ํ ์ ๊ฒ
Istio์์ ๋คํธ์ํฌ ์ฑ๋ฅ์ ๋ถ์ํ๋ ค๋ฉด Kiali, Prometheus, Jaeger ๋ฑ์ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
1) Kiali๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ๊ฐ ๋คํธ์ํฌ ํ๋ฆ ํ์ธ
kubectl port-forward svc/kiali -n istio-system 20001:20001
- ๋ธ๋ผ์ฐ์ ์์ http://localhost:20001์ ์ ์ํ์ฌ ๋คํธ์ํฌ ํ๋ฆ์ ์๊ฐ์ ์ผ๋ก ๋ถ์ํ ์ ์์ต๋๋ค.
2) Prometheus๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์ง์ฐ(Latency) ๋ชจ๋ํฐ๋ง
kubectl port-forward svc/prometheus -n istio-system 9090:9090
- istio_request_duration_milliseconds ๋ฉํธ๋ฆญ์ ํ์ธํ์ฌ ์๋น์ค ์๋ต ์๋๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
3) Jaeger๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ํธ๋ ์ด์ฑ ํ์ธ
kubectl port-forward svc/jaeger-query -n istio-system 16686:16686
- http://localhost:16686์์ ํธ๋์ญ์ ํ๋ฆ์ ๋ถ์ํ์ฌ ์ง์ฐ์ด ๋ฐ์ํ๋ ๋ถ๋ถ์ ํ์ธํ ์ ์์ต๋๋ค.
๐ก Kiali, Prometheus, Jaeger๋ฅผ ํ์ฉํ๋ฉด ๋คํธ์ํฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ๋ถ์ํ ์ ์์ต๋๋ค.
โ 2.2 Envoy Proxy์ ๋ฆฌ์์ค ์ฌ์ฉ๋ ํ์ธ
๋คํธ์ํฌ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, Envoy Proxy๊ฐ ๊ณผ๋ถํ ์ํ์ธ์ง ์ ๊ฒํด์ผ ํฉ๋๋ค.
kubectl top pod -n default
์ถ๋ ฅ ์์ :
NAME CPU(cores) MEMORY(bytes)
my-app-56d7fbb85d-xyz12 50m 200Mi
istio-proxy 500m 800Mi
๐ก istio-proxy์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ ๊ฒฝ์ฐ, ๋ฆฌ์์ค ์ ํ์ ์ค์ ํด์ผ ํฉ๋๋ค.
๐น 3. ๋คํธ์ํฌ ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ
โ 3.1 Connection Pool ๋ฐ Keepalive ์ค์ ์ต์ ํ
์๋ชป๋ ๋คํธ์ํฌ ์ค์ ์ผ๋ก ์ธํด ๋ถํ์ํ ์ฐ๊ฒฐ์ด ์ ์ง๋๊ฑฐ๋, ๊ณผ๋ํ ๋ฆฌ์์ค๊ฐ ์๋น๋ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด 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 ์์ฒญ ๋๊ธฐ์ด์ 5๊ฐ๋ก ์ ํ
maxRequestsPerConnection: 3 # ํ๋์ ์ฐ๊ฒฐ์์ ์ฒ๋ฆฌํ ์ต๋ ์์ฒญ ์ ์ ํ
tcp:
maxConnections: 50 # TCP ์ต๋ ์ฐ๊ฒฐ ์ ์ ํ
outlierDetection:
consecutiveErrors: 3 # 3ํ ์ฐ์ ์ค๋ฅ ๋ฐ์ ์ ํด๋น ์ฐ๊ฒฐ ํด์
interval: 5s # ์ค๋ฅ ๊ฐ์ง ๊ฐ๊ฒฉ
baseEjectionTime: 10s # ์ฐ๊ฒฐ ํด์ ํ ์ฌ์๋ ๋๊ธฐ ์๊ฐ
๐ก Connection Pool ์ค์ ์ ์ต์ ํํ๋ฉด ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
โ 3.2 ํธ๋ํฝ ์์ถ(Compression) ํ์ฑํ
Envoy Proxy์์ ํธ๋ํฝ ์์ถ์ ํ์ฑํํ๋ฉด, ๋คํธ์ํฌ ๋์ญํญ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
Envoy ํํฐ ์ค์ ์ถ๊ฐ
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: compression-filter
namespace: istio-system
spec:
configPatches:
- applyTo: NETWORK_FILTER
match:
context: ANY
patch:
operation: ADD
value:
name: envoy.filters.http.compressor
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
response_direction_config:
common_config:
enabled: true
๐ก ์์ถ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ฉด ๋คํธ์ํฌ ํธ๋ํฝ์ ์ค์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
โ 3.3 ๋ถํ์ํ ํธ๋ํฝ ๋ก๊น ์ค์ด๊ธฐ
๊ณผ๋ํ ๋ก๊น
์ ๋คํธ์ํฌ ์ฑ๋ฅ ์ ํ ๋ฐ ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
ํ์ํ ์์ฒญ๋ง ๋ก๊น
ํ๋๋ก ์ค์ ํ๋ฉด ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
๋ถํ์ํ ํธ๋ํฝ ๋ก๊ทธ ํํฐ๋ง
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: access-logs
namespace: istio-system
spec:
accessLogging:
providers:
- name: envoy
filter:
expression: 'response.code >= 400' # HTTP 400 ์ด์ ์๋ฌ ๋ก๊ทธ๋ง ์ ์ฅ
๐ก ๋ถํ์ํ ํธ๋ํฝ ๋ก๊ทธ๋ฅผ ์ค์ด๋ฉด ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
โ 3.4 HPA๋ฅผ ํ์ฉํ Envoy Proxy ์คํ ์ค์ผ์ผ๋ง
๋คํธ์ํฌ ๋ถํ๊ฐ ์ฆ๊ฐํ๋ฉด Envoy Proxy๊ฐ ๊ณผ๋ถํ ์ํ๊ฐ ๋ ์ ์์ผ๋ฏ๋ก, Horizontal Pod Autoscaler(HPA)๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ํ์ฅ์ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Envoy Proxy HPA ์ค์
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: istio-proxy-hpa
namespace: istio-system
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: istio-proxy
minReplicas: 2 # ์ต์ 2๊ฐ์ Envoy Proxy ์ ์ง
maxReplicas: 5 # ์ต๋ 5๊ฐ์ Envoy Proxy ํ์ฅ
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU ์ฌ์ฉ๋์ด 70%๋ฅผ ์ด๊ณผํ๋ฉด ์๋ ํ์ฅ
๐ก HPA๋ฅผ ์ ์ฉํ๋ฉด ํธ๋ํฝ ๋ถํ์ ๋ฐ๋ผ Envoy Proxy๊ฐ ์๋ ํ์ฅ๋์ด ์ฑ๋ฅ์ด ์ต์ ํ๋ฉ๋๋ค.
๐ ๊ฒฐ๋ก
- ๋คํธ์ํฌ ์ฑ๋ฅ ์ ํ๋ Connection Pool, Keepalive ๋ฐ ํธ๋ํฝ ์์ถ์ ์ต์ ํํ๋ฉด ํด๊ฒฐํ ์ ์์ต๋๋ค.
- ๊ณผ๋ํ ๋ก๊น ์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก, ๋ถํ์ํ ๋ก๊ทธ๋ฅผ ํํฐ๋งํด์ผ ํฉ๋๋ค.
- HPA๋ฅผ ํ์ฉํ์ฌ Envoy Proxy๋ฅผ ์๋ ํ์ฅํ๋ฉด ๋คํธ์ํฌ ๋ถํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- Prometheus, Kiali ๋ฐ Jaeger๋ฅผ ํ์ฉํ๋ฉด ๋คํธ์ํฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ๋ถ์ํ ์ ์์ต๋๋ค.