{"id":481020,"date":"2026-05-26T05:46:53","date_gmt":"2026-05-26T05:46:53","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481020"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481020","title":{"rendered":"\u0417\u0430\u043f\u0438\u0441\u044c \u0432 Kubernetes: \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/22\/8b\/0f\/228b0fbd50ae776cbf2335eaa5c7c2d9.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/22\/8b\/0f\/228b0fbd50ae776cbf2335eaa5c7c2d9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/22\/8b\/0f\/228b0fbd50ae776cbf2335eaa5c7c2d9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442. \u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/aenix\/articles\/1031818\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043f\u0440\u043e <strong>\u0447\u0442\u0435\u043d\u0438\u0435<\/strong> \u2014 \u043a\u044d\u0448 \u0432 <code>controller-runtime<\/code>, informer\u2019\u044b, <code>Reflector<\/code>, <code>DeltaFIFO<\/code>, \u043f\u043e\u0447\u0435\u043c\u0443 <code>r.Get<\/code> \u0432 \u0440\u0435\u043a\u043e\u043d\u0441\u0430\u0439\u043b\u0435 \u043d\u0435 \u0445\u043e\u0434\u0438\u0442 \u0432 apiserver. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e <strong>\u0437\u0430\u043f\u0438\u0441\u044c<\/strong>.<\/p>\n<p>Kubernetes \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0442\u0430\u043a, \u0447\u0442\u043e <strong>\u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0433\u0443\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u2014 \u0438 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e<\/strong>. \u041d\u0430 \u043e\u0434\u0438\u043d Deployment \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0438 <code>deployment-controller<\/code> (\u043f\u0440\u0430\u0432\u0438\u0442 status), \u0438 HPA (\u043f\u0440\u0430\u0432\u0438\u0442 <code>spec.replicas<\/code>), \u0438 admission-\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b (\u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 labels), \u0438 <code>cert-manager<\/code> (\u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438), \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441 <code>kubectl apply<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u043e\u0438 \u043f\u043e\u043b\u044f \u0438 \u043d\u0435 \u043b\u0435\u0437\u0435\u0442 \u0432 \u0447\u0443\u0436\u0438\u0435. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0432 Kubernetes \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0447\u0430\u0441\u0442\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0433\u043e\u043d\u043a\u0443 \u2014 \u0438 \u043a\u0430\u043a \u0438\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0438\u0448\u0435\u0442\u0435 \u0432\u044b \u0441\u0430\u043c\u0438. \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<h3>resourceVersion \u0438 optimistic concurrency<\/h3>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0432 API: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 Kubernetes \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 <code>metadata.resourceVersion<\/code> \u2014 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u2014 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0443\u0449\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432 etcd. apiserver \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 \u0438 \u0436\u0434\u0451\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 <code>r.Update(ctx, &amp;obj)<\/code>, \u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, <strong>\u0432\u043a\u043b\u044e\u0447\u0430\u044f <\/strong><code><strong>resourceVersion<\/strong><\/code>. apiserver \u0441\u0432\u0435\u0440\u044f\u0435\u0442:<\/p>\n<ul>\n<li>\n<p><code>resourceVersion<\/code> \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 etcd \u2192 \u043f\u0438\u0448\u0435\u043c, \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0432 etcd \u0443\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u0435\u0435 \u2192 <code>409 Conflict<\/code>, \u00ab\u043a\u0442\u043e-\u0442\u043e \u0442\u0435\u0431\u044f \u043e\u043f\u0435\u0440\u0435\u0434\u0438\u043b\u00bb.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c <strong>optimistic concurrency control<\/strong>. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u043d\u0435 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u2014 \u0432\u0441\u0435 \u043f\u0438\u0448\u0443\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0438\u0437 \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 <code>Update<\/code> \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442, \u0447\u0435\u0439 <code>resourceVersion<\/code> \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u044b\u043b \u0441\u0432\u0435\u0436\u0438\u043c. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 <code>409<\/code>, \u0438 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043d\u043e\u0432\u0430.<\/p>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0447\u0435\u0441\u0442\u043d\u044b\u0439, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430. <code>Update<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <strong>\u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/strong>: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435, \u0432 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438 \u0432\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u0435 <code>409<\/code>. \u0418 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435, \u0432\u0430\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c <strong>\u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b retry<\/strong> \u2014 \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0441\u043e \u0441\u0432\u0435\u0436\u0438\u043c <code>resourceVersion<\/code> \u0438 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043d\u0451\u0441 \u043a\u0442\u043e-\u0442\u043e \u0435\u0449\u0451), \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 apiserver. \u0418 \u0442\u0430\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u0451\u0442 \u00ab\u043f\u043e\u043f\u0430\u0441\u0442\u044c\u00bb \u043c\u0435\u0436\u0434\u0443 \u0447\u0443\u0436\u0438\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438. \u0412 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 \u044d\u0442\u043e\u0442 retry-\u0446\u0438\u043a\u043b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0449\u0443\u0442\u0438\u043c\u0443\u044e \u0434\u043e\u043b\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u00ab\u043c\u043e\u0451 \u043f\u043e\u043b\u0435 \/ \u0447\u0443\u0436\u043e\u0435 \u043f\u043e\u043b\u0435\u00bb. \u0412\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0442\u0435 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u0438 \u2014 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <strong>Patch<\/strong>.<\/p>\n<h3>\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f: Patch<\/h3>\n<p>Patch \u2014 \u044d\u0442\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u043d\u0435 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u0412 Kubernetes \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 patch-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439; \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 apiserver, \u0438 <code>controller-runtime<\/code>. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u2014 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0433\u043e.<\/p>\n<h4>JSON Merge Patch (RFC 7396)<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 JSON \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"json\">{ \"spec\": { \"replicas\": 5 } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e \u2014 apiserver \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442. \u041f\u043e\u043b\u044f \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>null<\/code> \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f. \u0412 <code>controller-runtime<\/code> \u0437\u0430 \u044d\u0442\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0441\u0442\u043e\u0438\u0442 <code>client.MergeFrom(original)<\/code>, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0432\u044b \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0435 \u0432 \u043a\u043e\u0434\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <code>status<\/code>.<\/p>\n<p>\u0423 Merge Patch \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043e\u0449\u0443\u0442\u0438\u043c\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430. \u042d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 RFC 7396: <strong>\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u0435\u0440\u0434\u0436\u0430\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e<\/strong>, \u043a\u043b\u044e\u0447-\u043a-\u043a\u043b\u044e\u0447\u0443, <strong>\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u2014 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/strong>. \u0422\u043e \u0435\u0441\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u0432 patch\u2019\u0435, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439, \u043a\u0430\u043a\u0438\u0435 \u0431\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u0430\u043c \u043d\u0438 \u0431\u044b\u043b\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 (<code>labels<\/code>, <code>annotations<\/code>) \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u044e\u0447 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e. \u0410 \u0432\u043e\u0442 \u0441\u043f\u0438\u0441\u043a\u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u043c: \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c <code>image<\/code> \u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 <code>spec.containers<\/code> \u2014 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u0442\u043e-\u0442\u043e \u0440\u044f\u0434\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2014 \u0432\u044b \u0435\u0433\u043e \u0441\u043e\u0442\u0440\u0451\u0442\u0435, \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044f \u043e\u0431 \u044d\u0442\u043e\u043c.<\/p>\n<h4>JSON Patch (RFC 6902)<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. JSON Patch \u2014 \u044d\u0442\u043e \u044f\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438:<\/p>\n<pre><code class=\"json\">[  { \"op\": \"replace\", \"path\": \"\/spec\/containers\/0\/image\", \"value\": \"nginx:1.27\" },  { \"op\": \"add\",     \"path\": \"\/metadata\/labels\/foo\",     \"value\": \"bar\" },  { \"op\": \"remove\",  \"path\": \"\/metadata\/annotations\/legacy\" }]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043f\u0440\u044f\u043c\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435: \u00ab\u0437\u0430\u043c\u0435\u043d\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 0 \u0441\u043f\u0438\u0441\u043a\u0430 <code>containers<\/code>\u00bb, \u00ab\u0434\u043e\u0431\u0430\u0432\u044c \u043a\u043b\u044e\u0447 \u0432 <code>labels<\/code>\u00bb, \u00ab\u0443\u0434\u0430\u043b\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e\u00bb. \u0421\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043d\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u00ab\u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a\u00bb, \u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0412 <code>controller-runtime<\/code> \u044d\u0442\u043e <code>client.RawPatch(types.JSONPatchType, ...)<\/code>:<\/p>\n<pre><code class=\"go\">patchBytes := []byte(`[    {\"op\":\"remove\",\"path\":\"\/metadata\/finalizers\/0\"}]`)if err := r.Patch(ctx, &amp;obj, client.RawPatch(types.JSONPatchType, patchBytes)); err != nil {    return err}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 JSON Patch \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e. \u041f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u044b\u0440\u043e\u0433\u043e JSON, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0438\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438; \u0438\u0437-\u0437\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u044b Go \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0430-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435, \u043b\u044e\u0431\u0430\u044f \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u0432 <code>path<\/code> \u0432\u0441\u043f\u043b\u044b\u0432\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e\u0442 <code>MergeFrom<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 diff \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>JSON Patch \u0443\u0434\u043e\u0431\u0435\u043d \u0432 \u043d\u0438\u0448\u0435\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445, \u0433\u0434\u0435 \u0432\u0430\u0436\u043d\u0430 \u0442\u043e\u0447\u0435\u0447\u043d\u0430\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f: \u0441\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (<code>remove<\/code> \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443), \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438\u0437 \u043a\u0430\u0440\u0442\u044b, \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c compare-and-swap \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>test<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0437\u043d\u0430\u0435\u0442\u0435 \u0438 \u0442\u043e\u0447\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u0438 \u0442\u043e\u0447\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u00ab\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 diff\u00bb.<\/p>\n<h4>Strategic Merge Patch<\/h4>\n<p>Strategic Merge Patch (SMP) \u2014 k8s-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 Merge Patch \u0441 \u0443\u043c\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0443 JSON Patch. \u0412\u043d\u0435\u0448\u043d\u0435 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 JSON-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u043a\u0430\u043a Merge Patch:<\/p>\n<pre><code class=\"json\">{ \"spec\": { \"containers\": [ { \"name\": \"app\", \"image\": \"nginx:1.27\" } ] } }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e apiserver \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0443\u043c\u043d\u0435\u0435. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 Kubernetes \u0432 Go-\u0442\u0435\u0433\u0430\u0445 \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0437\u0430\u0448\u0438\u0442\u0430 <strong>patch-strategy<\/strong> \u2014 <code>patchStrategy:\"merge\"<\/code>, <code>patchMergeKey:\"name\"<\/code>, <code>patchStrategy:\"replace\"<\/code> \u0438 \u0442. \u043f. \u041f\u043e \u044d\u0442\u0438\u043c \u0442\u0435\u0433\u0430\u043c apiserver \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043a\u0438 <code>containers<\/code> \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u0440\u0436\u0438\u0442\u044c <strong>\u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e \u043f\u043e \u043a\u043b\u044e\u0447\u0443<\/strong> <code>name<\/code>: \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043c\u0435\u043d\u044f\u0435\u0442\u0435, \u2014 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e <code>volumeMounts<\/code> \u043c\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u2014 \u043f\u043e <code>name<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>args<\/code> \u0438\u043b\u0438 <code>command<\/code> \u043c\u0435\u0440\u0436\u0438\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043b\u044c\u0437\u044f, \u0438 \u043f\u0440\u0438 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0438 \u0432 patch\u2019\u0435 \u043e\u043d\u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043b\u0435\u0439-\u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u043c\u0435\u0440\u0436 \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>kubectl apply<\/code> (\u0431\u0435\u0437 <code>--server-side<\/code>). \u0412 <code>controller-runtime<\/code> \u2014 <code>client.StrategicMergeFrom(original)<\/code>.<\/p>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: <strong>SMP \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 Kubernetes-\u0442\u0438\u043f\u043e\u0432<\/strong>. \u0414\u043b\u044f CRD apiserver \u0435\u0433\u043e <strong>\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435<\/strong> \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 <code>Content-Type: application\/strategic-merge-patch+json<\/code> \u043a CRD \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0432\u0435\u0440\u0433\u0430\u0435\u0442\u0441\u044f. \u0414\u043b\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 CRD \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f JSON Patch \u0438 JSON Merge Patch \u2014 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c.<\/p>\n<p>\u0423\u043c\u043d\u043e\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u043b\u044f CRD \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Server-Side Apply, \u0438 \u0442\u0430\u043c \u2014 \u043d\u0435 \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e SSA \u0434\u043b\u044f CRD <strong>\u0442\u043e\u0436\u0435<\/strong> \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0445 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0427\u0442\u043e\u0431\u044b apiserver \u043c\u0435\u0440\u0436\u0438\u043b \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e, \u0432 \u0441\u0445\u0435\u043c\u0435 CRD \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u044b <code>x-kubernetes-list-type: map<\/code> \u0438 <code>x-kubernetes-list-map-keys<\/code>. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>controller-gen<\/code> (<code>+listType=map<\/code>, <code>+listMapKey=name<\/code>), \u0438 <code>kubebuilder<\/code> \u044d\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/p>\n<h4>Patch \u0431\u0435\u0437 resourceVersion<\/h4>\n<p>\u0422\u043e\u043d\u043a\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u043e \u0443\u043f\u0443\u0441\u043a\u0430\u044e\u0442. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"go\">original := obj.DeepCopy()obj.Spec.Replicas = ptr.To[int32](5)patch := client.MergeFrom(original)if err := r.Patch(ctx, obj, patch); err != nil {    return err}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a <code>client.MergeFrom<\/code> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 payload patch-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041b\u043e\u0433\u0438\u043a\u0430 \u0442\u0430\u043a\u0430\u044f: \u0432\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 <code>obj.DeepCopy()<\/code> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432 <code>original<\/code>. \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 <code>obj<\/code>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e <code>client.MergeFrom<\/code> \u0431\u0435\u0440\u0451\u0442 \u0434\u0432\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u2014 <code>original<\/code> \u0438 <code>obj<\/code> \u2014 \u0438 <strong>\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 diff<\/strong>. \u042d\u0442\u043e\u0442 diff \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u0435\u043b\u043e\u043c PATCH-\u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u0436\u0434\u0443 <code>original<\/code> \u0438 <code>obj<\/code> \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u2014 <code>spec.replicas<\/code>. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0439\u0434\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u043e. \u041f\u043e\u043b\u0435 <code>metadata.resourceVersion<\/code> \u0432 diff <strong>\u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0451\u0442<\/strong> \u2014 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0438, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <code>original<\/code> \u0438 <code>obj<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: apiserver, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 PATCH \u0431\u0435\u0437 <code>resourceVersion<\/code> \u0432 payload, \u0435\u0433\u043e <strong>\u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442<\/strong>. \u041e\u043d \u0431\u0435\u0440\u0451\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 etcd, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0430\u0448 \u043f\u0430\u0442\u0447 \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0435\u0433\u043e \u0438 \u043f\u0438\u0448\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 <code>409 Conflict<\/code>, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e optimistic lock \u2014 \u044d\u0442\u043e \u0448\u0442\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043d\u0435 \u0431\u0430\u0433: \u0432\u044b \u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u00ab\u0438\u0437\u043c\u0435\u043d\u0438 \u043c\u043d\u0435 \u0432\u043e\u0442 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f\u00bb, apiserver \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0438\u0445 \u043f\u043e\u0432\u0435\u0440\u0445 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043a\u0430\u043a\u043e\u0439 \u0431\u044b \u043e\u043d\u0430 \u043d\u0438 \u0431\u044b\u043b\u0430.<\/p>\n<p>\u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0432\u0430\u0448\u0435 \u043f\u043e\u043b\u0435 \u043d\u0438\u043a\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442 \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u0442\u043e <code>status<\/code> \u0432\u0430\u0448\u0435\u0433\u043e CRD, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0448\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0443\u0436\u0435\u043d optimistic lock \u0438 \u043f\u0440\u0438 patch\u2019\u0435 \u2014 \u0432 <code>controller-runtime<\/code> \u0435\u0441\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431:<\/p>\n<pre><code class=\"go\">patch := client.MergeFromWithOptions(original, client.MergeFromWithOptimisticLock{})<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 <code>resourceVersion<\/code> \u043f\u043e\u043f\u0430\u0434\u0451\u0442 \u0432 diff, \u0438 apiserver \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c.<\/p>\n<p>Patch \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u043e\u043c\u0443 \u043a\u0430\u043a\u043e\u0435 \u043f\u043e\u043b\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442\u00bb. \u041b\u044e\u0431\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 <code>update<\/code> \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0430\u0442\u0447\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 apiserver \u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442, \u043d\u0430 \u0447\u044c\u0438 \u043f\u043e\u043b\u044f \u043e\u043d \u043f\u043e\u0441\u044f\u0433\u043d\u0443\u043b. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043c\u0435\u0436\u0434\u0443 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 <code>spec<\/code>, \u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u2014 \u0432 <code>status<\/code>), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <strong>subresources<\/strong>.<\/p>\n<h3>Subresources: \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0432\u0435\u0440\u0438 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 Kubernetes, \u0443 \u043d\u0435\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0441\u0435\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code><strong>metadata<\/strong><\/code> \u2014 \u043e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 (\u0438\u043c\u044f, namespace, labels, annotations, owner-\u0441\u0441\u044b\u043b\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438). \u042d\u0442\u0430 \u0441\u0435\u043a\u0446\u0438\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Kubernetes;<\/p>\n<\/li>\n<li>\n<p><code><strong>spec<\/strong><\/code> \u2014 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c;<\/p>\n<\/li>\n<li>\n<p><code><strong>status<\/strong><\/code> \u2014 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u044d\u0442\u0438 \u0441\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u043d\u0430\u044f. \u0421 <code>metadata<\/code> \u0438 <code>spec<\/code> \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043a\u043b\u0438\u0435\u043d\u0442 \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, GitOps-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440. \u0421\u043e <code>status<\/code> \u2014 \u0440\u0435\u043a\u043e\u043d\u0441\u0430\u0439\u043b\u0435\u0440 \u0441\u0430\u043c\u043e\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430. RBAC \u0432 Kubernetes \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441 \u0446\u0435\u043b\u0438\u043a\u043e\u043c: \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 <code>update<\/code> \u043d\u0430 \u0435\u0434\u0438\u043d\u044b\u0439 HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0438 <code>spec<\/code>, \u0438 <code>status<\/code>, \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0441\u0435\u043a\u0446\u0438\u044f\u043c\u0438 \u0432 \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u2014 \u0430 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<p>\u042d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <strong>subresources<\/strong>. \u0423 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 API \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432: \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u2014 \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a \u043d\u0435\u043c\u0443 \u043a\u0430\u043a \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044e. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u2014 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0441\u0432\u043e\u0438\u043c\u0438 RBAC-\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u0411\u044b\u0432\u0430\u044e\u0442 \u043e\u043d\u0438 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432.<\/p>\n<p><strong>\u0418\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435<\/strong> \u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f\u00bb, \u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0434 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u0427\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u0432 Kubernetes \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a <code>kubectl logs<\/code> (subresource <code>\/log<\/code>), <code>kubectl exec<\/code> (<code>\/exec<\/code>), <code>kubectl port-forward<\/code> (<code>\/portforward<\/code>), <code>kubectl attach<\/code> (<code>\/attach<\/code>). \u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0438\u0448\u0443\u0442 \u0432 etcd, \u0430 \u0434\u0435\u043b\u0430\u044e\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u0440\u0443\u0436\u043d\u043e\u0435 \u2014 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442 stream \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443, \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p><strong>\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435<\/strong> \u2014 \u044d\u0442\u043e subresource, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 YAML, \u043d\u043e \u0436\u0438\u0432\u0451\u0442 \u0437\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u00ab\u0434\u0432\u0435\u0440\u044c\u044e\u00bb \u0432 API. \u0421\u0430\u043c\u044b\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 <code>\/status<\/code>. \u0414\u043b\u044f CRD \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 <code>CustomResourceDefinition<\/code> \u044f\u0432\u043d\u043e:<\/p>\n<pre><code class=\"yaml\">spec:  versions:  - name: v1    subresources:      status: {}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443 \u0432\u0430\u0448\u0435\u0433\u043e CRD \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 HTTP-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 <code>\/status<\/code>. \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 <strong>\u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442<\/strong> \u0432 etcd \u0441 \u0435\u0434\u0438\u043d\u043e\u0439 <code>resourceVersion<\/code> \u2014 \u0432 YAML \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 <code>metadata<\/code>, <code>spec<\/code> \u0438 <code>status<\/code> \u0440\u044f\u0434\u043e\u043c, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e. \u041d\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 API:<\/p>\n<ul>\n<li>\n<p><code>PATCH \/apis\/example.com\/v1\/...\/foobars\/my-foo<\/code> \u2014 \u043c\u0435\u043d\u044f\u0435\u0442 <code>spec<\/code> \u0438 <code>metadata<\/code>. \u041f\u043e\u043b\u0435 <code>status<\/code> \u0432 payload <strong>\u043c\u043e\u043b\u0447\u0430 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/strong> apiserver\u2019\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><code>PATCH \/apis\/example.com\/v1\/...\/foobars\/my-foo\/status<\/code> \u2014 \u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <code>status<\/code>. \u041f\u043e\u043b\u0435 <code>spec<\/code> \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u0447\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435? \u041f\u0440\u0438\u0447\u0438\u043d \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0438 RBAC \u2014 \u043b\u0438\u0448\u044c \u0441\u0430\u043c\u0430\u044f \u0432\u0438\u0434\u0438\u043c\u0430\u044f \u0438\u0437 \u043d\u0438\u0445:<\/p>\n<ul>\n<li>\n<p><strong>\u0420\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/strong> \u041d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0432\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 RBAC-\u043f\u0440\u0430\u0432\u0438\u043b\u0430: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f <code>update<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u2014 \u043d\u0430 subresource <code>\/status<\/code>. \u0423 Pod \u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0436\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u044f: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <code>pods\/status<\/code>, \u0443 kubelet \u2014 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u0438 \u0435\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0435\u0439.<\/strong> \u0417\u0430\u043f\u0438\u0441\u044c \u0432 <code>status<\/code> \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 <code>spec<\/code> \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u042d\u0442\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0446\u0435\u043b\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0433\u043e\u043d\u043e\u043a \u043f\u0440\u0438 <code>kubectl apply<\/code>: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 apply \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0438 \u043e\u043d\u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0442\u0440\u0443\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0435\u043d\u044f\u044e\u0442 \u043d\u0435\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043a\u0443\u0441\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u043d\u044b\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432.<\/strong> \u0417\u0430\u043f\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 <code>\/status<\/code> \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u0435\u0442 <code>metadata.generation<\/code> \u2014 \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d <code>observedGeneration<\/code> (\u043f\u0440\u043e \u043d\u0435\u0433\u043e \u043d\u0438\u0436\u0435).<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0438 admission-\u0446\u0435\u043f\u043e\u0447\u043a\u0430<\/strong> \u0434\u043b\u044f status \u2014 webhook\u2019\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 spec \u043d\u0435 \u0434\u0451\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0445 \u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e status.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 watch-\u043a\u0430\u043d\u0430\u043b \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/strong> \u2014 apiserver \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 <code>\/status<\/code> \u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 <code>controller-runtime<\/code> \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 API \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2014 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <code>\/status<\/code> \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u00ab\u0444\u0430\u0441\u0430\u0434\u00bb <code>r.Status()<\/code>:<\/p>\n<pre><code class=\"go\">\/\/ \u041f\u0438\u0448\u0435\u043c \u0432 \/status, spec \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u043cobj.Status.Phase = \"Ready\"if err := r.Status().Update(ctx, &amp;obj); err != nil {    return err}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u2014 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u043c <code>r.Update<\/code>. \u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043a\u0438, \u0432 \u043a\u043e\u0434\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u043e\u043a, \u043d\u043e \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 <code>status<\/code> \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c: apiserver \u043c\u043e\u043b\u0447\u0430 \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u043b \u044d\u0442\u043e \u043f\u043e\u043b\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e endpoint \u043d\u0435 \u0442\u043e\u0442.<\/p>\n<h4>\/scale: subresource \u043a\u0430\u043a \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439<\/h4>\n<p>\u041d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 decl-subresource \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0434\u0440\u0443\u0433\u0430\u044f \u0434\u0432\u0435\u0440\u044c \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u043e\u043b\u044e\u00bb. \u0418\u043d\u043e\u0433\u0434\u0430 subresource \u2014 \u044d\u0442\u043e <strong>\u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0441 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0432 apiserver \u043b\u043e\u0433\u0438\u043a\u043e\u0439<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u043e \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443. \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 <code>\/scale<\/code> \u0443 Deployment, ReplicaSet, StatefulSet.<\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f API, <code>\/scale<\/code> \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>autoscaling\/v1.Scale<\/code> \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 <code>spec.replicas<\/code> \u0438 <code>status.replicas<\/code>. \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439, \u043e\u0431\u0449\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 scalable-\u0442\u0438\u043f\u043e\u0432. HPA \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0438\u043c: \u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0430\u0432 \u043d\u0430 <code>deployments\/scale<\/code>, <code>statefulsets\/scale<\/code>, <code>replicasets\/scale<\/code>, \u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 <code>update<\/code> \u043d\u0430 \u0441\u0430\u043c\u0438 Deployment\u2019\u044b \/ ReplicaSet\u2019\u044b \/ StatefulSet\u2019\u044b \u2014 \u0430 \u044d\u0442\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0430\u0442\u0430\u043a\u0438 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 apiserver \u043c\u0430\u043f\u043f\u0438\u043d\u0433 <code>\/scale<\/code> \u043d\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d: \u00ab<code>Deployment.spec.replicas<\/code> \u2194 <code>Scale.spec.replicas<\/code>\u00bb, \u00ab<code>Deployment.status.replicas<\/code> \u2194 <code>Scale.status.replicas<\/code>\u00bb. \u042d\u0442\u0430 \u0441\u0432\u044f\u0437\u044c \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0441\u0445\u0435\u043c\u0435 \u2014 \u043e\u043d\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435 apiserver\u2019\u0430. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439.<\/p>\n<p>\u041f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 subresources: <code>\/binding<\/code> \u0443 Pod (\u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e scheduler \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 <code>spec.nodeName<\/code>), <code>\/eviction<\/code> \u0443 Pod (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 <code>kubectl drain<\/code> \u0441 \u0443\u0447\u0451\u0442\u043e\u043c <code>PodDisruptionBudget<\/code>), <code>\/finalize<\/code> \u0443 Namespace, <code>\/token<\/code> \u0443 ServiceAccount \u2014 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u0440\u0443\u0433 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/p>\n<blockquote>\n<p><strong>\u041a\u0441\u0442\u0430\u0442\u0438.<\/strong> \u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c subresource \u0441 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0448\u0442\u0430\u0442\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u2014 <strong>Aggregation API Layer<\/strong>. \u0412\u043c\u0435\u0441\u0442\u043e CRD \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 API server, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 <code>kube-apiserver<\/code> \u0447\u0435\u0440\u0435\u0437 <code>APIService<\/code> \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0441 \u043b\u044e\u0431\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0440\u043e aggregation \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0438\u0441\u0430\u043b \u0432 <a href=\"https:\/\/kubernetes.io\/blog\/2024\/11\/21\/dynamic-kubernetes-api-server-for-cozystack\/\">\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/a>. \u0417\u0434\u0435\u0441\u044c \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a \u0434\u0430\u043b\u0435\u043a\u043e \u0442\u044f\u043d\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u00ab\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0432\u0435\u0440\u0435\u0439 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443\u00bb. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u043c\u0435.<\/p>\n<\/blockquote>\n<h4>generation \u0438 observedGeneration<\/h4>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e <code>resourceVersion<\/code>, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 <code>metadata<\/code> \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u2014 <code><strong>generation<\/strong><\/code>. Apiserver \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e <strong>\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 <\/strong><code><strong>spec<\/strong><\/code>: \u043f\u0440\u0430\u0432\u043a\u0438 \u0432 <code>status<\/code> \u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043f\u043e\u043b\u044f\u0445 <code>metadata<\/code> \u0435\u0433\u043e \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u044e\u0442. \u0413\u0434\u0435 <code>resourceVersion<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0445\u043e\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c\u00bb, <code>generation<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u00ab\u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0442\u043e, \u0447\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u00bb.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d <code>status.observedGeneration<\/code>. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0440\u0435\u043a\u043e\u043d\u0441\u0430\u0439\u043b\u0435 \u043f\u0438\u0448\u0435\u0442 \u0432 <code>status.observedGeneration<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e <code>metadata.generation<\/code>. \u041f\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043c \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e, \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043b\u0438 <code>status<\/code> \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 <code>spec<\/code>:<\/p>\n<ul>\n<li>\n<p><code>observedGeneration == generation<\/code> \u2192 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0443\u0436\u0435 \u043e\u0442\u0440\u0435\u043a\u043e\u043d\u0441\u0430\u0439\u043b\u0438\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e <code>spec<\/code>, \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 <code>status<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u0438\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p><code>observedGeneration &lt; generation<\/code> \u2192 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u043b <code>spec<\/code>, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0435\u0449\u0451 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043e\u0442\u0440\u0435\u043a\u043e\u043d\u0441\u0430\u0439\u043b\u0438\u0442\u044c \u2014 <code>status<\/code> \u0443\u0441\u0442\u0430\u0440\u0435\u043b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0423 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p><strong>\u0421\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435. \u0415\u0441\u043b\u0438 <code>observedGeneration == generation<\/code>, \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439, \u0447\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u043c, \u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0442\u044c. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b <code>spec<\/code>, \u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0432\u0441\u044e \u0440\u0435\u043a\u043e\u043d\u0441\u0430\u0439\u043b-\u043b\u043e\u0433\u0438\u043a\u0443 \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0441\u043b\u043e\u0432\u0438\u044f \u0432 <\/strong><code><strong>status.conditions<\/strong><\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u0435\u0435. \u0425\u043e\u0440\u043e\u0448\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0442\u043e\u0436\u0435 \u043f\u0438\u0448\u0443\u0442 <code>observedGeneration<\/code> \u2014 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 (kubectl, \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b, \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b) \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043a \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <code>spec<\/code> \u0438\u043b\u0438 \u043a \u0435\u0449\u0451 \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u00abReady: True\u00bb \u0438 \u0434\u0443\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0448\u0451\u043b \u0434\u043e \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e apply.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0442\u043b\u0430\u0434\u043a\u0430.<\/strong> \u0415\u0441\u043b\u0438 <code>observedGeneration<\/code> \u043e\u0442\u0441\u0442\u0430\u0451\u0442 \u043e\u0442 <code>generation<\/code> \u0438 \u043d\u0435 \u0440\u0430\u0441\u0442\u0451\u0442, \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u043a\u0443\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0435 \u00ab\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u00bb. \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043b\u0438\u0431\u043e \u0443\u043f\u0430\u043b, \u043b\u0438\u0431\u043e \u0437\u0430\u0441\u0442\u0440\u044f\u043b \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0435 \u2014 \u0438 <code>metadata.generation<\/code> \u043f\u0440\u043e\u0442\u0438\u0432 <code>status.observedGeneration<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e subresource <code>\/status<\/code>: \u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u0435\u0442 <code>generation<\/code>. \u0415\u0441\u043b\u0438 \u0431\u044b \u0441\u0442\u0430\u0442\u0443\u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043f\u0440\u044b\u0433\u0430\u043b \u0431\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0432\u0435\u0441\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u0431\u044b \u0441\u043c\u044b\u0441\u043b.<\/p>\n<h4>\u0413\u0434\u0435 subresources \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f<\/h4>\n<p>\u0417\u0430\u0432\u043e\u0434\u0438\u0442\u044c subresource \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0445 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u043e. \u042d\u0442\u043e \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 operability (\u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 subresource \u043d\u0443\u0436\u043d\u044b \u0441\u0432\u043e\u0438 RBAC-\u043f\u0440\u0430\u0432\u0430 \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0437\u043e\u0432\u0430), \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f: \u0432 <code>controller-runtime<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434 subresource \u043d\u0443\u0436\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 writer, \u0438 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043e\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f <code>\/status<\/code> (\u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c <code>r.Status()<\/code> \u2192 <code>StatusWriter<\/code>). \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e <code>MyCustomSubresourceWriter<\/code> \u043f\u043e\u0434 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 subresource \u0442\u0430\u043c \u043d\u0435\u0442 \u2014 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u0432\u043e\u0439 subresource \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0447\u0435\u0440\u0435\u0437 <code>client.SubResource(\"...\").Patch\/Update<\/code>. \u0418 \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c.<\/p>\n<p>\u0410 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f subresources \u0433\u0440\u0443\u0431\u0430\u044f, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0435\u043a\u0446\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (<code>spec<\/code> vs <code>status<\/code>), \u0430 \u043d\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b Deployment \u0447\u0435\u0440\u0435\u0437 <code>kubectl apply -f<\/code>, \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 <code>spec.replicas: 3<\/code>. \u0427\u0435\u0440\u0435\u0437 \u0447\u0430\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f HPA \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b <code>spec.replicas: 12<\/code> \u043f\u043e\u0434 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d <code>kubectl apply<\/code> \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043c\u0435\u043d\u044f\u043b <code>image<\/code> \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0441 <code>replicas<\/code>? \u0415\u0441\u043b\u0438 <code>kubectl apply<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 \u0432\u0435\u0441\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u043c Update\u2019\u043e\u043c, \u043e\u043d \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442 <code>replicas<\/code> \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 3, \u0438 HPA \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>Subresources \u0432 \u044d\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442: \u0438 <code>replicas<\/code>, \u0438 <code>image<\/code> \u043b\u0435\u0436\u0430\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e <code>spec<\/code>, \u0432 \u043e\u0434\u043d\u043e\u043c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043d\u043a\u043e\u0439 \u0433\u0440\u0430\u043d\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u043d\u0435 \u0435\u0433\u043e \u0441\u0435\u043a\u0446\u0438\u0439.<\/p>\n<h3>kubectl apply \u0438 three-way merge \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435<\/h3>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e <strong>three-way merge<\/strong> \u2014 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e <code>kubectl apply<\/code>. \u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e: \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442, \u0434\u0435\u043b\u0430\u0435\u0442\u0435 <code>kubectl apply -f<\/code>, \u0438 <code>kubectl<\/code> \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. \u041d\u043e \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e? \u0415\u0441\u043b\u0438 \u0431\u044b \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b <code>Update<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0432\u044b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0431\u044b \u0432\u0441\u0451, \u0447\u0442\u043e \u0442\u0443\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u2014 HPA, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u043c\u0443\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0431\u0445\u0443\u043a\u0438. \u0415\u0441\u043b\u0438 \u0431\u044b \u0434\u0451\u0440\u0433\u0430\u043b <code>Patch<\/code> \u2014 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0440\u0443\u043a\u0430\u043c\u0438 \u0440\u0435\u0448\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043c\u0435\u043d\u044f\u0442\u044c, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c. \u041d\u0443\u0436\u0435\u043d \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0447\u0435\u0442\u0430\u043b \u0431\u044b \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0441 \u0443\u0432\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043a \u0447\u0443\u0436\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0434\u043b\u044f <code>kubectl apply<\/code> \u2014 \u044d\u0442\u043e <strong>three-way merge \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435<\/strong>. \u0418\u0434\u0435\u044f \u0442\u0430\u043a\u0430\u044f: <code>kubectl<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>kubectl.kubernetes.io\/last-applied-configuration<\/code> \u0442\u043e\u0442 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <strong>\u0432\u044b \u0441\u0430\u043c\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438<\/strong>. \u041f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c apply \u0443 <code>kubectl<\/code> \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0442\u0440\u0438 \u0432\u0435\u0440\u0441\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><strong>last-applied<\/strong> \u2014 \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 (\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438);<\/p>\n<\/li>\n<li>\n<p><strong>current<\/strong> \u2014 \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 etcd (\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>Get<\/code>);<\/p>\n<\/li>\n<li>\n<p><strong>new<\/strong> \u2014 \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 (\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0441 \u0434\u0438\u0441\u043a\u0430).<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 <code>kubectl<\/code> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 <strong>diff \u043c\u0435\u0436\u0434\u0443 last-applied \u0438 new<\/strong> \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u0442\u043e, \u0447\u0442\u043e <strong>\u0432\u044b<\/strong> \u0445\u043e\u0442\u0435\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u00bb. \u042d\u0442\u043e\u0442 diff \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a current \u0447\u0435\u0440\u0435\u0437 Strategic Merge Patch. \u0412 \u0438\u0442\u043e\u0433\u0435:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0438\u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438, \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0443\u0434\u0430\u043b\u0438\u043b\u0438 \u0438\u0437 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430, \u2014 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e diff \u043c\u0435\u0436\u0434\u0443 last-applied \u0438 new \u0438\u0445 \u00ab\u0437\u043d\u0430\u0435\u0442\u00bb).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 last-applied \u043d\u0435 \u0431\u044b\u043b\u043e, \u043d\u043e \u043a\u0442\u043e-\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 current (\u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043c\u0443\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0431\u0445\u0443\u043a, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0447\u0435\u0440\u0435\u0437 <code>kubectl edit<\/code>), \u2014 <strong>\u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c\u0438<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b \u0438\u0445 \u00ab\u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b\u0438\u00bb.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430 \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c: \u0437\u0430 \u043d\u0438\u043c \u0441\u0442\u043e\u044f\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u00ab\u0432\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441\u0430\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438\u00bb. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 GitOps-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0445 client-side apply.<\/p>\n<blockquote>\n<p><strong>\u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u0440\u043e Helm.<\/strong> \u0422\u043e\u0442 \u0436\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d three-way merge \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0432 <code>helm<\/code>, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0435 \u0436\u0435 \u0442\u0440\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u2014 \u00ab\u043f\u0440\u043e\u0448\u043b\u0430\u044f\u00bb, \u00ab\u0442\u043e, \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0441\u0435\u0439\u0447\u0430\u0441\u00bb \u0438 \u00ab\u043d\u043e\u0432\u0430\u044f\u00bb, \u2014 \u043d\u043e \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u00ab\u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u00bb Helm \u0432\u044b\u0431\u0440\u0430\u043b \u043d\u0435 \u0432 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c <code>Secret<\/code> \u0442\u0438\u043f\u0430 <code>helm.sh\/release.v1<\/code> \u0432 namespace \u0440\u0435\u043b\u0438\u0437\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u0435\u043a\u0440\u0435\u0442\u0435 \u043b\u0435\u0436\u0430\u0442 \u0441\u0436\u0430\u0442\u044b\u0435 \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u043e\u043d\u0430. \u041f\u0440\u0438 <code>helm upgrade<\/code> \u043e\u043d \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043d\u043e\u0432\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u043e\u043c \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u0438 Helm \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0443. \u0414\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 \u2014 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0437\u0430\u0442\u0451\u0440\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c <code>kubectl edit<\/code>. \u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u0442\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e \u0438 \u0443 <code>kubectl apply<\/code>: \u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c Helm, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u00ab\u043a\u0442\u043e \u0447\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442\u00bb \u044d\u0442\u043e \u043d\u0435 \u0434\u0430\u0451\u0442.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u0443 client-side apply \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043b\u0430\u0431\u043e\u0435 \u043c\u0435\u0441\u0442\u043e: \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0436\u0438\u0432\u0451\u0442 <strong>\u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435<\/strong>, \u0430 ground truth (last-applied) \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 <strong>\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong>. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0442\u0435\u043a\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u043c\u0443-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>Update<\/code> \u0438\u043b\u0438 <code>Patch<\/code> \u043c\u0438\u043c\u043e <code>kubectl apply<\/code>, \u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>last-applied-configuration<\/code> \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u0435\u0442. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 <code>kubectl apply<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e \u00ab\u0432\u0430\u0448\u0435\u043c\u00bb \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u2014 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 metadata. \u041e\u043d\u0430 \u043d\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u0430, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0441\u0442\u0435\u0440\u0435\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 (<code>kubectl apply<\/code> \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, <code>kubectl apply<\/code> \u0438\u0437 CI, <code>helm apply<\/code> \u043e\u0442 \u0434\u0435\u043f\u043b\u043e\u0439-\u0441\u0438\u0441\u0442\u0435\u043c\u044b) \u2014 \u043e\u043d\u0438 <strong>\u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u043e \u0434\u0440\u0443\u0433\u0435<\/strong> \u0438 \u0437\u0430\u0442\u0438\u0440\u0430\u044e\u0442 \u0447\u0443\u0436\u0438\u0435 last-applied.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u00ab\u043a\u0442\u043e \u0447\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442\u00bb. \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0430\u043a\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 <code>spec.replicas<\/code> \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u00bb.<\/p>\n<\/li>\n<\/ul>\n<p>\u041b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u2014 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0442\u043e\u0442 \u0436\u0435 three-way merge <strong>\u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440<\/strong> \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u0447\u0435\u0441\u0442\u043d\u0443\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u00ab\u043a\u0442\u043e \u0447\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442\u00bb. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c.<\/p>\n<h3>Server-Side Apply: per-field ownership<\/h3>\n<p>\u0418\u0434\u0435\u044f Server-Side Apply (SSA) \u2014 \u0432\u0437\u044f\u0442\u044c three-way merge, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0432 apiserver \u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <strong>\u0441\u0442\u0440\u043e\u0433\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u00ab\u043a\u0442\u043e \u0447\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442\u00bb<\/strong>. \u0424\u0438\u0447\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 GA \u0441 Kubernetes 1.22.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443, \u043d\u0443\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u043e\u0434\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u2014 <strong>field manager<\/strong> (\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440). \u042d\u0442\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u044f\u0440\u043b\u044b\u043a, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 apiserver \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442. \u041d\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u0441\u043c\u044b\u0441\u043b\u0435 \u00ab\u0432\u043e\u0442 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u00bb. \u0414\u043b\u044f <code>kubectl apply --server-side<\/code> \u044d\u0442\u043e <code>kubectl<\/code>, \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u2014 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>my-controller<\/code>), \u0434\u043b\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0430 \u2014 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <code>horizontal-pod-autoscaler<\/code>.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0443\u0442\u044c SSA \u043e\u0434\u043d\u043e\u0439 \u0444\u0440\u0430\u0437\u043e\u0439: <strong>apiserver \u0441\u0430\u043c \u0445\u0440\u0430\u043d\u0438\u0442, \u043a\u0430\u043a\u043e\u0435 \u043f\u043e\u043b\u0435 \u043a\u0430\u043a\u043e\u043c\u0443 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442, \u0438 \u043d\u0435 \u0434\u0430\u0451\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439<\/strong>.<\/p>\n<h4>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/h4>\n<p>SSA \u2014 \u044d\u0442\u043e HTTP <code>PATCH<\/code> \u0441 <code>Content-Type: application\/apply-patch+yaml<\/code> (\u0435\u0441\u0442\u044c \u0438 JSON-\u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043d\u043e YAML \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439). \u0412 \u0442\u0435\u043b\u0435 \u2014 <strong>\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442:<\/p>\n<pre><code class=\"yaml\">apiVersion: example.com\/v1kind: FooBarmetadata:  name: my-foo  namespace: defaultspec:  replicas: 5<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u043a\u0430\u043a \u0431\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u00ab\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0437\u0430 <code>spec.replicas<\/code>, \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u043c \u0431\u044b\u043b\u043e 5\u00bb. apiserver, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<ol>\n<li>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/strong> \u0438\u0437 apply-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (\u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432).<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 ownership<\/strong> \u2014 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u00ab\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 X \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043b\u0430\u0434\u0435\u0435\u0442 <code>spec.replicas<\/code>\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0431\u0438\u0440\u0430\u0435\u0442<\/strong> \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u043b\u0430\u0434\u0435\u043b, \u0435\u0441\u043b\u0438 \u0432 \u043d\u043e\u0432\u043e\u0439 apply-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u0445 \u043d\u0435\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u0435\u043d: \u0432 SSA \u043d\u0435\u043b\u044c\u0437\u044f \u00ab\u0434\u043e\u043f\u0430\u0442\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435, \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0438\u00bb. Apply \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u00ab\u0432\u043e\u0442 \u0432\u0441\u0451, \u0447\u0435\u043c \u044f \u0432\u043b\u0430\u0434\u0435\u044e \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\u00bb. \u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 apply \u0432\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 <code>{spec: {replicas: 5, image: \"foo\"}}<\/code>, \u0430 \u0432 \u043d\u043e\u0432\u043e\u043c \u2014 \u0442\u043e\u043b\u044c\u043a\u043e <code>{spec: {replicas: 5}}<\/code>, \u043f\u043e\u043b\u0435 <code>spec.image<\/code> \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043e.<\/p>\n<h4>managedFields: \u0433\u0434\u0435 \u0436\u0438\u0432\u0451\u0442 ownership<\/h4>\n<p>\u0420\u0430\u0437 apiserver \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0433\u0434\u0435-\u0442\u043e \u044d\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c. \u0425\u0440\u0430\u043d\u0438\u0442 \u043e\u043d \u0432 <code>metadata.managedFields<\/code>:<\/p>\n<pre><code class=\"yaml\">metadata:  managedFields:  - manager: my-controller    operation: Apply    apiVersion: example.com\/v1    time: \"2026-04-23T10:00:00Z\"    fieldsType: FieldsV1    fieldsV1:      f:spec:        f:replicas: {}  - manager: kubectl    operation: Update    apiVersion: example.com\/v1    time: \"2026-04-23T10:01:00Z\"    fieldsType: FieldsV1    fieldsV1:      f:metadata:        f:labels:          f:environment: {}      f:spec:        f:image: {}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e \u043f\u043e\u043b\u044f\u043c:<\/p>\n<ul>\n<li>\n<p><code><strong>manager<\/strong><\/code> \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u043f\u0438\u0441\u0430\u043b. \u0414\u043b\u044f Apply \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>fieldManager<\/code> \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u0414\u043b\u044f Update \u2014 apiserver \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0441\u0430\u043c \u043f\u043e User-Agent\u2019\u0443.<\/p>\n<\/li>\n<li>\n<p><code><strong>operation<\/strong><\/code> \u2014 \u0442\u043e, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: <code>Apply<\/code> (\u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0438\u0448\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 Server-Side Apply) \u0438\u043b\u0438 <code>Update<\/code> (\u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>Update<\/code>, JSON Merge Patch, JSON Patch). apiserver \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043f\u043e\u043b\u0435\u043c, \u043d\u043e \u0438 \u043a\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043e: \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f <code>Apply<\/code>-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u044f\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442, \u0430 \u0432\u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <code>Update<\/code> \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u2014 \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u043f\u043e\u043b\u0435 \u00ab\u043f\u0435\u0440\u0435\u0435\u0434\u0435\u0442\u00bb \u0432 managedFields \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430-Update\u2019\u0430.<\/p>\n<\/li>\n<li>\n<p><code><strong>fieldsV1<\/strong><\/code> \u2014 \u043f\u0443\u0442\u0438 \u043a \u043f\u043e\u043b\u044f\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c <code>f:<\/code>, \u043f\u0443\u0441\u0442\u043e\u0439 <code>{}<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0432\u043b\u0430\u0434\u0435\u044e \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u0435\u043c\u00bb.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438 SSA-\u0437\u0430\u043f\u0440\u043e\u0441\u0435 apiserver \u0441\u043c\u043e\u0442\u0440\u0438\u0442: \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>spec.replicas<\/code>. \u041a\u0442\u043e \u0438\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u043b\u0430\u0434\u0435\u0435\u0442?<\/p>\n<ul>\n<li>\n<p><strong>\u041d\u0438\u043a\u0442\u043e \u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u0436\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440<\/strong> \u2192 \u043f\u0438\u0448\u0435\u043c \u0431\u0435\u0437 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 payload \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e<\/strong> \u2192 <code>409 Conflict<\/code> \u0441 \u0442\u0435\u043b\u043e\u043c \u00ab\u043f\u043e\u043b\u0435 X \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 Y, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 <code>force=true<\/code>\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u043d\u043e \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0432 etcd<\/strong> \u2192 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u043d\u0435\u0442, \u043e\u0431a \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f <strong>\u0441\u043e\u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430\u043c\u0438<\/strong> \u043f\u043e\u043b\u044f (shared ownership). \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f apiserver \u2014 \u0432\u0441\u0435, \u043a\u0442\u043e \u0437\u0430\u044f\u0432\u0438\u043b \u00ab\u044f \u0445\u043e\u0447\u0443 \u0437\u0434\u0435\u0441\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb, \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043f\u0440\u0430\u0432\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 <\/strong><code><strong>force=true<\/strong><\/code> \u2192 \u043e\u0442\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435. \u0421\u0442\u0430\u0440\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0442\u0435\u0440\u044f\u0435\u0442 \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 managedFields, \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c SSA \u2014 \u044d\u0442\u043e <strong>\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438<\/strong>. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 ownership \u2014 <strong>per-field<\/strong>, \u0430 \u043d\u0435 per-object. \u041d\u0430 \u043e\u0434\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0434\u044e\u0436\u0438\u043d\u044b \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432, \u0438 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u0439 \u043a\u0443\u0441\u043e\u043a (\u0430 \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0435\u0439 \u0438 \u0432\u043e\u0432\u0441\u0435 \u043e\u0431\u0449\u0430\u044f).<\/p>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0430\u0436\u043d\u0443\u044e \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0443: <code><strong>managedFields<\/strong><\/code><strong> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u0442\u0435\u0445, \u0447\u0442\u043e \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 SSA<\/strong>. \u0414\u0430\u0436\u0435 \u043f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u043c <code>Update<\/code> \u0438\u043b\u0438 <code>Patch<\/code> apiserver \u0441\u0430\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438, \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u043f\u043e\u0434 \u0432\u0430\u0448\u0438\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u2014 \u0438\u043c\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>User-Agent<\/code> HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u043e\u0442\u0441\u044e\u0434\u0430 \u0432 managedFields \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438 <code>manager: kubectl-client-side-apply<\/code> \u0438\u043b\u0438 <code>manager: kube-controller-manager<\/code> \u0441 <code>operation: Update<\/code>).<\/p>\n<p>\u0422\u043e \u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f SSA: \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 <strong>\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438<\/strong> (Update \/ Patch \/ Apply \u2014 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <code>Get<\/code> \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442) apiserver \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 managedFields, \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044f \u0432\u0441\u0451 \u0438\u043c\u0435\u044e\u0449\u0435\u0435\u0441\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u043c\u0443 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 <code>before-first-apply<\/code>. \u041d\u0430 \u0436\u0438\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0443 \u043b\u044e\u0431\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 managedFields <strong>\u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430<\/strong> \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u2014 \u043f\u0440\u0438\u0447\u0451\u043c \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e, \u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438.<\/p>\n<h4>\u041a\u0430\u043a \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c managedFields \u043d\u0430 \u043f\u0440\u043e\u0434\u0435<\/h4>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, <strong>\u043a\u0442\u043e \u0447\u0435\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435<\/strong>, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>kubectl<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 1.21 \u043f\u0440\u044f\u0447\u0435\u0442 managedFields \u0432 \u0432\u044b\u0432\u043e\u0434\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u044f\u0432\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c:<\/p>\n<pre><code class=\"bash\">kubectl get deployment my-app -o yaml --show-managed-fields<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0435\u0440\u0435\u0437 <code>jq<\/code> \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u0438 \u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"bash\">kubectl get deployment my-app -o json --show-managed-fields \\  | jq '.metadata.managedFields[] | {manager, operation, time}'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u00ab\u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 X \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u0435 Y\u00bb \u2014 \u043e\u0442\u043a\u0440\u044b\u0442\u044c managedFields, \u043d\u0430\u0439\u0442\u0438, \u043a\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u043b\u0435, \u0438 \u0440\u0435\u0448\u0438\u0442\u044c: \u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0441 <code>force<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u0440\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u00ab\u043e\u0442\u043a\u0443\u0434\u0430 \u0432 \u043c\u043e\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0432\u0437\u044f\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u00bb \u2014 managedFields \u043f\u043e\u043a\u0430\u0436\u0443\u0442, \u043a\u0430\u043a\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0435\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0438 \u0432 \u043a\u0430\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<h4>managedFields \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0431\u043e\u043b\u0438<\/h4>\n<p>\u0420\u0430\u0437 \u0443\u0436 managedFields \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435, \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0438 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u2014 \u0442\u043e\u0447\u043d\u0435\u0435, \u0434\u0432\u0435:<\/p>\n<p><strong>\u0420\u0430\u0437\u0434\u0443\u0432\u0430\u044e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/strong> \u0414\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e CRD \u0441\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 managedFields \u043b\u0435\u0433\u043a\u043e \u0432\u0435\u0441\u044f\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442. \u0412 etcd \u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0432 watch-\u043f\u043e\u0442\u043e\u043a\u0435 \u2014 \u0442\u0440\u0430\u0444\u0438\u043a.<\/p>\n<p><strong>\u041c\u0435\u0448\u0430\u044e\u0442 \u0447\u0438\u0442\u0430\u0442\u044c.<\/strong> <code>kubectl get foo -o yaml<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u044e managedFields \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 YAML\u2019\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 1.21 \u0432 <code>kubectl<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0444\u043b\u0430\u0433 <code>--show-managed-fields=false<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439, \u2014 \u0438\u043d\u0430\u0447\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0438\u043f\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b <strong>\u043d\u0435 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442\u0435 managedFields \u0438\u0437 \u043a\u043e\u0434\u0430<\/strong> (\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0435 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044f ownership \u0440\u0443\u043a\u0430\u043c\u0438), managedFields \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0432 \u043a\u044d\u0448 \u0447\u0435\u0440\u0435\u0437 <code>Transform<\/code> \u2014 \u043c\u044b \u043f\u0440\u043e \u044d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435:<\/p>\n<pre><code class=\"go\">Transform: func(obj any) (any, error) {    m, err := meta.Accessor(obj)    if err != nil {        return obj, nil    }    m.SetManagedFields(nil)    return obj, nil},<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u0430\u0436\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: \u043d\u0430 \u0441\u0430\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0435\u0440\u0435\u0437 SSA \u044d\u0442\u043e <strong>\u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442<\/strong>. SSA-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 managedFields \u0432 payload \u2014 apiserver \u0431\u0435\u0440\u0451\u0442 \u0438\u0445 \u0438\u0437 etcd \u0441\u0430\u043c. \u0422\u0430\u043a \u0447\u0442\u043e Transform \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 managedFields \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 \u0432 \u043a\u044d\u0448\u0435, \u043d\u043e \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c apply.<\/p>\n<p>\u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e\u0442 \u0442\u0440\u044e\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u0435\u0441\u043b\u0438 \u0432\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 <strong>\u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442 managedFields<\/strong> \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043a\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043f\u043e\u043b\u0435\u043c, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>Force<\/code>). \u0422\u043e\u0433\u0434\u0430 \u0441\u0440\u0435\u0437\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u044d\u0448\u0435 \u043d\u0435\u043b\u044c\u0437\u044f, \u0438\u043d\u0430\u0447\u0435 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u00ab\u0432\u0441\u043b\u0435\u043f\u0443\u044e\u00bb.<\/p>\n<h3>SSA \u0432 controller-runtime<\/h3>\n<p>\u0412 \u043a\u043e\u0434\u0435 SSA \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0435\u0440\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434 \u043f\u0430\u0442\u0447\u0430 \u2014 <code>client.Apply<\/code>:<\/p>\n<pre><code class=\"go\">desired := &amp;examplev1.FooBar{    TypeMeta: metav1.TypeMeta{        APIVersion: \"example.com\/v1\",        Kind:       \"FooBar\",    },    ObjectMeta: metav1.ObjectMeta{        Name:      \"my-foo\",        Namespace: \"default\",    },    Spec: examplev1.FooBarSpec{        Replicas: ptr.To[int32](5),    },}if err := r.Patch(ctx, desired,    client.Apply,    client.FieldOwner(\"my-controller\"),    client.ForceOwnership,); err != nil {    return err}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<ul>\n<li>\n<p><code><strong>client.Apply<\/strong><\/code> \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 patch, \u0430 Server-Side Apply. \u0412\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 <code>PATCH<\/code> \u0441 <code>application\/apply-patch+yaml<\/code>.<\/p>\n<\/li>\n<li>\n<p><code><strong>client.FieldOwner(\"my-controller\")<\/strong><\/code> \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c <code>fieldManager<\/code>. \u0414\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c <strong>\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c<\/strong>: \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0439\u0442\u0435 \u0435\u0433\u043e \u0432 \u0440\u0435\u043b\u0438\u0437\u0430\u0445, \u0438\u043d\u0430\u0447\u0435 \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 managedFields \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0438\u043c\u0435\u043d\u0438, \u0430 \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><code><strong>client.ForceOwnership<\/strong><\/code> \u2014 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u0443\u0436\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043a\u043e\u043c\u0443-\u0442\u043e, \u043e\u0442\u043e\u0431\u0440\u0430\u0442\u044c. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0430 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0435 \u2014 <code>409<\/code>. \u0412\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e: \u0434\u043b\u044f status, \u0433\u0434\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0441\u0442\u0438\u043d\u044b, \u043e\u043a; \u0434\u043b\u044f spec, \u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0430\u0432\u0438\u0442 \u0440\u0443\u043a\u0430\u043c\u0438, \u043b\u0443\u0447\u0448\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b, \u0430 \u043d\u0435 \u043c\u043e\u043b\u0447\u0430 \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<h4>Apply configurations<\/h4>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u043e\u0433\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043d\u0435\u0437\u0430\u0441\u043b\u0443\u0436\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u044f\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u2014 <strong>apply configurations<\/strong>. \u0414\u043b\u044f SSA \u043e\u043d \u0431\u044b\u0432\u0430\u0435\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0443\u0434\u043e\u0431\u0435\u043d.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 <code>client.Apply<\/code> \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>spec.replicas<\/code>, \u0438 \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e Go-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code class=\"go\">desired := &amp;examplev1.FooBar{    TypeMeta: metav1.TypeMeta{        APIVersion: \"example.com\/v1\",        Kind:       \"FooBar\",    },    ObjectMeta: metav1.ObjectMeta{Name: \"my-foo\", Namespace: \"default\"},    Spec: examplev1.FooBarSpec{        Replicas: ptr.To[int32](5),    },}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u0423 <code>Spec<\/code> \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u044f \u2014 \u0441\u043a\u0430\u0436\u0435\u043c, \u043d\u0435-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 <code>Threshold int32<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438. \u0412 Go zero-value <code>int32<\/code> \u2014 \u044d\u0442\u043e <code>0<\/code>, \u0438 \u043f\u0440\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 JSON \u043e\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 <code>\"threshold\": 0<\/code>. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f apiserver \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 <strong>\u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/strong>, \u0430 \u043d\u0435 \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e\u00bb: \u043e\u043d \u0437\u0430\u043f\u0438\u0448\u0435\u0442, \u0447\u0442\u043e \u0432\u0430\u0448 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043f\u043e\u043b\u0435\u043c <code>threshold<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>0<\/code>. \u0415\u0441\u043b\u0438 \u0437\u0430 <code>threshold<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u2014 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442, \u0430 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>Force<\/code> (\u0447\u0442\u043e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e).<\/p>\n<p>\u041a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 \u0432 \u0441\u0430\u043c\u043e\u0439 Go-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u0423 \u043d\u0435-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e\u00bb \u043e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043e \u043d\u0443\u043b\u0451\u043c\u00bb. \u0410 SSA \u044d\u0442\u0443 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442: \u043e\u0434\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u044f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u00bb, \u0434\u0440\u0443\u0433\u043e\u0435 \u2014 \u00ab\u044f \u0445\u043e\u0447\u0443 \u0432\u043b\u0430\u0434\u0435\u0442\u044c \u0438\u043c \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\u00bb.<\/p>\n<p><strong>Apply configuration<\/strong> \u2014 \u044d\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0441 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <strong>\u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c<\/strong>, \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u2014 \u0447\u0435\u0440\u0435\u0437 \u044f\u0432\u043d\u044b\u0439 <code>With*<\/code>-\u0441\u0435\u0442\u0442\u0435\u0440. \u0415\u0441\u043b\u0438 <code>WithThreshold(...)<\/code> \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438, \u043f\u043e\u043b\u044f \u0432 payload \u043f\u0440\u043e\u0441\u0442\u043e <strong>\u043d\u0435 \u0431\u0443\u0434\u0435\u0442<\/strong> \u2014 \u0438 apiserver \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430 \u043d\u0435\u0433\u043e \u0431\u043e\u0440\u043e\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 Kubernetes-\u0442\u0438\u043f\u043e\u0432 apply-configurations \u043b\u0435\u0436\u0430\u0442 \u0432 <code>k8s.io\/client-go\/applyconfigurations\/...<\/code>:<\/p>\n<pre><code class=\"go\">import appsv1ac \"k8s.io\/client-go\/applyconfigurations\/apps\/v1\"import corev1ac \"k8s.io\/client-go\/applyconfigurations\/core\/v1\"dep := appsv1ac.Deployment(\"my-deploy\", \"default\").    WithSpec(appsv1ac.DeploymentSpec().        WithReplicas(5).        WithTemplate(corev1ac.PodTemplateSpec().            WithSpec(corev1ac.PodSpec().                WithContainers(                    corev1ac.Container().                        WithName(\"app\").                        WithImage(\"nginx:1.25\"),                ),            ),        ),    )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 CRD apply-configurations \u043d\u0435 \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u044e\u0442 \u0441\u0430\u043c\u0438 \u2014 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 <code>applyconfiguration-gen<\/code> (\u0447\u0430\u0441\u0442\u044c <code>k8s.io\/code-generator<\/code>). \u0422\u043e\u0447\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (\u0432 \u0441\u0432\u0435\u0436\u0438\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <code>--input-pkgs<\/code> \u0438 <code>--output-pkg<\/code>, \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0445 \u2014 <code>--input-dirs<\/code> \u0438 <code>--output-package<\/code>), \u043e\u0431\u0449\u0430\u044f \u0438\u0434\u0435\u044f \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0438 \u043f\u0430\u043a\u0435\u0442, \u043a\u0443\u0434\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 apply-configurations:<\/p>\n<pre><code class=\"bash\">applyconfiguration-gen \\  --input-pkgs=github.com\/example\/api\/v1 \\  --output-pkg=github.com\/example\/api\/v1\/applyconfiguration \\  --go-header-file=hack\/boilerplate.go.txt<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 \u0432\u0430\u0448\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e CRD-\u0442\u0438\u043f\u0430 <code>FooBar<\/code> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p><code>FooBarApplyConfiguration<\/code> \u2014 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 builder \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>WithSpec<\/code>, <code>WithStatus<\/code>, <code>WithLabels<\/code> \u0438 \u0442. \u0434.<\/p>\n<\/li>\n<li>\n<p><code>FooBarSpecApplyConfiguration<\/code> \u2014 builder \u0434\u043b\u044f <code>spec<\/code>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438; \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434-\u0441\u0435\u0442\u0442\u0435\u0440 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 (<code>WithReplicas<\/code>, <code>WithImage<\/code>, \u2026).<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 builder\u2019\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">import examplev1ac \"github.com\/example\/api\/v1\/applyconfiguration\"desired := examplev1ac.FooBar(\"my-foo\", \"default\").    WithSpec(examplev1ac.FooBarSpec().        WithReplicas(5),    )if err := r.Apply(ctx, desired, client.FieldOwner(\"my-controller\")); err != nil {    return err}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c builder-API \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u044f\u0432\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u00ab\u043d\u0435 \u0432\u044b\u0437\u0432\u0430\u043b \u2014 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e\u00bb \u2014 \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0435\u0433\u043e \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 SSA.<\/p>\n<p>\u0412 \u0441\u0432\u0435\u0436\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 <code>controller-runtime<\/code> \u0435\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 <code>r.Apply(ctx, desired, client.FieldOwner(...))<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 applyconfigurations \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u0431\u0435\u0437 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432 <code>client.Patch(..., client.Apply, ...)<\/code>. \u0415\u0441\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0435\u0449\u0451 \u043d\u0435\u0442 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>client.Patch<\/code> \u0441\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c <code>client.Apply<\/code>, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<h4>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: desired \u0438\u0437 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/h4>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435, \u043a\u0442\u043e \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0430\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c SSA-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u041b\u043e\u0433\u0438\u043a\u0430 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439: \u00ab\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Apply\u00bb. \u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c <strong>\u043d\u0435\u043b\u044c\u0437\u044f<\/strong>:<\/p>\n<pre><code class=\"go\">\/\/ \u043a\u0430\u043a \u041d\u0415 \u043d\u0430\u0434\u043evar obj examplev1.FooBarif err := r.Get(ctx, key, &amp;obj); err != nil {    return err}obj.Spec.Replicas = ptr.To(int32(5))if err := r.Patch(ctx, &amp;obj,    client.Apply,    client.FieldOwner(\"my-controller\"),); err != nil {    return err}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e: \u0432\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0432 SSA <strong>\u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/strong>, \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 <code>spec<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 apiserver \u0432\u0430\u043c \u0432\u0435\u0440\u043d\u0443\u043b. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f apiserver \u0432\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0437\u0430\u044f\u0432\u0438\u043b\u0438: \u00ab\u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u043b\u0430\u0434\u0435\u044e \u044f\u00bb. \u0412 managedFields \u0443 \u0432\u0430\u0448\u0435\u0433\u043e <code>my-controller<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0438 <code>spec.image<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0440\u0443\u043a\u0430\u043c\u0438), \u0438 <code>spec.tolerations<\/code> (\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b admission-webhook), \u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 <code>kubectl edit<\/code> \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u043f\u043e <code>spec.image<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u00ab\u0432\u043b\u0430\u0434\u0435\u0435\u0442\u00bb \u0432\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>\u0414\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 <code>spec.replicas<\/code>, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u2014 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <strong>\u0441 \u043d\u0443\u043b\u044f<\/strong> \u0438 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0438 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"go\">\/\/ \u043a\u0430\u043a \u043d\u0430\u0434\u043edesired := examplev1ac.FooBar(key.Name, key.Namespace).    WithSpec(examplev1ac.FooBarSpec().        WithReplicas(5),    )if err := r.Apply(ctx, desired, client.FieldOwner(\"my-controller\")); err != nil {    return err}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 SSA-payload \u0443\u0439\u0434\u0443\u0442 \u0440\u043e\u0432\u043d\u043e <code>metadata.name<\/code>, <code>metadata.namespace<\/code> \u0438 <code>spec.replicas<\/code>. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u0447\u0443\u0436\u0438\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<p>\u0418 \u0432\u043e\u0442 <strong>\u0440\u0430\u0434\u0438 \u044d\u0442\u043e\u0433\u043e<\/strong> apply-configurations \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442. \u0421 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 Go-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438\u0437 API-\u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u044b \u043b\u0438\u0431\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 zero-value \u043d\u0430 \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0432\u043b\u0430\u0434\u0435\u0442\u044c, \u043b\u0438\u0431\u043e \u0437\u0430\u0431\u0443\u0434\u0435\u0442\u0435 \u043e\u0431\u043d\u0443\u043b\u0438\u0442\u044c \u00ab\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435\u00bb \u2014 \u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. apply-configuration \u0432 \u0432\u0438\u0434\u0435 builder\u2019\u0430 \u0441 <code>With*<\/code>-\u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u0432\u0430\u043c \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f: \u0447\u0442\u043e \u043d\u0435 \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u2014 \u0442\u043e \u0438 \u043d\u0435 \u0443\u0439\u0434\u0451\u0442 \u0432 payload.<\/p>\n<h4>\u041f\u0440\u043e\u0447\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 SSA<\/h4>\n<p>\u0412\u043a\u0440\u0430\u0442\u0446\u0435, \u0447\u0442\u043e \u0435\u0449\u0451 \u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435:<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u0432\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435, \u043e\u0431\u0430 \u0441 <\/strong><code><strong>Force<\/strong><\/code> \u2192 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u0438\u043d\u0433-\u043f\u043e\u043d\u0433 ownership. \u041b\u0435\u0447\u0435\u043d\u0438\u0435: \u043e\u0434\u0438\u043d \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 (\u043d\u0435 <code>Force<\/code>, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442), \u043b\u0438\u0431\u043e \u043f\u043e\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f, \u043b\u0438\u0431\u043e \u043e\u0434\u0438\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043c\u0435\u043d\u0430 <\/strong><code><strong>FieldOwner<\/strong><\/code><strong> \u0432 \u0440\u0435\u043b\u0438\u0437\u0435<\/strong> \u2192 \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 managedFields \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0438\u043c\u0435\u043d\u0438, \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442. <code>FieldOwner<\/code> \u2014 \u0447\u0430\u0441\u0442\u044c API-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u0432\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043c\u0435\u043d\u044f\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><code><strong>kubectl apply<\/strong><\/code><strong> (client-side) \u0438 SSA \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0434\u0435\u0440\u0443\u0442\u0441\u044f.<\/strong> \u0415\u0441\u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u0432\u0430\u0448\u0435\u0433\u043e \u0442\u0443\u043b\u0438\u043d\u0433\u0430 \u0443\u0436\u0435 \u0443\u0448\u043b\u0430 \u043d\u0430 <code>--server-side<\/code>, \u0430 \u0447\u0430\u0441\u0442\u044c \u2014 \u043d\u0435\u0442, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u0435 ownership: client-side apply \u043d\u0435 \u0443\u0432\u0430\u0436\u0430\u0435\u0442 managedFields \u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0442\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u043b\u044f, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u0430 \u0447\u0443\u0436\u0438\u043c\u0438 SSA-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c\u0438. \u0421\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0435; \u0435\u0441\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u043d\u0438\u043a\u0430\u043a \u2014 \u0431\u0443\u0434\u044c\u0442\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p><code><strong>dryRun<\/strong><\/code><strong> \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/strong> \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u043a\u0430\u043a \u0432\u0430\u0448 SSA-\u0437\u0430\u043f\u0440\u043e\u0441 \u043b\u044f\u0436\u0435\u0442 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 ownership, \u043f\u0440\u043e\u0433\u043e\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u0432 dry-run: <code>r.Patch(ctx, desired, client.Apply, client.FieldOwner(\"...\"), client.DryRunAll)<\/code>. apiserver \u0432\u0435\u0440\u043d\u0451\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0443 \u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u044b \u043f\u0440\u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0432 etcd. \u041e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u00ab\u0447\u0442\u043e \u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c\u00bb.<\/p>\n<\/li>\n<\/ul>\n<h3>Best practices<\/h3>\n<ul>\n<li>\n<p><strong>\u0420\u0435\u0448\u0438\u0442\u0435, \u043a\u0442\u043e \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0447\u0435\u043c.<\/strong> \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u044f\u0432\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0439\u0442\u0435: \u00ab\u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u043e\u043b\u044f\u00bb. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0439\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u043b\u044f status<\/strong> \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <code>client.MergeFrom<\/code> \u0431\u0435\u0437 optimistic lock \u2014 status \u043f\u0440\u0430\u0432\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0438 apiserver \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442 \u0435\u0433\u043e \u043f\u043e subresource.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u043b\u044f spec \u0438 \u043e\u0431\u0449\u0438\u0445 \u043f\u043e\u043b\u0435\u0439<\/strong> \u2014 Server-Side Apply. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u044f\u0434\u043e\u043c \u0436\u0438\u0432\u0443\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0442\u0435 \u0436\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 <\/strong><code><strong>FieldOwner<\/strong><\/code><strong>.<\/strong> \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0432 \u043a\u043e\u0434\u0435, \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u043b\u0438\u0437\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>Apply-configurations<\/strong>, \u0430 \u043d\u0435 \u0433\u043e\u043b\u044b\u0435 Go-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u2014 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0431\u0440\u0430\u0442\u044c ownership \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e zero-value \u043f\u043e\u043b\u044f\u043c.<\/p>\n<\/li>\n<li>\n<p><code><strong>ForceOwnership<\/strong><\/code> \u0432\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e: \u0434\u043b\u044f status \u2014 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043a, \u0434\u043b\u044f spec \u2014 \u043b\u0443\u0447\u0448\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b, \u0447\u0435\u043c \u043c\u043e\u043b\u0447\u0430 \u043e\u0442\u0431\u0438\u0440\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0439\u0442\u0435 <\/strong><code><strong>Update<\/strong><\/code><strong>\/<\/strong><code><strong>Patch<\/strong><\/code><strong> \u0438 <\/strong><code><strong>Apply<\/strong><\/code> \u043d\u0430 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u043f\u043e\u043b\u044f\u0445. \u0412\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435\u0441\u044c \u0435\u0433\u043e.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0442\u043e\u0433\u043e<\/h3>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 Kubernetes \u2014 \u044d\u0442\u043e <strong>\u0441\u043b\u043e\u0438<\/strong>, \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0435 \u0441 \u0433\u043e\u0434\u0430\u043c\u0438, \u0438 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c: \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b <strong>\u043d\u0435 \u0432\u044b\u0442\u0435\u0441\u043d\u0438\u043b\u0438<\/strong> \u0441\u0442\u0430\u0440\u044b\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0437\u0430\u0434\u0430\u0447: <code>Update<\/code> \u0441 <code>resourceVersion<\/code> \u2014 \u0434\u043b\u044f \u0440\u0435\u0434\u043a\u0438\u0445 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438), <code>MergeFrom<\/code> \u0431\u0435\u0437 <code>resourceVersion<\/code> \u2014 \u0434\u043b\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u0432\u043e\u0438 \u043f\u043e\u043b\u044f \u0438 status, Strategic Merge Patch \u2014 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441 \u0443\u043c\u043d\u044b\u043c \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u0432, subresources \u2014 \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0435\u0439 \u043f\u043e \u0441\u0435\u043a\u0446\u0438\u044f\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430, <code>kubectl apply<\/code> \u0431\u0435\u0437 <code>--server-side<\/code> \u2014 \u0434\u043b\u044f CI-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u0438 Helm-\u0440\u0435\u043b\u0438\u0437\u043e\u0432, Server-Side Apply \u2014 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u043f\u0440\u0430\u0432\u044f\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e <code>spec<\/code> \u0438 \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0438\u0445\u0438\u0445 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0435\u0439.<\/p>\n<p>\u0412 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043a\u044d\u0448\u0435\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430: \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 informer \u0438 \u0440\u0435\u0448\u0430\u0435\u0442\u0435, <strong>\u043a\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u043d\u043e<\/strong> \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0438 \u0441\u0435\u0431\u0435, \u043d\u0438 \u0441\u043e\u0441\u0435\u0434\u044f\u043c.<\/p>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0446\u0438\u043a\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 <strong>\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/strong> \u2014 \u043e\u0442 admission chain \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 <code>kubectl apply<\/code> \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 Garbage Collector. \u0412 \u043d\u0435\u0451 \u0432\u043e\u0439\u0434\u0443\u0442:<\/p>\n<ul>\n<li>\n<p><strong>Admission chain<\/strong>: mutating \u0438 validating webhooks, \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0443\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432 etcd.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438<\/strong>: <code>ownerReferences<\/code>, <code>controller: true<\/code>, <code>blockOwnerDeletion<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435<\/strong>: <code>deletionTimestamp<\/code>, \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b, \u0442\u0440\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f (<code>--cascade=orphan|foreground|background<\/code>) \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0444\u0438\u043d\u0430\u043b \u0446\u0438\u043a\u043b\u0430. \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1039282\/\">https:\/\/habr.com\/ru\/articles\/1039282\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043f\u0440\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u2014 \u043a\u044d\u0448 \u0432 controller-runtime, informer\u2019\u044b, Reflector, DeltaFIFO, \u043f\u043e\u0447\u0435\u043c\u0443 r.Get \u0432 \u0440\u0435\u043a\u043e\u043d\u0441\u0430\u0439\u043b\u0435 \u043d\u0435 \u0445\u043e\u0434\u0438\u0442 \u0432 apiserver. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e \u0437\u0430\u043f\u0438\u0441\u044c.Kubernetes \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0433\u0443\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u2014 \u0438 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041d\u0430 \u043e\u0434\u0438\u043d Deployment \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0438 deployment-controller (\u043f\u0440\u0430\u0432\u0438\u0442 status), \u0438 HPA (\u043f\u0440\u0430\u0432\u0438\u0442 spec.replicas), \u0438 admission-\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b (\u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 labels), \u0438 cert-manager (\u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438), \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441 kubectl apply. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u043e\u0438 \u043f\u043e\u043b\u044f \u0438 \u043d\u0435 \u043b\u0435\u0437\u0435\u0442 \u0432 \u0447\u0443\u0436\u0438\u0435. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0432 Kubernetes \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0447\u0430\u0441\u0442\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0433\u043e\u043d\u043a\u0443 \u2014 \u0438 \u043a\u0430\u043a \u0438\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0438\u0448\u0435\u0442\u0435 \u0432\u044b \u0441\u0430\u043c\u0438. \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.resourceVersion \u0438 optimistic concurrency\u0421\u0430\u043c\u043e\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0432 API: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 Kubernetes \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 metadata.resourceVersion \u2014 \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u2014 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0443\u0449\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432 etcd. apiserver \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 \u0438 \u0436\u0434\u0451\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435.\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 r.Update(ctx, &amp;obj), \u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f resourceVersion. apiserver \u0441\u0432\u0435\u0440\u044f\u0435\u0442:resourceVersion \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 etcd \u2192 \u043f\u0438\u0448\u0435\u043c, \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f;\u0432 etcd \u0443\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u0435\u0435 \u2192 409 Conflict, \u00ab\u043a\u0442\u043e-\u0442\u043e \u0442\u0435\u0431\u044f \u043e\u043f\u0435\u0440\u0435\u0434\u0438\u043b\u00bb.\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c optimistic concurrency control. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u043d\u0435 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u2014 \u0432\u0441\u0435 \u043f\u0438\u0448\u0443\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0438\u0437 \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 Update \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442, \u0447\u0435\u0439 resourceVersion \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u044b\u043b \u0441\u0432\u0435\u0436\u0438\u043c. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 409, \u0438 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043d\u043e\u0432\u0430.\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0447\u0435\u0441\u0442\u043d\u044b\u0439, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430. Update \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435, \u0432 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e:\u041f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438 \u0432\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u0435 409. \u0418 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435, \u0432\u0430\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b retry \u2014 \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0441\u043e \u0441\u0432\u0435\u0436\u0438\u043c resourceVersion \u0438 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043d\u0451\u0441 \u043a\u0442\u043e-\u0442\u043e \u0435\u0449\u0451), \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 apiserver. \u0418 \u0442\u0430\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u0451\u0442 \u00ab\u043f\u043e\u043f\u0430\u0441\u0442\u044c\u00bb \u043c\u0435\u0436\u0434\u0443 \u0447\u0443\u0436\u0438\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438. \u0412 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 \u044d\u0442\u043e\u0442 retry-\u0446\u0438\u043a\u043b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0449\u0443\u0442\u0438\u043c\u0443\u044e \u0434\u043e\u043b\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u00ab\u043c\u043e\u0451 \u043f\u043e\u043b\u0435 \/ \u0447\u0443\u0436\u043e\u0435 \u043f\u043e\u043b\u0435\u00bb. \u0412\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0442\u0435 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430.\u0415\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u0438 \u2014 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 Patch.\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f: PatchPatch \u2014 \u044d\u0442\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u043d\u0435 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u0412 Kubernetes \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 patch-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439; \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 apiserver, \u0438 controller-runtime. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u2014 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0433\u043e.JSON Merge Patch (RFC 7396)\u0421\u0430\u043c\u044b\u0439 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 JSON \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442\u0441\u044f:{ &#171;spec&#187;: { &#171;replicas&#187;: 5 } }\u0427\u0442\u043e \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e \u2014 apiserver \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442. \u041f\u043e\u043b\u044f \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c null \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f. \u0412 controller-runtime \u0437\u0430 \u044d\u0442\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0441\u0442\u043e\u0438\u0442 client.MergeFrom(original), \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0432\u044b \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0435 \u0432 \u043a\u043e\u0434\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 status.\u0423 Merge Patch \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043e\u0449\u0443\u0442\u0438\u043c\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430. \u042d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 RFC 7396: \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u0435\u0440\u0434\u0436\u0430\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e, \u043a\u043b\u044e\u0447-\u043a-\u043a\u043b\u044e\u0447\u0443, \u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u2014 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u0432 patch\u2019\u0435, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439, \u043a\u0430\u043a\u0438\u0435 \u0431\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u0430\u043c \u043d\u0438 \u0431\u044b\u043b\u0438.\u0414\u043b\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 (labels, annotations) \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u044e\u0447 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e. \u0410 \u0432\u043e\u0442 \u0441\u043f\u0438\u0441\u043a\u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u043c: \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c image \u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 spec.containers \u2014 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u0442\u043e-\u0442\u043e \u0440\u044f\u0434\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2014 \u0432\u044b \u0435\u0433\u043e \u0441\u043e\u0442\u0440\u0451\u0442\u0435, \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044f \u043e\u0431 \u044d\u0442\u043e\u043c.JSON Patch (RFC 6902)\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. JSON Patch \u2014 \u044d\u0442\u043e \u044f\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438:[  { &#171;op&#187;: &#171;replace&#187;, &#171;path&#187;: &#171;\/spec\/containers\/0\/image&#187;, &#171;value&#187;: &#171;nginx:1.27&#187; },  { &#171;op&#187;: &#171;add&#187;,     &#171;path&#187;: &#171;\/metadata\/labels\/foo&#187;,     &#171;value&#187;: &#171;bar&#187; },  { &#171;op&#187;: &#171;remove&#187;,  &#171;path&#187;: &#171;\/metadata\/annotations\/legacy&#187; }]\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043f\u0440\u044f\u043c\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435: \u00ab\u0437\u0430\u043c\u0435\u043d\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 0 \u0441\u043f\u0438\u0441\u043a\u0430 containers\u00bb, \u00ab\u0434\u043e\u0431\u0430\u0432\u044c \u043a\u043b\u044e\u0447 \u0432 labels\u00bb, \u00ab\u0443\u0434\u0430\u043b\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e\u00bb. \u0421\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043d\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u00ab\u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a\u00bb, \u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\u0412 controller-runtime \u044d\u0442\u043e client.RawPatch(types.JSONPatchType, &#8230;):patchBytes := []byte(`[    {&#171;op&#187;:&#187;remove&#187;,&#187;path&#187;:&#187;\/metadata\/finalizers\/0&#8243;}]`)if err := r.Patch(ctx, &amp;obj, client.RawPatch(types.JSONPatchType, patchBytes)); err != nil {    return err}\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 JSON Patch \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e. \u041f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u044b\u0440\u043e\u0433\u043e JSON, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0438\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438; \u0438\u0437-\u0437\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u044b Go \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0430-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435, \u043b\u044e\u0431\u0430\u044f \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u0432 path \u0432\u0441\u043f\u043b\u044b\u0432\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e\u0442 MergeFrom, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 diff \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.JSON Patch \u0443\u0434\u043e\u0431\u0435\u043d \u0432 \u043d\u0438\u0448\u0435\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445, \u0433\u0434\u0435 \u0432\u0430\u0436\u043d\u0430 \u0442\u043e\u0447\u0435\u0447\u043d\u0430\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f: \u0441\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (remove \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443), \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438\u0437 \u043a\u0430\u0440\u0442\u044b, \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c compare-and-swap \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e test. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0437\u043d\u0430\u0435\u0442\u0435 \u0438 \u0442\u043e\u0447\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u0438 \u0442\u043e\u0447\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u0438 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u00ab\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 diff\u00bb.Strategic Merge PatchStrategic Merge Patch (SMP) \u2014 k8s-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 Merge Patch \u0441 \u0443\u043c\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0443 JSON Patch. \u0412\u043d\u0435\u0448\u043d\u0435 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 JSON-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u043a\u0430\u043a Merge Patch:{ &#171;spec&#187;: { &#171;containers&#187;: [ { &#171;name&#187;: &#171;app&#187;, &#171;image&#187;: &#171;nginx:1.27&#8243; } ] } }\u041d\u043e apiserver \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0443\u043c\u043d\u0435\u0435. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 Kubernetes \u0432 Go-\u0442\u0435\u0433\u0430\u0445 \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0437\u0430\u0448\u0438\u0442\u0430 patch-strategy \u2014 patchStrategy:&#187;merge&#187;, patchMergeKey:&#187;name&#187;, patchStrategy:&#187;replace&#187; \u0438 \u0442. \u043f. \u041f\u043e \u044d\u0442\u0438\u043c \u0442\u0435\u0433\u0430\u043c apiserver \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442:\u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043a\u0438 containers \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u0440\u0436\u0438\u0442\u044c \u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e \u043f\u043e \u043a\u043b\u044e\u0447\u0443 name: \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043c\u0435\u043d\u044f\u0435\u0442\u0435, \u2014 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c;\u0447\u0442\u043e volumeMounts \u043c\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u2014 \u043f\u043e name;\u0447\u0442\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, args \u0438\u043b\u0438 command \u043c\u0435\u0440\u0436\u0438\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043b\u044c\u0437\u044f, \u0438 \u043f\u0440\u0438 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0438 \u0432 patch\u2019\u0435 \u043e\u043d\u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c;\u0447\u0442\u043e \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043b\u0435\u0439-\u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u043c\u0435\u0440\u0436 \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c.\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 kubectl apply (\u0431\u0435\u0437 &#8212;server-side). \u0412 controller-runtime \u2014 client.StrategicMergeFrom(original).\u0412\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: SMP \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 Kubernetes-\u0442\u0438\u043f\u043e\u0432. \u0414\u043b\u044f CRD apiserver \u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 Content-Type: application\/strategic-merge-patch+json \u043a CRD \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0432\u0435\u0440\u0433\u0430\u0435\u0442\u0441\u044f. \u0414\u043b\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 CRD \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f JSON Patch \u0438 JSON Merge Patch \u2014 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c.\u0423\u043c\u043d\u043e\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u043b\u044f CRD \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Server-Side Apply, \u0438 \u0442\u0430\u043c \u2014 \u043d\u0435 \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e SSA \u0434\u043b\u044f CRD \u0442\u043e\u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0445 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0427\u0442\u043e\u0431\u044b apiserver \u043c\u0435\u0440\u0436\u0438\u043b \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e, \u0432 \u0441\u0445\u0435\u043c\u0435 CRD \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u044b x-kubernetes-list-type: map \u0438 x-kubernetes-list-map-keys. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 controller-gen (+listType=map, +listMapKey=name), \u0438 kubebuilder \u044d\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.Patch \u0431\u0435\u0437 resourceVersion\u0422\u043e\u043d\u043a\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u043e \u0443\u043f\u0443\u0441\u043a\u0430\u044e\u0442. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434:original := obj.DeepCopy()obj.Spec.Replicas = ptr.To[int32](5)patch := client.MergeFrom(original)if err := r.Patch(ctx, obj, patch); err != nil {    return err}\u0417\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a client.MergeFrom \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 payload patch-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041b\u043e\u0433\u0438\u043a\u0430 \u0442\u0430\u043a\u0430\u044f: \u0432\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 obj.DeepCopy() \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432 original. \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432 obj. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e client.MergeFrom \u0431\u0435\u0440\u0451\u0442 \u0434\u0432\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u2014 original \u0438 obj \u2014 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 diff. \u042d\u0442\u043e\u0442 diff \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u0435\u043b\u043e\u043c PATCH-\u0437\u0430\u043f\u0440\u043e\u0441\u0430.\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u0436\u0434\u0443 original \u0438 obj \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u2014 spec.replicas. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0439\u0434\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u043e. \u041f\u043e\u043b\u0435 metadata.resourceVersion \u0432 diff \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0451\u0442 \u2014 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0438, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 original \u0438 obj \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442.\u0418 \u0432\u043e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: apiserver, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 PATCH \u0431\u0435\u0437 resourceVersion \u0432 payload, \u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442. \u041e\u043d \u0431\u0435\u0440\u0451\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 etcd, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0430\u0448 \u043f\u0430\u0442\u0447 \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0435\u0433\u043e \u0438 \u043f\u0438\u0448\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 409 Conflict, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e optimistic lock \u2014 \u044d\u0442\u043e \u0448\u0442\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043d\u0435 \u0431\u0430\u0433: \u0432\u044b \u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u00ab\u0438\u0437\u043c\u0435\u043d\u0438 \u043c\u043d\u0435 \u0432\u043e\u0442 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f\u00bb, apiserver \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0438\u0445 \u043f\u043e\u0432\u0435\u0440\u0445 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043a\u0430\u043a\u043e\u0439 \u0431\u044b \u043e\u043d\u0430 \u043d\u0438 \u0431\u044b\u043b\u0430.\u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0432\u0430\u0448\u0435 \u043f\u043e\u043b\u0435 \u043d\u0438\u043a\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442 \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u0442\u043e status \u0432\u0430\u0448\u0435\u0433\u043e CRD, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0448\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0443\u0436\u0435\u043d optimistic lock \u0438 \u043f\u0440\u0438 patch\u2019\u0435 \u2014 \u0432 controller-runtime \u0435\u0441\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431:patch := client.MergeFromWithOptions(original, client.MergeFromWithOptimisticLock{})\u0422\u043e\u0433\u0434\u0430 resourceVersion \u043f\u043e\u043f\u0430\u0434\u0451\u0442 \u0432 diff, \u0438 apiserver \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c.Patch \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u043e\u043c\u0443 \u043a\u0430\u043a\u043e\u0435 \u043f\u043e\u043b\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442\u00bb. \u041b\u044e\u0431\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 update \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0430\u0442\u0447\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 apiserver \u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442, \u043d\u0430 \u0447\u044c\u0438 \u043f\u043e\u043b\u044f \u043e\u043d \u043f\u043e\u0441\u044f\u0433\u043d\u0443\u043b. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043c\u0435\u0436\u0434\u0443 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 spec, \u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u2014 \u0432 status), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c subresources.Subresources: \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0432\u0435\u0440\u0438 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 Kubernetes, \u0443 \u043d\u0435\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0441\u0435\u043a\u0446\u0438\u0438:metadata \u2014 \u043e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 (\u0438\u043c\u044f, namespace, labels, annotations, owner-\u0441\u0441\u044b\u043b\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438). \u042d\u0442\u0430 \u0441\u0435\u043a\u0446\u0438\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Kubernetes;spec \u2014 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c;status \u2014 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481020","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481020","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481020"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481020\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}