Flux+Flagger+Istio+Kubernetes を使用して GitOps クラウドネイティブ プログレッシブ (カナリア) 配信を実装する

Flux+Flagger+Istio+Kubernetes を使用して GitOps クラウドネイティブ プログレッシブ (カナリア) 配信を実装する

[[403388]]

このガイドでは、Kubernetes と Istio を使用したプログレッシブ配信のための GitOps の使用について実践的な経験を積むことができます。

導入

デモ: https://github.com/stefanprodan/gitops-istio

GitOps とは何ですか?

GitOps は、宣言型インフラストラクチャとワークロードの信頼できるソースとして Git を使用する継続的デリバリーのアプローチです。 Kubernetes の場合、これは kubectl apply/delete または helm install/upgrade の代わりに git push を使用することを意味します。

このワークショップでは、GitHub を使用して構成リポジトリをホストし、Flux を GitOps 配信ソリューションとして使用します。

プログレッシブデリバリーとは何ですか?

プログレッシブ配信は、カナリア、機能フラグ、A/B テストなどの高度なデプロイメント パターンの総称です。プログレッシブ デリバリー技術は、アプリケーション開発者と SRE チームに影響範囲を細かく制御できるようにすることで、新しいソフトウェア バージョンを本番環境に導入するリスクを軽減します。

このワークショップでは、Flagger と Prometheus を使用して、アプリケーションのカナリア リリースと A/B テストを自動化します。

準備

LoadBalancer をサポートする Kubernetes クラスター v1.16 以上が必要になります。テスト目的では、2 つの CPU と 4 GB のメモリを搭載した Minikube を使用できます。

Homebrew を使用して flux CLI をインストールします。

  1. brew をインストールして fluxcd/tap/flux

macOS AMD64/ARM64、Linux AMD64/ARM、Windows 用のバイナリは、flux2 リリース ページからダウンロードできます。

クラスターが前提条件を満たしていることを確認します。

  1. フラックスチェック  --前 

Homebrew を使用して jq と yq をインストールします。

  1. brew インストール jq yq

このリポジトリをフォークしてクローンします:

  1. git clone https://github.com/<ユーザー名>/gitops-istio
  2. cd gitops-istio

クラスターブートストラップ

flux ブートストラップ コマンドを使用すると、Kubernetes クラスターに Flux をインストールし、Git リポジトリから自身を管理するように構成できます。クラスターに Flux コンポーネントが存在する場合、ブートストラップ コマンドは必要に応じてアップグレードを実行します。

GitHub リポジトリのフォーク URL を指定して Flux をブートストラップします。

  1. フラックスブートストラップgit \
  2. --author-email=<あなたのメールアドレス> \  
  3. --url=ssh://[email protected]/<ユーザー名>/gitops-istio \  
  4. --branch=メイン\  
  5. --path=クラスタ/my-cluster  

上記のコマンドには ssh-agent が必要です。Windows を使用している場合は、flux bootstrap github ドキュメントを参照してください。

起動時に、Flux は SSH キーを生成し、公開キーを出力します。クラスターの状態を git と同期するには、公開キーをコピーし、write を使用して GitHub リポジトリにアクセスするためのデプロイ キーを作成する必要があります。 GitHub で、[設定] > [デプロイ キー] に移動し、[デプロイ キーの追加] をクリックして、☑️ [書き込みアクセスを許可する] をオンにし、Flux 公開キーを貼り付けて、[キーの追加] をクリックします。

Flux がリポジトリにアクセスすると、次の処理が行われます。

  • Istioオペレーターのインストール
  • Istioコントロールプレーンの準備が整うのを待っています
  • Flagger、Prometheus、Grafanaをインストールする
  • Istioパブリックゲートウェイを作成する
  • prod名前空間を作成する
  • 負荷テスターのデプロイメントを作成する
  • フロントエンドのデプロイメントとカナリアを作成する
  • バックエンドのデプロイメントとカナリアを作成する

