Istio 실습 - bookinfo
istio를 직접 설치하고, 간단한 예제 (MSA 구성된) 서비스를 기동 시켜볼까합니다.
설치 환경은 네이버클라우드의 쿠버네티스 환경을 사용합니다.
(istio 설치 관계로 "네이버클라우드" 쿠버네티스 환경 설치는 생략하겠습니다.)
아래의 istio 실습은 2021년 12월말로 작성된 istio 1.12.1버전을 기준으로 작성됨을 유의해서 보시기 바랍니다.
사전 준비
- 클러스터 구성 : Master Node 1대, Worker Node 1대 (여러대도 상관없습니다. 사실 없어도 무방합니다.)
- 네이버 클라우드 내부 네트워크 (ACG) 정책설정 (istio 설치를 위함)
- 필요 포트 리스트 : https://istio.io/latest/docs/ops/deployment/requirements/
- 편의상 저는 모든 포트를 열었습니다.
1. Istio 설치
- istio 다운로드
$ cd ~
// 최신 버전 다운로드
$ curl -L https://istio.io/downloadIstio | sh -
// 특정 버전을 지정하여 다운받으시고 싶으신 분들께서는 아래의 명령을 이용하시기 바랍니다.
$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.8 TARGET_ARCH=x86_64 sh -
- "istioctl" bin 경로 지정
$ cd istio-1.12.1
$ export PATH=$PWD/bin:$PATH
- istio 설치
$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete
- istio의 sidecar injection 활성화
어떤 서비스 구축에 앞서 istio의 sidecar injection기능을 활성화하여야 한다.
istio는 Pod에 sidecar(envoy)를 (porxy)기반으로 트래픽을 컨트롤하는 구조이기 때문에
pod가 생성될때 자동으로 sidecar가 생성되도록 injection기능을 활성화 하는것이다.
(이에 대한 자세한 내용은 다음에 다루도록 하겠습니다.)
$ kubectl label namespace default istio-injection=enabled
namespace/default labeled
- 라벨 추가 확인
$ kubectl get ns --show-labels
NAME STATUS AGE LABELS
default Active 35d istio-injection=enabled <-- 추가 완료
istio-system Active 44h <none>
kube-node-lease Active 35d <none>
kube-public Active 35d <none>
kube-system Active 35d <none>
2. Sample App 배포 - BookInfo 서비스 설치
Istio의 Sample 어플리케이션 배포는 istio공식에서 지원하는 sample을 기반으로 하려고합니다.
bookinfo 서비스는 위의 그림처럼 되어 있습니다.
아참 저기 samples 경로는 위의 istio다운로드하면서 같이 다운받아졌습니다.
- bookinfo 애플리케이션 배포
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
애플리케이션 배포는 productpage, detail, rating, review (v1~v3)이 배포 되었음을 알 수 있습니다.
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-79f774bdb9-g9rs5 2/2 Running 4 42h
productpage-v1-6b746f74dc-pw2v4 2/2 Running 4 42h
ratings-v1-b6994bb9-xkbrd 2/2 Running 2 20h
reviews-v1-545db77b95-drxj7 2/2 Running 4 42h
reviews-v2-7bf8c9648f-n9dc6 2/2 Running 2 20h
reviews-v3-84779c7bbc-9kmpx 2/2 Running 4 42h
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.106.32.181 <none> 9080/TCP 42h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35d
productpage ClusterIP 10.98.30.185 <none> 9080/TCP 42h
ratings ClusterIP 10.100.102.52 <none> 9080/TCP 42h
reviews ClusterIP 10.110.228.242 <none> 9080/TCP 42h
여기서 svc를 보시면 모든 서비스는 ClusterIP로 구성되어 있으며,
이는 내부접근만 가능하고, 외부에서는 접근이 불가한상태입니다. (API 게이트웨이를 만들어야 겠죠?)
내부 접근으로 확인해보고 싶으신 분은 아래 명령으로 productpage를 접근해보십시오
$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
- Istio gateway 설정 (외부 접근 열기)
istio는 서비스를 외부로 노출시키기 위해서는 istio의 gateway를 사용합니다. (k8s의 ingress, service를 미사용)
istio의 gateway는 k8s 커스텀 리소스 타입으로, istio로 들어오는 traffic의 통로가 됩니다.
또한 gateway는 pod형식이며 Load Balancer타입으로 서비스 된다.
istio gateway를 등록 후 gateway를 통해 서비스할 호스트를 Virtual Service로 등록됩니다.
구분 | 데이터 흐름 |
기본 | Client --> Istio Gateway --> Istio Virtual Service --> K8s Service |
Bookinfo 상세 | Client --> istio-ingressgateway (kind: Service) --> istio-ingressgateway (king: Pod) --> bookinfo-gate (kind: gateway) --> bookinfo (kind: Virtual Service) --> productpage (kind: service) --> productpage (kind: pod) |
좀더 세부적으로 bookinfo gateway의 yaml를 파보자..ㅠㅠ !!
(개발자는 파야한다.!! --> 특히 line by line으로 해야한다!!)
$ cat samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway <--- 커스텀 kind
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller <-- selector 타입으로 istio-gateway를 사용하였기 때문에 gateway의 트래픽을 받을 Virtual Service가 등록되어야 함!!
servers:
- port:
number: 80 <-- 80으로 Listen
name: http
protocol: HTTP <-- http로 Client트래픽을 받도록 함
hosts:
- "*" <-- 모든 호스트 허용
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService <-- 위의 gateway트래픽을 수용하여 라우팅 룰이 적용된다.
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway <-- 위의 Gateway의 메타데이터 이름이 지정되야 맵핑됩니다.
http:
- match: <-- 말 그대로 매치되는 URL을 확인하여 -> route 정책된다.
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination: <-- 매치된 URL이 모두 productpage의 9080으로 포워딩한다.
host: productpage
port:
number: 9080
얘기가 길어졌지만, 여기에 대해 이해하고 넘어가야 istio를 나중에 커스텀하는데 문제가 없을 것이다.
(필자는 설치 다하고 이해하는 괴로움을 느꼈습니다.. ㅠㅠ)
이제 yaml도 보았으니, gateway를 적용해봅시다.!!!
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
적용하는데 문제가 없었는지 확인을 해보자
// 전체 istio 문제여부 확인
$ istioctl analyze
✔ No validation issues found when analyzing namespace: default.
// gateway 확인
$ kubectl get gateway
NAME AGE
bookinfo-gateway 43h
// pod 확인
$ kubectl get pod -n istio-system -l istio=ingressgateway
NAME READY STATUS RESTARTS AGE
istio-ingressgateway-77b69b4bf8-5l8cd 1/1 Running 1 20h
// svc 확인
$ kubectl get svc istio-ingressgateway -n istio-system --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
istio-ingressgateway LoadBalancer 10.109.36.179 <pending> 15021:31136/TCP,80:32253/TCP,443:30717/TCP,31400:31072/TCP,15443:31639/TCP 43h app=istio-ingressgateway,install.operator.istio.io/owning-resource-namespace=istio-system,install.operator.istio.io/owning-resource=unknown,istio.io/rev=default,istio=ingressgateway,operator.istio.io/component=IngressGateways,operator.istio.io/managed=Reconcile,operator.istio.io/version=1.12.1,release=istio
- 배포된 어플리케이션 접속
이제 어플리케이션을 확인해보자.
그전에 istio-ingressgateway가 어떤 포트로 수용하는 알아야겠죠?
- 포트 확인
$ kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'
32253 <-- 저는 해당 포트로 오픈되어 있네요
- IP 확인 (혹시 로컬에 하신분들은 127.0.0.1이 되겠네요)
저는 네이버클라우드로 되어 있는 관계로 네이버 클라우드 "Server 대시보드"에 해당 서버의 공인 IP를 찾아야 합니다.
- 접속: http://[해당IP]:32253/productpage
istio를 사용하면 손쉽게 모니터링 툴을 적용해볼 수 있습니다.
다음은 페이지에서는 이어서 모니터링 툴 적용에 대한 포스팅을 연결해서 해볼게요~
'Cloud > MSA & Istio' 카테고리의 다른 글
istio #2 - istio 아키텍처 (0) | 2022.08.23 |
---|---|
Istio #1 - MSA란? Istio란? (0) | 2022.02.25 |