Bookinfo를 쿠버네티스로 실행하기

Bookinfo를 쿠버네티스로 실행하기

이 모듈에서는 서로 다른 프로그래밍 언어로 작성된 네 개의 마이크로서비스(productpage, details, ratings, reviews)로 구성된 애플리케이션을 보여줘요. 이 구성된 애플리케이션을 Bookinfo라고 부르며, 자세한 내용은 Bookinfo 예제 페이지에서 볼 수 있어요.

출처: Istio 문서

본문

이 모듈은 서로 다른 프로그래밍 언어로 작성된 네 개의 마이크로서비스(productpage, details, ratings, reviews)로 구성된 애플리케이션을 보여줘요. 이 애플리케이션을 Bookinfo라고 부르며, Bookinfo 예제 페이지에서 더 자세히 배울 수 있어요.

Bookinfo 예제는 reviews 마이크로서비스에 세 가지 버전(v1, v2, v3)이 있는 애플리케이션의 최종 상태를 보여줘요. 이 모듈에서는 애플리케이션이 reviews 마이크로서비스의 v1 버전만 사용해요. 다음 모듈들에서 reviews 마이크로서비스의 새 버전을 배포하면서 애플리케이션을 확장하게 돼요.

애플리케이션과 테스트용 파드 배포하기

  1. MYHOST 환경 변수에 애플리케이션의 URL을 저장하세요.
$ export MYHOST=$(kubectl config view -o jsonpath={.contexts..namespace}).bookinfo.com
  1. bookinfo.yaml을 훑어보세요. 이는 앱의 쿠버네티스 배포 스펙이에요. 서비스와 deployment를 확인하세요.
  2. 애플리케이션을 쿠버네티스 클러스터에 배포하세요.
$ 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
  1. 파드의 상태를 확인하세요.
$ 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
  1. 네 파드가 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
  1. 파드 상태를 확인하세요. 각 마이크로서비스에 파드가 세 개 있는 걸 볼 수 있어요.
$ 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
  1. 서비스들이 Running 상태에 도달한 후, 마이크로서비스에 요청을 보내는 데 쓸 테스트용 파드 curl을 배포하세요.
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.31/samples/curl/curl.yaml
  1. 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 리소스 구성 및 애플리케이션 웹페이지 접근

  1. 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 설정 파일 업데이트하기

  1. bookinfo라는 쿠버네티스 ingress의 IP 주소를 확인하세요.
$ kubectl get ingress bookinfo
  1. /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}')

애플리케이션에 접근하기

  1. 커맨드 라인에서 애플리케이션의 홈 페이지에 접근하세요.
$ curl -s $MYHOST/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
  1. 다음 명령의 출력을 브라우저 주소창에 붙여 넣으세요.
$ echo http://$MYHOST/productpage

다음과 같은 웹페이지가 보일 거예요: Bookinfo 웹 애플리케이션.

  1. 마이크로서비스들이 서로 어떻게 호출하는지 관찰하세요. 예를 들어 reviews는 http://ratings:9080/ratings URL로 ratings 마이크로서비스를 호출해요.

reviews의 코드를 보세요.

private final static String ratings_service = "http://ratings:9080/ratings";
  1. 실제 세계의 지속적인 사용자 트래픽을 시뮬레이션하려면 별도의 터미널 창에서 무한 루프를 설정해 애플리케이션으로 트래픽을 보내세요.
$ 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>
...

이제 애플리케이션 테스트하기로 넘어갈 준비가 됐어요.

더 알아보기 (Learn more)