ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ сравнСниС Kubernetes Apply, Replace ΠΈ Patch

Для Kubernetes Π΅ΡΡ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² обновлСния рСсурсов: apply, edit, patch ΠΈ replace. Π‘ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π°. Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся.

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ сравнСниС Kubernetes Apply, Replace ΠΈ Patch

Если ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Google Ρ„Ρ€Π°Π·Ρƒ "kubernetes apply vs replace", находится ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° StackOverflow, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π²Π΅Ρ€Π΅Π½. ΠŸΡ€ΠΈ поискС "kubernetes apply vs patch" пСрвая ΠΆΠ΅ ссылка β€” докумСнтация Π½Π° kubectl patch, которая Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ сравнСниС apply ΠΈ patch. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ использованиС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ….

Π’ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° рСсурса Kubernetes (сСрвиса, deployment, ingress ΠΈ Ρ‚.Π΄.) ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ свойства этого рСсурса. НапримСр, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ число Ρ€Π΅ΠΏΠ»ΠΈΠΊ.

Kubernetes CLI

Если Π²Ρ‹ ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с кластСрами Kubernetes Ρ‡Π΅Ρ€Π΅Π· CLI, Ρ‚ΠΎ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с apply ΠΈ edit. Команда apply Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ рСсурса ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ "upsert" Π² кластСр Kubernetes, Ρ‚.Π΅. создаСт рСсурс, Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚, ΠΈ обновляСт Π΅Π³ΠΎ, Ссли ΠΎΠ½ сущСствуСт. Команда edit Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ рСсурс Ρ‡Π΅Ρ€Π΅Π· API, послС Ρ‡Π΅Π³ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ рСсурса Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ открываСтся Π² тСкстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈ сохранитС Ρ„Π°ΠΉΠ», kubectl ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ сдСланныС измСнСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ эти измСнСния ΠΊ рСсурсу.

НС всС Π·Π½Π°ΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ patch ΠΈ replace. Команда patch позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ спСцификации рСсурса, прСдоставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Команда replace Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ edit, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ всС Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ спСцификации рСсурса, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с использованиСм kubectl get -o yaml, ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅, Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ replace для обновлСния рСсурса ΠΏΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ спСцификации. Команда replace Π½Π΅ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ссли ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ рСсурса ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ измСнСния.

Kubernetes API

Π’Ρ‹, вСроятно, Π·Π½Π°ΠΊΠΎΠΌΡ‹ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ CoreV1().Pods().Update(), replaceNamespacedService ΠΈΠ»ΠΈ patch_namespaced_deployment, Ссли Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с кластСрами Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для API Kubernetes с использованиСм Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ языка программирования. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ запросов ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ HTTP, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ PUT ΠΈ PATCH. ΠŸΡ€ΠΈ этом update ΠΈ replace ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ PUT, Π° patch, ΠΊΠ°ΠΊ Π±Ρ‹ это Π½Π΅ Π±Ρ‹Π»ΠΎ банально, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ PATCH.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ kubectl Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с кластСрами Ρ‡Π΅Ρ€Π΅Π· API. Π˜Π½Π°Ρ‡Π΅ говоря, kubectl– это ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° ΠΏΠΎΠ²Π΅Ρ€Ρ… клиСнтской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для языка Go, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π°Ρ Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠΌ ΠΈ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅ Π² довСсок ΠΊ ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΌ возмоТностям API. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΌΠ΅Ρ‚ΠΎΠ΄ apply Π½Π΅ Π±Ρ‹Π» упомянут Π²Ρ‹ΡˆΠ΅ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π°Π±Π·Π°Ρ†Π΅. Π’ настоящСС врСмя (ΠΌΠ°ΠΉ 2020, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°) вся Π»ΠΎΠ³ΠΈΠΊΠ° kubectl apply, Ρ‚.Π΅. созданиС Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… рСсурсов ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π° сторонС ΠΊΠΎΠ΄Π° kubectl. ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ усилия ΠΏΠΎ пСрСносу Π»ΠΎΠ³ΠΈΠΊΠΈ apply Π½Π° сторону API, Π½ΠΎ это всС Π΅Ρ‰Π΅ Π½Π° стадии Π±Π΅Ρ‚Π°-тСстирования. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ€Π°ΡΠΏΠΈΡˆΡƒ Π½ΠΈΠΆΠ΅.

