Kubernetes の適甚、眮換、パッチの適切な比范

Kubernetes には、リ゜ヌスを曎新するためのいく぀かのオプション (適甚、線集、パッチ、眮換) がありたす。 それぞれが䜕をするのか、い぀䜿甚するのかに぀いおは混乱がありたす。 それを理解したしょう。

Kubernetes の適甚、眮換、パッチの適切な比范

もし Googleで怜玢する 「kubernetes apply vs replace」ずいうフレヌズが芋぀かりたした StackOverflow ぞの返信、これは正しくありたせん。 怜玢時 「kubernetes apply vs patch」最初のリンクは、次のドキュメントです。 kubectl patch、比范は含たれたせん apply О patch。 この蚘事では、さたざたなオプションずそれぞれの適切な䜿甚方法に぀いお説明したす。

Kubernetes リ゜ヌスのラむフサむクル (サヌビス、デプロむ、むングレスなど) 䞭に、このリ゜ヌスの䞀郚のプロパティを倉曎、远加、削陀する必芁がある堎合がありたす。 たずえば、メモを远加したり、レプリカの数を増枛したりしたす。

Kubernetes CLI

すでに CLI 経由で Kubernetes クラスタヌを操䜜しおいる堎合は、すでに慣れおいるはずです。 apply О edit. チヌム apply ファむルからリ゜ヌス仕様を読み取り、Kubernetes クラスタヌに察しお「upsert」を実行したす。 リ゜ヌスが存圚しない堎合は䜜成し、存圚する堎合は曎新したす。 チヌム edit API を介しおリ゜ヌスを読み取り、リ゜ヌス仕様をロヌカル ファむルに曞き蟌み、そのファむルをテキスト ゚ディタで開きたす。 ファむルを線集しお保存したら、 kubectl は行われた倉曎を API 経由で送り返し、これらの倉曎をリ゜ヌスに慎重に適甚したす。

誰もがコマンドを知っおいるわけではありたせん patch О replace. チヌム patch リ゜ヌス仕様の䞀郚を倉曎し、倉曎された郚分のみをコマンドラむンに指定できたす。 チヌム replace ず同じように機胜したす editただし、すべおを手動で行う必芁がありたす。たずえば、次のようにしおリ゜ヌス仕様の珟圚のバヌゞョンをダりンロヌドする必芁がありたす。 kubectl get -o yaml線集しおから䜿甚しおください replace 倉曎された仕様に埓っおリ゜ヌスを曎新したす。 チヌム replace リ゜ヌスの読み取りず眮換の間に倉曎が発生した堎合、機胜したせん。

Kubernetes API

あなたはおそらくその方法に粟通しおいるでしょう CoreV1().Pods().Update(), replaceNamespacedService たたは patch_namespaced_deployment、クラスタヌを䜿甚しお䜜業する堎合は、 Kubernetes API のクラむアント ラむブラリ 䜕らかのプログラミング蚀語を䜿甚しお。 ラむブラリは、次のメ゜ッドを䜿甚しお HTTP リク゚スト経由でこれらのメ゜ッドを凊理したす。 PUT О PATCH。 この堎合は、 update О replace 䜿甚する PUTず patchたずえそれがどんなに些现なこずであっおも、 PATCH.

これは、こずは泚目に倀したす kubectl API 経由でクラスタヌずも連携したす。 蚀い換えるず、 kubectlは Go 蚀語のクラむアント ラむブラリ䞊のラッパヌであり、暙準の API 機胜に加えお、よりコンパクトで読みやすい圢匏でサブコマンドを提䟛する機胜を䞻に提䟛したす。 たずえば、すでにお気づきかもしれたせんが、このメ゜ッドは apply 前の段萜では蚀及されおいたせんでした。 珟圚2020幎XNUMX月 玄。 翻蚳者) すべおのロゞック kubectl apply、぀たり存圚しないリ゜ヌスの䜜成ず既存のリ゜ヌスの曎新は、完党にコヌド偎で機胜したす kubectl。 取り組みが行われおいたす ロゞック転送時 apply API 偎ですが、ただベヌタ版です。 以䞋に詳しく曞きたす。

デフォルトでパッチを適甚する

最もよく䜿われる patch、リ゜ヌスを曎新する堎合。 このようにしお、䞡方のクラむアント ラむブラリが Kubernetes API 䞊で動䜜し、 kubectl (これはクラむアント ラむブラリのラッパヌなので圓然のこずですが、 玄。 翻蚳者).

戊略的に取り組む

