Share via


Azure Kubernetes Service 用の Istio ベースのサービス メッシュ アドオンをアップグレードする

この記事では、Azure Kubernetes Service (AKS) 用の Istio ベースのサービス メッシュ アドオンのアップグレード エクスペリエンスについて説明します。

Istio ベースのサービス メッシュ アドオンに対する新しいマイナー リビジョンまたはパッチのリリースに関するお知らせは、AKS リリース ノートで公開されています。

マイナー リビジョンのアップグレード

Istio アドオンでは、カナリア アップグレード プロセスを使ってマイナー リビジョンをアップグレードできます。 アップグレードが開始されると、新しい (カナリア) リビジョンのコントロール プレーンが古い (安定した) リビジョンのコントロール プレーンと一緒にデプロイされます。 その後、監視ツールを使ってこのプロセス中のワークロードの正常性を追跡しながら、データ プレーンのワークロードを手動でロール オーバーできます。 ワークロードの正常性に問題が見られない場合は、アップグレードを完了して新しいリビジョンのみがクラスターに残るようにすることができます。 それ以外の場合は、Istio の以前のリビジョンにロールバックできます。

サポートされている Istio のマイナー リビジョンを現在クラスターで使っている場合、一度に 1 つのマイナー リビジョンのアップグレードしか許可されません。 サポートされていないリビジョンの Istio をクラスターで使っている場合は、その Kubernetes バージョンでサポートされている最小の Istio マイナー リビジョンにアップグレードする必要があります。 その後は、再び一度に 1 つずつ、マイナー リビジョンのアップグレードを行うことができます。

次の例は、リビジョン asm-1-18 から asm-1-19 にアップグレードする方法を示しています。 手順はすべてのマイナー アップグレードで同じです。

  1. az aks mesh get-upgrades コマンドを使って、アップグレード ターゲットとしてクラスターで使用できるリビジョンを確認します。

    az aks mesh get-upgrades --resource-group $RESOURCE_GROUP --name $CLUSTER
    

    このコマンドによって返されない新しいリビジョンが見込まれる場合は、最新のリビジョンと互換性を持つように、最初に AKS クラスターをアップグレードする必要がある場合があります。

  2. クラスター上の既存のメッシュ リビジョンにメッシュ構成を設定している場合は、次の手順でカナリア アップグレードを開始する前にaks-istio-system 名前空間の新しいリビジョンに対応する別の ConfigMap を作成する必要があります。 この構成は、新しいリビジョンのコントロール プレーンがクラスターにデプロイされた時点で適用されます。 詳細については、こちらをご覧ください。

  3. az aks mesh upgrade start を使って、リビジョン asm-1-18 から asm-1-19 へのカナリア アップグレードを開始します。

    az aks mesh upgrade start --resource-group $RESOURCE_GROUP --name $CLUSTER --revision asm-1-19
    

    カナリア アップグレードとは、1.18 コントロール プレーンが 1.17 コントロール プレーンと一緒にデプロイされることを意味します。 これらは、アップグレードを完了するかロールバックするまで共存し続けます。

  4. asm-1-18asm-1-19 の両方に対応するコントロール プレーン ポッドが存在することを確認します。

    • istiod ポッドを確認します。

      kubectl get pods -n aks-istio-system
      

      出力例:

      NAME                                        READY   STATUS    RESTARTS   AGE
      istiod-asm-1-18-55fccf84c8-dbzlt            1/1     Running   0          58m
      istiod-asm-1-18-55fccf84c8-fg8zh            1/1     Running   0          58m
      istiod-asm-1-19-f85f46bf5-7rwg4             1/1     Running   0          51m
      istiod-asm-1-19-f85f46bf5-8p9qx             1/1     Running   0          51m
      
    • イングレスが有効な場合は、イングレス ポッドを確認します。

      kubectl get pods -n aks-istio-ingress
      

      出力例:

      NAME                                                          READY   STATUS    RESTARTS   AGE
      aks-istio-ingressgateway-external-asm-1-18-58f889f99d-qkvq2   1/1     Running   0          59m
      aks-istio-ingressgateway-external-asm-1-18-58f889f99d-vhtd5   1/1     Running   0          58m
      aks-istio-ingressgateway-external-asm-1-19-7466f77bb9-ft9c8   1/1     Running   0          51m
      aks-istio-ingressgateway-external-asm-1-19-7466f77bb9-wcb6s   1/1     Running   0          51m
      aks-istio-ingressgateway-internal-asm-1-18-579c5d8d4b-4cc2l   1/1     Running   0          58m
      aks-istio-ingressgateway-internal-asm-1-18-579c5d8d4b-jjc7m   1/1     Running   0          59m
      aks-istio-ingressgateway-internal-asm-1-19-757d9b5545-g89s4   1/1     Running   0          51m
      aks-istio-ingressgateway-internal-asm-1-19-757d9b5545-krq9w   1/1     Running   0          51m
      

      両方のリビジョンのイングレス ゲートウェイ ポッドがサイド バイ サイドでデプロイされていることを確認します。 ただし、サービスとその IP は不変のままです。

  5. 新しいポッドが新しいリビジョンとそのコントロール プレーンに関連付けられた Istio サイドカーを取得するように、名前空間のラベルを変更します。

    kubectl label namespace default istio.io/rev=asm-1-19 --overwrite
    

    ラベルの変更は、再起動されるまでワークロードには影響しません。

  6. 各アプリケーション ワークロードを再起動して、個別にロール オーバーします。 次に例を示します。

    kubectl rollout restart deployment <deployment name> -n <deployment namespace>
    
  7. 監視ツールとダッシュボードを調べて、再起動後にワークロードがすべて正常な状態で実行されているかどうかを確認します。 その結果に基づいて、次の 2 つの選択肢があります。

    • カナリア アップグレードを完了する: ワークロードがすべて期待どおりに正常な状態で実行されていることを確認できれば、カナリア アップグレードを完了できます。 アップグレードが完了すると、前のリビジョンのコントロール プレーンが削除され、新しいリビジョンのコントロール プレーンがクラスター上に残ります。 次のコマンドを実行して、カナリア アップグレードを完了します。

      az aks mesh upgrade complete --resource-group $RESOURCE_GROUP --name $CLUSTER
      
    • カナリア アップグレードをロールバックする: ワークロードの正常性に問題が見つかった場合は、Istio の以前のリビジョンにロールバックできます。

      • 名前空間のラベルを前のリビジョンに書き換えます。

        kubectl label namespace default istio.io/rev=asm-1-18 --overwrite
        
      • これらのワークロードをもう一度再起動して、以前の Istio リビジョンに対応するサイドカーを使うようにワークロードをロールバックします。

        kubectl rollout restart deployment <deployment name> -n <deployment namespace>
        
      • コントロール プレーンを以前のリビジョンにロールバックします。

        az aks mesh upgrade rollback --resource-group $RESOURCE_GROUP --name $CLUSTER
        
  8. 以前、リビジョンに対してメッシュ構成を設定した場合、完了またはロールバック時にクラスターから削除されたリビジョンの ConfigMap を削除できるようになります。

