私たちは皆、ある種のパッケージマネージャーを使用しています。その中には、クリーニングレディのAunt Galyaも含まれています。 ただし、パッケージマネージャーの機能に関する一般的な合意はなく、標準のrpmおよびdpkg OSとビルドシステムはパッケージマネージャーと呼ばれます。 私たちは、彼らの機能のトピックについて考えることを提案します-それが何であり、なぜ現代世界で必要なのか。 そして、Kubernetesに向かって掘り下げ、これらの機能に関してHelmを慎重に検討します。

この図でテンプレート機能のみが緑色で強調表示されている理由と、アセンブリとパッケージング、環境の自動化などの問題を見てみましょう。 しかし、心配しないでください、記事はすべてが悪いという事実で終わるわけではありません。 コミュニティはこれに同意できず、代替ツールとソリューションを提供します-私たちはそれらに対処します。
Ivan Glushkov (
gli )は、この詳細なプレゼンテーションのビデオおよびテキスト版であるRIT ++に関する彼のレポートでこれを手伝ってくれました。
RIT ++でのこのビデオおよびその他のDevOpsスピーチのビデオは公開されており、 YouTubeチャンネルで無料で視聴できます。作業上の質問に対する回答を探してください。
スピーカーについて: Ivan Glushkovは15年間ソフトウェアを開発しています。 私はMZ、Echoでコメント用のプラットフォームで働いて、MCSTのElbrusプロセッサ用のコンパイラの開発に参加しました。 彼は現在、Postmatesのインフラストラクチャプロジェクトに関与しています。 Ivanは主要な
DevZenポッドキャストの1つであり、会議について説明しています。
ここではRIT ++について、
ここではHighLoad ++について説明します。
パッケージマネージャー
誰もが何らかのパッケージマネージャーを使用していますが、それが何であるかについての単一の合意はありません。 共通の理解があり、それぞれに独自の理解があります。
どのタイプのパッケージマネージャーが最初に思い浮かぶのか思い出してみましょう。
- すべてのオペレーティングシステムの標準パッケージマネージャー: rpm、dpkg、portageなど
- さまざまなプログラミング言語のパッケージマネージャー: cargo、cabal、rebar3、mix 、...
主な機能は、パッケージのインストール、パッケージの更新、パッケージのアンインストール、および依存関係の管理のためのコマンドを実行することです。 プログラミング言語内のパッケージマネージャーでは、事態はもう少し複雑です。 たとえば、「パッケージの起動」や「リリースの作成」(ビルド/実行/リリース)などのコマンドがあります。 これは既にビルドシステムですが、パッケージマネージャーとも呼ばれています。

