ื”ืฉื•ื•ืื” ื ื›ื•ื ื” ืฉืœ Kubernetes ื”ื—ืœ, ื”ื—ืœืคื” ื•ืชื™ืงื•ืŸ

ืœ-Kubernetes ืžืกืคืจ ืืคืฉืจื•ื™ื•ืช ืœืขื“ื›ื•ืŸ ืžืฉืื‘ื™ื: ื”ื—ืœ, ืขืจื•ืš, ืชื™ืงื•ืŸ ื•ื”ื—ืœืคื”. ื™ืฉ ื‘ืœื‘ื•ืœ ืœื’ื‘ื™ ืžื” ื›ืœ ืื—ื“ ืขื•ืฉื” ื•ืžืชื™ ืœื”ืฉืชืžืฉ ื‘ื”ื. ื‘ื•ื ื ื‘ื™ืŸ ืืช ื–ื”.

ื”ืฉื•ื•ืื” ื ื›ื•ื ื” ืฉืœ Kubernetes ื”ื—ืœ, ื”ื—ืœืคื” ื•ืชื™ืงื•ืŸ

ืื ื—ืคืฉ ื‘ื’ื•ื’ืœ ื”ื‘ื™ื˜ื•ื™ "kubernetes apply vs replace" ื ืžืฆื ืชืฉื•ื‘ื” ืœ-StackOverflow, ื•ื–ื” ืœื ื ื›ื•ืŸ. ื‘ืขืช ื—ื™ืคื•ืฉ "kubernetes apply vs patch" ื”ืงื™ืฉื•ืจ ื”ืจืืฉื•ืŸ ื”ื•ื ื”ืชื™ืขื•ื“ ืขื‘ื•ืจ kubectl patch, ืฉืื™ื ื• ื›ื•ืœืœ ื”ืฉื•ื•ืื” apply ะธ patch. ืžืืžืจ ื–ื” ื™ื‘ื—ืŸ ืืช ื”ืืคืฉืจื•ื™ื•ืช ื”ืฉื•ื ื•ืช, ื›ืžื• ื’ื ืืช ื”ืฉื™ืžื•ืฉ ื”ื ื›ื•ืŸ ื‘ื›ืœ ืื—ืช ืžื”ืŸ.

