Istio Circuit Breaking
์ฌ์ ์ค๋น
$ kubectl apply -n default -f https://raw.githubusercontent.com/istio/istio/1.20.2/samples/helloworld/helloworld.yaml
service/helloworld created
deployment.apps/helloworld-v1 created
deployment.apps/helloworld-v2 created
์ ๊ทธ๋ฐ๋ฐ ์์ helloworld v1/v2 ๋๋ค resource limits๊ฐ ์ ๊ฑธ๋ ค ์์ด์ ์ง์ k edit deploy
๋ก ์์ ํด resource limits๋ฅผ ๋ฃ์ด์ฃผ์. (k edit pod ...
์ผ๋ก ํ๋ ค๊ณ ํ๋ Pod์์๋ resource ์์ ์ด ์ ๋จ ใ
ใ
)
...
resources:
requests:
cpu: "100m" # default
limits:
cpu: "100m"
memory: "200Mi"
...
๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ฒ์ ๋ณ K8s svc๋ ์ถ๊ฐ๋ก deploy ํ์.
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: helloworld-v1
labels:
app: helloworld
service: helloworld
version: v1
spec:
ports:
- port: 5000
name: http
selector:
app: helloworld
version: v1
---
apiVersion: v1
kind: Service
metadata:
name: helloworld-v2
labels:
app: helloworld
service: helloworld
version: v2
spec:
ports:
- port: 5000
name: http
selector:
app: helloworld
version: v2
EOF
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
helloworld ClusterIP 10.43.135.30 <none> 5000/TCP ...
helloworld-v1 ClusterIP 10.43.70.96 <none> 5000/TCP ...
helloworld-v2 ClusterIP 10.43.248.127 <none> 5000/TCP ...
Helloworld ์ํฌ๋ก๋๋ฅผ ๋ชจ๋ ๋ํ๋ก์ด ํ๊ณ ๋๋ฉด, ํ ์คํธ์ฉ Pod์ ์ ์ํด์ ์๋ ๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฌ๋ฉด์ ์๋ต์ ๋ชจ๋ํฐ๋ง ํ๊ณ ์์.
$ k exec ... -it -- sh
~ $ while true; do curl "http://helloworld.default.svc.cluster.local:5000/hello"; done;
Circuit Breaker๋
ํธ๋ํฝ์ ๋ฐ๋ ์ํฌ๋ก๋ ์งํฉ ์ค์ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋, ํด๋น ์ํฌ๋ก๋๋ฅผ ํธ๋ํฝ ๋ผ์ฐํ ์์ ์ ์ธํจ์ผ๋ก์จ ๋คํธ์ํฌ์ ์์ ์ฑ์ ๋์ด๋ ํจํด์ด๋ค.
Istio์์ Network Resiliency(ํ๋ ฅ์ฑ)๊ณผ Fault Tolerance๋ฅผ ๊ฐ์ถ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
fortio๋ก Pod ๋ถํ ์์ฑํ๊ธฐ
์ฌ์ ์์
์์ ๋ง๋ค์ด๋ Helloworld ์ํฌ๋ก๋ ์ค์ v1์ ๊ฐ์ ๋ก ๋ถํ๋ฅผ ์ค ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด ๋ก๋ ํ
์คํธ ํด์ธ fortio
๋ฅผ ๋ํ๋ก์ด ํ์.
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: fortio
labels:
app: fortio
spec:
containers:
- image: docker.io/fortio/fortio:latest_release
imagePullPolicy: IfNotPresent
name: fortio
ports:
- containerPort: 8080
name: http-fortio
- containerPort: 8079
name: grpc-ping
EOF
๊ทธ๋ฆฌ๊ณ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด helloworld v1 ์ํฌ๋ก๋์ ๋ถํ๋ฅผ ์ฃผ์.
$ kubectl exec -it fortio -- /usr/bin/fortio load -c 2 -t 30m -qps 0 http://helloworld-v1.default:5000/hello
์ด๋, -c 2
๋ concurrent thread 2๊ฐ์, -t 30m
์ 30๋ถ ๋์, -qps 0
์ ๊ธฐ๋ค๋ฆผ ์์ด ๊ณ์ ์์ฒญ์ ๋ณด๋ด๋๋ก ๋ง๋ ๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ 1์ด๋ง๋ค curl
๋ณด๋ด๋๊ฒ ๊ธ๊ฒฉํ ๋๋ ์ด๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ์์ํ๋ค!!! ๋ฐ๋ฉด์ helloworld-v2
์์ ์ค๋ ์๋ต์ ๋ฐ๋ก๋ฐ๋ก ๋ฐ๊ฒ ๋๋ค.
์๋ป๊ฒ์ง helloworld-v1
โฆ โค๏ธโ๐ฅ
DestinationRule
๋ก Outlier Detection ์ํํ๊ธฐ
์ด์ ์ด๋ ๊ฒ ๋ถํ ๋๋ฌธ์ ์ฅ์ ๊ฐ ์๊ธด ์ํฌ๋ก๋๋ฅผ ์๋์ผ๋ก ์ ์ธํ ์ ์๋๋ก DestinationRule
์ Outlier Detection ๊ธฐ๋ฅ์ ํตํด ๊ตฌํํด๋ณด์!! ์๋์ ๊ฐ์ด DestinationRule
์ ์์ฑํด ๋ํ๋ก์ด ํ๋ค.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: hellowrold
spec:
host: helloworld.default.svc.cluster.local
trafficPolicy:
connectionPool:
http: # ๋์์ ์ ์ํ ์ ์๋ connection์ ์ ํ
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
tcp:
maxConnections: 1
outlierDetection:
consecutive5xxErrors: 3 # 503 service unavailable
interval: 1m
baseEjectionTime: 5m
maxEjectionPercent: 100
EOF
์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ, helloworld-v1
์ํฌ๋ก๋์์ connection pool ์ ํ์ผ๋ก ์ธํด 503
์๋ฌ๋ฅผ ๋ฐ๊ฒ ๋๊ณ , ์ฒ์์ while ... curl ...
๋ก ๋ณด๋ด๋ ํธ์ถ๋ ์ด์ ๋ helloworld-v2
์ ์๋ต๋ง์ ๋ฐ๊ฒ ๋๋ค!!