๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์ Fault Injection ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ฅ์ ํ
์คํธ ๋ฐ Chaos Engineering์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Fault Injection(๊ฒฐํจ ์ฃผ์
)์ ์ผ๋ถ๋ฌ ์ฅ์ ๋ฅผ ๋ฐ์์์ผ ์์คํ
์ ๋ณต์๋ ฅ(Resilience)์ ํ๊ฐํ๋ ๊ธฐ์ ์
๋๋ค.
์ด๋ฅผ ํตํด ์๋น์ค ์ฅ์ ๋ฐ์ ์ ์์คํ
์ด ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ๋ฏธ๋ฆฌ ํ
์คํธํ๊ณ ๋๋นํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ Fault Injection์ ๊ฐ๋
, Istio๋ฅผ ํ์ฉํ ์ฅ์ ํ
์คํธ ๋ฐฉ๋ฒ,
๊ทธ๋ฆฌ๊ณ VirtualService๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ฐ(latency) ๋ฐ ์ค๋ฅ(failure) ์๋ฎฌ๋ ์ด์
ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
๐น 1. Fault Injection(๊ฒฐํจ ์ฃผ์ )์ด๋?
โ 1.1 Fault Injection ๊ฐ๋
**Fault Injection(๊ฒฐํจ ์ฃผ์
)**์ ์ผ๋ถ๋ฌ ์ฅ์ ๋ฅผ ๋ฐ์์์ผ ์๋น์ค์ ์์ ์ฑ์ ๊ฒ์ฆํ๋ ๊ธฐ๋ฒ์
๋๋ค.
์ด๋ **Chaos Engineering(ํผ๋ ๊ณตํ)**์ ํต์ฌ ๊ธฐ์ ์ค ํ๋์ด๋ฉฐ,
์ค์ ์ฅ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ์์คํ
์ด ์ ์์ ์ผ๋ก ๋ณต๊ตฌ๋ ์ ์๋์ง ํ
์คํธํ๋ ์ญํ ์ ํฉ๋๋ค.
Fault Injection์ ์ํํ๋ ์ด์
- ์๋น์ค ์ฅ์ ๋ฐ์ ์, ์์คํ ์ ๋ณต์๋ ฅ์ ํ๊ฐํ๊ธฐ ์ํด
- ๋คํธ์ํฌ ์ง์ฐ(latency), ์ค๋ฅ(failure) ๋ฑ ์ค์ ์ฅ์ ์ํฉ์ ๋ฏธ๋ฆฌ ํ ์คํธ
- ์ฅ์ ๋ฐ์ ์ ํธ๋ํฝ์ด ์ ์์ ์ผ๋ก ๋ถ์ฐ๋๊ณ , ์๋ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ์ง ํ์ธ
โ 1.2 Istio์์ Fault Injection ํ์ฉ ๋ฐฉ์
Istio์์๋ VirtualService์ fault ์์ฑ์ ํ์ฉํ์ฌ ๋คํธ์ํฌ ์ฅ์ ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
- ์ง์ฐ(Latency) Fault Injection → ๋คํธ์ํฌ ์๋ต ์๋๋ฅผ ์ธ์์ ์ผ๋ก ์ง์ฐ
- ์ค๋ฅ(Failure) Fault Injection → ํน์ ์์ฒญ์ ๊ฐ์ ๋ก ์คํจํ๊ฒ ์ค์
๐น 2. Istio๋ฅผ ํ์ฉํ Fault Injection ์ค์
โ 2.1 ์ง์ฐ(Latency) Fault Injection
์๋ ์์ ์์๋ ํน์ ์์ฒญ์ด 5์ด ๋์ ์ง์ฐ๋๋๋ก ์ค์ ํ์ฌ ์๋ต ์๋๋ฅผ ํ ์คํธํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- fault:
delay:
fixedDelay: 5s # ๋ชจ๋ ์์ฒญ์ 5์ด ๋์ ์ง์ฐ
percentage:
value: 100.0 # 100% ์์ฒญ์ ์ ์ฉ
route:
- destination:
host: my-service
subset: v1
์ค๋ช :
- fault.delay.fixedDelay: 5s → ๋ชจ๋ ์์ฒญ์ 5์ด ๋์ ์ง์ฐ
- fault.delay.percentage.value: 100.0 → 100% ์์ฒญ์ ๋ํด ์ง์ฐ ์ ์ฉ
๐ก ํ์ฉ ์ฌ๋ก:
- ์ฌ์ฉ์๊ฐ ์๋ต ์ง์ฐ์ ๊ฒฝํํ ๋ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ ์คํธ
- Istio์ ํ์์์ ์ค์ ์ด ์ ์์ ์ผ๋ก ์๋ํ๋์ง ๊ฒ์ฆ
โ 2.2 ์ค๋ฅ(Failure) Fault Injection
์๋ ์์ ์์๋ ํน์ ์์ฒญ์ด 50% ํ๋ฅ ๋ก 500 ์ค๋ฅ๋ฅผ ๋ฐํํ๋๋ก ์ค์ ํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- fault:
abort:
httpStatus: 500 # HTTP 500 ์ค๋ฅ ๋ฐํ
percentage:
value: 50.0 # 50% ํ๋ฅ ๋ก ์ ์ฉ
route:
- destination:
host: my-service
subset: v1
์ค๋ช :
- fault.abort.httpStatus: 500 → ์๋ต์ ๊ฐ์ ๋ก 500 ์ค๋ฅ๋ก ์ค์
- fault.abort.percentage.value: 50.0 → 50% ํ๋ฅ ๋ก ์ ์ฉ (๋๋จธ์ง 50%๋ ์ ์ ์๋ต)
๐ก ํ์ฉ ์ฌ๋ก:
- ์๋น์ค ์ฅ์ ๋ฐ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ ์คํธ
- ์๋ ์ฌ์๋(Retry), ์ฅ์ ๊ฐ์ง(Circuit Breaker) ์ค์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๋์ง ํ์ธ
๐น 3. Fault Injection๊ณผ ๋ณต์๋ ฅ ํ ์คํธ ์๋๋ฆฌ์ค
์๋๋ฆฌ์ค 1๏ธโฃ: ํ์์์ ์ค์ ๊ฒ์ฆ (์ง์ฐ Fault Injection ํ์ฉ)
- ์์ **์ง์ฐ Fault Injection ์ค์ (5์ด ์ง์ฐ)**์ ์ ์ฉ
- Istio์ ํ์์์ ์ค์ ์ด 3์ด๋ก ๋์ด ์๋ค๋ฉด, ์์ฒญ์ด ์๋์ผ๋ก ์คํจํด์ผ ํจ
- ์๋น์ค์์ ํ์์์์ด ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ์ธ
์๋๋ฆฌ์ค 2๏ธโฃ: ์๋ ๋ณต๊ตฌ ๊ธฐ๋ฅ ํ ์คํธ (์ค๋ฅ Fault Injection ํ์ฉ)
- ์์ **์ค๋ฅ Fault Injection ์ค์ (50% 500 ์ค๋ฅ ๋ฐ์)**์ ์ ์ฉ
- Istio์ **Retry ์ค์ (3ํ ์ฌ์๋)**์ ํ์ฑํ
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฅ์ ๋ฐ์ ์ ์๋์ผ๋ก ์ฌ์๋๋ฅผ ์ํํ๋์ง ํ์ธ
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- fault:
abort:
httpStatus: 500
percentage:
value: 50.0
retries:
attempts: 3 # ์ต๋ 3๋ฒ๊น์ง ์ฌ์๋
perTryTimeout: 2s # ๊ฐ ์์ฒญ๋น ์ต๋ 2์ด ๋๊ธฐ
retryOn: "gateway-error,connect-failure,refused-stream"
route:
- destination:
host: my-service
subset: v1
๐ก ์ด ์ค์ ์ ์ ์ฉํ๋ฉด, ์ฅ์ ๋ฐ์ ์ ์๋์ผ๋ก 3ํ ์ฌ์๋ํ๋ฉฐ ์ฅ์ ๋ฅผ ๊ทน๋ณตํ ์ ์์
๐ ๊ฒฐ๋ก
- Fault Injection์ ์ค์ ์ฅ์ ์ํฉ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์๋น์ค์ ๋ณต์๋ ฅ์ ๊ฒ์ฆํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
- ์ง์ฐ(Latency) Fault Injection์ ํ์ฉํ๋ฉด, ๋คํธ์ํฌ ์๋ต ์๊ฐ์ด ๊ธธ์ด์ง ๋ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ ์คํธํ ์ ์์ต๋๋ค.
- ์ค๋ฅ(Failure) Fault Injection์ ์ ์ฉํ๋ฉด, ์๋ฒ๊ฐ ๊ฐ์ ๋ก ์คํจํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ํ๊ฒ ๋์ํ๋์ง ๊ฒ์ฆํ ์ ์์ต๋๋ค.
- Retry, Circuit Breaker์ ํจ๊ป ์กฐํฉํ๋ฉด ๋์ฑ ๊ฐ๋ ฅํ ์ฅ์ ๋ณต์๋ ฅ์ ํ๋ณดํ ์ ์์ต๋๋ค.