新しい航空会社で。 スチュワーデスが客室に入ります。「あなたは私たちの新しい航空会社に乗りました。飛行機の機首には映画館があります。尾部にはスロットマシンのホールがあります。下のデッキにはプールがあります。アッパーデッキ - サウナ さて、皆さん、シートベルトを締めてください、そしてこれらすべての不要なものを付けて、離陸してみます。
こんにちは、私の名前はアンドリーです。私は人生のほとんどをIT業界で働いてきました。私はインフラストラクチャ構成管理エンジニアリングの進化に非常に興味があります。過去 8 年間、私はDevOps に携わってきました。
新たな人気トレンドの 1 つは、Weaveworks の CEO である Alexis Richardson によって 2017 年に導入されたGitOps の概念です。 Weaveworks は、2020 年に GitOps の開発のために 3,600 万ドルを超える投資を調達した大規模なアダルト企業です。
前回の記事では、Elastic Stack から Grafana に切り替えた方法に関するコスト削減の成功事例について 説明しました。ここで、この概念を採用する際に待ち構える可能性がある、明白ではない課題について話していきたいと思います。つまり、GitOps は「特効薬」ではありません。おそらく、多くの複雑な回避策を講じて再編成することになるでしょう。私自身もこの道を歩んできたので、GitOps に関する他の記事を読んでもわからない、最もイライラする問題を紹介したいと思います。
コンテンツの概要 GitOps とは何か、そしてなぜそれが必要なのか (必要ないのか) Snowflake サーバーの問題 GitOps - すべての問題に対する万能薬 (またはそうでない) Helm で Flux を使用するロジック カスタムフラックスリソース GitOps のチェックリスト 単一の真実の情報源の概念の違反 小さな結論
GitOps とは何か、そしてなぜそれが必要ないのか さっそく飛び込んでみましょう!
ステートレスとステートフル
明日のインフラストラクチャ構築の最も一般な定义は、不変のインフラストラクチャです。その主要なアイデアは、インフラストラクチャをステートレスとステートフルという 2 つの本身的に異なる部份に裁切することです。
インフラストラクチャのステートレス一部分は不変で冪等です。状態を蓄積しません(データを保留しません)。また、蓄積された状態に応じて動作を変更します。ステートレス パーツのインスタンスには、いくつかの核心的なアーティファクト、スクリプト、アセンブリが含まれる場合があります。原則として、クラウド/仮想化環境のベースイメージから制作します。これらは缺乏安全感で一時的なものです。新しいベース イメージからインスタンスを再制作することで、新しいバージョンのアプリケーションを展示します。
永続データはステートフル的部分に上传されます。これは、専用サーバーを实用した新古典的なスキーム、または几部のクラウドメカニズム (DBaaS、オブジェクト、またはブロックストレージ) によって実現できます。
この「動物園」を维护しやすく、正しく機能させるには、エンジニアリング チームと DevOps チーム間のコラボレーション、および充分に自動化された配信パイプラインが不必要です。
CI部分
エクストリーム プログラミングは、アジャイル開発手段の 1 つです。多くのフィードバック ループが特徴で、クライアントのニーズとの双色球历史を維持できます。
CI/CDシステムを利于したデリバリーパイプラインの自動化を実現します。 CI (継続的インテグレーション) という用語は、1994 年に Grady Booch によって方案され、1997 年に Kent Beck と Ron Jeffries によってエクストリーム プログラミングの分野に導入されました。 CI では、変更をプロジェクトのメイン作業ブランチにできるだけ頻繁に統合する必备があります。
これには、まずタスクをより細かく葡萄糖氧化する必不可少があります。小さな変更はより共价键的であり、追跡、能够理解、統合が更容易です。次に、新しく書かれたコードを単にマージすることはできません。ブランチをマージする前に、很多年に動作していたものが壊れていないことを確認する必不可少があります。これを行うには、少なくともアプリケーションを構築する必不可少があります。コードをテストでカバーすることもお勧めします。
そしてこれは、開発において長い道のりを経て、その过程中で CI/CD システムになった CI システムによって実行されるタスクです。
CDパート
CDとは何ですか? 。
継続的デリバリー。このとき、継続的インテグレーションの実践と DevOps 传统艺术の助けを借りて、プロジェクトのメイン ブランチを常に実稼働環境にデプロイできる状態に保ちます。
継続的な展開。これは継続的デリバリーであり、メイン ブランチに送られるすべてのものがクラスターや本番環境にダンプされます。
さらに進んでみましょう。
Snowflakeサーバーの問題 残念ながら、不変のインフラストラクチャにはいくつかの問題があります。その大这部分は、Infrastructure as Code (IaC) の性质から継承されています。
まず第二に、それは構成のドリフトです。この用語は Puppet Labs (别名な Puppet SCM の做成者) で生まれ、ターゲット システム上のすべての変更がシステム構成经营 (SCM) の助けを借りて行われるわけではないことを述べています。一步はそれらをバイパスして手動で行われます。
このような複数の変更の過程で、構成のドリフト、つまり SCM で説明されている構成と実際の状況との差異が現れます。
これは自動化可怕スパイラルにつながります。
手動による変更が増えるほど、SCM スクリプトを実行すると、記録されていない変更が壊れる也许 性が高くなります。実行するのが怖ければ怖いほど、新たな手動編集が行われる也许 性が高くなります。
最終的には、この悪質なポジティブ フィードバックがスノーフレーク サーバーの成型につながり、そのサーバーは相对に不整理になり、もはや里面の介绍を誰も表述できなくなりました。手動で編集すると、ノードは降雪の中の個々の雪の結晶と同じくらい僵板になります。
このドリフトにより、サーバーは不変のインフラストラクチャ内の上位レベルに残ります。これで、GCP プロジェクト/AWS VPC/Kubernetes-cluster-snowflakes について話すことができます。これは、不変のインフラストラクチャでは変更の実装が規制されていないために発生します。さらに、それを適切に行う的方法を誰も知りません。
GitOps - すべての問題を解決する万能薬 (またはそうでない) そこに Weaveworks がやって来て、「みなさん、私たちはあなたが相应とするものを持っています - GitOps です」と言います。 GitOps を推進するために、彼らは制作した Kelsey Hightower のような重鎮を迎え入れました。 PR 中に、彼は「男になれ! 角本をやめて出荷を始めよう!」というメッセージを大々的に宣伝します。そして、彼はある地步のマーケティングでたらめなビンゴを言います。
私の意見では、最も魅力的な利点は次のとおりです。
デプロイの一貫性と標準化の向上 セキュリティ保証の向上 エラーからのより簡単かつ迅速な回復 アクセスとシークレットの管理が容易になる 自己文書化されたデプロイ チーム内での知識の配布
そして、GitOps が何なのかを看法しようとしている人は、この教科書のスライドに面对します。
次に、GitOps の原則を見つけます。これは、IaC の原則をわずかに拡張したものに似ています。
GitOps は宣言型です GitOps アプリはバージョン管理されており、不変です GitOps アプリは自動的にプルされます GitOps アプリは継続的に調整されます
それでも、これは真高空での球状の記述であるため、探索は続けられます。 GitOps.tech Web サイトには、いくつかの为重要な説明が記載されています。
まず、GitOps は、これをインフラストラクチャに自動的に適用する CD ツールを備えた Git のインフラストラクチャのようなコードであることを学びます。
GitOps 内には少なくとも 2 つのリポジトリが必要です。
アプリケーションリポジトリ。アプリケーションのソース コードと、そのアプリケーションのデプロイメントを記述するマニフェストについて説明します。 インフラストラクチャ リポジトリ。インフラストラクチャ マニフェストと展開環境について説明します。
また、GitOps イデオロギーでは、プッシュ指明のアプローチよりもプル指明のアプローチが好まれます。これは、权重級のプル モンスターである Puppet や Chef から、軽量なプッシュ ベースの Ansible や Terraform への SCM システムの進化とは多个対照的です。
そして、GitOps が主にツールキットの話であるならば、Weaveworks 自体から Flux ベースの构架を取り出してそれを拆分することは理にかなっています。アイデアの做成者はリファレンス実装を做成したに違いありません。
Flux は現在バージョン 2 であり、アーキテクチャ的にはクラスター内で動作するコントローラーで構成されています。
ソースコントローラー コントローラーをカスタマイズする HELMコントローラー 通知コントローラー 画像自動化コントローラー
次に、Flux と Helm の作業について説明しましょう。
Helm で Flux を使用するロジック Flux 2 の Helm パッケージ マネージャーを运用してアプリケーションをデプロイする例をさらに説明します。
なぜ? によると、HELM パッケージ マネージャーは最も人気のあるパッケージング アプリケーションであり、50% 以内のシェアを占めています。
残念ながら、これ以下の最新信息のデータは見つかりませんでしたが、それ今年以来、大きな変化はないと思います。
それでは、Flux 2 が Helm とどのように連携するかという基础ロジックを見ていきましょう。アプリケーションとインフラストラクチャの 2 つのリポジトリがあります。
アプリケーション リポジトリから HELM チャートと Docker イメージを制成し、それぞれ Helm チャート リポジトリと Docker レジストリに追加します。
次に、フラックス コントローラーを実行する Kubernetes クラスターがあります。
アプリケーションをロールアウトするには、カスタム リソース (CR) HelmRelease を記述する YAML を準備し、それをインフラストラクチャ リポジトリに追加します。
Flux がそれを拿到できるように、Kubernetes クラスターに CR GitRepository を做成します。ソース コントローラーはそれを認識し、git にアクセスしてダウンロードします。
この YAML をクラスターにデプロイするには、カスタマイズ リソースを記述します。
KusTOMize コントローラーはそれを認識し、ソース コントローラーに移動して YAML を争取し、クラスターにデプロイします。
Helm コントローラーは、CR HelmRelease がクラスターに出現したことを確認し、ソース コントローラーにアクセスして、記述されている HELM チャートを选取します。
ソース コントローラーが标准されたチャートを HELM コントローラーに展示 するには、CR クラスターに HelmRepository を做成する必要条件があります。
Helm-controller は Source-controller からチャートを完成し、リリースを做成してクラスターにデプロイします。次に、Kubernetes は相应なポッドを做成し、Docker レジストリに移動して、対応するイメージをダウンロードします。
したがって、アプリケーションの新しいバージョンをロールアウトするには、新しいイメージ、新しい HelmRelease ファイル、そして場合によっては新しい HELM チャートを弄成する相应があります。次に、それらを適切なリポジトリに硬件配置し、Flux コントローラーが上記のチェーンで作業を繰り返すのを待つ相应があります。
そして、作業を終了するために、問題が発生した可能会性があることを告诉する告诉コントローラーをどこかに配置单します。
カスタム Flux リソース 次に、Flux が動作するカスタム リソースについて説明します。
1 つ目は Git リポジトリです。ここでは、Git リポジトリのアドレス (14 行目) と、Git リポジトリが根据するブランチ (10 行目) を任意できます。
したがって、リポジトリ每名ではなく、単一のブランチのみをダウンロードします。しかし!私たちは責任あるエンジニアであり、ゼロ トラストの基本特征を自觉遵守しようとしているため、リポジトリへのアクセスをロックし、Kubernetes クラスター内にキーを运行してシークレットを制作し、それを Flux に渡してそこに移動できるようにします (12 行目)。
次にカスタマイズです。ここで要留意していただきたいのは、Flux の KusTOMize コントローラーと Kubernetes の小说作家の KusTOMize は 2 つの異なるものであるということです。なぜこのような杂乱を招くような名前が選ばれたのかはわかりませんが、混同しないことが比较重要です。
Kustomization は、YAML (同时) を Git リポジトリからクラスターにデプロイする方式方法です。ここでは、系统配置元のソース (行 12 - 所诉の CR GitRepository の名前)、YAML の要先拿到元ディレクトリ (行 8) を所选する必须があり、YAML を格納するターゲットの名前空間を所选できます。 (13行目)。
次は Helm のリリースです。
ここで、名前とチャートのバージョンを更改できます (10、11 行目)。ここでは変数値を更改して、Helm が環境ごとにリリースをカスタマイズできるようにします (15 ~ 19 行目)。環境が大きく異なる能够性があるため、これは比较に重要性かつ有必要な機能です。 Helm チャートを拿到するソースも更改します (12、13、14 行目)。この場合、それは Helm リポジトリです。
しかし!私たちは照样として責任あるエンジニアであるため、Helm リポジトリに緊密にアクセスし、そこに到達するための神秘现象を Flux に具备します (7、8 行目)。
GitOps のチェックリスト それでは、今確認した项目を理解するために、小さなチェックリストを制作してみましょう。 GitOps を開始するには、就许多のスクリプトを制作する一定があります (Immutable インフラストラクチャとは、几乎に自動化された配信パイプラインがすべてであることを覚えています)。したがって、まず初期に下例を制作する一定があります。
イメージをビルドして Docker レジストリにプッシュするスクリプト インフラストラクチャ Git リポジトリ インフラストラクチャ GIT リポジトリへの CI システム アクセスのアカウント HelmRelease ファイルを生成してプッシュするスクリプト Helm リポジトリ Helm リポジトリへの CI システム アクセスのアカウント Helm チャートを構築して公開するスクリプト` インフラストラクチャ リポジトリの Flux アカウント Helm チャート リポジトリの Flux アカウント
これで、GitOps のチェックリストが实现しました。進む。
単一の真実の情報源の概念の違反
Helm リリースで基本上的に何が得られるのかを見てみましょう。この指定のケースでは、Git が真正唯一的の真実の情報源ではないことは明らかです。この Helm リリースが依存する、少なくとも 2 つのリソースと git の外の 2 つのアーティファクトがあります。
ヘルム チャート (8 ~ 14 行目) Docker イメージ (19 行目)
さらに物事を複雑にして、Helm チャートのバージョンの範囲を肯定することもできます。
この場合、Flux はこの範囲内に提出される新しい Helm チャートを監視および設定します。さらに、当社のソース コントローラーは、S3 バンドルを含む YAML をソースとして用できます。
そこから、YAML チャートと Helm チャートの両方を保护できます。
さらに、Docker レジストリ内の新しいイメージを監視し、インフラストラクチャ リポジトリを編集できるイメージ オートメーション コントローラーもあります。
ただし、HELM Chart リポジトリ運用や Docker レジストリ運用は重要ありません。私たちは可以な限り GitOps になりたいと考えています。そこで、ドキュメントを依据して、GIT リポジトリから Helm チャートをデプロイするプロセスを步长します (保留するアプリケーション リポジトリを選択します)。
これにより、アプリケーション リポジトリ用に別の CR GitRepository、Flux がそれにアクセスするためのアカウントを弄成し、キーを适用してシークレットを弄成する必须があります。
同時に、Docker イメージへの複雑な依存関係の問題はまったく解決されていません。
小さな結論 现今はこれで很だと思います。後編では、この宽容さがどのような問題を抱えているのかをお伝えします。あとで議論します:
複数の環境の問題 からの値 秘密の問題 CI Ops と GitOps 安全 ロールバック手順 複数のクラスターの問題 GitOps を本当に必要としているのは誰でしょうか?
この記事がお役に立てば幸いです!