レビューの新しいバージョンの追加

このモジュールでは、レビューアの評価の数と星の色を返すreviewsサービスの新しいバージョン_v2_をデプロイします。本番環境へのデプロイ前には、静的解析テスト、単体テスト、統合テスト、エンドツーエンドテスト、ステージング環境でのテストを実行します。

  1. app=reviewsラベルなしで、reviewsマイクロサービスの新しいバージョンをデプロイします。このラベルがないと、新しいバージョンはreviewsサービスを提供するように選択されず、本番コードから呼び出されません。app=reviewsラベルをapp=reviews_testに置き換えて、以下のコマンドを実行し、reviewsマイクロサービスバージョン2をデプロイします。

    $ curl -s https://raw.githubusercontent.com/istio/istio/release-1.24/samples/bookinfo/platform/kube/bookinfo.yaml | sed 's/app: reviews/app: reviews_test/' | kubectl apply -l app=reviews_test,version=v2 -f -
    deployment.apps/reviews-v2 created
    
  2. アプリケーションにアクセスして、デプロイされたマイクロサービスがアプリケーションを中断していないことを確認します。

  3. 前にデプロイしたテストコンテナを使用して、クラスタ内からマイクロサービスの新しいバージョンをテストします。新しいバージョンはテスト中にratingsマイクロサービスの本番ポッドにアクセスすることに注意してください。また、reviewsサービスに選択されていないため、マイクロサービスの新しいバージョンにアクセスするには、ポッドのIPアドレスを使用する必要があることに注意してください。

    1. ポッドのIPアドレスを取得します。

      $ REVIEWS_V2_POD_IP=$(kubectl get pod -l app=reviews_test,version=v2 -o jsonpath='{.items[0].status.podIP}')
      $ echo $REVIEWS_V2_POD_IP
      
    2. ポッドにリクエストを送信し、正しい結果が返されることを確認します。

      $ kubectl exec $(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -- curl -sS "$REVIEWS_V2_POD_IP:9080/reviews/7"
      {"id": "7","reviews": [{  "reviewer": "Reviewer1",  "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!", "rating": {"stars": 5, "color": "black"}},{  "reviewer": "Reviewer2",  "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare.", "rating": {"stars": 4, "color": "black"}}]}
      
    3. リクエストを連続して10回送信することで、プリミティブな負荷テストを実行します。

      $ kubectl exec $(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -- sh -c "for i in 1 2 3 4 5 6 7 8 9 10; do curl -o /dev/null -s -w '%{http_code}\n' $REVIEWS_V2_POD_IP:9080/reviews/7; done"
      200
      200
      ...
      
  4. 上記の手順により、reviewsの新しいバージョンが機能することを確認し、デプロイできます。サービスの単一レプリカを本番環境にデプロイするため、実際のトラフィックが新しいサービスバージョンに到達し始めます。現在の設定では、トラフィックの75%が古いバージョン(古いバージョンの3つのポッド)に、25%が新しいバージョン(単一のポッド)に到達します。

    reviews v2をデプロイするには、app=reviewsラベルを使用して新しいバージョンを再デプロイし、reviewsサービスからアドレス指定できるようにします。

    $ kubectl label pods -l version=v2 app=reviews --overwrite
    pod "reviews-v2-79c8c8c7c5-4p4mn" labeled
    
  5. これで、アプリケーションのウェブページにアクセスし、評価に黒い星が表示されることを確認できます。ページに数回アクセスすると、星が表示される場合(約25%)と、星が表示されない場合(約75%)があります。

    Bookinfo Web Application with black stars as ratings
    評価に黒い星が表示されたBookinfo Webアプリケーション
  6. 本番環境で新しいバージョンに問題が発生した場合、新しいバージョンをすばやくアンデプロイして、古いバージョンのみを使用することができます。

    $ kubectl delete deployment reviews-v2
    $ kubectl delete pod -l app=reviews,version=v2
    deployment.apps "reviews-v2" deleted
    pod "reviews-v2-79c8c8c7c5-4p4mn" deleted
    

    設定の変更がシステム全体に伝播するまで時間を待ちます。その後、アプリケーションのウェブページに数回アクセスして、黒い星が表示されなくなったことを確認します。

    新しいバージョンを復元するには

    $ kubectl apply -l app=reviews,version=v2 -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/bookinfo/platform/kube/bookinfo.yaml
    deployment.apps/reviews-v2 created
    

    アプリケーションのウェブページに数回アクセスして、黒い星が約25%の確率で表示されることを確認します。

  7. 次に、新しいバージョンのレプリカ数を増やします。エラーの数が増加しないことを注意深く確認しながら、段階的に増やすことができます。

    $ kubectl scale deployment reviews-v2 --replicas=3
    deployment.apps/reviews-v2 scaled
    

    これで、アプリケーションのウェブページに数回アクセスすると、黒い星が約半分の確率で表示されます。

  8. これで、古いバージョンを廃止できます。

    $ kubectl delete deployment reviews-v1
    deployment.apps "reviews-v1" deleted
    

    アプリケーションのウェブページにアクセスすると、黒い星のみが表示されたレビューが返されます。

上記の手順では、reviewsの更新を実行しました。まず、シミュレートされた本番トラフィックを送信せずに新しいバージョンをデプロイしました。テストトラフィックを使用して本番環境でテストしました。新しいバージョンが正しい結果を提供することを確認しました。新しいバージョンをリリースし、徐々に本番トラフィックを増やしました。最後に、古いバージョンを廃止しました。

ここから、次の例題タスクを使用してデプロイメント戦略を改善できます。まず、本番環境で新しいバージョンのエンドツーエンドテストを実行します。これには、リクエストパラメータを使用して新しいバージョンにトラフィックを誘導する機能が必要です(たとえば、Cookieに保存されているユーザー名を使用します)。さらに、本番トラフィックを新しいバージョンにシャドウイングし、新しいバージョンが間違った結果を提供したり、エラーが発生したりしないかどうかを確認します。最後に、ロールアウトの制御をより詳細に取得します。例として、1%でデプロイし、サービスの劣化がない限り、1時間ごとに1%ずつ増やすことができます。Istioは、これらのタスクを簡単に実行できるようにすることで、Kubernetesの価値を高めます。デプロイメントに関する詳細情報とベストプラクティスについては、デプロイメントモデルを参照してください。

ここから、2つの選択肢があります。

  1. サービスメッシュを使用します。サービスメッシュでは、すべてのレポート、ルーティング、ポリシー、セキュリティロジックを、アプリケーションポッドに透過的に注入されたサイドカープロキシに配置します。ビジネスロジックはアプリケーションのコードに残っており、アプリケーションコードに変更を加える必要はありません。

  2. アプリケーションコードに必要な機能を実装します。ほとんどの機能は、Javaプログラミング言語用のNetflixのHystrixライブラリなど、さまざまなライブラリで既に利用可能です。ただし、ライブラリを使用するにはコードを変更する必要があります。追加の労力を費やす必要があり、コードが膨れ上がり、ビジネスロジックとレポート、ルーティング、ポリシー、ネットワーキングロジックが混在します。マイクロサービスが異なるプログラミング言語を使用しているため、複数のライブラリを学習、使用、更新する必要があります。

Istioがここで説明されているタスクなどをどのように実行できるかについては、Istioサービスメッシュを参照してください。次のモジュールでは、さまざまなIstio機能について説明します。

productpageでIstioを有効にする準備ができました。Istioを有効にする

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

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