Istio を使用してクラスターをブートストラップする場合、適用順序を定義することが重要です。アプリケーション ポッドが Istio サイドカー インジェクションを使用するには、アプリケーションの前に Istio コントロール プレーンが起動して実行されている必要があります。

Flux v2 では、オブジェクト間の依存関係を定義することで実行順序を指定できます。たとえば、clusters/my-cluster/apps.yaml では、アプリの調整が istio システムに依存することを Flux に伝えます。

  1. apiバージョン: kustomize.toolkit.fluxcd.io/v1beta1
  2. 種類: カスタマイズ
  3. メタデータ:
  4. 名前: アプリ
  5. 名前空間: flux-system
  6. 仕様:
  7. 間隔: 30分0秒
  8. 依存:
  9. -名前: istio-system
  10. ソース参照:
  11. 種類: Gitリポジトリ
  12. 名前: フラックスシステム
  13. パス: ./apps

まず Flux を観察して Istio をインストールし、次にデモ アプリを観察します。

  1. ウォッチフラックスがカスタマイズを取得

次のコマンドを使用して、Flux 調整ログを tail できます。

  1. フラックスログ--all-namespaces --follow --tail=10  

Istio のカスタマイズとアップグレード

istio/system/profile.yaml にある IstioOperator リソースを使用して、Istio インストールをカスタマイズできます。

  1. apiバージョン: install.istio.io/v1alpha1
  2. 種類: IstioOperator
  3. メタデータ:
  4. 名前: istio-デフォルト 
  5. 名前空間: istio-system
  6. 仕様:
  7. プロフィール: デモ
  8. コンポーネント:
  9. パイロット:
  10. k8s:
  11. リソース:
  12. リクエスト:
  13. CPU: 10m
  14. メモリ: 100Mi

Istio 設定を変更した後、変更を git にプッシュすると、Flux によってクラスターに適用されます。 Istio オペレーターは、変更に応じて Istio コントロール プレーンを再構成します。

新しい Istio バージョンが利用可能になると、update-istio GitHub Action ワークフローは、Istio Operator のアップグレードに必要なマニフェスト更新を含むプル リクエストを開きます。新しい Istio バージョンは、e2e ワークフローを通じて Kubernetes Kind でテストされます。 PR がマスター ブランチにマージされると、Flux はクラスター内の Istio をアップグレードします。

アプリケーションのブートストラップ

Flux が Git リポジトリをクラスターと同期すると、フロントエンド/バックエンドのデプロイメント、HPA、およびカナリア オブジェクトが作成されます。 Flagger は、カナリア定義を使用して、Kubernetes デプロイメント、ClusterIP サービス、Istio 宛先ルール、仮想サービスなどの一連のオブジェクトを作成します。これらのオブジェクトはメッシュ上のアプリケーションを公開し、カナリア分析とプロモーションを容易にします。

  1. # Fluxによって適用
  2. デプロイメント.apps/フロントエンド
  3. 水平ポッドオートスケーラー.自動スケーリング/フロントエンド
  4. canary.flagger.app/フロントエンド
  5.  
  6. #フラガーによって生成されました
  7. デプロイメント.apps/フロントエンド -プライマリ 
  8. 水平ポッドオートスケーラー.自動スケーリング/フロントエンド-プライマリ 
  9. サービス/フロントエンド
  10. サービス/フロントエンドカナリア
  11. サービス/フロントエンド -プライマリ 
  12. destinationrule.networking.istio.io/frontend-canary
  13. destinationrule.networking.istio.io/frontend-primary  
  14. virtualservice.networking.istio.io/frontend

Flagger がカナリアを正常に初期化したかどうかを確認します。

  1. kubectl -n prod カナリアを取得する
  2.  
  3. 名前ステータス 体重
  4. バックエンド初期化0
  5. フロントエンド初期化0

