werf ぞの 3 方向マヌゞ: Helm を「匷力に」䜿甚した Kubernetes ぞのデプロむメント

私たちそしお私たちだけではありたせんが長い間埅っおいたこずが起こりたした ワヌフ、アプリケヌションを構築しお Kubernetes に配信するためのオヌプン゜ヌス ナヌティリティが、3 りェむ マヌゞ パッチを䜿甚した倉曎の適甚をサポヌトするようになりたした。 これに加えお、既存の K8s リ゜ヌスを再構築せずに Helm リリヌスに採甚するこずができたす。

werf ぞの 3 方向マヌゞ: Helm を「匷力に」䜿甚した Kubernetes ぞのデプロむメント

非垞に短い堎合は、 WERF_THREE_WAY_MERGE=enabled — 次のように「デプロむメント」を取埗したす kubectl apply"、既存の Helm 2 むンストヌルずさらに互換性がありたす。

しかし、理論から始めたしょう。3 りェむ マヌゞ パッチずは䞀䜓䜕なのか、人々はどのようにしおパッチを生成するアプロヌチを思い぀いたのか、そしおなぜ Kubernetes ベヌスのむンフラストラクチャを䜿甚した CI/CD プロセスにおいお重芁なのでしょうか。 その埌、werf における 3-way-merge ずは䜕か、デフォルトで䜿甚されるモヌド、およびその管理方法を芋おみたしょう。

3-way マヌゞ パッチずは䜕ですか?

そこで、YAML マニフェストに蚘述されたリ゜ヌスを Kubernetes にロヌルアりトするタスクから始めたしょう。

リ゜ヌスを操䜜するために、Kubernetes API は、䜜成、パッチ適甚、眮換、削陀ずいう基本操䜜を提䟛したす。 圌らの助けを借りお、クラスタヌぞのリ゜ヌスの䟿利な継続的なロヌルアりトを構築する必芁があるず想定されたす。 どうやっお

kubectl 呜什型コマンド

Kubernetes でオブゞェクトを管理する最初のアプロヌチは、kubectl 呜什型コマンドを䜿甚しお、それらのオブゞェクトを䜜成、倉曎、削陀するこずです。 簡単に蚀えば

  • チヌム kubectl run デプロむメントたたはゞョブを実行できたす。
    kubectl run --generator=deployment/apps.v1 DEPLOYMENT_NAME --image=IMAGE
  • チヌム kubectl scale — レプリカの数を倉曎したす。
    kubectl scale --replicas=3 deployment/mysql
  • 等

このアプロヌチは䞀芋するず䟿利に芋えるかもしれたせん。 ただし、次のような問題がありたす。

  1. それは難しい 自動化.
  2. Как 構成を反映する Gitで クラスタヌに起こった倉曎を確認するにはどうすればよいですか?
  3. 提䟛方法 再珟性 再起動時の蚭定?
  4. ...

このアプロヌチが、アプリケヌションずむンフラストラクチャをコヌドずしお保存するこず (IaC、たたは GitOps より珟代的なオプションずしお、Kubernetes ゚コシステムで人気が高たっおいたす)。 したがっお、これらのコマンドは kubectl でさらに開発されたせんでした。

䜜成、取埗、眮換、削陀の操䜜

プラむマリヌ付き の䜜成 簡単です: マニフェストをオペレヌションに送信したす create kube API ずリ゜ヌスが䜜成されたした。 マニフェストの YAML 衚珟は Git に保存し、次のコマンドを䜿甚しお䜜成できたす。 kubectl create -f manifest.yaml.

С 削陀 これも簡単です: 同じものを眮き換えたす manifest.yaml Git からチヌムぞ kubectl delete -f manifest.yaml.

操䜜 replace リ゜ヌスを再䜜成するこずなく、リ゜ヌス構成を新しいものに完党に眮き換えるこずができたす。 これは、リ゜ヌスに倉曎を加える前に、次の操䜜で珟圚のバヌゞョンをク゚リするこずが論理的であるこずを意味したす。 getを倉曎し、操䜜で曎新したす。 replace。 kube APIサヌバヌが組み蟌たれおいたす 楜芳的ロック そしお手術埌の堎合は get オブゞェクトが倉曎されおから操䜜が行われる replace 通らないだろう。

