Kubernetes ã«ã¯ããªãœãŒã¹ãæŽæ°ããããã®ããã€ãã®ãªãã·ã§ã³ (é©çšãç·šéããããã眮æ) ããããŸãã ãããããäœãããã®ãããã€äœ¿çšããã®ãã«ã€ããŠã¯æ··ä¹±ããããŸãã ãããç解ããŸãããã
ãã 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
ãã¯ã©ã¹ã¿ãŒã䜿çšããŠäœæ¥ããå Žåã¯ã 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 ã€ã®æŽæ°ã¢ãããŒãããµããŒãããŠããŸãã 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 ãä¿¡é Œã§ããªãããšã¯ç解ããŠããã ãããšæããŸãã å°ãªããšããã®èšäºãçŸåšã®åçã眮ãæãããŸã§ã¯ã
åºæïŒ habr.com