Patch ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π›ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ patch, Ссли Π²Ρ‹ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ рСсурс. Π’Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ клиСнтскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ²Π΅Ρ€Ρ… API Kubernetes, Ρ‚Π°ΠΊ ΠΈ kubectl (Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, вСдь ΠΎΠ½ – ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° клиСнтской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°).

Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ стратСгичСски

ВсС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ kubectl apply, edit ΠΈ patch ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ PATCH Π² запросах HTTP для обновлСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ рСсурса. Если Π²Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π΅Π΅ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄, Ρ‚ΠΎ Π²ΠΎ всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ strategic-merge patching для ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ рСсурсов, хотя ΠΊΠΎΠΌΠ°Π½Π΄Π° patch ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом Π½ΠΈΠΆΠ΅). ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ strategic-merge patching пытаСтся "ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ" ΠΏΡ€ΠΈ объСдинСнии прСдоставлСнной спСцификации с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ спСцификациСй. Π‘ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ, ΠΎΠ½ пытаСтся ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‚Π°ΠΊ ΠΈ массивы, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ измСнСния, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π΄Π΄ΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ. НапримСр, запуск ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ patch с Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды Π² спСцификации ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° pod, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ эта пСрСмСнная срСды добавляСтся ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ срСды, Π° Π½Π΅ пСрСзаписываСт ΠΈΡ…. Для удалСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° слСдуСт ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² null Π² прСдоставлСнной спСцификации. КакиС ΠΆΠ΅ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄ kubectl для обновлСния Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

Если Π²Ρ‹ создаСтС ΠΈ управляСтС своими рСсурсами с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ kubectl apply, ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π»ΡƒΡ‡ΡˆΠ΅ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ kubectl apply, Ρ‡Ρ‚ΠΎΠ±Ρ‹ kubectl ΠΌΠΎΠ³ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹Π΅ измСнСния ΠΎΡ‚ примСнСния ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ apply Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ отслСТиваСт Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, позволяя Π΅ΠΌΡƒ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° свойства спСцификации ΠΈ элСмСнты массива явно ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ. Π­Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ apply для удалСния свойств ΠΈ элСмСнтов массива, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ стратСгичСскоС слияниС Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ edit ΠΈ patch Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ примСчания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ kubectl apply примСняСт для отслСТивания своих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, поэтому Π»ΡŽΠ±Ρ‹Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· API Kubernetes, Π½ΠΎ внСсСнныС Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ edit ΠΈ patch, Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ apply, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ apply Π½Π΅ удаляСт ΠΈΡ…, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ спСцификации для apply (Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ сказано, Ρ‡Ρ‚ΠΎ edit ΠΈ patch Π΄Π΅Π»Π°ΡŽΡ‚ обновлСния ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… apply, Π½ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ – Π½Π΅Ρ‚).

Если Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ apply, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ edit, Ρ‚Π°ΠΊ ΠΈ patch, выбирая Ρ‚Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, которая большС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ΄ вносимоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ свойств спСцификации ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹. ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ свойств спСцификации ΠΈΠ»ΠΈ элСмСнтов массива edit Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΉ запуск apply, Π² Ρ‚ΠΎΠΌ числС отслСТиваСт, ΠΊΠ°ΠΊΠΎΠΉ Π±Ρ‹Π»Π° спСцификация Π΄ΠΎ ΠΈ послС Π΅Π΅ рСдактирования, поэтому ΠΌΠΎΠΆΠ½ΠΎ явно ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ свойства ΠΈ элСмСнты массива ΠΈΠ· рСсурса. НуТно явно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Π² null Π² спСцификации для patch, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· рСсурса. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта массива с использованиСм strategic-merge patching являСтся Π±ΠΎΠ»Π΅Π΅ слоТным, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ трСбуСтся использованиС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² слияния. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ обновлСнию Π½ΠΈΠΆΠ΅ для Π²Ρ‹Π±ΠΎΡ€Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹Ρ… Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ².

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² клиСнтской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ обновлСния, Π²Π΅Π΄ΡƒΡ‰ΠΈΠ΅ сСбя Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ kubectl, слСдуСт Π² запросах Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ content-type Π² application/strategic-merge-patch+json. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ свойства Π² спСцификации, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ явно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ… значСния Π² null Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ kubectl patch. Если Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнты массива, Π²Π°ΠΌ слСдуСт Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ слияния Π² ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ обновлСния ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ обновлСниям.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ обновлСниям