これはすべて、あなたがそれをただ取ることができないという事実によるだけです...そして、Haskell愛好家にこの比較を許させてください。 バイナリファイルは実行できますが、HaskellまたはCでプログラムを実行することはできません。最初に何らかの方法で準備する必要があります。 そして、この準備はかなり複雑であり、ユーザーはすべてが自動的に行われることを望んでいます。
開発
多数のコンポーネントで構成される大規模プロジェクト用に作成されたGNU libtoolを使用した人は、サーカスを笑わない。 それは本当に非常に難しく、いくつかのケースは原則的に解決できず、回避することしかできません。
それに比べて、Rustの貨物のような最新のパッケージ言語マネージャーははるかに便利です。ボタンを押すだけですべてが機能します。 実際には、内部では多くの問題が解決されています。 さらに、これらのすべての新しい機能には、特にデータベースなどの追加機能が必要です。 パッケージマネージャー自体では任意の名前を付けることができますが、データベースと呼んでいます。 データはそこに保存されます:インストールされたパッケージ、それらのバージョン、接続されたリポジトリ、これらのリポジトリのバージョンについて。 これらはすべてどこかに保存する必要があるため、内部データベースがあります。
このプログラミング言語での開発、このプログラミング言語のテスト、開始-すべてが組み込まれ、内部にあるため、
作業は非常に便利になります 。 ほとんどの現代言語はこのアプローチをサポートしています。 支持しなかった人でさえ、支持を始めます。なぜなら、コミュニティは、現代世界ではそれなしでは不可能だと主張しているからです。
しかし、どのソリューションにも常に利点があるだけでなく、欠点もあります。 ここでの欠点は、ラッパー、追加のユーティリティ、および組み込みの「データベース」が必要なことです。
Docker
Dockerはパッケージマネージャーであると思いますか?
どんな方法でも、基本的にははい。 アプリケーションをすべての依存関係と完全に組み合わせて、ボタンをクリックするだけで機能させるための、より正確なユーティリティは知りません。 パッケージマネージャーでない場合、これは何ですか? これは素晴らしいパッケージマネージャーです!
マキシム・ラプシンは、すでにDockerを使用することではるかに簡単になった
と述べています。 Dockerには、組み込みのビルドシステム、これらすべてのデータベース、バインディング、ユーティリティがあります。
すべての特典の価格はいくらですか? Dockerを使用する人は、産業用アプリケーションについてほとんど考えません。 私はそのような経験があり、実際に価格は非常に高いです:
- Dockerイメージに保存する必要がある情報の量 (イメージサイズ)。 すべての依存関係、ユーティリティの一部、ライブラリを内部にパックする必要があります。イメージは大きく、それを操作できる必要があります。
- パラダイムシフトが行われていることは、はるかに複雑です。
たとえば、1つのプログラムを転送してDockerを使用するタスクがありました。 プログラムはチームによって長年にわたって開発されました。 私は来ます、私たちは本に書かれているすべてをします:私たちはユーザーの物語、役割を描き、彼らが何をどのように行うか、彼らの標準的なルーチンを描きます。
私は言う:
-Dockerはすべての問題を解決できます。 これがどのように行われるかを見てください。
-すべてがボタンに表示されます-すばらしい! しかし、Kubernetesコンテナ内でSSHを実行したいと考えています。
-待て、SSHはどこにもありません。
-はい、はい、すべてがうまくいきます...しかし、SSHは可能ですか?
ユーザーの認識を新しい方向に変えるには、多くの時間がかかり、教育作業と多大な努力が必要です。
もう1つの価格要因は、
Dockerレジストリがイメージの外部リポジトリであり、何らかの方法でインストールおよび制御する必要があることです。 独自の問題、ガベージコレクターなどがあり、これに従わない場合はしばしば落ちますが、これはすべて解決されます。
クベルネテス
やっとKubernetesに着きました。 これは、コミュニティによって積極的にサポートされているクールなオープンソースのアプリケーション管理システムです。 元々は1つの会社を辞めていましたが、Kubernetesには巨大なコミュニティがあり、それに追いつくことは不可能であり、実質的に代替手段はありません。
興味深いことに、すべてのKubernetesノードはコンテナを介してKubernetes自体で動作し、すべての外部アプリケーションはコンテナ
を介して動作します。すべてがコンテナを介して動作します 。 これはプラスとマイナスの両方です。
Kubernetesには、分散性、フォールトトレランス、さまざまなクラウドサービスと連携する機能、マイクロサービスアーキテクチャに焦点を当てた機能など、多くの便利な機能とプロパティがあります。 これらはすべて面白くてクールですが、Kubernetesにアプリケーションをインストールする方法は?
アプリケーションのインストール方法は?
Docker-registryにDockerイメージをインストールします。
このフレーズの背後には深aがあります。 想像してください。たとえば、Rubyで記述されたアプリケーションがあり、DockerレジストリにDockerイメージを配置する必要があります。 つまり、次のことを行う必要があります。
- Dockerイメージを準備する
- それがどのバージョンに基づいているのかを理解します;
- それをテストすることができます;
- 収集し、以前にインストールしたDocker-registryに入力します。
実際、これは1行で大きな、大きな痛みです。
さらに、アプリケーションマニフェストをk8の用語(リソース)で記述する必要があります。 最も簡単なオプション:
- 展開+ポッド、サービス+イングレス(おそらく)を説明します。
- kubectl apply -f resources.yamlコマンドを実行し、すべてのリソースをこのコマンドに転送します。

