リビジョンとタグを使用したIstioコントロールプレーンの安全なアップグレード
メッシュコントロールプレーンのカナリアアップグレードの実行方法について学習します。
すべてのセキュリティソフトウェアと同様に、サービスメッシュも最新の状態に保つ必要があります。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
リビジョンに間接的に関連付けます。
新しいコントロールプレーンが他のprod-stable
名前空間に適していると判断したら、タグを新しいリビジョンを指すように変更できます。これにより、名前空間のラベルを変更することなく、prod-stable
というラベルが付けられたすべての名前空間を新しい1-10-0
リビジョンに更新できます。タグを異なるリビジョンを指すように変更したら、名前空間内のワークロードを再起動する必要があります。
新しいコントロールプレーンリビジョンへのアップグレードに満足したら、古いコントロールプレーンを削除できます。
安定したリビジョンタグの動作
リビジョン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-stable
とprod-canary
の両方が古いリビジョンを指さなくなった場合は、次の手順に従って古いリビジョンを安全に削除できます。
$ istioctl x uninstall --revision 1-9-5
まとめ
リビジョンを使用すると、Istioコントロールプレーンへの変更をカナリアテストできます。多数の名前空間を持つ大規模な環境では、このブログで紹介したように、安定したタグを使用することをお勧めします。これにより、移動する部品の数を減らし、Istioコントロールプレーンの更新に関する自動化を簡素化できます。1.10リリースと新しいタグ機能を確認して、フィードバックをお寄せください!