flux2+kustomize+helm+github マルチクラスタ GitOps クラウドネイティブ プログレッシブデリバリー

flux2+kustomize+helm+github マルチクラスタ GitOps クラウドネイティブ プログレッシブデリバリー

この例では、ステージングと本番の 2 つのクラスターがあるシナリオを想定しています。最終的な目標は、Flux と Kustomize を活用して、重複する宣言を最小限に抑えながら 2 つのクラスターを管理することです。

HelmRepository および HelmRelease カスタム リソースを使用してデモ アプリケーションをインストール、テスト、アップグレードするように Flux を構成します。 Flux は Helm リポジトリを監視し、semver 範囲に基づいて Helm バージョンを最新のチャート バージョンに自動的にアップグレードします。

準備

flux2-kustomize-helmの例

  • https://github.com/fluxcd/flux2-kusTOMize-helm-example

Kubernetes クラスター バージョン 1.16 以降と kubectl バージョン 1.18 以降が必要になります。ローカルで素早くテストするには、Kubernetes を使用できます。ただし、他の Kubernetes セットアップでも同様に動作します。

このガイドに従うには、GitHub アカウントとリポジトリを作成できる個人アクセス トークンが必要です (repo のすべての権限を確認してください)。

Homebrew を使用して MacOS および Linux に Flux CLI をインストールします。

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

または、Bash スクリプトを使用して事前コンパイルされたバイナリをダウンロードして CLI をインストールします。

  1. curl -s https://fluxcd.io/install.sh | sudo バッシュ

プロジェクト構造

Git リポジトリには、次の最上位ディレクトリが含まれています。

  • アプリディレクトリには、各クラスターのカスタム構成を持つHelmバージョンが含まれています。
  • インフラストラクチャ ディレクトリには、NGINX イングレス コントローラーや Helm リポジトリ定義などの一般的なインフラストラクチャ ツールが含まれています。
  • クラスタディレクトリには、各クラスタのFlux設定が含まれています。
  1. ├── アプリ
  2. │ ├── ベース
  3. │ ├── 制作
  4. │ └── ステージング
  5. ├── インフラストラクチャ
  6. │ ├── nginx
  7. │ ├── レディス
  8. │ └── 出典
  9. └── クラスター
  10. ├── 生産
  11. └── ステージング

アプリの構成構造は次のとおりです。

  • apps/base/ディレクトリには名前空間とHelmリリース定義が含まれています
  • apps/production/ディレクトリには、プロダクションHelmリリース値が含まれています。
  • apps/staging/ ディレクトリにはステージング値が含まれています
  1. ./アプリ/
  2. ├── ベース
  3. │ └── ポッドインフォ
  4. │ §── kustomization.yaml
  5. │ ├── 名前空間.yaml
  6. │ └── release.yaml
  7. ├── 生産
  8. │ §── kustomization.yaml
  9. │ └── podinfo-patch.yaml
  10. └── ステージング
  11. ├── kustomization.yaml
  12. └── podinfo-patch.yaml

apps/base/podinfo/ ディレクトリには、両方のクラスターに共通の値を持つ HelmRelease があります。

  1. apiバージョン: helm.toolkit.fluxcd.io/v2beta1
  2. 種類: HelmRelease
  3. メタデータ:
  4. 名前: podinfo
  5. 名前空間: podinfo
  6. 仕様:
  7. リリース名: podinfo
  8. チャート:
  9. 仕様:
  10. チャート: podinfo
  11. ソース参照:
  12. 種類: HelmRepository
  13. 名前: podinfo
  14. 名前空間: flux-system
  15. 間隔: 5m
  16. キャッシュ: redis-master.redis:6379
  17. 進入:
  18. 有効: true  
  19. 注釈:
  20. kubernetes.io/ingress.class: nginx
  21. パス: "/*"  