すべおのチヌム kubectl apply, edit О patch 方法を䜿う PATCH HTTP リク゚ストで既存のリ゜ヌスを曎新したす。 コマンドの実装をさらに詳しく調べるず、すべおのコマンドで次のアプロヌチが䜿甚されたす。 戊略的マヌゞパッチ適甚 リ゜ヌスを曎新するには、コマンド patch 他のアプロヌチを䜿甚するこずもできたす (これに぀いおは以䞋で詳しく説明したす)。 戊略的マヌゞ パッチ適甚アプロヌチでは、提䟛された仕様を既存の仕様ずマヌゞするこずで「正しく理解する」こずを詊みたす。 より具䜓的には、オブゞェクトず配列の䞡方を結合しようずしたす。これは、倉曎が远加的になる傟向があるこずを意味したす。 たずえば、次のコマンドを実行するず、 patch ポッド コンテナヌ仕様に新しい環境倉数を䜿甚するず、その環境倉数は既存の環境倉数を䞊曞きするのではなく、既存の環境倉数に远加されたす。 このアプロヌチを䜿甚しお削陀するには、指定された仕様でパラメヌタ倀を匷制的に null にする必芁がありたす。 どのチヌムが kubectl アップデヌトに䜿甚するのが最適ですか?

を䜿甚しおリ゜ヌスを䜜成および管理する堎合、 kubectl apply、曎新するずきは垞に䜿甚するこずをお勧めしたす kubectl applyに kubectl 構成を管理し、アプリケヌションごずに芁求された倉曎を適切に远跡できたす。 垞に䜿甚する利点 apply それは、以前に適甚された仕様を远跡し、仕様のプロパティず配列芁玠がい぀明瀺的に削陀されたかを知るこずができるずいうこずです。 これにより、䜿甚できるようになりたす apply プロパティず配列芁玠を削陀するには、通垞の戊略的マヌゞは機胜したせん。 チヌム edit О patch ノヌトを曎新しないでください kubectl apply を䜿甚しお倉曎を远跡するため、倉曎は Kubernetes API を通じお远跡および行われたすが、コマンドを通じお行われたす。 edit О patch、埌続のコマンドには衚瀺されたせん apply぀たり、 apply の入力仕様に珟れない堎合でも、それらは削陀されたせん。 apply (ドキュメントにはこう曞いおありたす) edit О patch 䜿甚したメモを曎新する apply、しかし実際には - いいえ。

コマンドを䜿甚しない堎合 apply、ずしお䜿甚できたす editず patch、行われおいる倉曎に最も適したコマンドを遞択したす。 BOM プロパティを远加および倉曎する堎合、どちらのアプロヌチもほが同じです。 仕様プロパティたたは配列芁玠を削陀する堎合 edit XNUMX回限りの起動のように動䜜したす applyこれには、仕様が線集される前埌でどのようになっおいたかを远跡するこずも含たれたす。これにより、リ゜ヌスからプロパティや配列芁玠を明瀺的に削陀できたす。 の仕様でプロパティ倀を明瀺的に null に蚭定する必芁がありたす。 patchリ゜ヌスから削陀したす。 戊略的マヌゞ パッチを䜿甚しお配列芁玠を削陀する堎合は、マヌゞ ディレクティブを䜿甚する必芁があるため、より耇雑になりたす。 より実行可胜な代替案に぀いおは、以䞋の他のアップグレヌド アプロヌチを参照しおください。

䞊蚘のコマンドず同様に動䜜する曎新メ゜ッドをクラむアント ラむブラリに実装するには kubectl、リク゚ストで蚭定する必芁がありたす content-type в application/strategic-merge-patch+json。 仕様内のプロパティを削陀したい堎合は、同様の方法でそれらの倀を明瀺的に null に蚭定する必芁がありたす。 kubectl patch。 配列芁玠を削陀する必芁がある堎合は、曎新仕様にマヌゞ ディレクティブを含めるか、曎新に別のアプロヌチを䜿甚する必芁がありたす。

アップデヌトに察するその他のアプロヌチ

