マルチクラスタHelidon Sock Shop

マルチクラスタ環境にデプロイされたSock Shopマイクロサービス・デモ・アプリケーションの実装。

このサンプル・アプリケーションでは、Sock Shopマイクロサービス・デモ・アプリケーションHelidon実装を示します。OAMリソースを使用して、マルチクラスタ環境でアプリケーション・デプロイメントを定義します。

始める前に

  • インストール手順に従って、マルチクラスタVerrazzano環境を設定します。
  • この例では、マルチクラスタ環境に関連付けられているmanaged1という名前の管理対象クラスタがあることを前提としています。環境にその名前のクラスタがない場合、デプロイメント・ファイルを編集し、placementセクションにリストされているクラスタ名を変更する必要があります。

管理クラスタおよび管理対象クラスタのkubeconfigファイルを指すように、次の環境変数を設定します。

$ export KUBECONFIG_ADMIN=/path/to/your/adminclusterkubeconfig
$ export KUBECONFIG_MANAGED1=/path/to/your/managedclusterkubeconfig

ノート: Sock Shopアプリケーションのデプロイメント・ファイルは、<VERRAZZANO_HOME>/examples/multicluster/sockshopにあるVerrazzanoプロジェクトに含まれています(<VERRAZZANO_HOME>は、Verrazzanoプロジェクトのルートです)。

アプリケーションのデプロイ

  1. Verrazzanoプロジェクトをデプロイして、Sock Shopアプリケーションのネームスペースを作成します。

    $ kubectl --kubeconfig $KUBECONFIG_ADMIN apply \
        -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.7.2/examples/multicluster/sock-shop/verrazzano-project.yaml
    

  2. Sock Shop OAMリソースを適用して、アプリケーションをデプロイします。

    $ kubectl --kubeconfig $KUBECONFIG_ADMIN apply \
        -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.7.2/examples/multicluster/sock-shop/sock-shop-comp.yaml
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN apply \
        -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.7.2/examples/multicluster/sock-shop/sock-shop-app.yaml
    

  3. Sock Shopアプリケーションの準備ができるまで待ちます。ポッド・リソースが管理対象クラスタに表示されるようになるまで、数分かかる場合があります。

    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 wait \
        --for=condition=Ready pods \
        --all -n mc-sockshop \
        --timeout=300s
    

アプリケーションの探索

Sock Shopマイクロサービス・アプリケーションは、次を含むREST APIエンドポイントを実装します:

  • /catalogue - Sock Shopカタログを返します。このエンドポイントは、GET HTTPリクエスト・メソッドを受け入れます。
  • /register - { "username":"xxx", "password":"***", "email":"foo@example.com", "firstName":"foo", "lastName":"coo" }をPOSTしてユーザーを作成します。このエンドポイントは、POST HTTPリクエスト・メソッドを受け入れます。

ノート: 次の手順では、OKEなどのKubernetes環境を使用していることを前提としています。その他の環境やデプロイメントでは、アドレス、ポートなどを取得するための代替メカニズムが必要になる場合があります。

