Oracle Cloud Infrastructure (OCI) 에서 이스티오(ISTIO)를 활용한 서비스 메쉬(Service Mesh)에 대한 기술 정리 및 이를 데모로 구현한 내용을 정리합니다.
글 순서
5. 이스티오 데모 - 이스티오 설치, 엔보이 프록시 주입
6. 이스티오 데모 - 샘플 어플리케이션 (Bookinfo) 배포
8. 이스티오 데모 - 결함 주입(Fault Injection)
REFERENCES
아래 도서 및 사이트를 참조하여 작성한 문서입니다.
- 도메인 주도 설계로 시작하는 마이크로 서비스 개발 (위키북스)
- 쿠버네티스 완벽 가이드 (길벗)
- Istio로 시작하는 서비스 메시 (에이콘)
- Isitio Documentation
샘플 어플리케이션 배포
데모를 위해 이스티오에서 제공하는 샘플 어플리케이션 Bookinfo를 사용하겠습니다.
Bookinfo는 아래와 같이 개별 Python, Java, Ruby, Node.js 마이크로서비스로 구성된 샘플 어플리케이션입니다. 아래 샘플 어플리케이션을 배포하면 엔보이 프록시도 자동으로 배포될 것입니다.
Bookinfo 어플리케이션은 다음과 같이 구성되어 있습니다.
- productpage: details와 reviews 마이크로서비스를 호출
- details: 도서 정보
- reviews: 도서에 대한 리뷰 정보. ratings 마이크로서비스를 호출
- ratings: 도서 리뷰에 따른 랭킹 정보
reviews 마이크로서비스는 3개의 버전을 가지고 있습니다.
- Version v1: ratings 마이크로서비스를 호출하지 않음
- Version v2: ratings 마이크로서비스를 호출. 한개에서 다섯개까지의 검은색 별표시로 도서에 대한 평가를 나타냄
- Version v3: ratings 마이크로서비스를 호출. 한개에서 다섯개까지의 빨간색 별표시로 도서에 대한 평가를 나타냄
kubectl 명령으로 Bookinfo 어플리케이션을 배포합니다.
[opc@demo ~]$ kubectl apply -f ~/istio-1.14.1/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
배포된 파드 내용을 확인합니다.
[opc@demo ~]$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
details-v1-7f4669bdd9-gj7ww 2/2 Running 0 2m16s 10.244.1.6 10.0.10.42 <none> <none>
...
productpage-v1-5586c4d4ff-mdjz2 2/2 Running 0 2m15s 10.244.0.135 10.0.10.35 <none> <none>
ratings-v1-6cf6bc7c85-gfhdd 2/2 Running 0 2m16s 10.244.0.10 10.0.10.234 <none> <none>
reviews-v1-7598cc9867-pzq9r 2/2 Running 0 2m16s 10.244.0.134 10.0.10.35 <none> <none>
reviews-v2-6bdd859457-qplsq 2/2 Running 0 2m16s 10.244.0.9 10.0.10.234 <none> <none>
reviews-v3-6c98f9d7d7-fp48z 2/2 Running 0 2m16s 10.244.1.7 10.0.10.42 <none> <none>
배포된 서비스 내용을 확인합니다. 마이크로서비스는 디폴트 네임스페이스에, 이스티오 게이트웨이는 istio-system 네임스페이스에 생성되어 있는 것을 알 수 있습니다.
[opc@demo ~]$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.96.216.63 <none> 9080/TCP 129m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d5h
productpage ClusterIP 10.96.39.32 <none> 9080/TCP 129m
ratings ClusterIP 10.96.42.233 <none> 9080/TCP 129m
reviews ClusterIP 10.96.60.62 <none> 9080/TCP 129m
...
OCI 웹콘솔에서 확인해 보면 위 서비스 정보와 같이 로드 밸런서가 생성되어 있습니다.
Bookinfo 어플리케이션이 정상 작동하는지에 대해 아래와 같이 curl 명령으로 확인할 수 있습니다.
[opc@demo ~]$ 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>
Bookinfo 서비스가 실행되고 있는 것을 확인했습니다. 이제 웹 브라우저와 같은 쿠버네티스 클러스터 외부에서 어플리케이션에 접근할 수 있도록 하겠습니다. 이를 위해서는 이스티오 게이트웨이를 만들어야 합니다.
다음과 같이 해당 매니페스트 파일을 적용해서 이스티오 게이트웨이를 생성합니다. 먼저 매니페스트 파일을 조회해보면 이스티오 인그레스 게이트웨이를 만들고, 들어온 트래픽을 서비스로 라우팅하는 VirtualService를 만드는 것을 알 수 있습니다.
[opc@demo ~]$ cat ~/istio-1.14.1/samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
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
매니페스트 파일을 적용해서 게이트웨이와 VirtaulService를 생성합니다.
[opc@demo ~]$ kubectl apply -f ~/istio-1.14.1/samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
생성된 게이트웨이를 확인합니다.
[opc@demo ~]$ kubectl get gateways
NAME AGE
bookinfo-gateway 21s
외부로 노출된 퍼블릭 IP(INGRESS_HOST)와 포트(INGRESS_PORT)를 확인합니다. 퍼블릭 IP는 로드 밸런서에 할당된 퍼블릭 IP이고, 포트는 게이트웨이 생성에서 정의한 포트입니다. 하지만 아래 명령으로도 확인할 수 있습니다.
[opc@demo ~]$ kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
150.230.7.116
[opc@demo ~]$ kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}'
80
이제 위에서 확인한 IP, 포트를 통해 아래 URL로 접속해 보면 Bookinfo 어플리케이션에 접속할 수 있습니다.
http://150.230.7.116:80/productpage
다음은 쿠버네티스 대쉬보드를 통해 확인한 productpage의 서비스 정보입니다.
<END>