ガンジーはスライドを手でこすります-Kubernetesでパッケージマネージャーを見つけたようです。 ただし、kubectlはパッケージマネージャーではありません。 彼は、私がこのようなシステムの最終状態を見たいと言っているだけです。 これはパッケージをインストールしたり、依存関係を処理したり、ビルドしたりするのではなく、単に「この最終状態を見たい」だけです。
ヘルム
ついにヘルムに来ました。 Helmは多目的ユーティリティです。 ここで、Helmの開発のどの領域を検討し、Helmと協力します。
テンプレートエンジン
まず、Helmはテンプレートエンジンです。 どのリソースを準備する必要があるかを話し合いましたが、問題はKubernetesの観点から(そしてyamlだけでなく)書くことです。 最も興味深いのは、これらがこの特定の環境における特定のアプリケーションの静的ファイルであることです。
ただし、複数の環境で作業し、本番環境だけでなく、ステージング、テスト、開発、および異なるチームの異なる環境がある場合、いくつかの同様のマニフェストが必要です。 たとえば、それらの1つには複数のサーバーがあり、多数のレプリカが必要であり、もう1つには1つのレプリカしか必要ないためです。 データベースがなく、RDSにアクセスできないため、内部にPostgreSQLをインストールする必要があります。 そして、ここには古いバージョンがあり、すべてを少し書き直す必要があります。
このすべての多様性は、Kubernetesのマニフェストを取得し、どこでもコピーして、すべての場所で修正する必要があるという事実につながります。ここで1桁を置き換えてください。 これは非常に不快になりつつあります。
解決策は簡単です。
テンプレートを入力する必要があります。 つまり、マニフェストを作成し、その中に変数を定義してから、外部で定義された変数をファイルとして送信します。 テンプレートは最終的なマニフェストを作成します。 すべての環境で同じマニフェストを再利用することが判明したため、はるかに便利です。
たとえば、ヘルムのマニフェスト。

- Helmの最も重要な部分はChart.yamlです 。これは、それがどのようなマニフェストであるか、どのバージョン、どのように機能するかを記述しています。
- テンプレートは、Kubernetesリソーステンプレートであり、その中にある種の変数が含まれています。 これらの変数は、外部ファイルまたはコマンドラインで定義する必要がありますが、常に外部で定義する必要があります。
- values.yamlは、これらのテンプレートの変数を含むファイルの標準名です。
chartをインストールするための最も単純な起動コマンドは、helm install ./wordpress(フォルダー)です。 一部のパラメーターを再定義するには、「これらのパラメーターを正確に再定義し、そのような値を設定したい」と言います。
Helmはこのタスクに対応しているため、図では緑色でマークしています。