フロントエンド プライマリ デプロイメントが稼働すると、Flagger はすべてのトラフィックをプライマリ ポッドにルーティングし、フロントエンド デプロイメントをゼロにスケーリングします。

Istio Ingress ゲートウェイ アドレスを見つけるには、次のコマンドを使用します。

  1. kubectl -n istio-system で svc istio-ingressgateway -ojson を取得します | jq .status.loadBalancer.ingress

ブラウザを開いてエントリ アドレスに移動すると、フロントエンド UI が表示されます。

カナリアリリース

Flagger は、HTTP リクエストの成功率、平均リクエスト期間、ポッドの健全性などの主要なパフォーマンス指標を測定しながら、トラフィックを徐々にカナリアに移行する制御ループを実装します。 KPI 分析に基づいて、カナリアのアップグレードまたは終了が行われ、分析結果が Slack に公開されます。

カナリア分析は、次のいずれかのオブジェクトが変更されるとトリガーされます。

PodSpec をデプロイする (コンテナ イメージ、コマンド、ポート、環境など)

ConfigMaps と Secrets はボリュームとしてマウントされるか、環境変数にマップされます

一定のトラフィックを受信しないワークロードの場合、Flagger は、呼び出されるとターゲット ワークロードの負荷テストを開始する Webhook で構成できます。カナリア設定は、apps/backend/canary.yaml にあります。

GitHub から変更をプルします:

  1. git プルオリジンメイン

バックエンド アプリケーションのカナリア デプロイメントをトリガーするには、コンテナ イメージをアップグレードします。

  1. '.images[0].newTag="5.0.1"' -i ./apps/backend/kustomization.yaml を追加します

変更をコミットしてプッシュします。

  1. gitを追加-A && \
  2. git commit -m "バックエンド 5.0.1" && \
  3. git プッシュ origin メイン

Flux に変更をプルするように指示するか、Flux が独自に変更を検出するまで 1 分ほど待ちます。

  1. flux 調整ソース git flux-system

Flux を監視して、クラスターを最新のコミットと調整します。

  1. ウォッチフラックスがカスタマイズを取得

数秒後、Flager はデプロイメント リビジョンが変更されたことを検出し、新しいロールアウトを開始します。

  1. $ kubectl -n prod カナリアバックエンドを記述します
  2.  
  3. イベント:
  4.  
  5. 新しいリビジョンが検出されました! backend.prod のスケールアップ
  6. backend.prodカナリア分析を開始します
  7. ロールアウト前の適合性チェックテストに合格
  8. backend.prod カナリアウェイト 5 を進める
  9. ...
  10. backend.prod カナリアウェイト 50 を進める
  11. backend.prod テンプレート仕様をbackend- primary .prodコピーしています
  12. プロモーション完了! backend.prod のスケールダウン

分析中、Grafana はカナリアの進行状況を監視できます。ポート転送を介してダッシュボードにアクセスできます。

  1. kubectl -n istio-system port- forward svc/flagger-grafana 3000:80

IstioダッシュボードのURLはhttp://localhost:3000/d/flagger-istio/istio-canary?refresh=10s&orgId=1&var-namespace=prod&var-primary=backend-primary&var-canary=backendです。

カナリア分析中にデプロイメントに新しい変更が適用されると、Flagger は分析フェーズを再開することに注意してください。

A/Bテスト

重み付けルーティングに加えて、Flagger は HTTP 一致条件に基づいてトラフィックをカナリアにルーティングするように構成することもできます。 A/B テストのシナリオでは、HTTP ヘッダーまたは Cookie を使用して、ユーザーの特定のセグメントをターゲットにします。これは、セッション アフィニティを必要とするフロントエンド アプリケーションに特に役立ちます。