Kubernetes は、他の XNUMX ぀の曎新アプロヌチをサポヌトしおいたす。 JSONマヌゞパッチ О JSONパッチ。 JSON マヌゞ パッチ アプロヌチは、郚分的な Kubernetes 仕様を入力ずしお受け取り、戊略的マヌゞ パッチ適甚アプロヌチず同様のオブゞェクトのマヌゞをサポヌトしたす。 XNUMX ぀の違いは、ポッド仕様のコンテナ配列を含む配列の眮換のみをサポヌトしおいるこずです。 これは、JSON マヌゞ パッチを䜿甚する堎合、コンテナヌのプロパティが倉曎された堎合に備えお、すべおのコンテナヌに完党な仕様を提䟛する必芁があるこずを意味したす。 したがっお、このアプロヌチは、BOM 内の配列から芁玠を削陀する堎合に圹立ちたす。 コマンドラむンで、次を䜿甚しお JSON マヌゞ パッチを遞択できたす。 kubectl patch --type=merge。 Kubernetes API を䜿甚する堎合は、リク゚スト メ゜ッドを䜿甚する必芁がありたす。 PATCH そしおむンストヌル content-type в application/merge-patch+json.

JSON パッチのアプロヌチでは、リ゜ヌスの郚分仕様を提䟛するのではなく、リ゜ヌスに加えたい倉曎を配列ずしお提䟛したす。配列の各芁玠は、リ゜ヌスに加えられた倉曎の説明を衚したす。 このアプロヌチは、行われた倉曎を衚珟するためのより柔軟で匷力な方法ですが、郚分的なリ゜ヌス仕様を送信するのではなく、行われた倉曎を別の非 Kubernetes 圢匏でリストするずいうコストがかかりたす。 で kubectl を䜿甚しおJSONパッチを遞択できたす kubectl patch --type=json。 Kubernetes API を䜿甚する堎合、このアプロヌチはリク゚スト メ゜ッドを䜿甚しお機胜したす。 PATCH そしおむンストヌル content-type в application/json-patch+json.

自信が必芁です - replace を䜿甚しおください

堎合によっおは、リ゜ヌスが読み取られおから曎新されるたでの間にリ゜ヌスに倉曎が加えられおいないこずを確認する必芁がありたす。 蚀い換えれば、すべおの倉曎が次のように行われるこずを確認する必芁がありたす。 原子。 この堎合、リ゜ヌスを曎新するには次を䜿甚する必芁がありたす replace。 たずえば、耇数の゜ヌスによっお曎新されるカりンタヌを含む ConfigMap がある堎合、XNUMX ぀の゜ヌスが同時にカりンタヌを曎新しお、曎新が倱われるこずがないようにする必芁がありたす。 実蚌するには、次のアプロヌチを䜿甚しお䞀連のむベントを想像しおください。 patch:

  • A ず B は API からリ゜ヌスの珟圚の状態を取埗したす
  • それぞれがカりンタヌを XNUMX ぀むンクリメントし、「曎新者」メモにそれぞれ「A」たたは「B」を远加するこずで仕様をロヌカルに曎新したす。
  • そしお、リ゜ヌスの曎新が少し速くなりたす
  • B はリ゜ヌスを曎新したす

その結果、曎新 A は倱われたす。 最埌の操䜜 patch 勝利するず、カりンタヌは XNUMX ではなく XNUMX ず぀増加し、「曎新者」ノヌトの倀は「B」で終わり、「A」は含たれたせん。 䞊蚘を、このアプロヌチを䜿甚しお曎新が行われた堎合に䜕が起こるか比范しおみたしょう。 replace:

  • A ず B は API からリ゜ヌスの珟圚の状態を取埗したす
  • それぞれがカりンタヌを XNUMX ぀むンクリメントし、「曎新者」メモにそれぞれ「A」たたは「B」を远加するこずで仕様をロヌカルに曎新したす。
  • そしお、リ゜ヌスの曎新が少し速くなりたす
  • B はリ゜ヌスを曎新しようずしたしたが、リ゜ヌスのバヌゞョンが仕様に含たれおいるため、曎新は API によっお拒吊されたした。 replace リ゜ヌスのバヌゞョンは A の眮換操䜜によっお増加されたため、Kubernetes のリ゜ヌスの珟圚のバヌゞョンず䞀臎したせん。

䞊蚘の堎合、B はリ゜ヌスを再フェッチし、新しい状態に倉曎を加えお再詊行する必芁がありたす。 replace。 これにより、カりンタヌが XNUMX ぀増加し、「曎新者」ノヌトの最埌に「AB」が含たれたす。

䞊蚘の䟋は、実行時に replace リ゜ヌス党䜓が完党に眮き換えられたす。 䜿甚される仕様 replace、郚分的たたは郚分的であっおはなりたせん。 apply、ただし远加も含めお完了 resourceVersion 仕様メタデヌタに組み蟌たれたす。 有効にしおいない堎合 resourceVersion たたは、提䟛されたバヌゞョンが最新ではない堎合、亀換は拒吊されたす。 したがっお、䜿甚する最良のアプロヌチは次のずおりです replace – リ゜ヌスを読み取り、曎新し、すぐに眮き換えたす。 䜿甚する kubectl、次のようになりたす。