確かに、短所が表示されます:
- 冗長性 。 リソースはKubernetesの観点から完全に定義されており、追加の抽象化レベルの概念は導入されていません。Kubernetesに書きたいものをすべて書き、そこで変数を置き換えます。
- 繰り返してはいけません-適用されません。 多くの場合、同じことを繰り返す必要があります。 異なる名前の2つの類似したサービスがある場合、フォルダー全体を完全にコピーし(ほとんどの場合これを行う)、必要なファイルを変更する必要があります。
これをすべて説明するパッケージマネージャーであるHelmの方向に突入する前に、Helmが依存関係でどのように機能するかを見てみましょう。
依存関係を扱う
Helmは依存関係を扱うのが困難です。 まず、依存するものに適合するrequirements.yamlファイルがあります。 要件を処理しながら、彼はrequirements.lockを実行します。これは、すべての依存関係の現在の状態(ナゲット)です。 その後、彼はそれらを/ chartsというフォルダーにダウンロードします。
管理するツールがあります:誰が、どのように、どこに接続するか-
タグと条件 、どの外部パラメータに応じて、どの環境で、どの依存関係に接続するか、接続しないかを決定します。
ステージング環境用のPostgreSQL(または本番用のRDS、テスト用のNoSQL)があるとします。 このパッケージを本番環境にインストールすると、PostgreSQLはインストールされません。タグと条件を使用するだけで、PostgreSQLはそこに必要ないからです。
ここで面白いのは何ですか?
- Helmは、すべての依存関係とアプリケーションのすべてのリソースを混合します。
- ソート->インストール/更新
/チャート内のすべての依存関係(これらの依存関係は、たとえば100)をダウンロードした後、Helmは内部のすべてのリソースを取得してコピーします。 テンプレートをレンダリングした後、彼はすべてのリソースを1か所に集め、自分の順序で並べ替えます。 この順序に影響を与えることはできません。 パッケージが何に依存しているかを自分で判断する必要があります。パッケージに推移的な依存関係がある場合は、requirements.yamlの説明にそれらすべてを含める必要があります。 これに留意する必要があります。
パッケージマネージャー
Helmはアプリケーションと依存関係をインストールし、Helmのインストールを指示できます-そして、パッケージをインストールします。 これがパッケージマネージャーです。
同時に、パッケージをアップロードする外部リポジトリがある場合は、ローカルフォルダーとしてではなく、「このリポジトリからこのパッケージを取得し、そのようなパラメーターでインストールします」と言うだけでアクセスできます。
多くのパッケージを備えたオープンなリポジトリがあります。 たとえば、次のコマンドを実行できます。helm install -f prod / values.yaml stable / wordpress
安定したリポジトリからwordpressを取得し、自分でインストールします。 検索/アップグレード/削除のすべてを実行できます。 実際、Helmはパッケージマネージャーです。
ただし、短所もあります。すべての
推移的な依存関係を内部に含める必要があります。 これは、推移的な依存関係が独立したアプリケーションであり、テストと開発のためにそれらを個別に操作したい場合に大きな問題です。
もう1つのマイナス点は、
エンドツーエンド構成です。 データベースがあり、その名前をすべてのパッケージに転送する必要がある場合、これは可能ですが、実行するのは困難です。

多くの場合、1つの小さなパケットをインストールすると動作します。 世界は複雑です。アプリケーションはアプリケーションに依存し、アプリケーションもアプリケーションに依存します。それらを何らかの形で巧みに構成する必要があります。 Helmはこれをサポートする方法を知らないか、大きな問題を抱えてサポートしています。また、動作させるためにタンバリンでたくさん踊らなければならない場合もあります。 これは悪いので、図の「パッケージマネージャー」は赤で強調表示されます。

組み立てと包装
Kubernetesでアプリケーションを取得して実行することはできません。 それをアセンブルする必要があります。つまり、Dockerイメージを作成し、Dockerレジストリに書き込むなどです。 Helmのパッケージの定義全体はそうですが。 パッケージが何であるか、どの機能とフィールドがそこにあるべきか、署名と認証を決定します(会社のセキュリティシステムは非常に満足しています)。 そのため、一方ではビルドとパッケージングがサポートされているように見えますが、他方ではDockerイメージの処理は構成されていません。
Helmでは、Dockerイメージなしでアプリケーションを実行することはできません。 同時に、Helmはアセンブリおよびパッケージング用に構成されていません。つまり、実際には、Dockerイメージを操作する方法がわかりません。
これは、小さなライブラリのアップグレードインストールを行うために、コンパイラを実行するために離れたフォルダに送信される場合と同じです。
したがって、Helmは画像の操作方法を知らないと言います。

