Service Mesh (ASM) は、オープンソースの Istio がインストールされている Kubernetes クラスターの ASM への直接移行をサポートしています。このトピックでは、オープンソースの Istio がインストールされているクラスターを ASM に移行する方法について説明します。
プロセス
次の手順を 4 つのフェーズで実行します。
Migrating フェーズでは、Kubernetes クラスターは Istio の構成済みインジェクションルールに従ってインジェクトされ、デフォルトで Istio Sidecar にインジェクトされます。サイドカーの自動インジェクションが有効になっている名前空間では、Pod ラベルを変更して、ワークロードへの ASM メッシュプロキシのインジェクションを明示的に宣言できます。
前提条件
移行の対象となる Kubernetes クラスターは、次の要件を満たしている必要があります。
クラスターのバージョンは 1.21 以降である必要があります。クラスターが 1.21 より前で、Alibaba Cloud Container Service for Kubernetes (ACK) でホストされている場合は、アップグレード手順について「ACK クラスターを手動で更新する」をご参照ください。
クラスターにインストールされている Istio は、V1.10 以降である必要があります。
移行のために、バージョン 1.24 以降の新しい ASM インスタンスを作成します。詳細については、「ASM インスタンスを作成する」をご参照ください。
手順
ステップ 1: 移行するクラスターを ASM に追加する
Istio がインストールされた ACK クラスター、または Alibaba Cloud Container Service に登録されているセルフビルドクラスターを ASM に追加するには、「ASM インスタンスにクラスターを追加する」をご参照ください。このプロセス中に、「istio-system 名前空間チェックを無視する」オプションを選択します。Kubernetes クラスターがまだ Alibaba Cloud Container Service に登録されていない場合は、ACK One の登録済みクラスター機能に基づいてクラスターを ACK インスタンスに登録し、ASM コンソールでクラスターを ASM に追加します。
クラスターが ASM に追加されると、ASM インスタンスは移行プロセスを制御するために ASMMigrateFromIstio リソースを自動的に作成します。次のコマンドを実行して、リソースを表示できます。
kubectl --kubeconfig=${ASM_KUBECONFIG} get asmmigratefromistio予想される出力:
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMigrateFromIstio
metadata:
name: default
spec:
desiredState: Init
retryCounter: 0
advancedOptions:
stopIstioSystemInjectionDisabling: false
status:
message: ""
retryCounter: 0
state: Initこのリソースの構成項目は、次のように説明されています。
フィールド名 | タイプ | 説明 | 値 |
spec.desiredState | 文字列 | 移行されるクラスターの移行ステータスを指定します。この値を変更して、指定された移行ステータスを入力できます。 重要 この値は、固定の順序でのみ変更できます。 この値は、Init -> SetupIstioForMigrate -> Migrating -> Finished の固定順序でのみ変更できます。 |
|
spec.retryCounter | int32 | ASM のコントロールプレーンは、状態を切り替える際に必要なチェックを実行して、新しい状態で指定された標準が満たされていることを確認する場合があります。 desiredState パラメーターを変更した後、このチェックは自動的にトリガーされます。チェックが失敗した場合は、画面上の指示に基づいて状態を調整してから、この値を変更して再チェックをトリガーします。 | 0~2147483647 |
spec.advancedOptions | オブジェクト | 高度なオプションを示します。 | |
spec.advancedOptions.stopIstioSystemInjectionDisabling | bool | ASM による istio-system 名前空間のラベルの同期を無効にするかどうかを指定します。移行するクラスターで東西ゲートウェイが構成されている場合は、値を |
|
status.retryCounter | int32 | retryCounter が正しく調整されているかどうかを記述します。最後の変更が正常に調整された場合、この値は spec.retryCounter と等しくなります。 | 読み取り専用 |
status.state | 文字列 | 現在の状態を示します。状態を切り替えた後、状態が spec.desiredState で指定された状態に正常に切り替わると、status.state の値は spec.desiredState の値と等しくなります。 | 読み取り専用 |
status.message | 文字列 | 状態の切り替えが失敗した場合の失敗の理由を示します。このフィールドが空でない場合は、spec.retryCounter を変更して再試行をトリガーする前に、プロンプトに従って調整を行う必要があります。 | 読み取り専用 |
ASMMigrateFromIstio の状態切り替え
次のフェーズに進むには、ASMMigrateFromIstio リソースの状態を手動で変更する必要があります。この例では、現在の状態は Init で、状態 SetupIstioForMigrate は次のフェーズに進んだことを示します。
次のサンプルコードは、状態を切り替える方法の例を示しています。
SetupIstioForMigratekubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"SetupIstioForMigrate"}}'Migratingkubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Migrating"}}'Finishedkubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Finished"}}'
次のフェーズの状態が SetupIstioForMigrate であると仮定すると、次のコマンドを実行して切り替えが成功したことを確認できます。
kubectl get asmigratefromistio default -o yaml予想される出力:
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMigrateFromIstio
metadata:
name: default
spec:
desiredState: SetupIstioForMigrate
retryCounter: 0
status:
message: ""
retryCounter: 0
state: SetupIstioForMigratestatus.state の値が SetupIstioForMigrate の場合、状態は正常に切り替わっています。
status.state の値が期待どおりに変更されない場合は、status.message のプロンプトに従って変更します。変更後、spec.retryCounter を 1 ずつ増やしてから再試行してください。
Istio の東西ゲートウェイが有効になっているクラスターに必要な追加設定
デフォルトでは、ASM では istio-system 名前空間のサイドカーの自動インジェクションは無効になっています。ただし、Istio の東西ゲートウェイ Pod のキャッシュされたイメージは、MutatingWebhook によって手動で変更する必要があり、これには istio-system 名前空間でサイドカーのインジェクションが有効になっている必要があります。クラスターで東西ゲートウェイが有効になっている場合は、次のコマンドを実行して、ASM が istio-system 名前空間でサイドカーの自動インジェクションを無効にするのを防ぎます。
kubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"advancedOptions":{"disableIstioSystemLabelReconciliation": true}}}' 次に、ASM から istio-system に同期されたラベルを手動で削除します。
Istio-system 名前空間の構成を編集します。
kubectl --kubeconfig=${ACK インスタンスの kubeconfig ファイルのパス} edit ns istio-systemラベル
istio-injection: disableを削除し、保存して終了します。
ステップ 2: 準備のために Istio を構成する
状態を SetupIstioForMigrate に変更します。
重要上記のコマンドを実行した後、ASM で Istiod を再構成する必要があります。この場合、後続の移行のために Istiod をローリングモードで再起動できます。
このフェーズでは、ASM は Istio に次の構成を追加して、移行中に Istio Sidecar と ASM Sidecar 間の mTLS 通信を有効にします。
defaultConfig: proxyMetadata: PROXY_CONFIG_XDS_AGENT: "true"このフェーズに入った後、この構成をすべてのワークロードに適用するには、Istio Sidecar が有効になっているすべてのワークロードを再起動する必要があります。次のコマンドを実行して、Pod が適格かどうかを確認できます。
kubectl get pod ${POD 名} -o yaml|grep PROXY_CONFIG_XDS_AGENT空でない出力が表示された場合、ワークロードは正しく構成されています。Istio Sidecar が有効になっているすべてのワークロードが構成されたら、Migrating フェーズに進みます。
ステップ 3: 移行
Migrating フェーズでは、すべての Istio Sidecar が ASM メッシュプロキシに置き換えられるまで、ワークロードに Istio Sidecar または ASM メッシュプロキシをインジェクトできます。
状態を Migrating に切り替えます。このフェーズでは、すべての Istio API を ASM に接続し、次の手順で概説されているように、イングレスゲートウェイ、エグレスゲートウェイ、東西ゲートウェイを含む Istio Sidecar のコンポーネントを ASM に移行します。
(オプション) ASM クラスタクロスゲートウェイをデプロイします。
ASM 内では、メッシュプロキシが有効になっているワークロードは、Istio の東西ゲートウェイと同様に、クラスタクロス通信に ASM クラスタクロスゲートウェイを自動的に使用します。この場合、東西ゲートウェイが有効になっている場合は、Istio Sidecar から ASM メッシュプロキシに移行した後もシームレスなクラスタクロス通信を維持するために、ASM クラスタクロスゲートウェイをデプロイしてから、ワークロードを ASM メッシュプロキシと統合する ことが不可欠です。
ASM コンソールでクラスターのネットワークを構成します。ネットワークは、Istio でクラスターに構成されているネットワークと同じである必要があります。さらに、Istio の東西ゲートウェイが有効になっているクラスターに対して、クラスタクロス メッシュ プロキシ経由のアクセスを有効にする を有効にする必要があります。詳細については、「クラスターのネットワーク設定を構成し、クラスタクロス メッシュ プロキシを有効にする」をご参照ください。
説明ASM のネットワーク構成が Istio のネットワーク構成と一致していることを確認します。この例では、整合性を確保するために、ASM でクラスター a に network-1 を、クラスター b に network-2 を構成する必要があります。
Istio Sidecar を ASM メッシュプロキシに移行します。
$ kubectl --kubeconfig=${Kubernetes クラスターの kubeconfig ファイルのパス} -n ${名前空間} patch ${デプロイメント名} --type='merge' -p '{"spec":{"template":{"metadata":{"labels":{"sidecar.asm.aliyun.com/inject":"true"}}}}}'重要この操作により、ワークロードでローリング再起動がトリガーされる場合があります。トラフィックの損失は、アプリケーションが無損失オフラインをサポートしているかどうか、Istio Sidecar に無損失オフラインが構成されているかどうか、およびアプリケーションが無損失オフラインの要件を満たしているかどうかによって異なります。要件は、アプリケーションへのすべてのリクエストが指定されたタイムアウト期間内に返される必要があることです。この手順は、オフピーク時に実行することをお勧めします。
Istio イングレスゲートウェイを ASM イングレスゲートウェイに移行します。
Istio イングレスゲートウェイを ASM イングレスゲートウェイに移行します。詳細については、「セルフビルドの Istio IngressGateway を ASM ゲートウェイに移行する方法」をご参照ください。
Istio エグレスゲートウェイを ASM エグレスゲートウェイに移行します。移行するクラスターでエグレスゲートウェイが有効になっている場合は、次の手順に従います。
ASM でエグレスゲートウェイを作成します。詳細については、「エグレスゲートウェイを作成する」をご参照ください。外部サービスに登録するための ServiceEntry、エグレスゲートウェイのポート フォワーディングを有効にするためのゲートウェイルール、トラフィックをエグレスゲートウェイにルーティングするための仮想サービスなど、必要なリソースを作成します。詳細については、「ASM での外部サービスへのアクセスのためのトラフィック管理」をご参照ください。
外部サービスの仮想サービスを調整して、トラフィックを ASM エグレスゲートウェイに転送し、目的の重みを設定します。
次のサンプルコードは、仮想サービスを構成する方法の例を示しています。完全なサンプルコードについては、「HTTP トラフィックのエグレスゲートウェイ」をご参照ください。
apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: direct-cnn-through-egress-gateway spec: hosts: - edition.cnn.com gateways: - istio-egressgateway - mesh http: - match: - gateways: - mesh port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local port: number: 80 weight: 99 - destination: # エグレスゲートウェイを指す新しい宛先を追加し、必要に応じて重みを調整します host: asm-egressgateway.istio-system.svc.cluster.local # ASM エグレスゲートウェイが asm-egressgateway と呼ばれていると仮定します port: number: 80 weight: 1この YAML ファイルでは、edition.cnn.com へのトラフィックは、99:1 の比率で Istio Ingressgateway と ASM Egressgateway にルーティングされます。すべてのトラフィックが ASM Egress ゲートウェイにルーティングされるまで、必要に応じて比率を調整します。Istio Egress ゲートウェイのアクセスログを監視して、トラフィックフローを追跡できます。
ステップ 4: 完了
次のフェーズに進む前に、以下のすべての操作が完了していることを確認してください。
すべての Istio Sidecar が削除されている。
Istio の東西ゲートウェイ、イングレスゲートウェイ、またはエグレスゲートウェイを通過するトラフィックがない。
すべての Istio API 構成が ASM にインポートされている。
ASM メッシュプロキシがインジェクトされたワークロードが期待どおりに機能している。
上記の操作が完了したら、バージョン固有の istioctl コマンドを使用して、クラスターにインストールされている Istio をアンインストールできます。
誤って削除または省略するなどの問題を回避するために、インストールされているバージョンと一致する istioctl ツールを使用してください。
$ istioctl --kubeconfig=${Kubernetes クラスターの kubeconfig ファイルのパス} uninstall --purgeistioctl ツールがアンインストールされたら、状態を Finished に切り替えます。状態の切り替えが失敗した場合は、status.message のプロンプトに従って残りの Istio リソースをクリアし、spec.retryCounter を 1 ずつ増やしてから再試行してください。 status.state の値が Finished に変更されると、移行は完了です。