์๊ฐ
์ฐ๋ฆฌ๋
ะ
Istio 1.1์ ์ฌ์ฉํ๋ฉด ํ๋ก์๋ ์ด๋น ์์ฒญ 0,6๊ฐ๋น ์ฝ 1000๊ฐ์ vCPU(๊ฐ์ ์ฝ์ด)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋น์ค ๋ฉ์์ ์ฒซ ๋ฒ์งธ ์ง์ญ(์ฐ๊ฒฐ ์์ชฝ์ ํ๋ก์ 2๊ฐ)์ ๊ฒฝ์ฐ ์ด๋น 1200๋ง ์์ฒญ์ ์๋๋ก ํ๋ก์ ์ ์ฉ ์ฝ์ด 40๊ฐ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. Google์ ๋น์ฉ ๊ณ์ฐ๊ธฐ์ ๋ฐ๋ฅด๋ฉด ๊ตฌ์ฑ ๋น์ฉ์ ์ฝ $XNUMX/์/์ฝ์ด๋ก ๊ณ์ฐ๋ฉ๋๋ค. n1-standard-64
์ฆ, ์ด ์ง์ญ์์๋ง ์ด๋น 50๋ง ๊ฑด์ ์์ฒญ์ ๋ํด ์ 1๋ง ๋ฌ๋ฌ ์ด์์ ๋น์ฉ์ด ์์๋ฉ๋๋ค.
์ด๋ฐ ์ฌ(
๋ถ๋ช ํ value-istio-test.yaml์ CPU ์์ฒญ์ ์ฌ๊ฐํ๊ฒ ์ฆ๊ฐ์ํต๋๋ค. ๊ณ์ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋ค๋ฉด ์ ์ดํ์๋ ์ฝ 24๊ฐ์ CPU ์ฝ์ด๊ฐ ํ์ํ๊ณ ๊ฐ ํ๋ก์์๋ 0,5๊ฐ์ CPU๊ฐ ํ์ํฉ๋๋ค. ๋๋ ๊ทธ๋ค์ง ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ๋ ๋ง์ ๋ฆฌ์์ค๊ฐ ํ ๋น๋๋ฉด ํ ์คํธ๋ฅผ ๋ฐ๋ณตํ๊ฒ ์ต๋๋ค.
๋๋ Istio์ ์ฑ๋ฅ์ด ๋ค๋ฅธ ์คํ ์์ค ์๋น์ค ๋ฉ์์ ์ผ๋ง๋ ๋น์ทํ์ง ์ง์ ํ์ธํ๊ณ ์ถ์์ต๋๋ค.
์๋น์ค ๋ฉ์ ์ค์น
์ฐ์ ํด๋ฌ์คํฐ์ ์ค์นํ์ต๋๋ค.
$ supergloo init
installing supergloo version 0.3.12
using chart uri https://storage.googleapis.com/supergloo-helm/charts/supergloo-0.3.12.tgz
configmap/sidecar-injection-resources created
serviceaccount/supergloo created
serviceaccount/discovery created
serviceaccount/mesh-discovery created
clusterrole.rbac.authorization.k8s.io/discovery created
clusterrole.rbac.authorization.k8s.io/mesh-discovery created
clusterrolebinding.rbac.authorization.k8s.io/supergloo-role-binding created
clusterrolebinding.rbac.authorization.k8s.io/discovery-role-binding created
clusterrolebinding.rbac.authorization.k8s.io/mesh-discovery-role-binding created
deployment.extensions/supergloo created
deployment.extensions/discovery created
deployment.extensions/mesh-discovery created
install successful!
๋๋ ์๋น์ค ๋ฉ์์ ๋ถํธ์คํธ๋ํ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์ SuperGloo๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋๋ ๋ง์ ์ผ์ ํ ํ์๊ฐ ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ๋ก๋์ ์์ SuperGloo๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง ์ด๋ฌํ ์์ ์ ์ด์์ ์ ๋๋ค. ๊ฐ ์๋น์ค ๋ฉ์์ ๋ํด ๋ง ๊ทธ๋๋ก ๋ช ๊ฐ์ง ๋ช ๋ น์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค. ๊ฒฉ๋ฆฌ๋ฅผ ์ํด Istio์ Linkerd์ ๊ฐ๊ฐ ํ๋์ฉ ๋ ๊ฐ์ ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์คํ์ Google Kubernetes Engine์์ ์ํ๋์์ต๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉํ์ด์ 1.12.7-gke.7
๊ทธ๋ฆฌ๊ณ ๋
ธ๋ ํ n1-standard-4
์๋ ๋
ธ๋ ํ์ฅ(์ต์ 4, ์ต๋ 16).
๊ทธ๋ฐ ๋ค์ ๋ช ๋ น์ค์์ ๋ ์๋น์ค ๋ฉ์๋ฅผ ๋ชจ๋ ์ค์นํ์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋งํฌ:
$ supergloo install linkerd --name linkerd
+---------+--------------+---------+---------------------------+
| INSTALL | TYPE | STATUS | DETAILS |
+---------+--------------+---------+---------------------------+
| linkerd | Linkerd Mesh | Pending | enabled: true |
| | | | version: stable-2.3.0 |
| | | | namespace: linkerd |
| | | | mtls enabled: true |
| | | | auto inject enabled: true |
+---------+--------------+---------+---------------------------+
๊ทธ๋ฐ ๋ค์ ์ด์คํฐ์ค:
$ supergloo install istio --name istio --installation-namespace istio-system --mtls=true --auto-inject=true
+---------+------------+---------+---------------------------+
| INSTALL | TYPE | STATUS | DETAILS |
+---------+------------+---------+---------------------------+
| istio | Istio Mesh | Pending | enabled: true |
| | | | version: 1.0.6 |
| | | | namespace: istio-system |
| | | | mtls enabled: true |
| | | | auto inject enabled: true |
| | | | grafana enabled: true |
| | | | prometheus enabled: true |
| | | | jaeger enabled: true |
+---------+------------+---------+---------------------------+
์ถฉ๋ ๋ฃจํ๋ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ ธ๊ณ ์ ์ดํ์ด ์์ ํ๋์์ต๋๋ค.
(์ฐธ๊ณ : SuperGloo๋ ํ์ฌ Istio 1.0.x๋ง ์ง์ํฉ๋๋ค. Istio 1.1.3์ผ๋ก ์คํ์ ๋ฐ๋ณตํ์ง๋ง ๋์ ๋๋ ์ฐจ์ด์ ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ์ต๋๋ค.)
Istio ์๋ ๋ฐฐํฌ ์ค์
Istio๊ฐ ์ฌ์ด๋์นด Envoy๋ฅผ ์ค์นํ๋๋ก ํ๋ ค๋ฉด ์ฌ์ด๋์นด ์ธ์ ํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. MutatingAdmissionWebhook
. ์ด ๊ธฐ์ฌ์์๋ ๊ทธ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ง ์์ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ๋ชจ๋ ์๋ก์ด ํฌ๋์ ์ก์ธ์ค๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์์
์ ๋ด๋นํ๋ ์ฌ์ด๋์นด์ initContainer๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ๋ ์ปจํธ๋กค๋ฌ๋ผ๊ณ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค. iptables
.
Shopify์์๋ ์ฌ์ด๋์นด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์์ฒด ์ก์ธ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ์ง๋ง ์ด ๋ฒค์น๋งํฌ์์๋ Istio์ ํจ๊ป ์ ๊ณต๋๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ค์์คํ์ด์ค์ ๋ฐ๋ก๊ฐ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ปจํธ๋กค๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ด๋์นด๋ฅผ ์ฝ์
ํฉ๋๋ค. istio-injection: enabled
:
$ kubectl label namespace irs-client-dev istio-injection=enabled
namespace/irs-client-dev labeled
$ kubectl label namespace irs-server-dev istio-injection=enabled
namespace/irs-server-dev labeled
์๋ Linkerd ๋ฐฐํฌ ์ค์
Linkerd ์ฌ์ด๋์นด ์๋ฒ ๋ฉ์ ์ค์ ํ๋ ค๋ฉด ์ฃผ์์ ์ฌ์ฉํฉ๋๋ค(์ ๋ ๋ค์์ ํตํด ์๋์ผ๋ก ์ถ๊ฐํ์ต๋๋ค). kubectl edit
):
metadata:
annotations:
linkerd.io/inject: enabled
$ k edit ns irs-server-dev
namespace/irs-server-dev edited
$ k get ns irs-server-dev -o yaml
apiVersion: v1
kind: Namespace
metadata:
annotations:
linkerd.io/inject: enabled
name: irs-server-dev
spec:
finalizers:
- kubernetes
status:
phase: Active
Istio ๋ด๊ฒฐํจ์ฑ ์๋ฎฌ๋ ์ดํฐ
Shopify ๊ณ ์ ์ ํธ๋ํฝ์ ์คํํ๊ธฐ ์ํด Istio๋ผ๋ ๋ด๊ฒฐํจ์ฑ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ํน์ ์ํฌ๋ก๋๋ฅผ ๋ชจ๋ธ๋งํ๋๋ก ๋์ ์ผ๋ก ๊ตฌ์ฑ๋๊ณ ์๋น์ค ๊ทธ๋ํ์ ํน์ ๋ถ๋ถ์ ๋ํ๋ด๋ ์ฌ์ฉ์ ์ง์ ํ ํด๋ก์ง๋ฅผ ์์ฑํ๋ ๋๊ตฌ๊ฐ ํ์ํ์ต๋๋ค.
Shopify์ ์ธํ๋ผ๋ ํ๋์ ํ๋งค ์ค์ ๊ณผ๋ถํ ์ํ์
๋๋ค. ์ด์ ํจ๊ป ์ผํผํ์ด(Shopify)
์ฐ๋ฆฌ๋ ํ๋ ฅ์ฑ ์๋ฎฌ๋ ์ดํฐ๊ฐ ๊ณผ๊ฑฐ์ Shopify์ ์ธํ๋ผ๋ฅผ ์๋ํ๋ ํ ํด๋ก์ง ๋ฐ ์ํฌ๋ก๋์ ์ผ์นํ๋ ์ํฌํ๋ก๋ฅผ ๋ชจ๋ธ๋งํ๊ธฐ๋ฅผ ์ํ์ต๋๋ค. ์๋น์ค ๋ฉ์๋ฅผ ์ฌ์ฉํ๋ ์ฃผ์ ๋ชฉ์ ์ ๋คํธ์ํฌ ์์ค์ ์์ ์ฑ๊ณผ ๋ด๊ฒฐํจ์ฑ์ด ํ์ํ๋ค๋ ๊ฒ์ด๋ฉฐ, ์ด์ ์ ์๋น์ค๋ฅผ ์ค๋จ์์ผฐ๋ ๋ถํ์ ์๋น์ค ๋ฉ์๊ฐ ํจ๊ณผ์ ์ผ๋ก ๋์ฒํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ด๊ฒฐํจ์ฑ ์๋ฎฌ๋ ์ดํฐ์ ์ค์ฌ์๋ ์๋น์ค ๋ฉ์ ๋ ธ๋ ์ญํ ์ ํ๋ ์์ ์ ๋ ธ๋๊ฐ ์์ต๋๋ค. ์์ ์ ๋ ธ๋๋ ์์ ์ ์ ์ ์ผ๋ก ๊ตฌ์ฑํ๊ฑฐ๋ REST API๋ฅผ ํตํด ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ ์ ๋ ธ๋์ ๋์ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ํ๊ท ํ ์คํธ ํํ๋ก ์ํฌํ๋ก๋ฅผ ์์ฑํฉ๋๋ค.
๋ค์์ ๊ทธ๋ฌํ ํ๋ก์ธ์ค์ ์์ ๋๋ค.
- ์ฐ๋ฆฌ๋ 10๊ฐ์ ์๋ฒ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ํฉ๋๋ค.
bar
์๋ต์ ๋ฐํํ๋ ์๋น์ค200/OK
100ms ํ. - ์ฐ๋ฆฌ๋ 10๊ฐ์ ํด๋ผ์ด์ธํธ๋ฅผ ์์ํฉ๋๋ค. ๊ฐ ํด๋ผ์ด์ธํธ๋ ์ด๋น 100๊ฐ์ ์์ฒญ์ ๋ณด๋
๋๋ค.
bar
. - 10์ด๋ง๋ค 1๊ฐ์ ์๋ฒ๋ฅผ ์ ๊ฑฐํ๊ณ ์ค๋ฅ๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
5xx
ํด๋ผ์ด์ธํธ์์.
์ํฌํ๋ก๊ฐ ๋๋๋ฉด ๋ก๊ทธ์ ์ธก์ ํญ๋ชฉ์ ๊ฒ์ฌํ๊ณ ํ ์คํธ๊ฐ ํต๊ณผํ๋์ง ํ์ธํฉ๋๋ค. ์ด๊ฒ์ด ์๋น์ค ๋ฉ์์ ์ฑ๋ฅ์ ๋ํด ๋ฐฐ์ฐ๊ณ ํ๊ท ํ ์คํธ๋ฅผ ์คํํ์ฌ ๋ด๊ฒฐํจ์ฑ์ ๋ํ ๊ฐ์ ์ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
(์ฐธ๊ณ : ์ฐ๋ฆฌ๋ Istio ๋ด๊ฒฐํจ์ฑ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์คํ ์์คํํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์์ง๋ง ์์ง ๊ทธ๋ ๊ฒ ํ ์ค๋น๊ฐ ๋์ด ์์ง ์์ต๋๋ค.)
์๋น์ค ๋ฉ์ ๋ฒค์น๋งํฌ๋ฅผ ์ํ Istio ๋ด๊ฒฐํจ์ฑ ์๋ฎฌ๋ ์ดํฐ
์๋ฎฌ๋ ์ดํฐ์ ์ฌ๋ฌ ์์ ๋ ธ๋๋ฅผ ์ค์ ํ์ต๋๋ค.
irs-client-loadgen
: ์ด๋น 3๊ฐ์ ์์ฒญ์ ๋ณด๋ด๋ 100๊ฐ์ ๋ณต์ ๋ณธirs-client
.irs-client
: ์์ฒญ์ ๋ฐ์ 3๊ฐ์ ๋ณต์ ๋ณธ์ 100ms๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ ๋ค์์ผ๋ก ์์ฒญ์ ์ ๋ฌํฉ๋๋ค.irs-server
.irs-server
: ๋ฐํ๋๋ ๋ณต์ ๋ณธ 3๊ฐ200/OK
100ms ํ.
์ด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด 9๊ฐ ์๋ํฌ์ธํธ ๊ฐ์ ์์ ์ ์ธ ํธ๋ํฝ ํ๋ฆ์ ์ธก์ ํ ์ ์์ต๋๋ค. ์ฌ์ด๋์นด irs-client-loadgen
ะธ irs-server
์ด๋น 100๊ฐ์ ์์ฒญ์ ์์ ํฉ๋๋ค. irs-client
โ 200(์์ ๋ฐ ๋ฐ์ ).
์ฐ๋ฆฌ๋ ๋ค์์ ํตํด ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์ถ์ ํฉ๋๋ค.
์กฐ์ฌ ๊ฒฐ๊ณผ
์ ์ดํ
๋จผ์ CPU ์ฌ์ฉ๋์ ์กฐ์ฌํ์ต๋๋ค.
Linkerd ์ ์ดํ ~22๋ฐ๋ฆฌ์ฝ์ด
Istio ์ ์ดํ: ~750๋ฐ๋ฆฌ์ฝ์ด
Istio ์ ์ดํ์ ๋๋ต์ ์ผ๋ก ๋ค์์ ์ฌ์ฉํฉ๋๋ค. 35๋ฐฐ ๋ ๋ง์ CPU ๋ฆฌ์์ค๋ง์ปค๋๋ณด๋ค ๋ฌผ๋ก ๋ชจ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋๋ฉฐ istio-telemetry๋ ์ฌ๊ธฐ์์ ๋ง์ ํ๋ก์ธ์ ๋ฆฌ์์ค๋ฅผ ์๋นํฉ๋๋ค(์ผ๋ถ ๊ธฐ๋ฅ์ ๋นํ์ฑํํ์ฌ ๋นํ์ฑํํ ์ ์์). ์ด ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ฑฐํด๋ ์ฌ์ ํ 100๋ฐ๋ฆฌ์ฝ์ด ์ด์์ ์ป์ ์ ์์ต๋๋ค. 4 ๋ฒ๋ง์ปค๋๋ณด๋ค
์ฌ์ด๋์นด ํ๋ก์
๊ทธ๋ฐ ๋ค์ ํ๋ก์ ์ฌ์ฉ์ ํ ์คํธํ์ต๋๋ค. ์์ฒญ ์์ ์ ํ ๊ด๊ณ๊ฐ ์์ด์ผ ํ์ง๋ง ๊ฐ ์ฌ์ด๋์นด์๋ ๊ณก์ ์ ์ํฅ์ ๋ฏธ์น๋ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค.
๋ง์ปค๋: irs-client์ ๊ฒฝ์ฐ ~100๋ฐ๋ฆฌ์ฝ์ด, irs-client-loadgen์ ๊ฒฝ์ฐ ~50๋ฐ๋ฆฌ์ฝ์ด
๊ฒฐ๊ณผ๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค. ํด๋ผ์ด์ธํธ ํ๋ก์๋ loadgen ํ๋ก์๋ณด๋ค ๋ ๋ฐฐ ๋ง์ ํธ๋ํฝ์ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, loadgen์์ ๋๊ฐ๋ ๋ชจ๋ ์์ฒญ์ โโ๋ํด ํด๋ผ์ด์ธํธ์๋ ํ๋์ ์์ ์์ฒญ๊ณผ ํ๋์ ์ก์ ์์ฒญ์ด ์์ต๋๋ค.
Istio/Envoy: irs-client์ ๊ฒฝ์ฐ ~155๋ฐ๋ฆฌ์ฝ์ด, irs-client-loadgen์ ๊ฒฝ์ฐ ~75๋ฐ๋ฆฌ์ฝ์ด
Istio ์ฌ์ด๋์นด์์๋ ๋น์ทํ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก Istio/Envoy ํ๋ก์๋ ์ฝ 50% ๋ ๋ง์ CPU ๋ฆฌ์์ค๋ง์ปค๋๋ณด๋ค
์๋ฒ ์ธก์์๋ ๋์ผํ ๊ตฌ์ฑํ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
Linkerd: irs-server์ ๊ฒฝ์ฐ ~50๋ฐ๋ฆฌ์ฝ์ด
Istio/Envoy: irs-server์ ๊ฒฝ์ฐ ~80๋ฐ๋ฆฌ์ฝ์ด
์๋ฒ ์ธก์์ ์ฌ์ด๋์นด Istio/Envoy๋ ์ฝ 60% ๋ ๋ง์ CPU ๋ฆฌ์์ค๋ง์ปค๋๋ณด๋ค
๊ฒฐ๋ก
Istio Envoy ํ๋ก์๋ ์๋ฎฌ๋ ์ด์ ๋ ์ํฌ๋ก๋์์ Linkerd๋ณด๋ค 50% ์ด์ ๋ ๋ง์ CPU๋ฅผ ์๋นํฉ๋๋ค. Linkerd ์ ์ดํ์ ํนํ ํต์ฌ ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ Istio๋ณด๋ค ํจ์ฌ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋น์ฉ์ ์ด๋ป๊ฒ ์ค์ผ ์ ์์์ง ๊ณ์ ๊ณ ๋ฏผํ๊ณ ์์ต๋๋ค. ์์ด๋์ด๊ฐ ์๋ค๋ฉด ๊ณต์ ํด์ฃผ์ธ์!
์ถ์ฒ : habr.com