開発
次の頭痛は開発です。 開発では、コードを迅速かつ便利に変更したいと考えています。 パンチカードに穴を開けた時が過ぎ、5日後に結果が得られました。 編集者がエディターで1つの文字を別の文字に置き換えることに慣れているので、コンパイルを押すと、既に変更されたプログラムが機能します。
ここで、コードを変更する場合、追加のアクションが多く必要であることがわかります。Dockerファイルを準備します。 Dockerを実行して、イメージを構築します。 どこかにプッシュする。 Kubernetesクラスターにデプロイします。 そして、あなたがプロダクションで欲しいものを手に入れて、コードをチェックすることができます。
破壊的な更新ヘルムのアップグレードによる不便さが依然としてあります。 kubectl execを使用して、すべてがどのように機能するかを確認し、コンテナ内を確認しました。すべてが正常です。 この時点で、更新を開始し、新しいイメージをダウンロードし、新しいリソースを起動し、古いリソースを削除します。最初からすべてを開始する必要があります。
最大の痛みは
大きな画像です。 ほとんどの企業は小さなアプリケーションでは動作しません。 多くの場合、スーパーモノリスでなければ、少なくとも小さなモノリスです。 時間が経つにつれて、年輪が成長し、コードベースが増加し、徐々にアプリケーションが非常に大きくなります。 2 GBを超えるDockerイメージに繰り返し遭遇しました。 プログラムの1バイトを変更し、ボタンを押すと、2ギガバイトのDockerイメージがアセンブルされ始めたと想像してください。 次に、次のボタンを押すと、サーバーへの2 GBの転送が開始されます。
Dockerでは、レイヤーを操作できます。 ある層があるかどうかを確認し、不足している層を送信します。 しかし、世界は非常に多くの場合、1つの大きなレイヤーになります。 2 GBがサーバーに移動し、DockerレジストリでKubernetesに移動しますが、最終的に起動するまですべての方法で展開されます-安全にお茶を飲むことができます。
Helmは、大きなDockerイメージに関するヘルプを提供しません。 私はこれをすべきではないと信じていますが、Helm開発者はすべてのユーザーよりもよく知っているので、Steve Jobsはそれに笑います。

開発ブロックも赤になりました。

環境自動化
最後の方向-環境の自動化-は興味深い分野です。 Docker(および関連モデルとしてのKubernetes)の世界以前には、「このサーバーまたはこれらのサーバーにアプリケーションをインストールして、レプリカがn個、依存関係が50個あり、すべて自動的に機能したい!」と言う方法はありませんでした。それはそうでしたが、そうではありませんでした!
Kubernetesはこれを提供します。たとえば、「ここに新しい環境を展開しています。アプリケーションを準備したすべての開発チームがボタンをクリックするだけで、これらすべてのアプリケーションが新しい環境に自動的にインストールされます」 。 理論的には、Helmがこれを支援し、外部データソース(S3、GitHub)からどこからでも構成を取得できるようにする必要があります。
Helmには特別なボタン「Do me good on already finally!」があり、すぐに良くなることが望ましいです。 Kubernetesではこれを行うことができます。
Kubernetesはどこでも実行でき、APIを介して機能するため、これは特に便利です。 AWSまたはGoogle Cloud Engineでminikubeをローカルで起動すると、すぐにKubernetesを取得でき、どこでも同じように機能します。ボタンを押すだけで、すべてがすぐに正常に動作します。
当然、Helmを使用するとこれが可能になります。 そうでなければ、ヘルムを一般的に作成することのポイントは何でしたか?
しかし、結果は違います。