次のステップに従い、エンドポイントをテストします

  1. アプリケーション用に生成されたホスト名を取得します。

    $ HOST=$(kubectl --kubeconfig $KUBECONFIG_MANAGED1 get gateway \
          -n mc-sockshop \
          -o jsonpath={.items[0].spec.servers[0].hosts[0]})
    $ echo $HOST
    
    # Sample output
    sockshop-appconf.mc-sockshop.11.22.33.44.nip.io
    

  2. istio-ingressgatewayサービスのEXTERNAL_IPアドレスを取得します。

    $ ADDRESS=$(kubectl --kubeconfig $KUBECONFIG_MANAGED1 get service \
        -n istio-system istio-ingressgateway \
        -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    $ echo $ADDRESS
    
    # Sample output
    11.22.33.44
    

  3. Sock Shopサンプル・アプリケーションにアクセスします

    • コマンドラインの使用

      a.カタログを取得します。

      $ curl -sk \
          -X GET \
          https://${HOST}/catalogue \
          --resolve ${HOST}:443:${ADDRESS}
      
      # Sample output
      [{"count":115,"description":"For all those leg lovers out there....", ...}]
      
      b.新しいユーザーを追加します(ユーザー名とパスワードの値を置き換えます)。
      $ curl -i \
          --header "Content-Type: application/json" --request POST \
          --data '{"username":"foo","password":"****","email":"foo@example.com","firstName":"foo","lastName":"foo"}' \
          -k https://${HOST}/register \
          --resolve ${HOST}:443:${ADDRESS}
      
      c.ユーザーのカートにアイテムを追加します。
      $ curl -i \
          --header "Content-Type: application/json" --request POST \
          --data '{"itemId": "a0a4f044-b040-410d-8ead-4de0446aec7e","unitPrice": "7.99"}' \
          -k https://${HOST}/carts/{username}/items \
          --resolve ${HOST}:443:${ADDRESS}
      
      # Sample output
      {"itemId":"a0a4f044-b040-410d-8ead-4de0446aec7e","quantity":1,"unitPrice":7.99}
      
      d.カートのアイテムを取得します。
      $ curl -i \
          -k https://${HOST}/carts/{username}/items \
          --resolve ${HOST}:443:${ADDRESS}
      
      # Sample output
      [{"itemId":"a0a4f044-b040-410d-8ead-4de0446aec7e","quantity":1,"unitPrice":7.99}]
      

      nip.ioを使用している場合は、--resolveを含める必要はありません。

    • ブラウザによるローカル・テスト

      一時的に、/etc/hostsファイル(MacまたはLinuxの場合)またはc:\Windows\System32\Drivers\etc\hostsファイル(Windows 10の場合)を変更して、ホスト名をイングレス・ゲートウェイのEXTERNAL-IPアドレスにマップするエントリを追加します。たとえば:

      11.22.33.44 sockshop.example.com
      

      その後、ブラウザでhttps://sockshop.example.com/catalogueからアプリケーションにアクセスできます。

      • nip.ioを使用している場合は、HOST変数(https://${HOST}/catalogueなど)を使用してブラウザでアプリケーションにアクセスできます。
      • プロキシを使用する場合は、*.nip.ioNO_PROXYリストに追加する必要がある場合があります。
    • 独自のDNS名の使用

      独自のDNS名をイングレス・ゲートウェイのEXTERNAL-IPアドレスにポイントします。

      • この場合、Sock Shopアプリケーションをデプロイする前に、sock-shop-app.yamlファイルを編集して、hostsセクション(yourhost.your.domainなど)で適切な値を使用する必要があります。
      • その後、ブラウザを使用してhttps://<yourhost.your.domain>/catalogueでアプリケーションにアクセスできます。

デプロイされたアプリケーションの確認

  1. アプリケーション構成、コンポーネント、ワークロードおよびイングレス・トレイトがすべて存在することを確認します。

    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get ApplicationConfiguration -n mc-sockshop
    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get Component -n mc-sockshop
    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get VerrazzanoCoherenceWorkload -n mc-sockshop
    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get Coherence -n mc-sockshop
    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get IngressTrait -n mc-sockshop
    

  2. Sock Shopサービス・ポッドが正常に作成され、READY状態に移行していることを確認します。これには数分かかる場合があり、一部のサービスが終了して再起動する場合があります。

    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get pods -n mc-sockshop
    
    # Sample output
    NAME             READY   STATUS    RESTARTS   AGE
    carts-coh-0      2/2     Running   0          38m
    catalog-coh-0    2/2     Running   0          38m
    orders-coh-0     2/2     Running   0          38m
    payment-coh-0    2/2     Running   0          38m
    shipping-coh-0   2/2     Running   0          38m
    users-coh-0      2/2     Running   0          38m
    

  3. デプロイされたSock Shopアプリケーションに関連するログやメトリックなどをさらに調査するために、様々なエンドポイントを使用できます。ここの指示に従ってアクセスできます。

アプリケーションのアンデプロイ

場所に関係なく、アプリケーションをアンデプロイするには、アプリケーション・リソースとプロジェクトを管理クラスタから削除します。アンデプロイは、アプリケーションが配置されているすべてのクラスタに影響します。

  1. アプリケーションをアンデプロイするには、Sock Shop OAMリソースを削除します:

    $ kubectl --kubeconfig $KUBECONFIG_ADMIN delete \
      -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.7.2/examples/multicluster/sock-shop/sock-shop-app.yaml
    $ kubectl --kubeconfig $KUBECONFIG_ADMIN delete \
      -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.7.2/examples/multicluster/sock-shop/sock-shop-comp.yaml
    

  2. プロジェクトを削除します。

    $ kubectl --kubeconfig $KUBECONFIG_ADMIN delete \
     -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.7.2/examples/multicluster/sock-shop/verrazzano-project.yaml
    

  3. アプリケーション・ポッドの終了後にネームスペースmc-sockshopを削除します。

    $ kubectl --kubeconfig $KUBECONFIG_ADMIN delete namespace mc-sockshop
    $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 delete namespace mc-sockshop