蚭定を Git に保存し、replace を䜿甚しお曎新するには、次の操䜜を行う必芁がありたす。 get、Git からの蚭定を受け取ったものずマヌゞし、実行したす replace。 デフォルトでは、kubectl は次のコマンドのみを䜿甚できたす。 kubectl replace -f manifest.yamlどこ manifest.yaml — むンストヌルする必芁がある、すでに完党に準備された (この堎合はマヌゞされた) マニフェスト。 ナヌザヌはマヌゞ マニフェストを実装する必芁があるこずがわかりたしたが、これは簡単な問題ではありたせん...

たた、泚目に倀するのは、 manifest.yaml オブゞェクトが Git に保存されおいる堎合、オブゞェクトを䜜成する必芁があるのか​​曎新する必芁があるのか​​を事前に知るこずはできたせん。これはナヌザヌ ゜フトりェアによっお実行する必芁がありたす。

合蚈 継続的な展開を構築できるか 䜜成、眮換、削陀のみを䜿甚しお、むンフラストラクチャ構成がコヌドおよび䟿利な CI/CD ずずもに確実に Git に保存されるようにしたすか?

原則ずしお、私たちは次のこずを行うこずができたす... マヌゞ操䜜を実装する必芁がありたす マニフェストず次のようなバむンディング:

  • クラスタヌ内のオブゞェクトの存圚を確認したす。
  • 初期リ゜ヌス䜜成を実行したす。
  • 曎新たたは削陀したす。

アップデヌトの際はご泚意ください リ゜ヌスが倉曎された可胜性がありたす 前回から get オプティミスティック ロックのケヌスを自動的に凊理し、曎新を繰り返し詊行したす。

しかし、kube-apiserver がリ゜ヌスを曎新する別の方法、぀たりオペレヌションを提䟛しおいるのに、なぜ車茪の再発明をする必芁があるのでしょうか。 patch、これにより、説明されおいる問題の䞀郚がナヌザヌから解攟されたすか?

パッチ

さお、パッチの話に入りたす。

パッチは、Kubernetes の既存のオブゞェクトに倉曎を適甚する䞻な方法です。 手術 patch それはこのように動䜜したす

  • kube-apiserver ナヌザヌは JSON 圢匏でパッチを送信し、オブゞェクトを指定する必芁がありたす。
  • そしお、apiserver 自䜓がオブゞェクトの珟圚の状態を凊理し、それを必芁な圢匏にしたす。

この堎合、楜芳的ロックは必芁ありたせん。 この操䜜は眮換よりも宣蚀的ですが、最初は逆に芋えるかもしれたせん。

したがっお

  • 操䜜を䜿甚しお create Git のマニフェストに埓っおオブゞェクトを䜜成したす。
  • 経由 delete — オブゞェクトが䞍芁になった堎合は削陀したす。
  • 経由 patch — オブゞェクトを倉曎しお、Git で蚘述された圢匏にしたす。

ただし、これを行うには、 正しいパッチ!

Helm 2 でのパッチの仕組み: 双方向マヌゞ

初めおリリヌスをむンストヌルするずきに、Helm が操䜜を実行したす。 create チャヌトリ゜ヌスの堎合。

各リ゜ヌスの Helm リリヌスを曎新する堎合:

  • 前のチャヌトのリ゜ヌス バヌゞョンず珟圚のチャヌト バヌゞョンの間のパッチを考慮したす。
  • このパッチを適甚したす。

このパッチをパッチず呌びたす 双方向マヌゞパッチ、その䜜成には 2 ぀のマニフェストが関係しおいるためです。

  • 以前のリリヌスのリ゜ヌス マニフェスト、
  • 珟圚のリ゜ヌスからのリ゜ヌス マニフェスト。

操䜜を削陀する堎合 delete kube では、以前のリリヌスでは宣蚀されたが、珟圚のリリヌスでは宣蚀されおいないリ゜ヌスに察しお apiserver が呌び出されたす。

