Bookinfo를 쿠버네티스로 실행하기
Bookinfo를 쿠버네티스로 실행하기
이 모듈에서는 서로 다른 프로그래밍 언어로 작성된 네 개의 마이크로서비스(productpage, details, ratings, reviews)로 구성된 애플리케이션을 보여줘요. 이 구성된 애플리케이션을 Bookinfo라고 부르며, 자세한 내용은 Bookinfo 예제 페이지에서 볼 수 있어요.
출처: Istio 문서
본문
이 모듈은 서로 다른 프로그래밍 언어로 작성된 네 개의 마이크로서비스(productpage, details, ratings, reviews)로 구성된 애플리케이션을 보여줘요. 이 애플리케이션을 Bookinfo라고 부르며, Bookinfo 예제 페이지에서 더 자세히 배울 수 있어요.
Bookinfo 예제는 reviews 마이크로서비스에 세 가지 버전(v1, v2, v3)이 있는 애플리케이션의 최종 상태를 보여줘요. 이 모듈에서는 애플리케이션이 reviews 마이크로서비스의 v1 버전만 사용해요. 다음 모듈들에서 reviews 마이크로서비스의 새 버전을 배포하면서 애플리케이션을 확장하게 돼요.
애플리케이션과 테스트용 파드 배포하기
- MYHOST 환경 변수에 애플리케이션의 URL을 저장하세요.
$ export MYHOST=$(kubectl config view -o jsonpath={.contexts..namespace}).bookinfo.com
- bookinfo.yaml을 훑어보세요. 이는 앱의 쿠버네티스 배포 스펙이에요. 서비스와 deployment를 확인하세요.
- 애플리케이션을 쿠버네티스 클러스터에 배포하세요.
$ kubectl apply -l version!=v2,version!=v3 -f https://raw.githubusercontent.com/istio/istio/release-1.31/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
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
- 파드의 상태를 확인하세요.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-6d86fd9949-q8rrf 1/1 Running 0 10s
productpage-v1-c9965499-tjdjx 1/1 Running 0 8s
ratings-v1-7bf577cb77-pq9kg 1/1 Running 0 9s
reviews-v1-77c65dc5c6-kjvxs 1/1 Running 0 9s
- 네 파드가 Running 상태에 도달한 후 deployment를 스케일할 수 있어요. 각 마이크로서비스의 각 버전이 파드 세 개로 실행되도록 다음 명령을 실행하세요.
$ kubectl scale deployments --all --replicas 3
deployment.apps/details-v1 scaled
deployment.apps/productpage-v1 scaled
deployment.apps/ratings-v1 scaled
deployment.apps/reviews-v1 scaled
- 파드 상태를 확인하세요. 각 마이크로서비스에 파드가 세 개 있는 걸 볼 수 있어요.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-6d86fd9949-fr59p 1/1 Running 0 50s
details-v1-6d86fd9949-mksv7 1/1 Running 0 50s
details-v1-6d86fd9949-q8rrf 1/1 Running 0 1m
productpage-v1-c9965499-hwhcn 1/1 Running 0 50s
productpage-v1-c9965499-nccwq 1/1 Running 0 50s
productpage-v1-c9965499-tjdjx 1/1 Running 0 1m
ratings-v1-7bf577cb77-cbdsg 1/1 Running 0 50s
ratings-v1-7bf577cb77-cz6jm 1/1 Running 0 50s
ratings-v1-7bf577cb77-pq9kg 1/1 Running 0 1m
reviews-v1-77c65dc5c6-5wt8g 1/1 Running 0 49s
reviews-v1-77c65dc5c6-kjvxs 1/1 Running 0 1m
reviews-v1-77c65dc5c6-r55tl 1/1 Running 0 49s
- 서비스들이 Running 상태에 도달한 후, 마이크로서비스에 요청을 보내는 데 쓸 테스트용 파드
curl을 배포하세요.
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.31/samples/curl/curl.yaml
- Bookinfo 애플리케이션이 실행 중인지 확인하려면 테스트용 파드에서 curl 명령으로 요청을 보내세요.
$ kubectl exec $(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -c curl -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
애플리케이션에 대한 외부 접근 활성화하기
애플리케이션이 실행되면 클러스터 외부의 클라이언트가 접근할 수 있게 하세요. 아래 단계들을 성공적으로 구성하면 노트북 브라우저에서 애플리케이션에 접근할 수 있어요.
클러스터가 GKE에서 실행 중이라면 productpage 서비스 타입을 LoadBalancer로 변경하세요.
$ kubectl patch svc productpage -p '{"spec": {"type": "LoadBalancer"}}'
service/productpage patched
Kubernetes Ingress 리소스 구성 및 애플리케이션 웹페이지 접근
- Kubernetes Ingress 리소스를 생성하세요.
$ kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: bookinfo
annotations:
kubernetes.io/ingress.class: istio
spec:
rules:
- host: $MYHOST
http:
paths:
- path: /productpage
pathType: Prefix
backend:
service:
name: productpage
port:
number: 9080
- path: /login
pathType: Prefix
backend:
service:
name: productpage
port:
number: 9080
- path: /logout
pathType: Prefix
backend:
service:
name: productpage
port:
number: 9080
- path: /static
pathType: Prefix
backend:
service:
name: productpage
port:
number: 9080
EOF
/etc/hosts 설정 파일 업데이트하기
- bookinfo라는 쿠버네티스 ingress의 IP 주소를 확인하세요.
$ kubectl get ingress bookinfo
/etc/hosts파일에 다음 명령이 제공하는 host 엔트리 앞부분에 위의 IP 주소를 추가하세요./etc/hosts를 편집하려면 슈퍼유저 권한이 필요하며 아마sudo를 써야 할 거예요.
$ echo $(kubectl get ingress istio-system -n istio-system -o jsonpath='{..ip} {..host}') $(kubectl get ingress bookinfo -o jsonpath='{..host}')
애플리케이션에 접근하기
- 커맨드 라인에서 애플리케이션의 홈 페이지에 접근하세요.
$ curl -s $MYHOST/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
- 다음 명령의 출력을 브라우저 주소창에 붙여 넣으세요.
$ echo http://$MYHOST/productpage
다음과 같은 웹페이지가 보일 거예요: Bookinfo 웹 애플리케이션.
- 마이크로서비스들이 서로 어떻게 호출하는지 관찰하세요. 예를 들어 reviews는
http://ratings:9080/ratingsURL로 ratings 마이크로서비스를 호출해요.
reviews의 코드를 보세요.
private final static String ratings_service = "http://ratings:9080/ratings";
- 실제 세계의 지속적인 사용자 트래픽을 시뮬레이션하려면 별도의 터미널 창에서 무한 루프를 설정해 애플리케이션으로 트래픽을 보내세요.
$ while :; do curl -s $MYHOST/productpage | grep -o "<title>.*</title>"; sleep 1; done
<title>Simple Bookstore App</title>
<title>Simple Bookstore App</title>
<title>Simple Bookstore App</title>
<title>Simple Bookstore App</title>
...
이제 애플리케이션 테스트하기로 넘어갈 준비가 됐어요.