環境の自動化はありません。
代替案
誰もが使用するKubernetesからのアプリケーション(実際にはソリューション番号1)が存在するが、Helmに上記の問題がある場合、コミュニティは対応せざるを得ませんでした。 代替ツールとソリューションを作成し始めました。
テンプレートエンジン
テンプレートエンジンとして、Helmはすべての問題を解決したように見えますが、それでもコミュニティは代替案を作成します。 テンプレートエンジンの問題、つまり冗長性とコードの再利用を思い出させてください。
ここの代表者は
Ksonnetです。 データと概念の根本的に異なるモデルを使用し、Kubernetesリソースでは機能せず、独自の定義で機能します。
プロトタイプ(パラメーター)->コンポーネント->アプリケーション->環境。
プロトタイプを構成する部品があります。 プロトタイプは外部データによってパラメーター化され、コンポーネントが表示されます。 いくつかのコンポーネントは、実行可能なアプリケーションを構成します。 さまざまな環境で実行されます。 ここにはKubernetesリソースへの明確なリンクがいくつかありますが、直接の類推はないかもしれません。
Ksonnetの主な目標は、もちろん、
リソースを
再利用することでした。 彼らは、コードを書いたら、後でどこでもそれを使用できるようにしたかったので、開発の速度が上がりました。 大規模な外部ライブラリを作成すると、人々はそこにリソースを常に投稿でき、コミュニティ全体がそれらを再利用できます。
理論的には、これは便利です。 私は実際には使用しませんでした。
パッケージマネージャー
ここでの問題は、思い出すように、ネストされた依存関係、エンドツーエンドの構成、推移的な依存関係です。 Ksonnetはそれらを解決しません。 KsonnetにはHelmと非常によく似たモデルがあり、同じ方法でファイル内の依存関係のリストを定義したり、特定のディレクトリにアップロードしたりします。 違いは、パッチを作成できることです。つまり、特定のパッケージのパッチを入れるフォルダーを準備しているということです。

フォルダをアップロードすると、これらのパッチがスーパーインポーズされ、複数のパッチをマージした結果を使用できます。 さらに、依存関係の構成の検証があります。 それは便利かもしれませんが、それはまだ非常に粗雑で、ほとんどドキュメントがなく、バージョンは0.1でフリーズしました。 使用するには早すぎると思います。

そのため、パッケージマネージャーは
KubePackであり、他の選択肢はまだありません。
開発
ソリューションはいくつかの異なるカテゴリに分類されます。
- ヘルムの上で作業しようとしています。
- ヘルムの代わり。
- 根本的に異なるアプローチを使用して、プログラミング言語で直接作業しようとします。
- その他のバリエーションについては後で。
1.ヘルム上での開発
優れた代表者は
Draftです。 その目的は、コードがコミットされる前にアプリケーションを試す機能、つまり現在の状態を確認する機能です。 ドラフトはプログラミング手法を使用します-Herokuスタイル:
- 言語用のパッケージ(パック)があります。
- Pythonで「Hello、world!」と書いてください。
- ボタンを押すと、Dockerファイルが自動的に作成されます(作成しません)。
- リソースが自動的に作成され、すべてが開始され、設定する必要があったdocker-registryに移動します。
- アプリケーションは自動的に動作を開始します。
これは、コードを使用して任意のディレクトリで実行でき、すべてが高速で簡単で優れているようです。
しかし、DraftはHelmリソースを作成するため、とにかくHelmで作業を開始することをお勧めします。コードが生産準備完了状態に達すると、DraftがHelmリソースをうまく作成することを期待しないでください。 手動で作成する必要があります。
少なくとも1つのHelmリソースを作成する前に、すぐに開始して最初から試すにはドラフトが必要であることがわかります。 ドラフトは、この方向の最初の候補です。
2.ヘルムなしの開発
Helm Chartsを使用しない開発では、Helm Chartsを使用して作成するのと同じKubernetesマニフェストを作成する必要があります。 私は3つの選択肢を提供します:
それらはすべてHelmに非常によく似ており、違いは細部にあります。 特に、ソリューションの一部は、コマンドラインインターフェイスを使用することを想定しており、Chartはgit pushを実行してフックを管理することを想定しています。
最終的には、ドッカービルド、ドッカープッシュ、およびkubectlロールアウトを実行します。 Helmについて記載したすべての問題を解決することはできません。 これは、同じ欠点を持つ単純な代替手段です。
3.アプリケーション言語での開発
次の選択肢は、アプリケーション言語の開発です。 ここでの良い例は
Metaparticleです。 Pythonでコードを記述し、Pythonの内部でアプリケーションに何が欲しいか考え始めたとします。
多くの場合、開発者はアプリケーションがサーバー上でどのように動作するか、sysconfigの適切な構成などについて考えたくないため、これは非常に興味深い概念だと考えています。 彼は動作するアプリケーションが必要です。
動作中のアプリケーション、その構成要素、それらがどのように相互作用するかを正確に説明すると、理論的には、アプリケーションの観点からこの知識をKubernetesリソースに変えるのに役立つ魔法があります。
デコレータを使用して、以下を決定します。リポジトリはどこにあるのか、正しくプッシュする方法。 サービスとは何か、そしてそれらが互いにどのように相互作用するか。 クラスター上に非常に多くのレプリカがあるはずです。