HTTP 一致条件と反復回数を指定して、A/B テストを有効にすることができます。

  1. 分析:
  2. # スケジュール間隔 (デフォルト60 秒)
  3. 間隔: 10秒
  4. #ロールバック前の失敗したメトリックチェック最大 
  5. 閾値: 10
  6. #反復回数合計
  7. 繰り返し回数: 12
  8. # カナリアマッチ条件
  9. マッチ:
  10. - ヘッダー:
  11. ユーザーエージェント:
  12. 正規表現: 「.*Firefox.*」  
  13. - ヘッダー:
  14. クッキー:
  15. 正規表現: "^(.*?;)?(type=insider)(;.*)?$"  

上記の設定では、Firefox ユーザーと内部 Cookie を持つユーザーに対して 2 分間の分析が実行されます。フロントエンドの構成は、apps/frontend/canary.yaml にあります。

フロントエンド コンテナ イメージを更新してデプロイをトリガーします。

  1. '.images[0].newTag="5.0.1"' -i ./apps/frontend/kustomization.yaml を追加します
  2.  
  3. gitを追加-A && \
  4. gitコミット-m "フロントエンド 5.0.1" && \
  5. git プッシュ origin メイン
  6.  
  7. flux 調整ソース git flux-system

Flagger はデプロイメント リビジョンが変更されたことを検出し、A/B テストを開始します。

  1. $ kubectl -n istio-system logsdeploy/flagger -f | jq .msg
  2.  
  3. 新しいリビジョンが検出されました! frontend.prod のスケールアップ
  4. frontend.prod のロールアウトが完了するのを待機しています:更新されたレプリカ 1 個のうち0 個が利用可能です
  5. ロールアウト前の適合性チェックテストに合格
  6. frontend.prod カナリア反復を進める 1/10
  7. ...
  8. 高度な frontend.prod カナリア反復 10/10
  9. frontend.prod テンプレート仕様をfrontend- primary .prodコピーしています
  10. フロントエンド -プライマリ.prod ロールアウトの完了待機:更新されたレプリカ 2 個のうち1 個が利用可能です
  11. プロモーション完了! frontend.prod のスケールダウン

すべてのカナリアを次の方法で監視できます。

  1. $ kubectl get canaries --all-namespacesを監視します 
  2.  
  3. 名前空間名ステータス 重み
  4. prod フロントエンド 進捗状況 100
  5. prodバックエンド成功0

Istio メトリックに基づくロールバック

Flagger は、Istio テレメトリによって提供されるメトリックを使用して、カナリア ワークロードを検証します。フロントエンド アプリケーション分析では、次の 2 つのインジケーター チェックが定義されます。

  1. メトリクス:
  2. -名前: エラー率
  3. テンプレート参照:
  4. 名前: エラー率
  5. 名前空間: istio-system
  6. しきい値範囲:
  7. 最大: 1
  8. 間隔: 30秒
  9. -名前: レイテンシー
  10. テンプレート参照:
  11. 名前: レイテンシー
  12. 名前空間: istio-system
  13. しきい値範囲:
  14. 最大: 500
  15. 間隔: 30秒

エラー率とレイテンシをチェックするための Prometheus クエリは flagger-metrics.yaml にあります。

カナリア分析中に、HTTP 500 エラーと高レイテンシを生成して、Flagger ロールバックをテストできます。

HTTP 500 エラーを生成します:

  1. curl -b 'type=insider' http://<INGRESS-IP>/status/500 を確認します。

遅延を生成:

  1. curl -b 'type=insider' http://<INGRESS-IP>/delay/1 を確認します。

失敗したチェックの数がカナリア分析のしきい値に達すると、トラフィックはプライマリにルーティングされ、カナリアはゼロにスケーリングされ、ロールアウトは失敗としてマークされます。

  1. $ kubectl -n istio-system logsdeploy/flagger -f | jq .msg
  2.  
  3. 新しいリビジョンが検出されました! frontend.prod のスケールアップ
  4. ロールアウト前の適合性チェックテストに合格
  5. frontend.prod カナリア反復を進める 1/10
  6. frontend.prod の進捗を停止 エラー率 31 > 1
  7. frontend.prod の進行遅延 2000 > 500 を停止
  8. ...
  9. frontend.prod のロールバック失敗チェックしきい値が 10 に達しました
  10. カナリアは失敗しました! frontend.prod のスケールダウン

Prometheus、Datadog、Amazon CloudWatch のカスタム メトリック チェックを使用して分析を拡張できます。

Slack、MS Teams、Discord、または Rocket のカナリア分析アラートの設定については、ドキュメントを参照してください。

<<:  Redis に基づく分散ロックと Redlock アルゴリズム

>>:  JVM パフォーマンスの最適化は難しいと聞きました。今日試してみました!

推薦する

NBAスターのジェレミー・リンの人気がドメイン名登録ブームを巻き起こす

最近スポーツ界で目覚ましい活躍を見せているのは、NBAのニューヨーク・ニックスの中国系アメリカ人選手...

機電ホームが1000万ドルを投じて尚国インターネットB2B業界ポータルサイトを買収、合併と買収の波を引き起こす?

A5ウェブマスターネットワーク(admin5.com)は3月20日に報道しました:最近、国内の有名な...

ETag の概要と SEO におけるその応用

以前、「高性能ウェブサイト構築ガイド」でETagについて学んだことがありますが、実際に適用したことは...

ウェブマスターネットワークニュース:多くの銀行が決済インターフェースの整理を検討中。テンセントが優酷を買収したとの噂も

1. ICBCは文書86号を使用してAlipayに強く反応し、多くの銀行が支払いインターフェースのク...

prohostingserver-$5/Kvm/Win/1g メモリ/80g ハードディスク/1T トラフィック/Phoenix

Prohostingserver は、仮想ホスティング、リセラー、VPS、サーバーレンタルを統合した...

企業がクラウドリソースをより有効活用するための4つのステップ

多くの企業にとって、クラウド リソースの活用は戦略の一部ではなく、個々のチームがニーズを満たすために...

プロモーションチャネルの選択方法は?これらの5つの原則と4つの次元を見てみましょう

疫病の影響で、交通はオンラインに移行し、プロモーションチャネルもオンラインに移行しました。この記事は...

ソフト記事執筆経験に基づくウェブサイトSEO記事執筆の誤解について語る

現在、ウェブサイトを宣伝し、検索エンジンがより多く、より速く検索できるようにし、GoogleやBai...

分散クラウド オプションはモバイル ワークロードにどのような利点をもたらしますか?

クラウド コンピューティングのこの次の大きな側面は、企業の IT ユーザーに多くの利点をもたらします...

Omdia: ハイブリッドおよびマルチクラウドの市場規模は2026年までに380億ドルを超える

最近、国際的に権威のある研究機関であるOmdiaは「Omdia Universe:ハイブリッドおよび...

どのようなユーザーエクスペリエンスが検索エンジンのニーズを満たすのでしょうか? (三つ)

前回の記事では、主にユーザーのニーズの分析とその内容を紹介しました。この記事では、主にほとんどのユー...

オムニチャネル環境でユーザー操作を実行するにはどうすればよいでしょうか?

オムニチャネル環境でユーザー操作を適切に行うことは簡単ではありません。これを実現するには、消費者向け...

データレイクに関するこれらの知識ポイントをご存知ですか?

本日の記事では、主にデータレイクの定義を紹介し、その後、主要なクラウドベンダーのソリューションと現在...

kuaichedao (VPS): 香港の動的 IP、台湾の動的 IP、TVB\Netflix\HKTV などのローカル ビデオ プログラムの視聴をサポート。

kuaichedao(高速トラック)は主に3種類のVPSを運営しています:(1)香港のダイナミックV...

Baidu BearアカウントによりSecooは中国オリジナルデザインをサポート

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています最近、大胆...