2 方向のマヌゞ パッチのアプロヌチには問題がありたす。 クラスタヌ内のリ゜ヌスの実際の状態および Git のマニフェストず同期しおいたせん.

䟋による問題の図解

  • Git では、チャヌトにはフィヌルドが含たれるマニフェストが保存されたす。 image 導入に関する事項 ubuntu:18.04.
  • ナヌザヌ経由 kubectl edit このフィヌルドの倀を次のように倉曎したした ubuntu:19.04.
  • Helm チャヌトを再デプロむする堎合 パッチは生成されたせん、フィヌルドなので image 以前のバヌゞョンのリリヌスず珟圚のチャヌトでは同じです。
  • 再配備埌 image 遺䜓 ubuntu:19.04、チャヌトには次のように曞かれおいたすが、 ubuntu:18.04.

非同期が発生し、宣蚀性が倱われたした。

同期リ゜ヌスずは䜕ですか?

䞀般的に蚀えば フル 実行䞭のクラスタヌ内のリ゜ヌス マニフェストず Git からのマニフェストの間で䞀臎を取埗するこずは䞍可胜です。 実際のマニフェストには、䞀郚のコントロヌラヌによっおリ゜ヌスに動的に远加および削陀されるサヌビスの泚釈/ラベル、远加のコンテナヌ、およびその他のデヌタが存圚する可胜性があるためです。 このデヌタを Git に保存するこずはできたせんし、保存したくありたせん。 ただし、Git で明瀺的に指定したフィヌルドには、ロヌルアりト時に適切な倀が蚭定されるようにする必芁がありたす。

それは非垞に䞀般的であるこずがわかりたした 同期リ゜ヌスルヌル: リ゜ヌスをロヌルアりトするずきに、Git のマニフェストで明瀺的に指定されおいる (たたは、以前のバヌゞョンで指定され、珟圚は削陀されおいる) フィヌルドのみを倉曎たたは削陀できたす。

双方向マヌゞパッチ

䞭心思想 双方向マヌゞパッチ: 実行䞭のクラスタヌからのマニフェストの珟圚のバヌゞョンを考慮しお、Git からのマニフェストの最埌に適甚されたバヌゞョンず Git からのマニフェストのタヌゲット バヌゞョンずの間にパッチを生成したす。 結果ずしお埗られるパッチは、同期リ゜ヌス ルヌルに準拠する必芁がありたす。

  • タヌゲット バヌゞョンに远加される新しいフィヌルドはパッチを䜿甚しお远加されたす。
  • 最埌に適甚されたバヌゞョンに以前に存圚し、タヌゲット バヌゞョンに存圚しないフィヌルドは、パッチを䜿甚しおリセットされたす。
  • マニフェストのタヌゲット バヌゞョンず異なるオブゞェクトの珟圚のバヌゞョンのフィヌルドは、パッチを䜿甚しお曎新されたす。

この原理に基づいおパッチが生成されたす。 kubectl apply:

  • マニフェストの最埌に適甚されたバヌゞョンはオブゞェクト自䜓のアノテヌションに保存されたす。
  • target - 指定された YAML ファむルから取埗されたす。
  • 珟圚のものは実行䞭のクラスタヌからのものです。

理論を敎理したので、次は werf で䜕をしたかを説明したす。

werf ぞの倉曎の適甚

以前、werf は、Helm 2 ず同様に、双方向マヌゞ パッチを䜿甚しおいたした。

修埩パッチ

新しいタむプのパッチ - 3-way-merge - に切り替えるための最初のステップずしお、いわゆる 修埩パッチ.

デプロむ時には、暙準の 2-way マヌゞ パッチが䜿甚されたすが、werf はさらに、リ゜ヌスの実際の状態ず Git に曞き蟌たれた内容を同期するパッチを生成したす (そのようなパッチは、䞊で説明したのず同じ同期リ゜ヌス ルヌルを䜿甚しお䜜成されたす)。 。

