KubernetesでのBookinfoの実行

このモジュールでは、異なるプログラミング言語で記述された4つのマイクロサービス(productpagedetailsratingsreviews)で構成されるアプリケーションを紹介します。この複合アプリケーションをBookinfoと呼び、Bookinfoの例ページで詳細を確認できます。

Bookinfoの例では、reviewsマイクロサービスにv1v2v3の3つのバージョンがあるアプリケーションの最終状態を示しています。このモジュールでは、アプリケーションはreviewsマイクロサービスのv1バージョンのみを使用します。次のモジュールでは、reviewsマイクロサービスの新しいバージョンのデプロイによってアプリケーションを拡張します。

アプリケーションとテストポッドのデプロイ

  1. アプリケーションのURLを保持するMYHOST環境変数を設定します。

    $ export MYHOST=$(kubectl config view -o jsonpath={.contexts..namespace}).bookinfo.com
    
  2. bookinfo.yamlをざっと見てください。これはアプリのKubernetesデプロイメント仕様です。サービスとデプロイメントに注目してください。

  3. アプリケーションをKubernetesクラスタにデプロイします。

    $ kubectl apply -l version!=v2,version!=v3 -f https://raw.githubusercontent.com/istio/istio/release-1.24/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
    
  4. ポッドの状態を確認します。

    $ 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
    
  5. 4つのポッドがRunning状態になったら、デプロイメントをスケールできます。各マイクロサービスの各バージョンを3つのポッドで実行するには、次のコマンドを実行します。

    $ 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
    
  6. ポッドの状態を確認します。各マイクロサービスに3つのポッドがあることに注意してください。

    $ 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
    
  7. サービスがRunning状態になったら、マイクロサービスへのリクエスト送信に使用するテストポッドであるcurlをデプロイします。

    $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/curl/curl.yaml
    
  8. 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>
    

アプリケーションへの外部アクセスの有効化

アプリケーションの実行後、クラスタ外部からのクライアントによるアクセスを有効にします。以下の手順を正しく設定すると、ラップトップのブラウザからアプリケーションにアクセスできます。

Kubernetes Ingressリソースの設定とアプリケーションのWebページへのアクセス

  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という名前のKubernetes IngressのIPアドレスを取得します。

    $ kubectl get ingress bookinfo
    
  2. /etc/hostsファイルに、次のコマンドで提供されるホストエントリに上記の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>
    
  2. 次のコマンドの出力をブラウザのアドレスバーに貼り付けます。

    $ echo http://$MYHOST/productpage
    

    次のウェブページが表示されます。

    Bookinfo Web Application
    Bookinfo Webアプリケーション
  3. マイクロサービスが互いにどのように呼び出し合うかを観察します。例えば、reviewshttp://ratings:9080/ratings URLを使用してratingsマイクロサービスを呼び出します。reviewsのコードを参照してください。

    private final static String ratings_service = "http://ratings:9080/ratings";
    
  4. 別のターミナルウィンドウで無限ループを設定し、アプリケーションにトラフィックを送信して、現実世界の一定のユーザートラフィックをシミュレートします。

    $ 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>
    ...
    

アプリケーションのテストの準備ができました。

この情報は役に立ちましたか?
改善のための提案はありますか?

ご意見ありがとうございました!