Π’ Kubernetes ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ обновлСниям: JSON merge patch ΠΈ JSON patch. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ JSON merge patch ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Kubernetes Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ слияниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ strategic-merge patching. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΌΠ΅Π½Ρƒ массивов, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ массив ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² спСцификации pod. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании JSON merge patch Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹Π΅ спСцификации для всСх ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² случаС измСнСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ свойства любого ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π΅Π½ для удалСния элСмСнтов ΠΈΠ· массива Π² спСцификации. Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ JSON merge patch, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ kubectl patch --type=merge. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с API Kubernetes слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ запроса PATCH ΠΈ установкС content-type Π² application/merge-patch+json.

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ JSON patch вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ рСсурса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ прСдоставлСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ внСсти Π² рСсурс, Π² Π²ΠΈΠ΄Π΅ массива, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива прСдставляСт собой описаниС измСнСния, вносимого Π² рСсурс. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ являСтся Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΈ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ способом выраТСния вносимых ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½ΠΎ Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ список вносимых ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈΠ΄Π΅Ρ‚ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ, Π½Π΅ Kubernetes, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, вмСсто ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ частичной спСцификации рСсурса. Π’ kubectl Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ JSON patch, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ kubectl patch --type=json. ΠŸΡ€ΠΈ использовании API Kubernetes этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° запроса PATCH ΠΈ установкС content-type Π² application/json-patch+json.

НуТна ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ replace

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π½ΡƒΠΆΠ½Π° ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² рСсурс Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ внСсСны измСнСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ чтСния рСсурса ΠΈ Π΅Π³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ. Π˜Π½Π°Ρ‡Π΅ говоря, стоит ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС измСнСния Π±ΡƒΠ΄ΡƒΡ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ. Π’ этом случаС для обновлСния рСсурсов стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ replace. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ссли Π΅ΡΡ‚ΡŒ ConfigMap со счСтчиком, обновляСмым нСсколькими источниками, слСдуСт Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° источника Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ счСтчик ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ обновлСния. Для дСмонстрации ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ событий ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ patch:

  • A ΠΈ B ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС рСсурса ΠΈΠ· API
  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… локально обновляСт ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, увСличивая счСтчик Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ добавляя "A" ΠΈΠ»ΠΈ "B" соотвСтствСнно Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ "updated-by"
  • А Ρ‡ΡƒΡ‚ΡŒ быстрСС обновляСт рСсурс
  • B обновляСт рСсурс

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ A потСряно. ПослСдняя опСрация patch Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚, счСтчик увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ вмСсто Π΄Π²ΡƒΡ…, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ примСчания "updated-by" заканчиваСтся Π½Π° "B" ΠΈ Π½Π΅ содСрТит "A". Π”Π°Π²Π°ΠΉΡ‚Π΅ сравним Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° обновлСния Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с использованиСм ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° replace:

  • A ΠΈ B ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС рСсурса ΠΈΠ· API
  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… локально обновляСт ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, увСличивая счСтчик Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ добавляя "A" ΠΈΠ»ΠΈ "B" соотвСтствСнно Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ "updated-by"
  • А Ρ‡ΡƒΡ‚ΡŒ быстрСС обновляСт рСсурс
  • B пытаСтся ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ рСсурс, Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ отклоняСтся API, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вСрсия рСсурса Π² спСцификации replace Π½Π΅ совпадаСт с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсиСй рСсурса Π² Kubernetes, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вСрсия рСсурса Π±Ρ‹Π»Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π° ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ replace со стороны A.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ случаС B придСтся Π·Π°Π½ΠΎΠ²ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ рСсурс, внСсти измСнСния Π² Π½ΠΎΠ²ΠΎΠ΅ состояниС ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ снова ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ replace. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ счСтчик Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ Π½Π° Π΄Π²Π°, Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ "updated-by" Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ "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 -