Note

新しいリビジョンに移動するときに手動で名前空間のラベルを変更するのは、面倒でエラーが発生しやすい作業です。 リビジョン タグがこの問題を解決します。 リビジョン タグはリビジョンを指す安定した識別子であり、名前空間のラベル変更を回避するために使用できます。 メッシュ オペレーターでは、名前空間のラベルを変更するのではなく、新しいリビジョンを指すようにタグを変更するだけで済みます。 そのタグでラベル付けされたすべての名前空間が同時に更新されます。 ただし、確実に正しいバージョンの istio-proxy サイドカーが挿入されるようにするには、ワークロードを再起動する必要があることに注意してください。

イングレス ゲートウェイを使用したマイナー リビジョンのアップグレード

現在 Istio イングレス ゲートウェイを使用していて、マイナー リビジョンのアップグレードを実行している場合は、Istio イングレス ゲートウェイ ポッド/デプロイがリビジョンごとにデプロイされていることに注意してください。 ただし、複数のリビジョンにわたるすべてのイングレス ゲートウェイ ポッドに 1 つの LoadBalancer サービスを提供するため、イングレス ゲートウェイの外部/内部 IP アドレスはアップグレードの全期間を通じて変更されません。

したがって、カナリア アップグレード中に、クラスターに 2 つのリビジョンが同時に存在する場合、受信トラフィックは両方のリビジョンのイングレス ゲートウェイ ポッドによって処理されます。

パッチ バージョンのアップグレード

  • Istio アドオンのパッチ バージョンの可用性情報は、AKS のリリース ノートで公開されています。
  • これらの AKS リリースの一部として、istiod およびイングレス ポッドに対してパッチが自動的にロールアウトされ、クラスターに設定されたdefault計画メンテナンス期間が順守されます。
  • ユーザーは、再導入のために次のポッドを再起動して、ワークロードで Istio プロキシへのパッチを開始する必要があります。
    • 新しいポッドまたは再起動されたポッド用の Istio プロキシのバージョンを確認します。 このバージョンは、パッチが適用された後の istiod および Istio イングレス ポッドのバージョンと同じです。

      kubectl get cm -n aks-istio-system -o yaml | grep "mcr.microsoft.com\/oss\/istio\/proxyv2"
      

      出力例:

      "image": "mcr.microsoft.com/oss/istio/proxyv2:1.18.2-distroless",
      "image": "mcr.microsoft.com/oss/istio/proxyv2:1.18.2-distroless"
      
    • 名前空間内のすべてのポッドの Istio プロキシ イメージのバージョンを確認します。

      kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
      sort |\
      grep "mcr.microsoft.com\/oss\/istio\/proxyv2"
      

      出力例:

      productpage-v1-979d4d9fc-p4764:	docker.io/istio/examples-bookinfo-productpage-v1:1.18.0, mcr.microsoft.com/oss/istio/proxyv2:1.18.1-distroless
      
    • 再挿入をトリガーするため、ワークロードを再起動します。 次に例を示します。

      kubectl rollout restart deployments/productpage-v1 -n default
      
    • 新しいバージョンになっていることを確認するには、名前空間内のすべてのポッドに対して Istio プロキシ イメージ のバージョンをもう一度確認します。

      kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
      sort |\
      grep "mcr.microsoft.com\/oss\/istio\/proxyv2"
      

      出力例:

      productpage-v1-979d4d9fc-p4764:	docker.io/istio/examples-bookinfo-productpage-v1:1.18.0, mcr.microsoft.com/oss/istio/proxyv2:1.18.2-distroless