๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio ์ปจํธ๋กค ํ๋ ์ธ์ ์ฑ๋ฅ ๋ถํ๋ฅผ ๋ถ์ํ๊ณ , ๋ฆฌ์์ค๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Istio๋ ์ปจํธ๋กค ํ๋ ์ธ(Control Plane)๊ณผ ๋ฐ์ดํฐ ํ๋ ์ธ(Data Plane)์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ,
์ปจํธ๋กค ํ๋ ์ธ์ ์ฑ๋ฅ์ด ์ ํ๋๋ฉด ๋คํธ์ํฌ ์ ์ฑ
์ ์ฉ ์๋ ์ง์ฐ, ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๋ฌธ์ , ๋์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ Istio ์ปจํธ๋กค ํ๋ ์ธ์ ๊ตฌ์ฑ ์์๋ณ ์ฑ๋ฅ ๋ถ์, ์์ ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง, ์ต์ ํ ๋ฐฉ๋ฒ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๐น 1. Istio ์ปจํธ๋กค ํ๋ ์ธ์ ๊ตฌ์ฑ ์์์ ์ญํ
Istio์ ์ปจํธ๋กค ํ๋ ์ธ์ ์๋น์ค ๋ฉ์์ ๋ํ ์ค์ ๋ฐ ์ ์ฑ
์ ๊ด๋ฆฌํ๋ ํต์ฌ ์ปดํฌ๋ํธ์
๋๋ค.
์ปจํธ๋กค ํ๋ ์ธ์ ์ฑ๋ฅ์ด ์ ํ๋๋ฉด, ์๋น์ค ๋ฉ์ ์ ์ฒด์ ์ฑ๋ฅ์๋ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ต์ ํ๊ฐ ํ์์ ์
๋๋ค.
โ 1.1 Istio ์ปจํธ๋กค ํ๋ ์ธ์ ์ฃผ์ ๊ตฌ์ฑ ์์
๊ตฌ์ฑ ์์ | ์ค๋ช |
istiod | Istio ์ปจํธ๋กค ํ๋ ์ธ์ ํต์ฌ ์ปดํฌ๋ํธ (์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ, ์ ์ฑ ๊ด๋ฆฌ) |
Pilot | Envoy ํ๋ก์ ๊ตฌ์ฑ ์ ๋ฌ (ํธ๋ํฝ ๋ผ์ฐํ ์ค์ ) |
Citadel | mTLS ์ธ์ฆ์ ๊ด๋ฆฌ (๋ณด์ ๋ฐ ์ธ์ฆ ๊ธฐ๋ฅ ์ ๊ณต) |
Galley | ์ค์ ๊ฒ์ฆ ๋ฐ ์๋น์ค ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ |
Injector | Sidecar ์๋ ์ฃผ์ ๊ด๋ฆฌ |
๐น 2. Istio ์ปจํธ๋กค ํ๋ ์ธ์ ์ฑ๋ฅ ๋ถ์ ๋ฐฉ๋ฒ
โ 2.1 ์ปจํธ๋กค ํ๋ ์ธ์ ๋ฆฌ์์ค ์ฌ์ฉ๋ ํ์ธ
Istio ์ปจํธ๋กค ํ๋ ์ธ์ด ํด๋ฌ์คํฐ์์ ์ฌ์ฉํ๋ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๋ฅผ ๋ถ์ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl top pod -n istio-system
์ถ๋ ฅ ์์ :
NAME CPU(cores) MEMORY(bytes)
istiod-5d8b6f8d7c-xyz12 250m 500Mi
istio-ingressgateway-7a6d5 180m 450Mi
๐ก istiod์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ณผ๋ํ๊ฒ ๋๋ค๋ฉด, ์ปจํธ๋กค ํ๋ ์ธ ์ฑ๋ฅ์ ์ต์ ํํด์ผ ํฉ๋๋ค.
โ 2.2 ์ปจํธ๋กค ํ๋ ์ธ์ ํ์ฑ ์ฐ๊ฒฐ ์ ํ์ธ
Istio ์ปจํธ๋กค ํ๋ ์ธ(istiod)์ด ๊ด๋ฆฌํ๋ ํ์ฑ ์ฐ๊ฒฐ ์(Envoy ํ๋ก์ ๊ฐ์)๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl exec -n istio-system -it $(kubectl get pod -l app=istiod -n istio-system -o jsonpath='{.items[0].metadata.name}') -- curl http://localhost:15014/metrics | grep istio_active
์ถ๋ ฅ ์์ :
istio_active_connections 250
๐ก istio_active_connections ๊ฐ์ด ๊ณผ๋ํ๊ฒ ๋๋ค๋ฉด, ์ปจํธ๋กค ํ๋ ์ธ ์ต์ ํ๊ฐ ํ์ํฉ๋๋ค.
โ 2.3 ์ปจํธ๋กค ํ๋ ์ธ์ ํธ๋์ญ์ ์ฒ๋ฆฌ ์๋ ํ์ธ
Istio ์ปจํธ๋กค ํ๋ ์ธ์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ค์ ๋ณ๊ฒฝ์ด ๋ฐ์๋๋ ์๋๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋๋ค.
kubectl apply -f new-virtualservice.yaml
kubectl get virtualservice -n default
์ ์ฉ๋ VirtualService๊ฐ ์ฆ์ ๋ฐ์๋์ง ์๊ฑฐ๋ ์ง์ฐ ์๊ฐ์ด ๊ธธ๋ค๋ฉด, ์ปจํธ๋กค ํ๋ ์ธ์ ๋ถํ๊ฐ ๊ณผ๋ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๐น 3. Istio ์ปจํธ๋กค ํ๋ ์ธ์ ์ต์ ํ ๋ฐฉ๋ฒ
โ 3.1 Istiod์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค ์ ํ ์ค์
Istio ์ปจํธ๋กค ํ๋ ์ธ์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ํํ๋ ค๋ฉด istiod์ ๋ฆฌ์์ค ์์ฒญ๊ณผ ์ ํ์ ์ค์ ํด์ผ ํฉ๋๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: istiod
namespace: istio-system
spec:
template:
spec:
containers:
- name: discovery
resources:
requests:
cpu: "500m" # ์ต์ 500m CPU ์์ฒญ
memory: "512Mi" # ์ต์ 512Mi ๋ฉ๋ชจ๋ฆฌ ์์ฒญ
limits:
cpu: "1000m" # ์ต๋ 1 CPU ์ ํ
memory: "1024Mi" # ์ต๋ 1Gi ๋ฉ๋ชจ๋ฆฌ ์ ํ
์ค๋ช :
- requests.cpu: "500m" → Istiod๊ฐ ์ต์ 500m(0.5 CPU)๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์
- limits.cpu: "1000m" → ์ต๋ 1 CPU๊น์ง๋ง ์ฌ์ฉํ ์ ์๋๋ก ์ ํ
- requests.memory: "512Mi" → ์ต์ 512Mi ๋ฉ๋ชจ๋ฆฌ ์์ฒญ
- limits.memory: "1024Mi" → ์ต๋ 1Gi ๋ฉ๋ชจ๋ฆฌ ์ ํ
๐ก ์ปจํธ๋กค ํ๋ ์ธ์ ๋ฆฌ์์ค๋ฅผ ์ ํํ๋ฉด ๊ณผ๋ํ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
โ 3.2 Sidecar ์ฃผ์ ์ต์ ํ (ํ์ํ ๋ค์์คํ์ด์ค๋ง ์ ์ฉ)
๋ชจ๋ ๋ค์์คํ์ด์ค์ Sidecar๋ฅผ ์๋์ผ๋ก ์ฃผ์
ํ๋ ๊ฒ์ ๋ถํ์ํ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ด๋ํ ์ ์์ต๋๋ค.
ํน์ ๋ค์์คํ์ด์ค์์๋ง Sidecar๊ฐ ์ฃผ์
๋๋๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
kubectl label namespace default istio-injection=enabled
kubectl label namespace kube-system istio-injection=disabled
๐ก istio-injection=disabled๋ก ์ค์ ํ๋ฉด, ๋ถํ์ํ Sidecar ์ฃผ์ ์ ๋ฐฉ์งํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
โ 3.3 Envoy ํ๋ก์ธ์ค ์ต์ ํ (Keepalive ์ค์ ์ ์ฉ)
Envoy ํ๋ก์๊ฐ ๋ถํ์ํ ์ฐ๊ฒฐ์ ์ง์์ ์ผ๋ก ์ ์งํ๋ฉด ์ปจํธ๋กค ํ๋ ์ธ์ ๋ถํ๋ฅผ ์ค ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Keepalive ์ค์ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
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: 10 # ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์์ฒญ ๊ฐ์ ์ ํ
maxRequestsPerConnection: 5 # ํ๋์ ์ฐ๊ฒฐ๋น ์ต๋ ์์ฒญ ๊ฐ์ ์ ํ
tcp:
maxConnections: 100 # ์ต๋ TCP ์ฐ๊ฒฐ ์ ์ ํ
outlierDetection:
consecutiveErrors: 5 # ์ค๋ฅ๊ฐ 5ํ ๋ฐ์ํ๋ฉด ์ฐ๊ฒฐ ํด์
interval: 10s # ์ค๋ฅ ๊ฐ์ง ์ฃผ๊ธฐ
baseEjectionTime: 30s # ์ฐ๊ฒฐ ํด์ ํ ์ฌ์๋ ์๊ฐ
์ค๋ช :
- http1MaxPendingRequests: 10 → HTTP ์์ฒญ ๋๊ธฐ์ด์ 10๊ฐ๋ก ์ ํ
- maxRequestsPerConnection: 5 → ํ๋์ ์ฐ๊ฒฐ์์ ์ต๋ 5๊ฐ์ ์์ฒญ๋ง ํ์ฉ
- tcp.maxConnections: 100 → ์ต๋ 100๊ฐ์ TCP ์ฐ๊ฒฐ ์ ์ง
- consecutiveErrors: 5 → 5๋ฒ ์ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์ฐ๊ฒฐ ์ฐจ๋จ
๐ก Envoy์ ์ฐ๊ฒฐ ์๋ฅผ ์ต์ ํํ๋ฉด ์ปจํธ๋กค ํ๋ ์ธ์ ๋ถํ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์ํ ์ ์์ต๋๋ค.
๐ ๊ฒฐ๋ก
- Istio ์ปจํธ๋กค ํ๋ ์ธ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ ํํด์ผ ํฉ๋๋ค.
- istiod์ ๋ฆฌ์์ค ์ ํ์ ์ค์ ํ๋ฉด ์ปจํธ๋กค ํ๋ ์ธ์ด ๊ณผ๋ถํ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- Sidecar ์๋ ์ฃผ์ ์ ํน์ ๋ค์์คํ์ด์ค์์๋ง ํ์ฑํํ์ฌ ๋ถํ์ํ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ค์ผ ์ ์์ต๋๋ค.
- Envoy์ ์ฐ๊ฒฐ ํ(Connection Pool) ๋ฐ Keepalive ์ค์ ์ ์ต์ ํํ๋ฉด ๋คํธ์ํฌ ํธ๋ํฝ ๋ถํ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.