ΠŸΡ€ΠΈ этом стоит Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, выполнятся ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ deployment.yaml Π½Π΅ содСрТит свойство .metadata.resourceVersion

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

Казалось Π±Ρ‹, это ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ Ρ‚ΠΎΠΌΡƒ, ΠΎ Ρ‡Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Ρ‚.Π΅. "Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ resourceVersion Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ спСцификации". Π£Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π΅Π²Π΅Ρ€Π½ΠΎ? НСт, это Π½Π΅ Ρ‚Π°ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ссли kubectl Π·Π°ΠΌΠ΅Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ resourceVersion, ΠΎΠ½ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΅Π΅ ΠΈΠ· рСсурса ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π²Π°ΠΌΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ replace. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасная, Ссли ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ, магия Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π° сторонС kubectl, Π½Π΅ стоит ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅Π΅ ΠΏΡ€ΠΈ использовании клиСнтских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с API. Π’ этом случаС Π²Π°ΠΌ придСтся ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ рСсурса, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ PUT запрос.

НСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ patch – Π΄Π΅Π»Π°Π΅ΠΌ replace

Иногда Π½ΡƒΠΆΠ½ΠΎ внСсти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ API. Π’ этих случаях ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ рСсурс, удаляя ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ создавая Π΅Π³ΠΎ. Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ kubectl replace --force. Запуск ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ удаляСт рСсурсы, Π° Π·Π°Ρ‚Π΅ΠΌ воссоздаСт ΠΈΡ… с прСдоставлСнной спСцификации. Π’ API Π½Π΅Ρ‚Ρƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° "ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ", Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Ρ‡Π΅Ρ€Π΅Π· API, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Для Π½Π°Ρ‡Π°Π»Π° Π½Π°Π΄ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ рСсурс, устанавливая для Π½Π΅Π³ΠΎ gracePeriodSeconds Π² ноль (0) ΠΈ propagationPolicy Π² β€œBackground”, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π½ΠΎΠ²ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ этот рСсурс с ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ спСцификациСй.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасСн, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ

Apply Π½Π° сторонС сСрвСра

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Kubernetes Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π°Π΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ apply ΠΈΠ· kubectl Π² API Kubernetes. Π›ΠΎΠ³ΠΈΠΊΠ° 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, Π° Ρ‚Π°ΠΊΠΆΠ΅ самописных скриптов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… клиСнтскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π˜Ρ‚ΠΎΠ³ΠΈ

НадСюсь, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Ρ€Π°Π·Π½Ρ‹Ρ… способов обновлСния рСсурсов Π² кластСрах Π±Ρ‹Π» ΠΏΠΎΠ»Π΅Π·Π΅Π½ для вас. ПолСзно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠΈ Π½Π΅ просто apply ΠΏΡ€ΠΎΡ‚ΠΈΠ² replace, вСдь ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ рСсурс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ apply, edit, patch ΠΈΠ»ΠΈ replace. Π’Π΅Π΄ΡŒ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ ΠΊΠ°ΠΆΠ΄Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ свою ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнСния. Для Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ replace, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ strategic-merge patch Ρ‡Π΅Ρ€Π΅Π· apply. Π’ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΌ случаС я Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ поняли, Ρ‡Ρ‚ΠΎ нСльзя Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Google ΠΈΠ»ΠΈ StackOerflow ΠΏΡ€ΠΈ поискС "kubernetes apply vs replace". По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° эта ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‚.

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ сравнСниС Kubernetes Apply, Replace ΠΈ Patch

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com