リビジョンとタグを使用したIstioコントロールプレーンの安全なアップグレード

メッシュコントロールプレーンのカナリアアップグレードの実行方法について学習します。

2021年5月26日 | Christian Posta - Solo.io、Lin Sun - Solo.io、Sam Naser - Google

すべてのセキュリティソフトウェアと同様に、サービスメッシュも最新の状態に保つ必要があります。Istioコミュニティは四半期ごとに新しいバージョンをリリースし、バグ修正とセキュリティの脆弱性に対する定期的なパッチリリースも行っています。サービスメッシュの運用者は、コントロールプレーンとデータプレーンのコンポーネントを何度もアップグレードする必要があります。アップグレード時には注意が必要です。ミスはビジネストラフィックに影響を与える可能性があります。Istioには、制御された方法でアップグレードを安全に実行するための多くのメカニズムがあり、Istio 1.10では、この運用エクスペリエンスがさらに改善されました。

背景

Istio 1.6では、リビジョンを使用したカナリアパターンに従ってサービスメッシュをアップグレードするための基本的なサポートを追加しました。このアプローチを使用すると、既存のデプロイメントに影響を与えることなく、複数の制御プレーンを並行して実行し、古い制御プレーンから新しい制御プレーンにワークロードを徐々に移行できます。

このリビジョンベースのアップグレードをサポートするために、Istioは名前空間に対してistio.io/revラベルを導入しました。これは、どのコントロールプレーンリビジョンがそれぞれの名前空間のワークロードに対してサイドカープロキシを注入する必要があるかを示します。たとえば、istio.io/rev=1-9-5というラベルは、コントロールプレーンリビジョン1-9-5がその名前空間のワークロードに対して1-9-5のプロキシを使用してデータプレーンを注入する必要があることを示します。

特定の名前空間のデータプレーン・プロキシをアップグレードするには、istio.io/revラベルをistio.io/rev=1-10-0などの新しいバージョンを指すように更新します。多数の名前空間でラベルの変更を手動で行う(またはオーケストレーションを試みることさえ)は、エラーが発生しやすく、意図しないダウンタイムにつながる可能性があります。

リビジョンタグの導入

Istio 1.10では、リビジョンタグという新しい機能により、リビジョンベースのアップグレードを改善しました。リビジョンタグを使用すると、運用者がリビジョンを使用し、Istioコントロールプレーンを安全にアップグレードするために変更する必要がある数が減ります。タグを名前空間のラベルとして使用し、そのタグにリビジョンを割り当てます。つまり、アップグレード中に名前空間のラベルを変更する必要がなく、手動の手順と構成の変更が最小限に抑えられます。

たとえば、prod-stableという名前のタグを定義し、それをコントロールプレーンの1-9-5リビジョンにポイントできます。また、prod-canaryという名前の別のタグを定義し、それを1-10-0リビジョンにポイントすることもできます。クラスタには多くの重要な名前空間がある場合があり、それらの名前空間をistio.io/rev=prod-stableでラベル付けできます。他の名前空間ではIstioの新しいバージョンをテストすることもでき、その名前空間をistio.io/rev=prod-canaryでラベル付けできます。タグは、これらの名前空間をprod-stableの場合は1-9-5リビジョン、prod-canaryの場合は1-10-0リビジョンに間接的に関連付けます。

Stable revision tags
安定したリビジョンタグ

新しいコントロールプレーンが他のprod-stable名前空間に適していると判断したら、タグを新しいリビジョンを指すように変更できます。これにより、名前空間のラベルを変更することなく、prod-stableというラベルが付けられたすべての名前空間を新しい1-10-0リビジョンに更新できます。タグを異なるリビジョンを指すように変更したら、名前空間内のワークロードを再起動する必要があります。

Updated revision tags
更新されたリビジョンタグ

新しいコントロールプレーンリビジョンへのアップグレードに満足したら、古いコントロールプレーンを削除できます。

安定したリビジョンタグの動作

リビジョン1-9-5に対して新しいprod-stableタグを作成するには、次のコマンドを実行します。

$ istioctl x revision tag set prod-stable --revision 1-9-5

その後、istio.io/rev=prod-stableラベルを使用して名前空間にラベルを付けます。Istioのdefaultリビジョン(つまり、リビジョンなし)をインストールした場合、最初に標準のインジェクションラベルを削除する必要があります。

$ kubectl label ns istioinaction istio-injection-
$ kubectl label ns istioinaction istio.io/rev=prod-stable

メッシュ内のタグを一覧表示するには、次のコマンドを使用します。

$ istioctl x revision tag list

TAG         REVISION NAMESPACES
prod-stable 1-9-5    istioinaction

タグはMutatingWebhookConfigurationを使用して実装されています。対応するMutatingWebhookConfigurationが作成されていることを確認できます。

$ kubectl get MutatingWebhookConfiguration

NAME                             WEBHOOKS   AGE
istio-revision-tag-prod-stable   2          75s
istio-sidecar-injector           1          5m32s

1.10.0に基づいてコントロールプレーンの新しいリビジョンをカナリアテストしようとしているとします。まず、リビジョンを使用して新しいバージョンをインストールします。

$ istioctl install -y --set profile=minimal --revision 1-10-0

prod-canaryという新しいタグを作成し、それを1-10-0リビジョンにポイントできます。

$ istioctl x revision tag set prod-canary --revision 1-10-0

その後、名前空間に応じてラベルを付けます。

$ kubectl label ns istioinaction-canary istio.io/rev=prod-canary

メッシュ内のタグを一覧表示すると、2つの異なるリビジョンを指す2つの安定したタグが表示されます。

$ istioctl x revision tag list

TAG         REVISION NAMESPACES
prod-stable 1-9-5    istioinaction
prod-canary 1-10-0   istioinaction-canary

istio.io/rev=prod-canaryというラベルが付けられた名前空間は、prod-canary安定タグ名に対応するコントロールプレーン(この例では1-10-0リビジョンを指す)によって注入されます。準備ができたら、次のコマンドでprod-stableタグを新しいコントロールプレーンに切り替えることができます。

$ istioctl x revision tag set prod-stable --revision 1-10-0 --overwrite

タグを新しいリビジョンを指すように切り替えるたびに、新しいリビジョンのプロキシを取得するために、それぞれの名前空間内のワークロードを再起動する必要があります。

prod-stableprod-canaryの両方が古いリビジョンを指さなくなった場合は、次の手順に従って古いリビジョンを安全に削除できます。

$ istioctl x uninstall --revision 1-9-5

まとめ

リビジョンを使用すると、Istioコントロールプレーンへの変更をカナリアテストできます。多数の名前空間を持つ大規模な環境では、このブログで紹介したように、安定したタグを使用することをお勧めします。これにより、移動する部品の数を減らし、Istioコントロールプレーンの更新に関する自動化を簡素化できます。1.10リリースと新しいタグ機能を確認して、フィードバックをお寄せください!

この記事を共有する