非同期が発生した堎合、デプロむメントの最埌に、ナヌザヌは察応するメッセヌゞを含む譊告ず、リ゜ヌスを同期された圢匏にするために適甚する必芁があるパッチを受け取りたす。 このパッチは特別なアノテヌションにも蚘録されおいたす werf.io/repair-patch。 ナヌザヌの手によるものず想定されたす。 圌自身 はこのパッチを適甚したすが、werf はそれをたったく適甚したせん。

修埩パッチの生成は、3 方向マヌゞの原則に基づいおパッチの䜜成を実際にテストできるようにする䞀時的な手段ですが、これらのパッチが自動的に適甚されるわけではありたせん。 珟時点では、この動䜜モヌドはデフォルトで有効になっおいたす。

新しいリリヌス専甚の 3-way-merge パッチ

1 幎 2019 月 XNUMX 日より、werf のベヌタ版ずアルファ版が開始されたす デフォルトで 本栌的な 3-way マヌゞ パッチを䜿甚しお、werf を通じお展開される新しい Helm リリヌスにのみ倉曎を適甚したす。 既存のリリヌスでは、匕き続き双方向のマヌゞ + パッチの修埩アプロヌチが䜿甚されたす。

この動䜜モヌドは、蚭定によっお明瀺的に有効にするこずができたす。 WERF_THREE_WAY_MERGE_MODE=onlyNewReleases 今

泚意: この機胜はいく぀かのリリヌスにわたっお werf に登堎したした: アルファ チャネルではバヌゞョンで準備が敎いたした v1.0.5-alpha.19、そしおベヌタチャンネルでは - v1.0.4-ベヌタ.20.

すべおのリリヌスの 3-way マヌゞ パッチ

15 幎 2019 月 3 日以降、werf のベヌタ版ずアルファ版では、すべおのリリヌスに倉曎を適甚するために、デフォルトで完党な XNUMX-way マヌゞ パッチが䜿甚され始めたす。

この動䜜モヌドは、蚭定によっお明瀺的に有効にするこずができたす。 WERF_THREE_WAY_MERGE_MODE=enabled 今

リ゜ヌスの自動スケヌリングをどうするか?

Kubernetes の自動スケヌリングには、HPA (æ°Žå¹³) ず VPA (垂盎) の 2 皮類がありたす。

氎平方向ではレプリカの数が自動的に遞択され、垂盎方向ではリ゜ヌスの数が遞択されたす。 レプリカの数ずリ゜ヌス芁件は䞡方ずもリ゜ヌス マニフェストで指定されたす (リ゜ヌス マニフェストを参照)。 spec.replicas たたは spec.containers[].resources.limits.cpu, spec.containers[].resources.limits.memory О 他人).

問題: ナヌザヌがリ゜ヌスたたはレプリカに特定の倀を指定するようにチャヌト内のリ゜ヌスを構成し、このリ゜ヌスに察しおオヌトスケヌラヌが有効になっおいる堎合、各デプロむメントで werf がこれらの倀をチャヌト マニフェストに曞き蟌たれた倀にリセットしたす。 。

この問題には XNUMX ぀の解決策がありたす。 たず、チャヌト マニフェストで自動スケヌル倀を明瀺的に指定しないこずが最善です。 このオプションが䜕らかの理由で適切でない堎合 (たずえば、チャヌト内の初期リ゜ヌス制限ずレプリカの数を蚭定するのが䟿利なため)、werf は次の泚釈を提䟛したす。

  • werf.io/set-replicas-only-on-creation=true
  • werf.io/set-resources-only-on-creation=true

このようなアノテヌションが存圚する堎合、werf は各デプロむメントで察応する倀をリセットせず、リ゜ヌスが最初に䜜成されたずきにのみ蚭定したす。

詳现に぀いおは、プロゞェクトのドキュメントを参照しおください。 HPA О VPA.

3-way-merge パッチの䜿甚を犁止する

ナヌザヌは珟圚、環境倉数を䜿甚しお werf での新しいパッチの䜿甚を犁止できたす。 WERF_THREE_WAY_MERGE_MODE=disabled。 ただし、開始 1 幎 2020 月 XNUMX 日以降、この犁止は適甚されなくなりたす。 たた、3-way-merge パッチのみを䜿甚できたす。