apps/staging/ ディレクトリには、ステージング固有の値を含む Kustomize パッチがあります。

  1. apiバージョン: helm.toolkit.fluxcd.io/v2beta1
  2. 種類: HelmRelease
  3. メタデータ:
  4. 名前: podinfo
  5. 仕様:
  6. チャート:
  7. 仕様:
  8. バージョン: ">=1.0.0-alpha"  
  9. テスト:
  10. 有効:有効 
  11. 進入:
  12. ホスト:
  13. -podinfo.ステージング

バージョン: ">=1.0.0-alpha" では、HelmRelease をアルファ、ベータ、プレリリースを含む最新のチャート バージョンに自動的にアップグレードするように Flux を構成することに注意してください。

apps/production/ ディレクトリには、本番環境固有の値を持つ Kustomize パッチがあります。

  1. apiバージョン: helm.toolkit.fluxcd.io/v2beta1
  2. 種類: HelmRelease
  3. メタデータ:
  4. 名前: podinfo
  5. 名前空間: podinfo
  6. 仕様:
  7. チャート:
  8. 仕様:
  9. バージョン: ">=1.0.0"  
  10. 進入:
  11. ホスト:
  12. -podinfo.production

バージョン: ">=1.0.0" では、HelmRelease を最新の安定したチャート バージョンに自動的にアップグレードするように Flux を構成することに注意してください (アルファ、ベータ、プレリリースは無視されます)。

インフラストラクチャー:

  1. 。/インフラストラクチャー/
  2. ├── nginx
  3. │ §── kustomization.yaml
  4. │ ├── 名前空間.yaml
  5. │ └── release.yaml
  6. ├── レディス
  7. │ §── kustomization.yaml
  8. │ ├── 名前空間.yaml
  9. │ └── release.yaml
  10. └── 出典
  11. ├── bitnami.yaml
  12. ├── kustomization.yaml
  13. └── podinfo.yaml

Infrastructure/sources/ ディレクトリには、Helm リポジトリの定義があります。

  1. apiバージョン: source.toolkit.fluxcd.io/v1beta1
  2. 種類: HelmRepository
  3. メタデータ:
  4. 名前: podinfo
  5. 仕様:
  6. 間隔: 5m
  7. URL: https://stefanprodan.github.io/podinfo
  8. ---  
  9. apiバージョン: source.toolkit.fluxcd.io/v1beta1
  10. 種類: HelmRepository
  11. メタデータ:
  12. 名前: ビットナミ
  13. 仕様:
  14. 間隔: 30m
  15. URL: https://charts.bitnami.com/bitnami

interval: 5m では、Flux が 5 分ごとに Helm リポジトリ インデックスをプルするように構成されていることに注意してください。インデックスに HelmRelease semver 範囲に一致する新しいチャート バージョンが含まれている場合、Flux はそのバージョンをアップグレードします。

ブートストラップのステージングと本番環境

クラスター ディレクトリには Flux 構成が含まれています。

  1. ./クラスター/
  2. ├── 生産
  3. │ ├── アプリ.yaml
  4. │ └── インフラストラクチャ.yaml
  5. └── ステージング
  6. ├── アプリ.yaml
  7. └── インフラストラクチャ.yaml

clusters/staging/ ディレクトリには、Kustomization 定義があります。

  1. apiバージョン: kustomize.toolkit.fluxcd.io/v1beta1
  2. 種類: カスタマイズ
  3. メタデータ:
  4. 名前: アプリ
  5. 名前空間: flux-system
  6. 仕様:
  7. 間隔: 10分0秒
  8. 依存:
  9. -名前: インフラストラクチャ
  10. ソース参照:
  11. 種類: Gitリポジトリ
  12. 名前: フラックスシステム
  13. パス: ./apps/staging
  14. プルーン: true  
  15. 検証: クライアント
  16. ---  
  17. apiバージョン: kustomize.toolkit.fluxcd.io/v1beta1
  18. 種類: カスタマイズ
  19. メタデータ:
  20. 名前: インフラストラクチャ
  21. 名前空間: flux-system
  22. 仕様:
  23. 間隔: 10分0秒
  24. ソース参照:
  25. 種類: Gitリポジトリ
  26. 名前: フラックスシステム
  27. パス: ./infrastructure

path: ./apps/staging では、ステージング Kustomize オーバーライドを同期するように Flux を構成し、dependsOn では、アプリケーションをデプロイする前にインフラストラクチャ項目を作成するように Flux に指示することに注意してください。

このリポジトリを個人の GitHub アカウントでフォークし、GitHub アクセス トークン、ユーザー名、リポジトリ名をエクスポートします。

  1. export GITHUB_TOKEN=<トークン>
  2. export GITHUB_USER=<ユーザー名>
  3. export GITHUB_REPO = <リポジトリ名>

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

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

kubectl コンテキストをステージング クラスターに設定し、Flux をブートストラップします。

  1. フラックスブートストラップgithub \
  2. --context=ステージング\  
  3. --owner=${GITHUB_USER} \  
  4. --repository=${GITHUB_REPO} \  
  5. --branch=メイン\  
  6. - 個人的 \  
  7. --path=クラスタ/ステージング 

bootstrap コマンドは、clusters/staging/flux-system ディレクトリ内の Flux コンポーネントのマニフェストをコミットし、読み取り専用アクセスを持つ GitHub 上にデプロイ キーを作成して、クラスター内で変更をプルできるようにします。

ステージングにインストールされている Helm リリースに注意してください。

  1. $ フラックスを監視し、helmreleases --all-namespacesを取得します 
  2. 名前空間名リビジョン一時停止準備完了メッセージ
  3. nginx nginx 5.6.14誤り       真のリリース調整が成功しました
  4. podinfo podinfo 5.0.3誤り       真のリリース調整が成功しました
  5. レディス レディス 11.3.4誤り       真のリリース調整が成功しました

デモ アプリが Ingress 経由でアクセスできることを確認します。

  1. $ kubectl -n nginx ポート転送svc/nginx-ingress-controller 8080:80 &
  2.  
  3. $ curl -H "ホスト: podinfo.staging" http://localhost:8080
  4. {
  5. 「ホスト名」 : 「podinfo-59489db7b5-lmwpn」
  6. 「バージョン」 : 「5.0.3」  
  7. }

本番環境クラスターのコンテキストとパスを設定して、本番環境で Flux をブートストラップします。

  1. フラックスブートストラップgithub \
  2. --context=プロダクション \  
  3. --owner=${GITHUB_USER} \  
  4. --repository=${GITHUB_REPO} \  
  5. --branch=メイン\  
  6. - 個人的 \  
  7. --path=クラスタ/プロダクション 

生産調整を監視する:

  1. $ フラックスを見て、カスタマイズを取得
  2. 名前の修正準備完了
  3. アプリメイン/797cd90cc8e81feb30cfe471a5186b86daf2758d本当 
  4. フラックスシステムメイン/797cd90cc8e81feb30cfe471a5186b86daf2758d真実 
  5. インフラストラクチャ main/797cd90cc8e81feb30cfe471a5186b86daf2758d真実 

Kubernetes シークレットの暗号化

シークレットを Git リポジトリに安全に保存するには、Mozilla の SOPS CLI を使用して、OpenPGP または KMS で Kubernetes シークレットを暗号化できます。

gnupg と sops をインストールします。

  1. brew gnupg sops をインストール

パスフレーズを指定せずに Flux の GPG キーを生成し、GPG キー ID を取得します。

  1. $ gpg --full-generate-key  
  2. メールアドレス: [email protected]
  3.  
  4. $ gpg --list-secret-keys [email protected]  
  5. 秒 rsa3072 2020-09-06 [SC]
  6. 1F3D1CED2F865F5E59CA564553241F147E7C5FA4

秘密キーを使用してクラスター上に Kubernetes シークレットを作成します。

  1. gpg --export-secret-keys \  
  2. --アーマー 1F3D1CED2F865F5E59CA564553241F147E7C5FA4 |  
  3. kubectl はシークレットジェネリック sops-gpgを作成します\
  4. --namespace=フラックスシステム\  
  5. --from-file=sops.asc=/dev/stdin  

Kubernetes シークレット マニフェストを生成し、SOP を使用してシークレット データ フィールドを暗号化します。

  1. kubectl -n redisシークレットジェネリック redis-authを作成します\
  2. --from-literal=パスワード=変更-me \  
  3. --dry-run=クライアント\  
  4. -o yaml > インフラストラクチャ/redis/redis-auth.yaml
  5.  
  6. sops --encrypt \  
  7. --pgp=1F3D1CED2F865F5E59CA564553241F147E7C5FA4 \  
  8. --encrypted-regex '^(データ|文字列データ)$' \  
  9. --in-place インフラストラクチャ/redis/redis-auth.yaml  

シークレットをinfrastructure/redis/kustomization.yamlに追加します。

  1. APIバージョン: kustomize.config.k8s.io/v1beta1
  2. 種類: カスタマイズ
  3. 名前空間: redis
  4. リソース:
  5. - 名前空間.yaml
  6. - リリース.yaml
  7. - redis-auth.yaml

クラスターで復号化を有効にするには、infrastructure.yaml ファイルを編集します。

  1. apiバージョン: kustomize.toolkit.fluxcd.io/v1beta1
  2. 種類: カスタマイズ
  3. メタデータ:
  4. 名前: インフラストラクチャ
  5. 名前空間: flux-system
  6. 仕様:
  7. #簡潔にするため内容を省略
  8. 復号化:
  9. プロバイダー: sops
  10. シークレットRef:
  11. 名前: sops-gpg

リポジトリにアクセスできるすべてのユーザーがシークレットを暗号化することはできても、復号化はできないように、公開キーをエクスポートします。

  1. gpg --export -a [email protected] > 公開キー 

変更をマスター ブランチにプッシュします。

  1. git add -A && git commit -m "暗号化されたシークレットを追加" && git push

両方のクラスターの redis 名前空間にシークレットが作成されたことを確認します。

  1. kubectl --context ステージング -n redis シークレットを取得する 
  2. kubectl --context production -n redis シークレットを取得する 

Kubernetes シークレットを使用して、Helm リリースに値を提供できます。

  1. apiバージョン: helm.toolkit.fluxcd.io/v2beta1
  2. 種類: HelmRelease
  3. メタデータ:
  4. 名前: レディス
  5. 仕様:
  6. #簡潔にするため内容を省略
  7. パスワードの使用: true  
  8. 値:
  9. - 種類: 秘密
  10. 名前: redis-auth
  11. 値キー:パスワード 
  12. targetPath:パスワード 

Helm リリース値のオーバーライドの詳細については、ドキュメントを参照してください。

クラスターの追加

クラスターをフリートに追加する場合は、まずリポジトリをローカルにクローンします。

  1. git クローン https://github.com/${GITHUB_USER}/${GITHUB_REPO}.git
  2. ${GITHUB_REPO} をコピーします

クラスターの名前でクラスター内にディレクトリを作成します。

  1. mkdir -p クラスタ/dev

ステージングから同期マニフェストをコピーします。

  1. cp クラスター/ステージング/インフラストラクチャ.yaml クラスター/dev
  2. cp クラスター/ステージング/apps.yaml クラスター/dev

アプリ内に開発オーバーレイを作成するには、clusters/dev/apps.yaml の spec.path を path: ./apps/dev に変更してください。

変更をマスター ブランチにプッシュします。

  1. git add -A && git commit -m "開発クラスターを追加" && git push

kubectl コンテキストとパスを開発クラスターに設定し、Flux をブートストラップします。

  1. フラックスブートストラップgithub \
  2. --context=dev \  
  3. --owner=${GITHUB_USER} \  
  4. --repository=${GITHUB_REPO} \  
  5. --branch=メイン\  
  6. - 個人的 \  
  7. --path=クラスタ/dev  

同じ環境

同一の環境を開始する場合は、production-clone などのクラスターをブートストラップし、production 定義を再利用できます。