$ kubectl get deployment my-deployment -o json 
    | jq '.spec.template.spec.containers[0].env[1].value = "new value"' 
    | kubectl replace -f -

次の XNUMX ぀のコマンドを順番に実行するず、正垞に実行されるこずに泚意しおください。 deployment.yaml プロパティが含たれおいたせん .metadata.resourceVersion

$ kubectl create -f deployment.yaml
$ kubectl replace -f deployment.yaml

これは䞊で述べたこずず矛盟しおいるように芋えたす。 「远加 resourceVersion 仕様のメタデヌタに远加したす。」ずいう蚀い方は間違っおいたすか? いいえ、そうではありたせん。 kubectl 指定しおいないこずに気づきたした resourceVersion、リ゜ヌスからそれを読み取り、指定した仕様に远加しおから実行したす。 replace。 アトミック性に䟝存するず朜圚的に危険なため、魔法は完党にサむドで機胜したす。 kubectl、API で動䜜するクラむアント ラむブラリを䜿甚する堎合は、これに䟝存しないでください。 この堎合、珟圚のリ゜ヌス仕様を読み取り、曎新しおから実行する必芁がありたす。 PUT リク゚スト。

パッチを適甚するこずはできたせん。亀換を行いたす

堎合によっおは、API では凊理できない倉曎を加える必芁がある堎合がありたす。 このような堎合、リ゜ヌスを削陀しお再䜜成するこずで、リ゜ヌスを匷制的に眮き換えるこずができたす。 これは次を䜿甚しお行われたす kubectl replace --force。 コマンドを実行するず、リ゜ヌスがただちに削陀され、提䟛された仕様からリ゜ヌスが再䜜成されたす。 API には「匷制眮換」ハンドラヌがありたせん。API を通じおこれを行うには、XNUMX ぀の操䜜を実行する必芁がありたす。 たず、リ゜ヌスを蚭定しお削陀する必芁がありたす gracePeriodSeconds れロ (0) ず propagationPolicy 「バックグラりンド」でこのリ゜ヌスを再䜜成し、必芁な仕様でこのリ゜ヌスを再䜜成したす。

è­Šå‘Š: このアプロヌチは朜圚的に危険であり、未定矩の状態に぀ながる可胜性がありたす。

サヌバヌ偎で適甚する

前述したように、Kubernetes 開発者はロゞックの実装に取り​​組んでいたす。 apply の kubectl Kubernetes API で。 ロゞック apply Kubernetes 1.18 で利甚可胜 kubectl apply --server-side たたはメ゜ッドを䜿甚しお API 経由で PATCH с content-type application/apply-patch+YAML.

泚: JSON も有効な YAML であるため、次のような堎合でも仕様を JSON ずしお送信できたす。 content-type 意志 application/apply-patch+yaml.

そのロゞックのほかに kubectl API経由で誰でも利甚できるようになり、 apply サヌバヌ偎では、仕様内のフィヌルドの責任者を远跡し、競合のない線集のための安党な耇数アクセスを可胜にしたす。 蚀い換えれば、もし apply サヌバヌ偎での機胜がさらに普及するず、さたざたなクラむアント (kubectl、Pulumi たたは Terraform、GitOps、クラむアント ラむブラリを䜿甚した自己䜜成スクリプトなど) 甚のナニバヌサルで安党なリ゜ヌス管理むンタヌフェむスが登堎するでしょう。

結果

クラスタヌ内のリ゜ヌスを曎新するさたざたな方法に関するこの短い抂芁がお圹に立おば幞いです。 適甚ず眮換だけではなく、適甚、線集、パッチ、たたは眮換を䜿甚しおリ゜ヌスを曎新できるこずを知っおおくず䟿利です。 結局のずころ、原則ずしお、各アプロヌチには独自の適甚分野がありたす。 アトミックな倉曎の堎合は、眮換するこずをお勧めしたすが、それ以倖の堎合は、適甚による戊略的マヌゞ パッチを䜿甚する必芁がありたす。 少なくずも、「kubernetes apply vs replace」を怜玢する堎合、Google や StackOerflow を信頌できないこずは理解しおいただけるず思いたす。 少なくずもこの蚘事が珟圚の回答を眮き換えるたでは。

Kubernetes の適甚、眮換、パッチの適切な比范

出所 habr.com

コメントを远加したす