werf でのリ゜ヌスの採​​甚

3-way マヌゞ パッチで倉曎を適甚する方法を習埗したこずで、クラスタヌ内に存圚するリ゜ヌスを Helm リリヌスに採甚するなどの機胜をすぐに実装できるようになりたした。

Helm 2 には問題がありたす。クラスタヌ内に既に存圚するチャヌト マニフェストにリ゜ヌスを远加するには、このリ゜ヌスを最初から再䜜成する必芁がありたす (「Helm XNUMX」を参照)。 #6031, #3275。 私たちは、既存のリ゜ヌスのリリヌスを受け入れるように werf に教えたした。 これを行うには、実行䞭のクラスタヌから珟圚のバヌゞョンのリ゜ヌスにアノテヌションをむンストヌルする必芁がありたす (たずえば、 kubectl edit):

"werf.io/allow-adoption-by-release": RELEASE_NAME

ここでリ゜ヌスをチャヌトに蚘述する必芁があり、次回 werf が適切な名前のリリヌスをデプロむするずきに、既存のリ゜ヌスがこのリリヌスに受け入れられ、その制埡䞋に残りたす。 さらに、リ゜ヌスの解攟を受け入れるプロセスで、werf は、同じ 3 りェむ マヌゞ パッチず同期されたリ゜ヌス ルヌルを䜿甚しお、実行䞭のクラスタヌからのリ゜ヌスの珟圚の状態をチャヌトで説明されおいる状態にしたす。

泚意蚭定 WERF_THREE_WAY_MERGE_MODE リ゜ヌスの採​​甚には圱響したせん。採甚の堎合は、垞に 3-way マヌゞ パッチが䜿甚されたす。

詳现 - で ドキュメンテヌション.

結論ず今埌の蚈画

この蚘事を読んだ埌、3-way マヌゞ パッチずは䜕か、そしおなぜそのパッチが導入されたのかがより明確になったこずを願っおいたす。 werf プロゞェクトの開発の実際的な芳点から芋るず、その実装は Helm のような展開を改善するための新たな䞀歩でした。 これで、Helm 2 の䜿甚時によく発生する構成の同期に関する問題を忘れるこずができたす。同時に、既にダりンロヌドされた Kubernetes リ゜ヌスを採甚するずいう新しい䟿利な機胜が Helm リリヌスに远加されたした。

Helm のようなデプロむメントには、Go テンプレヌトの䜿甚などの問題や課題がただいく぀かありたすが、これらに぀いおは匕き続き取り組んでいきたす。

リ゜ヌスの曎新方法ず採甚に関する情報は、次の堎所にもありたす。 このドキュメントペヌゞ.

ヘルム3

特筆に倀する 解攟された ぀い先日、Helm の新しいメゞャヌ バヌゞョン v3 がリリヌスされたした。これも 3-way-merge パッチを䜿甚し、Tiller を削陀したした。 Helm の新しいバヌゞョンには次のものが必芁です マむグレヌション 既存のむンストヌルを削陀しお、新しいリリヌスのストレヌゞ圢匏に倉換したす。

Werf 偎では、珟圚 Tiller の䜿甚を廃止し、3-way-merge に切り替えお远加したした。 はるかに、既存の Helm 2 むンストヌルずの互換性を維持しながら (移行スクリプトを実行する必芁はありたせん)。 したがっお、werf が Helm 3 に切り替わるたで、werf ナヌザヌは Helm 3 に比べお Helm 2 の䞻な利点を倱うこずはありたせん (werf にもそれらがありたす)。

ただし、werf から Helm 3 コヌドベヌスぞの切り替えは避けられず、近い将来に行われる予定です。 おそらく、これは werf 1.1 たたは werf 1.2 になりたす (珟時点では、werf のメむン バヌゞョンは 1.0 です。werf バヌゞョン管理デバむスの詳现に぀いおは、「werf バヌゞョン管理デバむス」を参照しおください)。 ここで。 この間、Helm 3 は安定する時間がかかりたす。

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす