Bookinfo Application ์ istio ๋ฌธ์์์ ๊ณต์์ ์ผ๋ก ์ ๊ณตํ๋ ์์ ์ด๋ค. ๋ฌธ์์ Tasks ์ํ์ ์ํ ํ๊ฒฝ์ด๊ธฐ๋ ํ๋ค. ์ด ์์ ์ฑ์ EKS ์์ ๊ตฌ์ฑํ์ฌ, Tasks๋ฅผ ์งํํ ์ค๋น๋ฅผ ํ๋ค.
EKS Blueprint
์ง๋๋ฒ์ ๊ธฐ๋ณธ์ ์ธ ์ค์ต์ ํ๊ธฐ ์ํด ๋ฒ์ ์
ํ๊ฑฐ ์ธ์ ์ถ๊ฐ๋ก ์์ ํด์ Bookinfo Application์ ๊ตฌ์ฑํ ๊ฒ์ด ๋ค์ PR์ ์ ๋ถ ์๋ค:
blueprint์์๋ ๊ตฌ์ฑํ๋ ํ
๋ผํผ ๋ฆฌ์์ค ์ดํ์ kubernetes ๋ฆฌ์์ค๋ ์ ๋ถ manifests๋ฅผ applyํ๋ local-exec provisioner๋ก ๊ตฌํํ๋ค.
์์ฃผ ์ข์ ๋ฐฉ๋ฒ์ด๋ ์๊ฐ์ ๋ค์ง ์์ง๋ง:
โข
kubernetes_manifest ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ์ manifest๊ฐ ์ธ๋ถ ์ข
์์ฑ(url)์ด ์์ด ์ ํฉํ์ง ์์๊ณ
โข
๋ค๋ฅธ ์ค์ต์ ํ๋๋ผ๊ณ bookinfo๋ ๊ธฐ๋ณธ ํ๊ฒฝ, ๊ฑฐ์ ์ธํ๋ผ์ ํด๋นํ๋ค๊ณ ์๊ฐํด์, ํ
๋ผํผ ์ฝ๋ ์์ผ๋ก ๋ฃ์๋ค.
istio ๊ด๋ จํ ์ค์ต์ ์ฝ๋ํ(IaC)์ ์ํฌํ๋ก ๋ณด๋จ ํ๋ฌธ ๋ฌธ์ํ์ ํธ์ฆ์จ ์์ฃผ๊ฐ ๋ ๊ฒ ๊ฐ๋ค.
์ด๋ฒ์๋ ๋ฌธ์ ๋ช
๋ น์ด๋๋ก ๋ฐ๋ผํด๋ ํ๋ฒ์ ์๋๋ ์ง์ ์ด ์์๋ค. ๊ทธ ๋ถ๋ถ ๋๋ฒ๊น
๊ณผ ํด๊ฒฐ ๊ทธ๋ฆฌ๊ณ bookinfo application๊ณผ istio ์ปดํฌ๋ํธ์ ๊ตฌ์ฑ์ ๋ํด ์์๋ณด์.
Bookinfo Application
manifests
์ํฌ๋ก๋์ ์ํคํ
์ฒ๋ ์์ ๊ฐ๋ค. ์ด๋ฐ ์ฌ๋ ค์ ํ์ธํด๋ณด๋ฉด ์ฑ
์ ๋ํ ์ ๋ณด์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฒ์ ๋ณ๋ก ๋ณด์ฌ์ฃผ๋ ์ฑ์ด๋ค. MSA ๊ตฌ์ฑ์ธ๋ฐ:
โข
productpage : details ์ reviews ๋ฅผ ํธ์ถํ์ฌ ํ๋ฉด ๊ตฌ์ฑ.
โข
details : ์ฑ
์ ๋ณด์ ๋ํ ์๋น์ค.
โข
reviews : ์ฑ
๋ฆฌ๋ทฐ์ ๋ํ ์๋น์ค, ์ธ๊ฐ์ง ๋ฒ์ ์ด ์๊ณ ์ผ๋ถ ๋ฒ์ ์ ratings ๋ฅผ ํธ์ถ.
โฆ
v1: ratings ๋ฅผ ํธ์ถํ์ง ์์.
โฆ
v2: ratings ๋ฅผ ํธ์ถํ์ฌ ๊ฒ์์ ๋ณ์ ๊ทธ๋ฆผ .
โฆ
v3: ratings ๋ฅผ ํธ์ถํ์ฌ ๋นจ๊ฐ์ ๋ณ์ ๊ทธ๋ฆผ .
โข
ratings : ์ฑ
์์์ ๋ํ ์๋น์ค.
๋ฌธ์์์ MSA๊ฐ ๊ฐ๊ฐ์ ์ธ์ด๋ก(polyglot) ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ์๋(?)ํ์ง๋ง, ์ ์ด์ istio๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค ์์ ์ฌ๋ ค์ ๊ตฌ์ฑํ๋ค๋ณด๋ ๋น์ฐํ๊ฑฐ ๊ฐ๊ธฐ๋ ํ๋ค. istio๊ฐ ์ฟ ๋ฒ๋คํฐ์ค ์ธ์ ํ๋ซํผ์ ์ฌ๋ ค๋ language/framework agnostic, injection ๊ฐ๋ฅํ ๋ฉ์๋ผ๋ ์ ์ ๊ฐ์กฐํ๊ณ ์ถ์๊ฑฐ ๊ฐ๋ค.
์ ์๋น์ค๋ฅผ ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค์ envoy proxy sidecar๊ฐ injection ๊ฐ๋ฅํ ๊ณณ์(istio-injection=enabled) ์ค์นํ์ฌ istio๋ก ํธ๋ํฝ ํ๋ฆ์ ํ์ธํด๋ณธ๋ค.
Gateway, VirtualService
bookinfo ์๋น์ค๋ง ๋ฐฐํฌํ ํ์ kiali์์ ๊ทธ๋ํ๋ฅผ ์ดํด๋ณด๋ฉด ์๋ฌด๊ฒ๋ ๋์ค์ง ์๋๋ค. ์ถ๋ ฅ ๋ฉ์ธ์ง์ ํฌํธ ํฌ์๋ ๋ช
๋ น(k port-forward -n istio-system kiali 20001:20001)์ผ๋ก๋ kiali ์น ์ฝ์์ ์ ์ํ ์ ์์ง๋ง, istioctl ์ ์ฌ์ฉํ์ฌ ์กฐ๊ธ ๋ ํธ๋ฆฌํ๊ฒ ์ ์ํ ์ ์๋ค.
๋ค์ด ๋ฐ๊ณ PATH์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ์ ์๋ค(์๋ apcahe kafka๋ ์ brew ๊ฐ์ ํจํค์ง์ ๋ด์ ์ฃผ์ง ์์๊น?). istioctl dashboard kiali ๋ก ํฌํธ ํฌ์๋์ ๋ธ๋ผ์ฐ์ ๋ฆฌ๋ค์ด๋ ํธ(์์ฃผ ์กฐ๊ธ ํธํ ๋ถ๋ถใ
)๋ฅผ ๋์์ ํด์ค๋ค. Graph์ ๋ค์ด๊ฐ๋ฉด ๋ทฐ๋ฅผ ์ด๋ฆฌ์ ๋ฆฌ ๋ฐ๊ฟ๋ ํ์ฌ๋ ์๋ฌด๊ฒ๋ ๋ณด์ด์ง ์๋๋ค.
istio๋ฅผ ํตํ ํธ๋ํฝ ๊ด๋ฆฌ, ๊ฐ์์ฑ ํ๋ณด๋ฅผ ์ํด ๋ค์ gateway, virtualservice๋ฅผ ์๋น์ค์ ๊ฐ์ ๋ค์์คํ์ด์ค, default ์ ์ค์นํ๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
# The selector matches the ingress gateway pod labels.
# If you installed Istio using Helm following the standard documentation, this would be "istio=ingress"
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80 # NOTE: 8080์์ ๋ฐ๊ฟ
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
YAML
๋ณต์ฌ
๋ฌธ์ ๋งํฌ์ manifest๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ gateway์ .spec.servers[0].port.number ๊ฐ 8080์ด๋ค. ์ด ๋ถ๋ถ์ด ๋ฌธ์ ์๋๋ฐ, ๊ฒฐ๊ตญ ํด๊ฒฐํ ๊ฒ์ istioctl anaylze ๋๋ถ์ด์๋ค.
Warning [IST0162] (Gateway default/bookinfo-gateway) The gateway is listening on a target port (port 8080) that is not defined in the Service associated with its workload instances (Pod selector istio=ingressgateway). If you need to access the gateway port through the gateway Service, it will not be available.
gateway๊ฐ 8080 ํฌํธ์ ๋ํด ์ด์ด ๋์์ง๋ง, selector์ ํ๋์์ ํด๋น ํฌํธ๋ฅผ ๋
ธ์ถํ์ง ์๊ณ ์๋ค. istio=ingressgateway ๋ฅผ ํํธ๋ก ์ด๊ฒ์ istio-ingress/istio-ingress deploy ์ด์ svc์ธ ๊ฒ์ ์ ์ ์๋ค.
istio-ingress๋ blueprint์์ helm release๋ก ์ค์นํ๋ค:
โข
values(๋ณ๊ฒฝํ์ง ์์)
์ฃผ์์ ๊ฒฝ๊ณ (If you installed Istio using Helm following the standard documentation, this would be "istio=ingress")์ ๋ฌ๋ฆฌ ๋ ์ด๋ธ์ istio=ingressgateway ๋ก ๋ฌ๋ ค ์์๋ค.
svc ํ
ํ๋ฆฟ์ values์์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ service.ports ๋ฅผ ๊ทธ๋๋ก ํ๊ฐํ๋ค. deploy ํ
ํ๋ฆฟ์ 15090 ์ ์ธํ๊ณ ๋ฑํ containerPort ๋ฅผ ๋
ธ์ถํ๊ฑฐ๋ values๋ก ์ ์ดํ ์ ์์๋ค. ๊ทธ๋ผ ์ด๊ฑด ์ฑ์์ ์ด๋ ๊ฒ(80, 443์ผ๋ก) ๋
ธ์ถํ๊ณ ์๋ค๋ ๊ฒ์ด๋ผ gateway์ ํฌํธ๋ฅผ ๋ฐ๊ฟจ๋ค.
์ฌ๊ธฐ์ ํค๋งธ๋ ์ด์ ๋:
โข
โฆ
๊ธฐ๋ณธ ๊ฐ์ 8080, 8443์ผ๋ก ๋์ด ์๋ค.
โฆ
ํ์ง๋ง ์ด ์ฐจํธ์ ์๊ฒฉ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๋ชป์ฐพ์๋ค. ๊ฒฐ๊ตญ ์ค์ต์ ์ฌ์ฉ๋ ๊ฒ์ istio/gateway ๊ฐ ๋ง๋ค.
โข
ํ๋ image๊ฐ auto์ด๋ค(???)
โฆ
๊ต์ฅํ ์ญ?์ค๋ฌ์ ์ผ๋ ์ฃผ์์ ํํธ๋ก, mutating webhook์ ์ฌ์ฉํด์(), ์ต์ ํ๋(?) ์ด๋ฏธ์ง๋ฅผ ๋ฐํ์์ ๋์ ์ผ๋ก ์ฃผ์
ํ๋ค๊ณ ์ดํดํ๋ค.
โฆ
์ฐธ์กฐ ๋งํฌ์ ๋ฐ๋ฅด๋ฉด ํ๋ก์ ์ฌ์ด๋์นด ์ญ์ ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฐ๋ ๊ฒ ๊ฐ๋ค. ๋์ค์ ๋ ์ดํด ๋ณผ ๊ฒ.
โข
๊ตฌ์ฑ๋๋ AWS LB - target group์ด unhealthy์ด๋ค(TODO).
โฆ
์์ ๋๋จธ์ง๋ ๋ค ์ดํดํ์ง๋ง ์ด ๋ถ๋ถ์ ์์ง ์๋ฌธ์ด๋ค. ์ด๋ป๊ฒ ์์ฒญ์ด ๊ฐ์ง?(๊ทธ๋ฐ๋ฐ ์ฑ๊ณตํ๋คโฆ)
๊ฒฐ๊ณผ์ ์ผ๋ก .spec.servers[0].port.number ๋ง 80์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ฉด istioctl analyze ๋ ๊ฒฝ๊ณ ๋ฅผ ๋์ฐ์ง ์๋๋ค:
โฏ istioctl analyze -n default
โ No validation issues found when analyzing namespace: default.
Bash
๋ณต์ฌ
GATEWAY_URL์ ๊ตฌ์ฑํ์ฌ ์์ฒญํ๋ฉด bookinfo ์๋น์ค๋ฅผ ํ์ธํ ์ ์๋ค. ์ด๊ฒ๋ ๋ฌธ์์ ์ค๋ช
๊ณผ ํ๊ฒฝ์ด ์กฐ๊ธ ๋ฌ๋ผ(์๋ง EKS๊ฐ ์๋๋ผ์), ๋ค์์ฒ๋ผ ๋ง๋ค ์ ์๋ค:
โฏ export INGRESS_HOST=$(k -n istio-ingress get svc istio-ingress -oyaml | yq .status.loadBalancer.ingress[0].hostname)
โฏ export INGRESS_PORT=$(k -n istio-ingress get svc istio-ingress -oyaml | yq '.spec.ports[] | select(.name=="http2").port')
โฏ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
โฏ echo $GATEWAY_URL
k8s-istioing-istioing-e9152dbca9-1ae09444cbc035b3.elb.ap-northeast-2.amazonaws.com:80
Bash
๋ณต์ฌ
๋ธ๋ผ์ฐ์ ์์ /productpage ๋ก ์์ฒญํด๋ณธ๋ค(http ์ฃผ์):
๋ฆฌ๋ทฐ์ ๊ฒ์๋ณ()์ด ์๋๊ฑธ๋ก ๋ณด์ reviews:v2๋ก ์์ฒญ์ด ๊ฐ๋ค๊ณ ์ ์ถํ ์ ์๋ค. bookinfo๋ reviews์ ๊ฐ ๋ฒ์ ์ ๋ํด ๋ผ์ด๋๋ก๋น ์์ฒญ์ ํ๋ค. ์์ง destination rules๋ฅผ ์ค์นํ์ง ์์ istio๋ก ์ด๋ฅผ ๊ด๋ฆฌํ ์ ์๊ณ kiali์์ ๋ชจ๋ํฐํ ์ ์๋ค.
Destination Rules
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: productpage
spec:
host: productpage
subsets:
- name: v1
labels:
version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: ratings
spec:
host: ratings
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v2-mysql
labels:
version: v2-mysql
- name: v2-mysql-vm
labels:
version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: details
spec:
host: details
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
---
YAML
๋ณต์ฌ
๋ณ๋ค๋ฅธ ํธ๋ํฝ ์ ์ด ์์ด ๊ฐ ์ํฌ๋ก๋(ํ๋) version ๋ ์ด๋ธ์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋งคํํ๋ค. bookinfo์ ํ๋๋ ๋ชจ๋ version ์ด๋ ๋ ์ด๋ธ์ด ๋ฌ๋ ค ์๋ค:
โฏ k -n default get po -oyaml | yq -r '.items | map({.metadata.name: .metadata.labels.version})'
- details-v1-5f4d584748-dlwnd: v1
- productpage-v1-564d4686f-nwqb9: v1
- ratings-v1-686ccfb5d8-75rkn: v1
- reviews-v1-86896b7648-lqlfq: v1
- reviews-v2-b7dcd98fb-b9f4l: v2
- reviews-v3-5c5cc7b6d-88vdp: v3
Bash
๋ณต์ฌ
ratings์ ์๋ v2-mysql , v2-mysql-vm ์ ๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ฑ์ด ์๋๊ฑฐ ๊ฐ๋ค. destination rules๊น์ง ์ค์นํ๋ฉด kiali์์ ๊ทธ๋ํ๋ก ์์ฒญ ํ๋ฆ์ ๋ณผ ์ ์๋ค:
Versioned app graph๋ก ๋ณด๋ฉด ๊ฐ destination rules์ ์๋ธ์
(๋ฒ์ )๋ณ๋ก ํ๋ฆ์ ๋ณด์ฌ์ค๋ค. ์ธ๋ชจ๋ ์๋น์ค์ด๋ค. ๊ทธ๋ํ ํ์
์ ๋ฉ๋ด๋ฅผ ์์์ ์๋ ์์๋ก(App > Service > Versioned service > Workload) drill down ํ๋ ๋๋์ด ์๋ค. ์ฐ์ธก ์๋จ์ Replay์ timespan(Last)๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ํ ํ ์๊ฐ์ด ์ง๋๋ฉด ๊ทธ๋ํ๊ฐ ์ฌ๋ผ์ง๋ค.
์์ฒญ์ ๋ช ๋ฒ ๋ ํ์ฌ ๋ชจ๋ ๋ฒ์ ์ ๋ํ ์์ฒญ์ด ์ด๋ฃจ์ด์ง๋ฉด ์ ์ฒด MSA ๊ตฌ์ฑ์ ๋ณผ ์ ์๋ค.
์ ๋ฆฌ
์ค์ต์ ๋ง์น๋ฉด ์์ฑํ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ค. blueprint ์ดํ์ provisioner๋ก ๊ตฌ์ฑํ ๊ฒ์ ์ด์ฐจํผ EKS ํด๋ฌ์คํฐ๋ฅผ ์ข
๋ฃํ์ฌ ์ญ์ ๊ฐ ๋๋ค. ๋ฐ๋ผ์ blueprint์ ์ง์๋๋ก ์ญ์ ํ๋ค:
tf destroy -target="module.eks_blueprints_addons" -auto-approve
tf destroy -target="module.eks" -auto-approve
tf destroy -auto-approve
Bash
๋ณต์ฌ
๊ทธ๋ฐ๋ฐ ๋์ ๊ฒฝ์ฐ istio-ingressgateway์ ํด๋นํ๋ ๋ก๋๋ฐธ๋ฐ์ ์ญ์ ๊ฐ ์ ์๋๋ค. EKS๋ฅผ ์ง์ธ ๋ ์ญ์ ๋์ด์ผ ํ ๊ฑฐ ๊ฐ์๋ฐ alb controller๊ฐ ๋จผ์ ์ฃฝ๋๊ฑฐ ๊ฐ๋ค(โฆ). ๊ทธ๋ฌ๋ฉด ๋ง์ง๋ง ๋จ๊ณ(tf destroy -auto-approve)์์ VPC ์ญ์ ๊ฐ ์๋๋ค. ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๊ณ destroy๋ฅผ ์คํํ๋ค(๊ฐ๋ VPC ์ญ์ ๋ ์๋์ด ์๋์ผ๋ก ํ๋ค).
tf state list | xargs -I{} terraform state rm {}
Bash
๋ณต์ฌ
๊ทธ๋ฌ๊ณค ์์ฒ๋ผ state์์๋ง ์ง์ฐ๊ฑฐ๋ tf destroy ๋ฅผ ๋ค์ ์คํํด๋ ๋๋ค.
LB์ target groups์ ์ญ์ ๋์ง ์๋๋ค. ์น ์ฝ์์์ ์ญ์ ํด์ค๋ค.
์ถ๊ฐ๋ก istio ์ปจํ
์คํธ์ ํด๋ฌ์คํฐ, ์ฌ์ฉ์๋ ์ญ์ ํ์(์ด์ฐจํผ ๋ค์ applyํ๋ฉด ์์ฑ๋๋ค):
k ctx -d istio
k config delete-cluster istio
k config delete-user istio
Bash
๋ณต์ฌ
์ต๋ ๊ตํ
โข
๋ผ์ฐํ
, ์ฅ์ ์ฃผ์
๋ฑ ํธ๋ํฝ์ ์ง์ ์ ์ดํ์ง ์์์ง๋ง, istio๊ฐ envoy proxy๋ฅผ ํตํด ์ด๋ป๊ฒ ํธ๋ํฝ์ ๊ด๋ฆฌํ ์ง kiali๋ก ํ์ธํ๋ค.
โข
์ ๊ณตํ๋ ๋ฌธ์/๊ฐ์ด๋์์ ์๋๋ ์ ์ ์ต์ ๋ฒ์ ์์ ์์ ํ์ฌ ํด๊ฒฐํ๋ค.
โฆ
์์ง ๊ธฐ์ฌํ ์ ๋๋ ์๋๋ค. ๋ค์ ํฌ๋ฆ์ด ์ด๋ ต๋คโฆ
โข
mutating webhook์ ํตํ ์ปจํ
์ด๋ ์ด๋ฏธ์ง ๋์ ์ ์ฉ์ด๋ ๊ฐ๋
์ด ์ ๊ธฐํ๋ค. ์ถํ์ deep dive ํด๋ณผ ๊ฒ.
โข
๋น๋ก provisioner๋ฅผ ์ผ์ง๋ง, ์ฟ ๋ฒ๋คํฐ์ค ์์ฒด๊ฐ manifest๋ฅผ ํตํ ์ ์ธ์ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ์ฌ, ์์ ์ฑ ํ๊ฒฝ์ ๊ตฌ์ฑํ ๋ ํฐ ๋ฌธ์ ๋ ์์๋ค.
โข
ํ
๋ผํผ destroy๊ฐ ํ๋ฒ์(ํ์์ฝํ ์ฒ ํ), ์ฐ๊ฒฐ ์๋ ๋ฆฌ์์ค๋(e.g. ์์ฑ๋๋ target groups, ๋ณด์๊ทธ๋ฃน, โฆ) ์ญ์ ํ๋๋ก ๊ตฌ์ฑํด ๋ณผ ๊ฒ.
โข