私はあなたのことは知りませんが、Pythonの定義からKubernetesの設定を作成する必要があると私に代わって何らかの魔法が決定した場合、個人的には好きではありません。 そして、他に何か必要な場合は?
アプリケーションがかなり標準的なものである限り、これはすべてある程度機能します。 その後、問題が始まります。 メインコンテナが起動する前にプレインストールコンテナを起動するとします。これにより、将来のコンテナを設定するためのアクションが実行されます。 これはすべてKubernetesの構成内で行われますが、これがMetaparticleのフレームワーク内で行われるかどうかはわかりません。
簡単な簡単な例を挙げますが、さらに多くの例があります。Kubernetes構成仕様には多くのパラメーターがあります。 Metaparticleのようなデコレータには完全に存在しないと確信しています。

図にメタ粒子が表示され、3つの代替Helmアプローチについて説明しました。 しかし、追加のものがあり、私の意見では非常に有望です。
Telepresence / Ksyncはその1つです。 すでに作成されたアプリケーションがあるとします。また、Helmリソースが記述されています。 アプリケーションをインストールし、クラスター内のどこかで開始しました。この時点で、たとえばコードの1行を変更するなど、何かを試してみたいと思います。 もちろん、プロダクションクラスターについては話していませんが、プロダクションで何かを支配している人もいます。
Kubernetesの問題は、これらのローカル編集をDocker更新を通じて、レジストリを通じてKubernetesに転送する必要があることです。 ただし、1つの変更された行を他の方法でクラスターに伝えることができます。 以下にあるローカルフォルダーとリモートフォルダーを同期できます。
はい、もちろん、同時に、イメージにはコンパイラーが必要です。開発に必要なものはすべてそこにあるべきです。 しかし、なんと便利なのでしょうか:アプリケーションをインストールし、複数の行を変更し、同期が自動的に動作し、更新されたコードが囲炉裏で実行され、コンパイルとテストを実行します-破損、更新、破壊的な更新は発生しません。アプリケーション。
私の意見では、これは問題の素晴らしい解決策です。
4. Kubernetesを使用しないKubernetesの開発
以前は、KubernetesなしでKubernetesを操作しても意味がないように思えました。 Helmの定義を一度正しく作成し、適切なツールを使用して、ローカル開発ですべての設定を共通化する方が良いと思いました。 しかし、時間が経つにつれて、私は現実に出くわし、非常に難しいアプリケーションを見てきました。 これで、Docker構成ファイルを作成する方が簡単だという結論に達しました。
Docker-composeファイルを作成するときは、すべて同じイメージを起動し、前の場合と同様に、Dockerコンテナ内のフォルダー上のローカルフォルダーをマウントします。Kubernetes内ではなく、単にDocker-compose内にローカルで起動します。 。 その後、コンパイラを実行するだけで、すべてが正常に機能します。 欠点は、Dockerの追加の構成が必要なことです。 プラスは、速度とシンプルさです。
私の例では、Docker-composeで実行しようとしたのと同じことをminikubeで実行しようとしましたが、その差は非常に大きかったです。 それはうまく機能せず、理解できない問題があり、Docker-composeがありました-10行で発生し、すべてが機能します。 同じ画像を使用しているため、これにより再現性が確保されます。