プロダクションクローン クラスターを起動します。

  1. フラックスブートストラップgithub \
  2. --context=プロダクションクローン \  
  3. --owner=${GITHUB_USER} \  
  4. --repository=${GITHUB_REPO} \  
  5. --branch=メイン\  
  6. - 個人的 \  
  7. --path=clusters/production-clone  

変更をローカルにプルします。

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

clusters/production-clone ディレクトリに kustomization.yaml ファイルを作成します。

  1. APIバージョン: kustomize.config.k8s.io/v1beta1
  2. 種類: カスタマイズ
  3. リソース:
  4. - フラックスシステム
  5. - ../production/infrastructor.yaml
  6. - ../production/apps.yaml

flux-system kustomize オーバーレイに加えて、プロダクション ディレクトリのインフラストラクチャとアプリのマニフェストも含まれていることに注意してください。

変更をマスター ブランチにプッシュします。

  1. git add -A && git commit -m "本番クローンを追加" && git push

Flux に、production-clone クラスターに実稼働ワークロードをデプロイするように指示します。

  1. フラックス調整カスタム化フラックスシステム\
  2. --context=プロダクションクローン \  
  3. --ソース付き 

<<:  オラクル、顧客のクラウドへの移行を加速させるOracle Support Rewardsプログラムを開始

>>:  Netty を使用して高性能な分散サービス フレームワークを作成する方法は?

推薦する

Baidu ウェブマスター プラットフォーム「ページ最適化提案ツール」の新バージョン

最近、以前の SEO 提案ツールである Baidu Webmaster Tools に新しい「ページ...

製品ページに複数のパンくずナビゲーションを設定できますか?

パンくずナビゲーションは非常に一般的で便利なナビゲーション システムです。特に、幅広い製品を取り扱う...

Baidu のアップデートで古いウェブサイトを安定させる方法

Baidu が更新されるたびに、ウェブサイトの一部が崩壊し、多くの古いウェブマスターは Baidu ...

SEO を行うには、詳細から始めて、一度に 1 ステップずつ分析して実行する方法を知る必要があります。

SEO技術は中国で10年近く普及しており、当時のSEOの運用方法は非常にシンプルで、意図的に行えばキ...

クラウド データ: サーバーの用途は正確には何であり、高品質のサーバーを選択するにはどうすればよいでしょうか?

実は編集者もこのタイトルを無意味に考えました。サーバーは何に使うのでしょうか?サーバーは、ネットワー...

My Sky Media|志科の「武器」が企業のマーケティング向上を支援

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

インターネットマーケティング評価は企業の成功を導きます

学生は学習状況を反映する評価が必要であり、教師は教育状況を反映する評価が必要であり、ビジネスパーソン...

経験: ウェブサイトのプログラミングとキーワードの選択は雑であってはなりません

インターネットの発展に伴い、オンラインプロモーションの重要性が高まっています。企業も個人も、インター...

新しいウェブサイトを立ち上げるのは急がないでください。すべては可能です。

私はしばらくウェブサイトの制作に携わっており、そこから多くのことを学びました。新しく立ち上げたウェブ...

Ctrip.comは同城旅行に2億ドル以上を投資し、同社の第2位の株主となった。

Ctrip.comは同城旅行に2億ドル以上を投資し、同社の第2位の株主となった。 4月28日、Ctr...

実際、私たちはまだ百度について十分には知らない。

Baidu のアルゴリズムやメジャーアップデートがリリースされると、SEO 担当者のウェブサイトのデ...

[更新] 香港クラウドサーバー、コストパフォーマンスが高く評判の良い香港クラウドサーバーのおすすめ

実は、使いやすくコスト効率に優れた香港のクラウド サーバーは比較的少ないのです。なぜそう言えるのでし...

SEOの例: 大規模なウェブサイトの修正は推奨されません

このウェブサイトは2007年10月に構築されました。当時、QQタイプのサイトはまだ普及していませんで...

360 Search は市場シェア目標を 25% に引き上げ、モバイル検索に注力する

新浪科技は11月6日早朝、360の検索事業担当副社長の于光東氏が新浪科技などメディアとの独占インタビ...