ื‘ืžื”ืœืš ืžื—ื–ื•ืจ ื”ื—ื™ื™ื ืฉืœ ืžืฉืื‘ Kubernetes (ืฉื™ืจื•ืช, ืคืจื™ืกื”, ื›ื ื™ืกื” ื•ื›ื•'), ืœืคืขืžื™ื ืืชื” ืฆืจื™ืš ืœืฉื ื•ืช, ืœื”ื•ืกื™ืฃ ืื• ืœื”ืกื™ืจ ื›ืžื” ืžืืคื™ื™ื ื™ื ืฉืœ ืžืฉืื‘ ื–ื”. ืœื“ื•ื’ืžื”, ื”ื•ืกืฃ ื”ืขืจื”, ื”ื’ื“ืœ ืื• ื”ืงื˜ืŸ ืืช ืžืกืคืจ ื”ื”ืขืชืงื™ื.

Kubernetes CLI

ืื ืืชื” ื›ื‘ืจ ืขื•ื‘ื“ ืขื ืืฉื›ื•ืœื•ืช Kubernetes ื“ืจืš ื”-CLI, ืืชื” ื›ื‘ืจ ืžื›ื™ืจ apply ะธ edit. ืงึฐื‘ื•ึผืฆึธื” apply ืงื•ืจื ืืช ืžืคืจื˜ ื”ืžืฉืื‘ ืžื”ืงื•ื‘ืฅ ื•ืžื‘ืฆืข "upsert" ืœืืฉื›ื•ืœ Kubernetes, ื›ืœื•ืžืจ. ื™ื•ืฆืจ ืืช ื”ืžืฉืื‘ ืื ื”ื•ื ืœื ืงื™ื™ื ื•ืžืขื“ื›ืŸ ืื•ืชื• ืื ื”ื•ื ืงื™ื™ื. ืงึฐื‘ื•ึผืฆึธื” edit ืงื•ืจื ืžืฉืื‘ ื“ืจืš ื”-API, ื•ืื– ื›ื•ืชื‘ ืืช ืžืคืจื˜ ื”ืžืฉืื‘ ืœืงื•ื‘ืฅ ืžืงื•ืžื™, ืฉื ืคืชื— ืœืื—ืจ ืžื›ืŸ ื‘ืขื•ืจืš ื˜ืงืกื˜. ืœืื—ืจ ืขืจื™ื›ื” ื•ืฉืžื™ืจืช ื”ืงื•ื‘ืฅ, kubectl ื™ืฉืœื— ืืช ื”ืฉื™ื ื•ื™ื™ื ืฉื‘ื•ืฆืขื• ื‘ื—ื–ืจื” ื“ืจืš ื”-API, ืฉื™ื—ื™ืœ ื‘ืงืคื™ื“ื” ืืช ื”ืฉื™ื ื•ื™ื™ื ื”ืœืœื• ืขืœ ื”ืžืฉืื‘.

ืœื ื›ื•ืœื ื™ื•ื“ืขื™ื ืืช ื”ืคืงื•ื“ื•ืช patch ะธ replace. ืงึฐื‘ื•ึผืฆึธื” patch ืžืืคืฉืจ ืœืš ืœืฉื ื•ืช ื—ืœืง ืžืžืคืจื˜ ืžืฉืื‘ื™ื, ืœืกืคืง ืจืง ืืช ื”ื—ืœืง ืฉื”ืฉืชื ื” ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื”. ืงึฐื‘ื•ึผืฆึธื” replace ืขื•ื‘ื“ ืื•ืชื• ื”ื“ื‘ืจ ื›ืžื• edit, ืื‘ืœ ื”ื›ืœ ืฆืจื™ืš ืœื”ื™ืขืฉื•ืช ื‘ืื•ืคืŸ ื™ื“ื ื™: ืืชื” ืฆืจื™ืš ืœื”ื•ืจื™ื“ ืืช ื”ื’ืจืกื” ื”ื ื•ื›ื—ื™ืช ืฉืœ ืžืคืจื˜ ื”ืžืฉืื‘, ืœืžืฉืœ, ื‘ืืžืฆืขื•ืช kubectl get -o yaml, ืขืจื•ืš ืื•ืชื• ื•ืื– ื”ืฉืชืžืฉ replace ื›ื“ื™ ืœืขื“ื›ืŸ ืžืฉืื‘ ืœืคื™ ืžืคืจื˜ ืฉื•ื ื”. ืงึฐื‘ื•ึผืฆึธื” replace ืœื ื™ืคืขืœ ืื ื”ืชืจื—ืฉื• ืฉื™ื ื•ื™ื™ื ื›ืœืฉื”ื ื‘ื™ืŸ ืงืจื™ืื” ืœื”ื—ืœืคืช ื”ืžืฉืื‘.

ืžืžืฉืง API ืฉืœ Kubernetes

ืืชื” ื›ื ืจืื” ืžื›ื™ืจ ืืช ื”ืฉื™ื˜ื•ืช CoreV1().Pods().Update(), replaceNamespacedService ืื• patch_namespaced_deployment, ืื ืืชื” ืขื•ื‘ื“ ืขื ืืฉื›ื•ืœื•ืช ื‘ืืžืฆืขื•ืช ืกืคืจื™ื™ืช ืœืงื•ื— ืขื‘ื•ืจ Kubernetes API ื‘ืืžืฆืขื•ืช ืฉืคืช ืชื›ื ื•ืช ื›ืœืฉื”ื™. ื”ืกืคืจื™ื™ื” ืžื˜ืคืœืช ื‘ืฉื™ื˜ื•ืช ืืœื• ื‘ืืžืฆืขื•ืช ื‘ืงืฉื•ืช HTTP ื‘ืืžืฆืขื•ืช ื”ืฉื™ื˜ื•ืช PUT ะธ PATCH... ืฉื‘ื• update ะธ replace ืฉื™ืžื•ืฉ PUTื• - patch, ืœื ืžืฉื ื” ื›ืžื” ื˜ืจื™ื•ื•ื™ืืœื™ ื–ื” ืขืฉื•ื™ ืœื”ื™ื•ืช, ืžืฉืชืžืฉ PATCH.

ื™ืฉ ืœืฆื™ื™ืŸ ื›ื™ kubectl ืขื•ื‘ื“ ื’ื ืขื ืืฉื›ื•ืœื•ืช ื“ืจืš API. ื‘ืžื™ืœื™ื ืื—ืจื•ืช, kubectlื”ื•ื ืžืขื˜ืคืช ืขืœ ื’ื‘ื™ ืกืคืจื™ื™ืช ื”ืœืงื•ื— ืœืฉืคืช Go, ืืฉืจ ืžืกืคืงืช ื‘ืžื™ื“ื” ืจื‘ื” ืืช ื”ื™ื›ื•ืœืช ืœืกืคืง ืคืงื•ื“ื•ืช ืžืฉื ื” ื‘ืฆื•ืจื” ืงื•ืžืคืงื˜ื™ืช ื•ืงืจื™ื ื™ื•ืชืจ ื‘ื ื•ืกืฃ ืœื™ื›ื•ืœื•ืช ื”-API ื”ืกื˜ื ื“ืจื˜ื™ื•ืช. ืœืžืฉืœ, ื›ืคื™ ืฉืื•ืœื™ ื›ื‘ืจ ืฉืžืชื ืœื‘, ื”ืฉื™ื˜ื” apply ืœื ื”ื•ื–ื›ืจ ืœืขื™ืœ ื‘ืคืกืงื” ื”ืงื•ื“ืžืช. ื ื›ื•ืŸ ืœืขื›ืฉื™ื• (ืžืื™ 2020, ืžืฉื•ืขืจ. ืžึฐืชื•ึผืจื’ึฐืžึธืŸ) ื›ืœ ื”ื™ื’ื™ื•ืŸ kubectl apply, ื›ืœื•ืžืจ ื™ืฆื™ืจืช ืžืฉืื‘ื™ื ืœื ืงื™ื™ืžื™ื ื•ืขื“ื›ื•ืŸ ืงื™ื™ืžื™ื, ืขื•ื‘ื“ืช ืœื—ืœื•ื˜ื™ืŸ ื‘ืฆื“ ื”ืงื•ื“ kubectl. ื ืขืฉื™ื ืžืืžืฆื™ื ืขืœ ื”ืขื‘ืจื” ืœื•ื’ื™ืช apply ืœืฆื“ ื”-API, ืื‘ืœ ื–ื” ืขื“ื™ื™ืŸ ื‘ื’ืจืกืช ื‘ื˜ื. ืื›ืชื•ื‘ ื‘ื”ืจื—ื‘ื” ื‘ื”ืžืฉืš.

ืชื™ืงื•ืŸ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ

ืขื“ื™ืฃ ืœื”ืฉืชืžืฉ patch, ืื ื‘ืจืฆื•ื ืš ืœืขื“ื›ืŸ ืืช ื”ืžืฉืื‘. ื›ืš ืคื•ืขืœื•ืช ืฉืชื™ ืกืคืจื™ื•ืช ื”ืœืงื•ื— ืขืœ ื’ื‘ื™ ื”-API ืฉืœ Kubernetes ื• kubectl (ืœื ืžืคืชื™ืข, ืžื›ื™ื•ื•ืŸ ืฉื–ื• ืขื˜ื™ืคื” ืœืกืคืจื™ื™ืช ื”ืœืงื•ื—, ืžืฉื•ืขืจ. ืžึฐืชื•ึผืจื’ึฐืžึธืŸ).

ืขื‘ื•ื“ื” ืืกื˜ืจื˜ื’ื™ืช

ื›ืœ ื”ืงื‘ื•ืฆื•ืช kubectl apply, edit ะธ patch ืœื”ืฉืชืžืฉ ื‘ืฉื™ื˜ื” PATCH ื‘-HTTP ื‘ืงืฉื•ืช ืœืขื“ื›ื•ืŸ ืžืฉืื‘ ืงื™ื™ื. ืื ืืชื” ืžืชืขืžืง ื‘ื™ื™ืฉื•ื ืคืงื•ื“ื•ืช ื‘ื™ืชืจ ืคื™ืจื•ื˜, ืื– ื›ื•ืœื ืžืฉืชืžืฉื™ื ื‘ื’ื™ืฉื” ืชื™ืงื•ืŸ ืืกื˜ืจื˜ื’ื™-ืžื™ื–ื•ื’ ื›ื“ื™ ืœืขื“ื›ืŸ ืžืฉืื‘ื™ื, ืœืžืจื•ืช ื”ืคืงื•ื“ื” patch ืขืฉื•ื™ ืœื”ืฉืชืžืฉ ื‘ื’ื™ืฉื•ืช ืื—ืจื•ืช (ืขื•ื“ ืขืœ ื›ืš ื‘ื”ืžืฉืš). ื’ื™ืฉืช ื”ืชื™ืงื•ืŸ ื”ืืกื˜ืจื˜ื’ื™-ืžื™ื–ื•ื’ ืžื ืกื” "ืœืชืงืŸ" ืขืœ ื™ื“ื™ ืžื™ื–ื•ื’ ื”ืžืคืจื˜ ืฉืกื•ืคืง ืขื ื”ืžืคืจื˜ ื”ืงื™ื™ื. ืœื™ืชืจ ื“ื™ื•ืง, ื”ื•ื ืžื ืกื” ืœืฉืœื‘ ื’ื ืื•ื‘ื™ื™ืงื˜ื™ื ื•ื’ื ืžืขืจื›ื™ื, ืžื” ืฉืื•ืžืจ ืฉื”ืฉื™ื ื•ื™ื™ื ื ื•ื˜ื™ื ืœื”ื™ื•ืช ืชื•ืกืคื™ื. ืœื“ื•ื’ืžื”, ื”ืคืขืœืช ื”ืคืงื•ื“ื” patch ืขื ืžืฉืชื ื” ืกื‘ื™ื‘ื” ื—ื“ืฉ ื‘ืžืคืจื˜ ืžื™ื›ืœ ื”ืคื•ื“, ื’ื•ืจื ืœื”ื•ืกืคืช ืžืฉืชื ื” ืกื‘ื™ื‘ื” ืœืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื” ื”ืงื™ื™ืžื™ื ื‘ืžืงื•ื ืœื“ืจื•ืก ืื•ืชื. ื›ื“ื™ ืœื”ืกื™ืจ ื‘ืืžืฆืขื•ืช ื’ื™ืฉื” ื–ื•, ืขืœื™ืš ืœืืœืฅ ืืช ืขืจืš ื”ืคืจืžื˜ืจ ืœื”ื™ื•ืช 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, ื‘ื—ื™ืจืช ื”ืคืงื•ื“ื” ื”ืžืชืื™ืžื” ื‘ื™ื•ืชืจ ืœืฉื™ื ื•ื™ ื”ืžืชื‘ืฆืข. ื‘ืขืช ื”ื•ืกืคื” ื•ืฉื™ื ื•ื™ ืฉืœ ืžืืคื™ื™ื ื™ BOM, ืฉืชื™ ื”ื’ื™ืฉื•ืช ื”ืŸ ื‘ืขืจืš ื–ื”ื•ืช. ื‘ืขืช ืžื—ื™ืงืช ืžืืคื™ื™ื ื™ ืžืคืจื˜ ืื• ืจื›ื™ื‘ื™ ืžืขืจืš edit ืžืชื ื”ื’ ื›ืžื• ื”ืฉืงื” ื—ื“ ืคืขืžื™ืช apply, ื›ื•ืœืœ ืžืขืงื‘ ืื—ืจ ืื™ืš ื”ื™ื” ื”ืžืคืจื˜ ืœืคื ื™ ื•ืื—ืจื™ ืขืจื™ื›ืชื•, ื›ืš ืฉืชื•ื›ืœ ืœื”ืกื™ืจ ื‘ืžืคื•ืจืฉ ืžืืคื™ื™ื ื™ื ื•ืจื›ื™ื‘ื™ ืžืขืจืš ืžืžืฉืื‘. ืขืœื™ืš ืœื”ื’ื“ื™ืจ ื‘ืžืคื•ืจืฉ ืืช ืขืจืš ื”ืžืืคื™ื™ืŸ ืœ- null ื‘ืžืคืจื˜ ืขื‘ื•ืจ patchื›ื“ื™ ืœื”ืกื™ืจ ืื•ืชื• ืžื”ืžืฉืื‘. ื”ืกืจืช ืจื›ื™ื‘ ืžืขืจืš ื‘ืืžืฆืขื•ืช ืชื™ืงื•ืŸ ืžื™ื–ื•ื’ ืืกื˜ืจื˜ื’ื™ ื”ื™ื ืžื•ืจื›ื‘ืช ื™ื•ืชืจ ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ื“ื•ืจืฉืช ืฉื™ืžื•ืฉ ื‘ื”ื ื—ื™ื•ืช ืžื™ื–ื•ื’. ืจืื” ื’ื™ืฉื•ืช ืฉื“ืจื•ื’ ืื—ืจื•ืช ืœืžื˜ื” ืœื—ืœื•ืคื•ืช ืžืขืฉื™ื•ืช ื™ื•ืชืจ.

ืœื™ื™ืฉื ืฉื™ื˜ื•ืช ืขื“ื›ื•ืŸ ื‘ืกืคืจื™ื™ืช ื”ืœืงื•ื— ืฉืžืชื ื”ื’ื•ืช ื‘ื“ื•ืžื” ืœืคืงื•ื“ื•ืช ืœืขื™ืœ kubectl, ื™ืฉ ืœื”ื’ื“ื™ืจ ื‘ื‘ืงืฉื•ืช content-type ะฒ application/strategic-merge-patch+json. ืื ืืชื” ืจื•ืฆื” ืœื”ืกื™ืจ ืžืืคื™ื™ื ื™ื ื‘ืžืคืจื˜, ืขืœื™ืš ืœื”ื’ื“ื™ืจ ื‘ืžืคื•ืจืฉ ืืช ื”ืขืจื›ื™ื ืฉืœื”ื ืœ- null ื‘ืื•ืคืŸ ื“ื•ืžื” kubectl patch. ืื ืืชื” ืฆืจื™ืš ืœื”ืกื™ืจ ืจื›ื™ื‘ื™ ืžืขืจืš, ืขืœื™ืš ืœื›ืœื•ืœ ื”ื ื—ื™ื•ืช ืžื™ื–ื•ื’ ื‘ืžืคืจื˜ ื”ืขื“ื›ื•ืŸ ืื• ืœื”ืฉืชืžืฉ ื‘ื’ื™ืฉื” ืื—ืจืช ืœืขื“ื›ื•ื ื™ื.

ื’ื™ืฉื•ืช ืื—ืจื•ืช ืœืขื“ื›ื•ื ื™ื

Kubernetes ืชื•ืžืš ื‘ืฉืชื™ ื’ื™ืฉื•ืช ืขื“ื›ื•ืŸ ืื—ืจื•ืช: ืชื™ืงื•ืŸ ืžื™ื–ื•ื’ JSON ะธ ืชื™ืงื•ืŸ JSON. ื’ื™ืฉืช ื”-JSON Merge Patch ืœื•ืงื—ืช ืžืคืจื˜ Kubernetes ื—ืœืงื™ ื›ืงืœื˜ ื•ืชื•ืžื›ืช ื‘ืžื™ื–ื•ื’ ืื•ื‘ื™ื™ืงื˜ื™ื ื‘ื“ื•ืžื” ืœื’ื™ืฉืช ื”ืชื™ืงื•ืŸ ื”ืืกื˜ืจื˜ื’ื™-ืžื™ื–ื•ื’. ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ื”ืฉื ื™ื™ื ื”ื•ื ืฉื”ื•ื ืชื•ืžืš ืจืง ื‘ื”ื—ืœืคืช ืžืขืจืš, ื›ื•ืœืœ ืžืขืจืš ื”ืžื™ื›ืœื™ื ื‘ืžืคืจื˜ ื”ืคื•ื“. ืžืฉืžืขื•ืช ื”ื“ื‘ืจ ื”ื™ื ืฉื›ืืฉืจ ืืชื” ืžืฉืชืžืฉ ื‘ืชื™ืงื•ืŸ ืžื™ื–ื•ื’ ืฉืœ JSON, ืขืœื™ืš ืœืกืคืง ืžืคืจื˜ ืžืœื ืขื‘ื•ืจ ื›ืœ ื”ืงื•ื ื˜ื™ื™ื ืจื™ื ืœืžืงืจื” ืฉืžืืคื™ื™ืŸ ื›ืœืฉื”ื• ืฉืœ ืงื•ื ื˜ื™ื™ื ืจ ืžืฉืชื ื”. ืื– ื’ื™ืฉื” ื–ื• ืฉื™ืžื•ืฉื™ืช ืœื”ืกืจืช ืืœืžื ื˜ื™ื ืžืžืขืจืš ื‘-BOM. ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื” ืืชื” ื™ื›ื•ืœ ืœื‘ื—ื•ืจ JSON merge patch ื‘ืืžืฆืขื•ืช kubectl patch --type=merge. ื‘ืขืช ืขื‘ื•ื“ื” ืขื ื”-API ืฉืœ Kubernetes, ืขืœื™ืš ืœื”ืฉืชืžืฉ ื‘ืฉื™ื˜ืช ื”ื‘ืงืฉื” PATCH ื•ื”ืชืงื ื” content-type ะฒ application/merge-patch+json.

ื’ื™ืฉืช ื”ืชื™ืงื•ืŸ ืฉืœ JSON, ื‘ืžืงื•ื ืœืกืคืง ืžืคืจื˜ ื—ืœืงื™ ืฉืœ ืžืฉืื‘, ืžืฉืชืžืฉืช ื‘ืืกืคืงืช ื”ืฉื™ื ื•ื™ื™ื ืฉื‘ืจืฆื•ื ืš ืœื‘ืฆืข ื‘ืžืฉืื‘ ื›ืžืขืจืš, ืฉื‘ื• ื›ืœ ืจื›ื™ื‘ ืฉืœ ื”ืžืขืจืš ืžื™ื™ืฆื’ ืชื™ืื•ืจ ืฉืœ ื”ืฉื™ื ื•ื™ ืฉืžืชื‘ืฆืข ื‘ืžืฉืื‘. ื’ื™ืฉื” ื–ื• ื”ื™ื ื“ืจืš ื’ืžื™ืฉื” ื•ืขื•ืฆืžืชื™ืช ื™ื•ืชืจ ืœื‘ื˜ื ืืช ื”ืฉื™ื ื•ื™ื™ื ื”ืžืชื‘ืฆืขื™ื, ืืš ื‘ืžื—ื™ืจ ืฉืœ ืจื™ืฉื•ื ื”ืฉื™ื ื•ื™ื™ื ื”ืžืชื‘ืฆืขื™ื ื‘ืคื•ืจืžื˜ ื ืคืจื“ ืฉืื™ื ื• Kubernetes, ื‘ืžืงื•ื ืฉืœื™ื—ืช ืžืคืจื˜ ืžืฉืื‘ื™ื ื—ืœืงื™. IN kubectl ืืชื” ื™ื›ื•ืœ ืœื‘ื—ื•ืจ ืชื™ืงื•ืŸ JSON ื‘ืืžืฆืขื•ืช kubectl patch --type=json. ื‘ืขืช ืฉื™ืžื•ืฉ ื‘-Kubernetes API, ื’ื™ืฉื” ื–ื• ืคื•ืขืœืช ื‘ืฉื™ื˜ืช ื”ื‘ืงืฉื” PATCH ื•ื”ืชืงื ื” content-type ะฒ application/json-patch+json.

ืื ื—ื ื• ืฆืจื™ื›ื™ื ื‘ื™ื˜ื—ื•ืŸ - ื”ืฉืชืžืฉ ืœื”ื—ืœื™ืฃ

ื‘ืžืงืจื™ื ืžืกื•ื™ืžื™ื, ืขืœื™ืš ืœื”ื™ื•ืช ื‘ื˜ื•ื— ืฉืœื ื™ื‘ื•ืฆืขื• ืฉื™ื ื•ื™ื™ื ื‘ืžืฉืื‘ ืžืจื’ืข ื”ืงืจื™ืื” ืฉืœ ื”ืžืฉืื‘ ื•ืขื“ ืœืขื“ื›ื•ืŸ ืฉืœื•. ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ืขืœื™ืš ืœื•ื•ื“ื ืฉื›ืœ ื”ืฉื™ื ื•ื™ื™ื ื™ื”ื™ื• ืึธื˜ื•ึนืžึดื™. ื‘ืžืงืจื” ื–ื”, ื›ื“ื™ ืœืขื“ื›ืŸ ืžืฉืื‘ื™ื ืขืœื™ืš ืœื”ืฉืชืžืฉ replace. ืœื“ื•ื’ืžื”, ืื ื™ืฉ ืœืš ConfigMap ืขื ืžื•ื ื” ืฉืžืชืขื“ื›ืŸ ืขืœ ื™ื“ื™ ืžืกืคืจ ืžืงื•ืจื•ืช, ืขืœื™ืš ืœื”ื™ื•ืช ื‘ื˜ื•ื— ืฉืฉื ื™ ืžืงื•ืจื•ืช ืœื ืžืขื“ื›ื ื™ื ืืช ื”ืžื•ื ื” ื‘ื• ื–ืžื ื™ืช, ืžื” ืฉื’ื•ืจื ืœืื™ื‘ื•ื“ ื”ืขื“ื›ื•ืŸ. ื›ื“ื™ ืœื”ื“ื’ื™ื, ื“ืžื™ื™ื ื• ืจืฆืฃ ืื™ืจื•ืขื™ื ื‘ืืžืฆืขื•ืช ื”ื’ื™ืฉื” patch:

  • A ื•-B ืžืงื‘ืœื™ื ืืช ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ืฉืœ ื”ืžืฉืื‘ ืžื”-API
  • ื›ืœ ืื—ื“ ืžืขื“ื›ืŸ ื‘ืื•ืคืŸ ืžืงื•ืžื™ ืืช ื”ืžืคืจื˜ ืขืœ ื™ื“ื™ ื”ื’ื“ืœืช ื”ืžื•ื ื” ื‘ืื—ื“ ื•ื’ื ื”ื•ืกืคืช "A" ืื• "B" ื‘ื”ืชืืžื” ืœื”ืขืจืช "ืขื“ื›ืŸ ืœืคื™"
  • ื•ื–ื” ืžืขื“ื›ืŸ ืืช ื”ืžืฉืื‘ ืงืฆืช ื™ื•ืชืจ ืžื”ืจ
  • B ืžืขื“ื›ืŸ ืืช ื”ืžืฉืื‘

ื›ืชื•ืฆืื” ืžื›ืš, ืขื“ื›ื•ืŸ A ืื‘ื“. ื ื™ืชื•ื— ืื—ืจื•ืŸ patch ืžื ืฆื—, ื”ืžื•ื ื” ื’ื“ืœ ื‘ืื—ื“ ื‘ืžืงื•ื ื‘ืฉื ื™ื™ื, ื•ื”ืขืจืš ืฉืœ ื”ืคืชืง "ืžืขื•ื“ื›ืŸ ืขืœ ื™ื“ื™" ืžืกืชื™ื™ื ื‘-"B" ื•ืื™ื ื• ืžื›ื™ืœ "A". ื”ื‘ื” ื ืฉื•ื•ื” ืืช ื”ืืžื•ืจ ืœืขื™ืœ ืœืžื” ืฉืงื•ืจื” ื›ืืฉืจ ื ืขืฉื™ื ืขื“ื›ื•ื ื™ื ื‘ืืžืฆืขื•ืช ื”ื’ื™ืฉื” replace:

  • A ื•-B ืžืงื‘ืœื™ื ืืช ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ืฉืœ ื”ืžืฉืื‘ ืžื”-API
  • ื›ืœ ืื—ื“ ืžืขื“ื›ืŸ ื‘ืื•ืคืŸ ืžืงื•ืžื™ ืืช ื”ืžืคืจื˜ ืขืœ ื™ื“ื™ ื”ื’ื“ืœืช ื”ืžื•ื ื” ื‘ืื—ื“ ื•ื’ื ื”ื•ืกืคืช "A" ืื• "B" ื‘ื”ืชืืžื” ืœื”ืขืจืช "ืขื“ื›ืŸ ืœืคื™"
  • ื•ื–ื” ืžืขื“ื›ืŸ ืืช ื”ืžืฉืื‘ ืงืฆืช ื™ื•ืชืจ ืžื”ืจ
  • B ืžื ืกื” ืœืขื“ื›ืŸ ืืช ื”ืžืฉืื‘, ืืš ื”ืขื“ื›ื•ืŸ ื ื“ื—ื” ืขืœ ื™ื“ื™ ื”-API ืžื›ื™ื•ื•ืŸ ืฉื’ืจืกืช ื”ืžืฉืื‘ ื ืžืฆืืช ื‘ืžืคืจื˜ replace ืื™ื ื• ืชื•ืื ืืช ื”ื’ืจืกื” ื”ื ื•ื›ื—ื™ืช ืฉืœ ื”ืžืฉืื‘ ื‘-Kubernetes ืžื›ื™ื•ื•ืŸ ืฉื’ืจืกืช ื”ืžืฉืื‘ ื”ื•ื’ื“ืœื” ืขืœ ื™ื“ื™ ืคืขื•ืœืช ื”ื”ื—ืœืคื” ืฉืœ A.

ื‘ืžืงืจื” ืฉืœืขื™ืœ, B ื™ืฆื˜ืจืš ืœื”ื‘ื™ื ืžื—ื“ืฉ ืืช ื”ืžืฉืื‘, ืœื‘ืฆืข ืฉื™ื ื•ื™ื™ื ื‘ืžืฆื‘ ื”ื—ื“ืฉ ื•ืœื ืกื•ืช ืฉื•ื‘ replace. ื–ื” ื™ื’ืจื•ื ืœื”ื’ื“ืœืช ื”ืžื•ื ื” ื‘ืฉื ื™ื™ื ื•ืœื”ืขืจืช "ืžืขื•ื“ื›ืŸ ืขืœ ื™ื“ื™" ืœื›ืœื•ืœ "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 ื‘ึผึทืงึธืฉืึธื”.

ืืชื” ืœื ื™ื›ื•ืœ ืœืขืฉื•ืช ืชื™ืงื•ืŸ - ืื ื—ื ื• ืขื•ืฉื™ื ื”ื—ืœืคื”

ืœืคืขืžื™ื ืืชื” ืฆืจื™ืš ืœื‘ืฆืข ื›ืžื” ืฉื™ื ื•ื™ื™ื ืฉืœื ื ื™ืชืŸ ืœื˜ืคืœ ื‘ื”ื ืขืœ ื™ื“ื™ ื”-API. ื‘ืžืงืจื™ื ืืœื”, ืชื•ื›ืœ ืœืืœืฅ ื”ื—ืœืคื” ืฉืœ ื”ืžืฉืื‘ ืขืœ ื™ื“ื™ ืžื—ื™ืงื” ื•ื™ืฆื™ืจื” ืžื—ื“ืฉ ืฉืœื•. ื–ื” ื ืขืฉื” ื‘ืืžืฆืขื•ืช kubectl replace --force. ื”ืคืขืœืช ื”ืคืงื•ื“ื” ืžืกื™ืจื” ืžื™ื“ ืืช ื”ืžืฉืื‘ื™ื ื•ืœืื—ืจ ืžื›ืŸ ื™ื•ืฆืจืช ืื•ืชื ืžื—ื“ืฉ ืžื”ืžืคืจื˜ ืฉืกื•ืคืง. ืื™ืŸ ื‘-API ืžื˜ืคืœ "force replace" ื•ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช ื“ืจืš ื”-API ื™ืฉ ืœื‘ืฆืข ืฉืชื™ ืคืขื•ืœื•ืช. ืจืืฉื™ืช ืขืœื™ืš ืœืžื—ื•ืง ืืช ื”ืžืฉืื‘ ืขืœ ื™ื“ื™ ื”ื’ื“ืจื” ืขื‘ื•ืจื• gracePeriodSeconds ืœืืคืก (0) ื• propagationPolicy ื‘"ืจืงืข" ื•ืœืื—ืจ ืžื›ืŸ ืฆื•ืจ ืžื—ื“ืฉ ืืช ื”ืžืฉืื‘ ื”ื–ื” ืขื ื”ืžืคืจื˜ ื”ืจืฆื•ื™.

ืื–ื”ืจื”: ื’ื™ืฉื” ื–ื• ืขืœื•ืœื” ืœื”ื™ื•ืช ืžืกื•ื›ื ืช ื•ืขืœื•ืœื” ืœื”ื•ื‘ื™ืœ ืœืžืฆื‘ ืœื ืžื•ื’ื“ืจ.

ื”ื—ืœ ื‘ืฆื“ ื”ืฉืจืช

ื›ืคื™ ืฉืฆื•ื™ืŸ ืœืขื™ืœ, ืžืคืชื—ื™ 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, ื›ืžื• ื’ื ืกืงืจื™ืคื˜ื™ื ืฉื ื›ืชื‘ื• ื‘ืขืฆืžื ื‘ืืžืฆืขื•ืช ืกืคืจื™ื•ืช ืœืงื•ื—.

ืชื•ืฆืื•ืช ืฉืœ

ืื ื™ ืžืงื•ื•ื” ืฉืกืงื™ืจื” ืงืฆืจื” ื–ื• ืฉืœ ื“ืจื›ื™ื ืฉื•ื ื•ืช ืœืขื“ื›ื•ืŸ ืžืฉืื‘ื™ื ื‘ืืฉื›ื•ืœื•ืช ื”ื™ื™ืชื” ืžื•ืขื™ืœื” ืœืš. ื˜ื•ื‘ ืœื“ืขืช ืฉื–ื” ืœื ืจืง ื”ื—ืœ ืžื•ืœ ื”ื—ืœืคื”; ืืคืฉืจ ืœืขื“ื›ืŸ ืžืฉืื‘ ื‘ืืžืฆืขื•ืช ื”ื—ืœ, ืขืจื•ืš, ืชื™ืงื•ืŸ ืื• ื”ื—ืœืคื”. ืื—ืจื™ ื”ื›ืœ, ื‘ืื•ืคืŸ ืขืงืจื•ื ื™, ืœื›ืœ ื’ื™ืฉื” ื™ืฉ ืชื—ื•ื ื™ื™ืฉื•ื ืžืฉืœื”. ืขื‘ื•ืจ ืฉื™ื ื•ื™ื™ื ืื˜ื•ืžื™ื™ื, ื”ื—ืœืคื” ืขื“ื™ืฃ; ืื—ืจืช, ืขืœื™ืš ืœื”ืฉืชืžืฉ ื‘ืชื™ืงื•ืŸ ืžื™ื–ื•ื’ ืืกื˜ืจื˜ื’ื™ ื‘ืืžืฆืขื•ืช ื”ื—ืœ. ืœื›ืœ ื”ืคื—ื•ืช, ืื ื™ ืžืฆืคื” ืžืžืš ืœื”ื‘ื™ืŸ ืฉืืชื” ืœื ื™ื›ื•ืœ ืœืกืžื•ืš ืขืœ Google ืื• StackOerflow ื›ืฉืืชื” ืžื—ืคืฉ "kubernetes apply vs replace". ืœืคื—ื•ืช ืขื“ ืฉืžืืžืจ ื–ื” ื™ื—ืœื™ืฃ ืืช ื”ืชืฉื•ื‘ื” ื”ื ื•ื›ื—ื™ืช.

ื”ืฉื•ื•ืื” ื ื›ื•ื ื” ืฉืœ Kubernetes ื”ื—ืœ, ื”ื—ืœืคื” ื•ืชื™ืงื•ืŸ

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”