Docker-composeがスキームに追加され、一般に、これらすべてのソリューションを合わせたコミュニティが開発の問題を解決したことがわかりました。
組み立てと包装
はい、アセンブリとパッケージングはHelmの問題ですが、おそらくHelm開発者は正しかったでしょう。 各企業には独自のCI / CDシステムがあり、アーティファクトを収集し、検証し、テストします。 すでに存在している場合-誰もが自分で持っているのに、なぜヘルムでこの問題を解決するのですか? おそらく、1つの正しいソリューションは機能せず、それぞれに修正が加えられます。
CI / CDがある場合、外部リポジトリとの統合があり、各コミットに対してドッカーが自動的に収集され、テストの設定が実行されます。ボタンをクリックしてすべてを展開すると、問題は解決しました。
CI / CDはビルドとパッケージングの問題に対する実際の解決策であり、私たちはそれを緑色に塗っています。
まとめ

5つの方向のうち、Helm自体はテンプレートエンジンのみを閉じます。 作成された理由はすぐに明らかになります。 コミュニティは残りのソリューションを共同で追加し、開発、アセンブリ、パッケージングの問題は外部ソリューションによって完全に解決されました。 これは完全に便利なわけではありません。社内で確立された伝統の枠組みの中で行うのは必ずしも簡単ではありませんが、少なくともそれは可能です。
フューチャーヘルム
私は誰もヘルムが何に来るべきかを確実に知らないのではないかと心配しています。 , Helm , . , , , Helm.
, Road Map.
Kuberneres Helm community , ,
Helm V3 .
Tiller, cli
, . Helm :
- , (cmd ..).
- Tiller — , Kubernetes.
Tiller , Command Line Interface. : « Chart» — Helm , , Tiller', : «, - ! , Kubernetes-» — .
Helm, Tiller , . , , , , Tiller' — namespace . Tiller namespace, , . , .
V3 Tiller .

? , , Command Line Interface, , Kubernetes. , Kubernetes , Tiller. kubectl cli .
Tiller
. , Kubernetes Command Line Interface : , , , pre- post-. .
Lua- Chart
, — ,
lua- . Chart lua-, . . , . , , , .

Lua , , , - , , .
, , . , . Kubernetes, - , , , , . , .
Release- + secret
, ,
Release- , Release . , Release-, , , CRD, , .
namespace
Release- namespace, , -
Tiller' namespace — , .
CRD: controller
, CRD-controller Helm , push-. .
, .

,
Helm . , , , . , , . Helm — - Kubernetes. - , , .
,
CI/CD , .
Slack , , , master , . : « Staging» — , : « !» — . かなり快適です。
Docker-compose Telepresence.

, A B, C, C . :
, Kubernetes — .

4 Chart' Helm, 3 ( C ). , v1 v2 , . , C; , v1 A; . , -. , .
— , .

, A. , Helm- , A, . B — , .
, , . , .
便利なリンク
•
Draft•
GitKube•
Helm•
Ksonnet• Telegram stickers:
,
•
Sig-Apps•
KubePack•
Metaparticle•
Skaffold•
Helm v3•
Docker-compose•
Ksync•
Telepresence•
Drone•
ForgeGitHub ,
twitter ,
.
素晴らしいニュース
当社のユーチューブチャンネル、我々はRIT ++祭りですべてのレポートのDevOpsチームのビデオを発見しました。これは別のプレイリストですが、ビデオの完全なリストには他の会議からの多くの有用なものがあります。
いっそのこと、フィードを購読するとニュースレター来年には、ので、私たちはたくさんのdevopsaを待っている:月に、RIT ++内。HighLoad ++のセクションとしての春、夏、秋、および独立した秋のDevOpsConf Russia。