๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์ Sidecar Proxy(Envoy)์ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์ค์ด๋ ์ต์ ํ ์ ๋ต์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Istio๋ ๊ฐ Pod์ Envoy ํ๋ก์๋ฅผ Sidecar๋ก ์ฃผ์
ํ์ฌ ํธ๋ํฝ์ ๊ด๋ฆฌํ๋๋ฐ,
์๋น์ค๊ฐ ๋ง์์ง์๋ก Sidecar๊ฐ ์ฌ์ฉํ๋ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฆ๊ฐํ์ฌ ์ฑ๋ฅ ์ ํ ๋ฐ ๋ฆฌ์์ค ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ Envoy Sidecar์ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์ค์ด๋ ๋ฐฉ๋ฒ, ์ค์ ์ต์ ํ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๐น 1. Sidecar Proxy(Envoy)์ ๋ฆฌ์์ค ์ฌ์ฉ๋ ๋ถ์
โ 1.1 Sidecar Proxy์ ์ญํ
Sidecar Proxy(Envoy)๋ Istio์ ๋ฐ์ดํฐ ํ๋ ์ธ์์ ํธ๋ํฝ์ ๊ด๋ฆฌํ๊ณ ๋ณด์ ์ ์ฑ
์ ์ ์ฉํ๋ ํต์ฌ ๊ตฌ์ฑ ์์์
๋๋ค.
๊ฐ Pod์ ์๋์ผ๋ก ์ฃผ์
๋๋ฉฐ, ์๋น์ค ๊ฐ ํต์ ์ ํ๋ก์ํ์ฌ ํธ๋ํฝ์ ์ ์ดํ๊ณ ๋ชจ๋ํฐ๋งํ๋ ์ญํ ์ ํฉ๋๋ค.
Envoy Sidecar๊ฐ ์ํํ๋ ์์
1๏ธโฃ ์๋น์ค ๊ฐ ํธ๋ํฝ ํ๋ก์ ์ญํ ์ํ (L4/L7 ๋ผ์ฐํ
)
2๏ธโฃ mTLS ์ํธํ ๋ฐ ์ธ์ฆ (๋ณด์ ๊ฐํ)
3๏ธโฃ ํธ๋ํฝ ๋ก๊น
๋ฐ ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ ์์ง
4๏ธโฃ ์๋น์ค ๊ฐ ๋ถํ ๋ถ์ฐ (Load Balancing)
๐ก Sidecar Proxy๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋ชจ๋ Pod์ ์ฃผ์ ๋๋ฏ๋ก ๋ฆฌ์์ค ์ฌ์ฉ๋์ด ๋์ ์ ์์ต๋๋ค.
โ 1.2 Sidecar Proxy์ ๋ฆฌ์์ค ์ฌ์ฉ๋ ํ์ธ
ํ์ฌ ์คํ ์ค์ธ Sidecar Proxy(Envoy)์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl top pod -n default
์ถ๋ ฅ ์์ :
NAME CPU(cores) MEMORY(bytes)
my-app-56d7fbb85d-xyz12 50m 200Mi
my-app-56d7fbb85d-xyz12 100m 350Mi # istio-proxy (Sidecar)
๐ก Sidecar(istio-proxy)์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ณผ๋ํ๋ฉด ์ต์ ํ๊ฐ ํ์ํฉ๋๋ค.
๐น 2. Sidecar Proxy ์ต์ ํ ๋ฐฉ๋ฒ
โ 2.1 ๋ถํ์ํ Sidecar ์๋ ์ฃผ์ ๋ฐฉ์ง
๋ชจ๋ ๋ค์์คํ์ด์ค์ Sidecar๋ฅผ ์๋์ผ๋ก ์ฃผ์
ํ๋ ๊ฒ์ ๋ถํ์ํ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ด๋ํ ์ ์์ต๋๋ค.
ํน์ ๋ค์์คํ์ด์ค์์๋ง Sidecar๊ฐ ์ฃผ์
๋๋๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
โ ํน์ ๋ค์์คํ์ด์ค์์๋ง Sidecar ์๋ ์ฃผ์ ํ์ฑํ
kubectl label namespace default istio-injection=enabled
kubectl label namespace kube-system istio-injection=disabled
โก ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ง Sidecar ์ฃผ์ ์ ์ฉ
์๋ ์์ ์ฒ๋ผ Pod์ ํน์ ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํ๋ฉด Sidecar ์ฃผ์ ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
apiVersion: v1
kind: Pod
metadata:
name: my-app
namespace: default
annotations:
sidecar.istio.io/inject: "false" # Sidecar ์๋ ์ฃผ์
๋นํ์ฑํ
spec:
containers:
- name: app
image: my-app:v1
๐ก ๋ถํ์ํ ์๋น์ค์ Sidecar๋ฅผ ์ฃผ์ ํ์ง ์์ผ๋ฉด ํด๋ฌ์คํฐ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
โ 2.2 Envoy Proxy์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ ํ ์ค์
Sidecar Proxy(Envoy)์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ํํ์ฌ ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: default
spec:
template:
spec:
containers:
- name: my-app
image: my-app:v1
- name: istio-proxy
resources:
requests:
cpu: "100m" # ์ต์ 100m CPU ์์ฒญ
memory: "256Mi" # ์ต์ 256Mi ๋ฉ๋ชจ๋ฆฌ ์์ฒญ
limits:
cpu: "500m" # ์ต๋ 500m CPU ์ ํ
memory: "512Mi" # ์ต๋ 512Mi ๋ฉ๋ชจ๋ฆฌ ์ ํ
์ค๋ช :
- requests.cpu: "100m" → ์ต์ 100m(0.1 CPU)๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์
- limits.cpu: "500m" → ์ต๋ 500m(0.5 CPU)๊น์ง๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- requests.memory: "256Mi" → ์ต์ 256Mi ๋ฉ๋ชจ๋ฆฌ ์์ฒญ
- limits.memory: "512Mi" → ์ต๋ 512Mi ๋ฉ๋ชจ๋ฆฌ ์ ํ
๐ก Sidecar์ ๋ฆฌ์์ค๋ฅผ ์ ํํ๋ฉด ์ปจํ ์ด๋๊ฐ ๊ณผ๋ํ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
โ 2.3 ํํฐ๋ง์ ํตํด ํธ๋ํฝ ๋ก๊น ๋ฐ์ดํฐ ์ค์ด๊ธฐ
๊ธฐ๋ณธ์ ์ผ๋ก Envoy Proxy๋ ๋ชจ๋ ํธ๋ํฝ ๋ก๊ทธ๋ฅผ ์ ์ฅํ์ง๋ง,
๋ถํ์ํ ๋ก๊ทธ๋ฅผ ํํฐ๋งํ๋ฉด ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
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 ์ด์ ์๋ฌ ๋ก๊ทธ๋ง ์ ์ฅ
์ค๋ช :
- filter.expression: 'response.code >= 400' → HTTP ์๋ต ์ฝ๋ 400 ์ด์๋ง ๋ก๊ทธ ์ ์ฅ
๐ก ๋ชจ๋ ํธ๋ํฝ์ ๋ก๊น ํ๋ ๋์ , ์๋ฌ ๋ก๊ทธ๋ง ์ ์ฅํ๋ฉด ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
โ 2.4 Keepalive ์ค์ ์ ํตํด ๋ถํ์ํ ์ฐ๊ฒฐ ์ ์ง ๋ฐฉ์ง
Envoy Proxy๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ฐ๊ฒฐ์ ์ ์งํ์ง๋ง,
๋ถํ์ํ ์ฐ๊ฒฐ์ ์ค์ด๋ฉด ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
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 # ๋๊ธฐ ์ค์ธ ์์ฒญ ์ ์ ํ
maxRequestsPerConnection: 3 # ํ๋์ ์ฐ๊ฒฐ๋น ์ต๋ ์์ฒญ ๊ฐ์ ์ ํ
tcp:
maxConnections: 50 # ์ต๋ TCP ์ฐ๊ฒฐ ์ ์ ํ
outlierDetection:
consecutiveErrors: 3 # ์ค๋ฅ๊ฐ 3ํ ๋ฐ์ํ๋ฉด ์ฐ๊ฒฐ ํด์
interval: 5s # ์ค๋ฅ ๊ฐ์ง ์ฃผ๊ธฐ
baseEjectionTime: 10s # ์ฐ๊ฒฐ ํด์ ํ ์ฌ์๋ ์๊ฐ
์ค๋ช :
- http1MaxPendingRequests: 5 → HTTP ์์ฒญ ๋๊ธฐ์ด์ 5๊ฐ๋ก ์ ํ
- maxRequestsPerConnection: 3 → ํ๋์ ์ฐ๊ฒฐ์์ ์ต๋ 3๊ฐ์ ์์ฒญ๋ง ํ์ฉ
- tcp.maxConnections: 50 → ์ต๋ 50๊ฐ์ TCP ์ฐ๊ฒฐ ์ ์ง
- consecutiveErrors: 3 → 3๋ฒ ์ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์ฐ๊ฒฐ ์ฐจ๋จ
๐ก Envoy์ ์ฐ๊ฒฐ ์๋ฅผ ์ต์ ํํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์ํ ์ ์์ต๋๋ค.
๐ ๊ฒฐ๋ก
- ๋ชจ๋ ์๋น์ค์ Sidecar๋ฅผ ์๋ ์ฃผ์ ํ์ง ์๊ณ , ํ์ํ ์๋น์ค์๋ง ์ฃผ์ ํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
- Envoy Proxy์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๋ฅผ ์ ํํ์ฌ ํด๋ฌ์คํฐ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
- ๋ถํ์ํ ํธ๋ํฝ ๋ก๊น ์ ์ค์ด๋ฉด ๋ฆฌ์์ค ์ฌ์ฉ๋์ ํจ๊ณผ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค.
- Keepalive ์ค์ ์ ์กฐ์ ํ์ฌ ๋ถํ์ํ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ํฅ์ํ ์ ์์ต๋๋ค.