{"id":471779,"date":"2025-08-23T15:07:24","date_gmt":"2025-08-23T15:07:24","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=471779"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=471779","title":{"rendered":"<span>DevOps Tutorials \u2014 Kubernetes: \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ma\/po\/lv\/mapolvqq4uunxfqoaviv3g9km9y.jpeg\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/ma\/po\/lv\/mapolvqq4uunxfqoaviv3g9km9y.jpeg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/ma\/po\/lv\/mapolvqq4uunxfqoaviv3g9km9y.jpeg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0435\u0440\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/913426\/\" rel=\"noopener noreferrer nofollow\">DevOps Tutorials \u2014 Ansible: \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/930326\/\" rel=\"noopener noreferrer nofollow\">DevOps Tutorials \u2014 Terraform: \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441\u0435\u0442\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Ubuntu Linux \u0432 Yandex Cloud \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Terraform \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 Angular+Java \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c JavaScript+Go \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c JavaScript+Go \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0438\u0436\u0435) \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d Kubernetes (<a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl-linux\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0434\u043b\u044f Linux<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0432 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u0441 Ingress (\u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/yandex.cloud\/ru\/docs\/managed-kubernetes\/\" rel=\"noopener noreferrer nofollow\">Yandex Managed Service for Kubernetes<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Yandex Cloud \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/yandex.cloud\/ru\/docs\/cli\/operations\/install-cli\" rel=\"noopener noreferrer nofollow\">yc CLI<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/yandex.cloud\/ru\/docs\/iam\/concepts\/authorization\/oauth-token\" rel=\"noopener noreferrer nofollow\">OAuth-\u0442\u043e\u043a\u0435\u043d<\/a> (<code>yc config set token &lt;OAuth-\u0442\u043e\u043a\u0435\u043d&gt;<\/code>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 IP Ingress, \u043d\u043e \u044d\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b &#171;\u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u043c&#187; \u0441\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d (\u043a\u0443\u043f\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/cp.beget.com\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>)<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e Kubernetes<\/h3>\n<p><a href=\"https:\/\/kubernetes.io\/\" rel=\"noopener noreferrer nofollow\">Kubernetes<\/a> (k8s) \u2014 \u044d\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430-\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 (cluster) \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043f\u0438\u0439, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0442\u043e\u043c\u0430 (volumes) \u0438 \u0442.\u0434.), \u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0430\u043c\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0438\u0445 \u043f\u0440\u0438 \u0441\u0431\u043e\u0435, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0438 \u0442.\u043f.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 &#8212; \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434, \u0431\u044d\u043a\u0435\u043d\u0434, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b. \u041a\u0430\u0436\u0434\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Docker). \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u0441\u0431\u043e\u0435, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0438 \u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f.<\/p>\n<p>K8s \u0431\u0435\u0440\u0435\u0442 \u044d\u0442\u043e \u043d\u0430 \u0441\u0435\u0431\u044f:<\/p>\n<ul>\n<li>\n<p>\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0445 \u043f\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c (\u0443\u0437\u043b\u0430\u043c &#8212; nodes) \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043f\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0430\u0432\u0442\u043e\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u2014 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0443\u043f\u0430\u0432\u0448\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>\u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443 \u0438 \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043c\u0438\u0440\u0443<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e (rolling update)<\/p>\n<\/li>\n<\/ul>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h4>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=TlHvYWVUZyc&amp;t=39s\" rel=\"noopener noreferrer nofollow\">Kubernetes Explained in 6 Minutes | k8s Architecture<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c (control plane\/master) \u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u044b (worker nodes).<\/p>\n<p><strong>Control plane<\/strong><\/p>\n<ul>\n<li>\n<p>API Server \u2014 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 (REST API). \u0412\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e<\/p>\n<\/li>\n<li>\n<p>etcd \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 &#171;\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&#187;, \u0433\u0434\u0435 k8s \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441)<\/p>\n<\/li>\n<li>\n<p>kube-scheduler (\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a) \u2014 \u0440\u0435\u0448\u0430\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u0443\u0437\u043b\u0430\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u0434\u044b (pods)<\/p>\n<\/li>\n<li>\n<p>kube-controller-manager \u2014 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 (\u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432, \u0440\u0435\u043f\u043b\u0438\u043a (replication), \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (endpoints) \u0438 \u0434\u0440.), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u044f\u0442 \u0437\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441 \u043d\u0438\u043c<\/p>\n<\/li>\n<\/ul>\n<p><strong>Worker nodes<\/strong><\/p>\n<ul>\n<li>\n<p>kubelet \u2014 \u0430\u0433\u0435\u043d\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0437\u043b\u0435; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 API Server \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043f\u043e\u0434\u043e\u0432 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0447\u0435\u0440\u0435\u0437 runtime<\/p>\n<\/li>\n<li>\n<p>container runtime (\u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, containerd, CRI-O) \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>kube-proxy \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c (\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c iptables\/iptables-replacement)<\/p>\n<\/li>\n<li>\n<p>CNI-\u043f\u043b\u0430\u0433\u0438\u043d\u044b (Calico, Flannel, WeaveNet \u0438 \u0434\u0440.) \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0434\u0430\u043c\u0438<\/p>\n<\/li>\n<\/ul>\n<h4>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/h4>\n<ul>\n<li>\n<p>Container (\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440) \u2014 \u043a\u0430\u043a \u0432 Docker: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 + \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>Pod (\u043f\u043e\u0434) \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 k8s: \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u043c\u0435\u0441\u0442\u0435 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u0435\u0442\u044c \u0438 \u0442\u043e\u043c\u0430. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 Pod \u2014 1 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 + \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b (sidecars). \u041f\u043e\u0434\u044b \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b<\/p>\n<\/li>\n<li>\n<p>ReplicaSet (\u043d\u0430\u0431\u043e\u0440 \u0440\u0435\u043f\u043b\u0438\u043a) \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043f\u0438\u0439 \u043f\u043e\u0434\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>Deployment (\u0434\u0435\u043f\u043b\u043e\u0439, \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435) \u2014 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439\/\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f ReplicaSet (\u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u043e\u0442\u043a\u0430\u0442\u044b). \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0431\u0435\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (stateless)<\/p>\n<\/li>\n<li>\n<p>StatefulSet (\u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439) \u2014 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c (stateful) (\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0447\u0435\u0440\u0435\u0434\u0438) \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0442\u043e\u043c\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>DaemonSet (\u043d\u0430\u0431\u043e\u0440 \u0434\u0435\u043c\u043e\u043d\u043e\u0432) \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043f\u0438\u044e \u043f\u043e\u0434\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c (\u0438\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445) \u0443\u0437\u043b\u0435 \u2014 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\/\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<li>\n<p>Job\/CronJob \u2014 \u0440\u0430\u0437\u043e\u0432\u044b\u0435 (Job) \u0438\u043b\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 (CronJob) \u0437\u0430\u0434\u0430\u0447\u0438<\/p>\n<\/li>\n<li>\n<p>Service (\u0441\u0435\u0440\u0432\u0438\u0441) \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u0434\u0430\u043c (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 IP + \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430). \u0422\u0438\u043f\u044b: ClusterIP (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430), NodePort, LoadBalancer<\/p>\n<\/li>\n<li>\n<p>Ingress \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 (HTTP) \u0438 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440; \u0442\u0440\u0435\u0431\u0443\u0435\u0442 Ingress Controller (nginx-ingress, Traefik \u0438 \u0434\u0440.)<\/p>\n<\/li>\n<li>\n<p>ConfigMap\/Secret \u2014 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u043f\u043e\u0434\u0430\u0445. Secret \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e (\u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u2014 base64; \u0432 \u043f\u0440\u043e\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Vault)<\/p>\n<\/li>\n<li>\n<p>Volume, PersistentVolume (PV), PersistentVolumeClaim (PVC), StorageClass \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f; PVC \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 PV, StorageClass \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>Namespace (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d) \u2014 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (multi-tenant, \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>CRD (Custom Resource Definition)\/Operator \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 API k8s \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<h4>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b<\/h4>\n<ul>\n<li>\n<p>\u041c\u044b \u043f\u0438\u0448\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b (\u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 YAML) \u2014 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c Deployment, Service \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<li>\n<p><code>kubectl apply<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b (\u043e\u0431\u044a\u0435\u043a\u0442\u044b) \u0432 API Server<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0440\u0435\u0448\u0430\u044e\u0442, \u0433\u0434\u0435 \u0438 \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u0434\u044b; kubelet \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0447\u0435\u0440\u0435\u0437 runtime<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u043f\u043e\u0434 \u043f\u0430\u0434\u0430\u0435\u0442, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\/\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 Deployment \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 rolling update, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c<\/p>\n<\/li>\n<\/ul>\n<h4>\u0421\u0435\u0442\u044c<\/h4>\n<ul>\n<li>\n<p>\u0412 k8s \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c &#171;\u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0434\u0443 \u2014 \u0441\u0432\u043e\u0439 IP, \u043f\u043e\u0434\u044b \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e&#187;. \u042d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 CNI-\u043f\u043b\u0430\u0433\u0438\u043d<\/p>\n<\/li>\n<li>\n<p>Service \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u0434\u043e\u0432 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>Ingress \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u043c HTTP(S)-\u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b<\/p>\n<\/li>\n<li>\n<p>NetworkPolicy \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442, \u043a\u0442\u043e \u0441 \u043a\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f (\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u0434\u0430)<\/p>\n<\/li>\n<\/ul>\n<h4>\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u043f\u0438\u0437\u043e\u0434\u0438\u0447\u043d\u044b (\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c\u0438) \u2014 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f PersistentVolumes<\/p>\n<\/li>\n<li>\n<p>StorageClass \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0442\u043e\u043c\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0434\u0438\u0441\u043a\u0438 \u0432 GCE\/AWS)<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c (\u0411\u0414) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 StatefulSet + PVC<\/p>\n<\/li>\n<\/ul>\n<h4>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>Requests\/Limits (\u0437\u0430\u043f\u0440\u043e\u0441\u044b\/\u043b\u0438\u043c\u0438\u0442\u044b) \u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435\/\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b (\u0426\u041f, \u043f\u0430\u043c\u044f\u0442\u044c) \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430; \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 QoS<\/p>\n<\/li>\n<li>\n<p>Horizontal Pod Autoscaler (HPA) \u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043e\u0432 \u043f\u043e \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c<\/p>\n<\/li>\n<li>\n<p>Vertical Pod Autoscaler (VPA) \u2014 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b\/\u043b\u0438\u043c\u0438\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>Cluster Autoscaler \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\/\u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0443\u0437\u043b\u044b \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u043f\u043e\u0434 \u043d\u0443\u0436\u0434\u044b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<\/ul>\n<h4>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/h4>\n<ul>\n<li>\n<p>RBAC (Role-Based Access Control) \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a API<\/p>\n<\/li>\n<li>\n<p>NetworkPolicy \u2014 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0434\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>Secrets \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>Pod Security \u2014 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043e\u0432 (\u0440\u0430\u043d\u044c\u0448\u0435 \u0431\u044b\u043b\u0430 PodSecurityPolicy, \u0432 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0431\u044b\u043b\u0430 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u0430 \u043d\u0430 Pod Security Admission; \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435 Gatekeeper\/OPA)<\/p>\n<\/li>\n<li>\n<p>runtime &#8212; \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0441 \u043d\u0435\u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 capabilities, seccomp, SELinux\/AppArmor \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043c\u0435\u0442\u0440\u0438\u043a\u0438, \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430<\/h4>\n<ul>\n<li>\n<p>\u041e\u0442\u0447\u0435\u0442\u044b (\u043b\u043e\u0433\u0438): \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442 \u0430\u0433\u0435\u043d\u0442\u044b (fluentd\/fluent-bit, Logstash) \u0438 \u0445\u0440\u0430\u043d\u044f\u0442 \u0432 Elasticsearch\/Loki<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u0440\u0438\u043a\u0438: Prometheus + Grafana \u2014 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<li>\n<p>\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430: Jaeger, OpenTelemetry \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b: \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e\u0434\u0430\/\u0443\u0437\u043b\u0430, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 (alerting), \u043f\u0430\u043d\u0435\u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 (dashboards)<\/p>\n<\/li>\n<\/ul>\n<h4>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h4>\n<ul>\n<li>\n<p>kubectl \u2014 CLI \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>kubeadm, kops, kubespray \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>minikube, kind \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>Helm \u2014 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (\u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0435\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435)<\/p>\n<\/li>\n<li>\n<p>Operators (\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b) \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (CRD + \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440)<\/p>\n<\/li>\n<li>\n<p>Managed Kubernetes: GKE (Google), EKS (AWS), AKS (Azure), Yandex Cloud \u2014 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 control plane.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e Deployment + Service<\/h4>\n<pre><code class=\"yaml\"># deployment.yaml apiVersion: apps\/v1 kind: Deployment metadata:   name: hello-deploy spec:   replicas: 3   selector:     matchLabels:       app: hello   template:     metadata:       labels:         app: hello     spec:       containers:         - name: hello           image: nginx:stable           ports:             - containerPort: 80           readinessProbe:             httpGet:               path: \/               port: 80             initialDelaySeconds: 5             periodSeconds: 10           resources:             requests:               cpu: \"100m\"               memory: \"128Mi\"             limits:               cpu: \"200m\"               memory: \"256Mi\"  --- # service.yaml apiVersion: v1 kind: Service metadata:   name: hello-svc spec:   type: ClusterIP   selector:     app: hello   ports:     - port: 80       targetPort: 80 <\/code><\/pre>\n<p>\u041c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u044d\u0442\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/home\/\" rel=\"noopener noreferrer nofollow\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.geeksforgeeks.org\/devops\/kubernetes-tutorial\/\" rel=\"noopener noreferrer nofollow\">Kubernetes Tutorial &#8212; GeeksForGeeks<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=X48VuDVv0do\" rel=\"noopener noreferrer nofollow\">Kubernetes Tutorial for Beginners<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f<\/h3>\n<p>\u041d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u043d\u0430 Vue.js \u0438 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043d\u0430 Go. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u0411\u0414, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0431\u0435\u0437 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c Dockerfile \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>Dockerfile \u0431\u044d\u043a\u0435\u043d\u0434\u0430:<\/p>\n<pre><code>FROM golang:1.21 as builder  WORKDIR \/app  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 COPY go.mod go.sum .\/ RUN go mod download  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f COPY . .  # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Linux # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c CGO_ENABLED=0 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, # \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0431\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a C RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .\/cmd\/api  # \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Yandex Internal Root CA RUN curl https:\/\/storage.yandexcloud.net\/cloud-certs\/CA.pem -o YandexInternalRootCA.crt  FROM alpine:latest  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c ca-certificates \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 HTTPS RUN apk --no-cache add ca-certificates  WORKDIR \/root  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438\u0437 builder COPY --from=builder \/app\/YandexInternalRootCA.crt \/usr\/local\/share\/ca-certificates\/YandexInternalRootCA.crt  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 RUN update-ca-certificates  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 builder COPY --from=builder \/app\/main .  EXPOSE 8081  # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 CMD [\".\/main\"] <\/code><\/pre>\n<p>Dockerfile \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430:<\/p>\n<pre><code>FROM node:16.20.0-alpine3.18 as builder  WORKDIR \/app  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 COPY package*.json .\/ RUN npm install  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f COPY . .  # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 RUN npm run build  FROM nginx:1.25-alpine AS production  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 builder COPY --from=builder \/app\/dist \/usr\/share\/nginx\/html  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Nginx COPY default.conf \/etc\/nginx\/conf.d\/default.conf  EXPOSE 8080 <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u0438\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Nginx. \u0415\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f (<code>default.conf<\/code>) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"nginx\">server {   listen 80;    location \/ {     root   \/usr\/share\/nginx\/html;     index  index.html;     try_files $uri $uri\/ \/index.html;   }    # \u041f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443   location \/api\/ {     # my-store-backend - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0430     proxy_pass http:\/\/my-store-backend:8081\/;   } } <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Docker Compose. <code>docker-compose.yaml<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"yaml\">version: '3.8'  services:   # \u0421\u0435\u0440\u0432\u0438\u0441 \u0431\u044d\u043a\u0435\u043d\u0434\u0430   backend:     # \u041e\u0431\u0440\u0430\u0437     image: ${CI_REGISTRY_IMAGE}\/my-store-backend:${VERSION}     # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430     container_name: my-store-backend     restart: always     # \u0421\u0435\u0442\u044c     networks:       - my-store     # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f     healthcheck:       test: wget -qO- http:\/\/localhost:8081\/health       interval: 10s       timeout: 5s       start_period: 10s       retries: 5    # \u0421\u0435\u0440\u0432\u0438\u0441 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430   frontend:     # \u041e\u0431\u0440\u0430\u0437     image: ${CI_REGISTRY_IMAGE}\/my-store-frontend:${VERSION}     # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430     container_name: my-store-frontend     restart: always     # \u041f\u043e\u0440\u0442\u044b     ports:       - '80:80'     # \u0421\u0435\u0442\u044c     networks:       - my-store  networks:   my-store: <\/code><\/pre>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 Gitlab CI \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Docker Compose \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041e\u0431\u0440\u0430\u0437\u044b \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u0438 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 Gitlab Registry. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0430\u0434\u0438\u0438 \u0440\u0435\u043b\u0438\u0437\u0430 (\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 \u0432 Gitlab Registry) \u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0432 <code>gitlab-ci.yaml<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"yaml\"># \u0421\u0442\u0430\u0434\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430 release-backend:   stage: release   image:     name: gcr.io\/go-containerregistry\/crane:debug     entrypoint: ['']   cache: []   before_script:     - crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY   script:     - crane tag $CI_REGISTRY_IMAGE\/my-store-backend:$CI_COMMIT_SHA $VERSION  # \u0421\u0442\u0430\u0434\u0438\u044f \u0434\u0435\u043f\u043b\u043e\u044f (\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438) deploy-backend:   stage: deploy   image: docker:24.0.7-alpine3.19   before_script:     - apk add docker-cli-compose openssh-client bash     - eval $(ssh-agent -s)     - echo \"$SSH_PRIVATE_KEY\"| tr -d '\\r' | ssh-add -     - mkdir -p ~\/.ssh     - chmod 600 ~\/.ssh     - echo \"$SSH_KNOWN_HOSTS\" &gt;&gt; ~\/.ssh\/known_hosts     - chmod 644 ~\/.ssh\/known_hosts     - docker context create remote --description \"remote ssh\" --docker \"host=ssh:\/\/${DEV_USER}@${DEV_HOST}\"   script:     - echo \"VERSION=${VERSION}\" &gt;&gt; deploy.env     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY     - docker --context remote compose --env-file deploy.env up backend -d --pull \"always\" --force-recreate   environment:     name: review\/$CI_COMMIT_REF_SLUG     url: http:\/\/${DEV_HOST}:8080     auto_stop_in: 1h   when: manual <\/code><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Kubernetes<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c k8s Yandex Cloud \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>yc managed-kubernetes cluster get-credentials &lt;\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430&gt; --external<\/code>. \u042d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e k8s \u0432 <code>$HOME\/.kube\/config<\/code>. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>yc config set folder-id &lt;\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430&gt;<\/code>.<\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u0441\u0443\u0434\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 k8s, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b Deployment \u0438 Service. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a Gitlab Registry. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 Secrets \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u0430.<\/p>\n<p>\u0417\u0430\u0431\u0430\u0432\u044b \u0440\u0430\u0434\u0438 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0434\u043b\u044f \u0431\u044d\u043a\u0435\u043d\u0434\u0430 Vertical Pod Autoscaler.<\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430, \u0442\u043e \u0435\u043c\u0443 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b Configmap \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 Nginx, Ingress \u0434\u043b\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438\u0437\u0432\u043d\u0435 \u043f\u043e \u0434\u043e\u043c\u0435\u043d\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 ClusterIssuer \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u0432 \u043d\u0435\u0439 2 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<pre><code>mkdir kubernetes cd kubernetes  mkdir frontend backend <\/code><\/pre>\n<h4>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u044d\u043a\u0435\u043d\u0434\u0430<\/h4>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>backend<\/code>.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 Deployment:<\/p>\n<details class=\"spoiler\">\n<summary>deployment.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- apiVersion: apps\/v1 kind: Deployment metadata:   # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043f\u043b\u043e\u044f   name: backend   # \u041c\u0435\u0442\u043a\u0438   labels:     app: backend spec:   # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a (\u043a\u043e\u043f\u0438\u0439) \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   replicas: 1   # \u041b\u0438\u043c\u0438\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0440\u0435\u043b\u0438\u0437\u043e\u0432.   # \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   # \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438   revisionHistoryLimit: 12   # \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   strategy:     # \u041f\u043e\u044d\u0442\u0430\u043f\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f     type: RollingUpdate     rollingUpdate:       # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0440\u0435\u043f\u043b\u0438\u043a \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f       maxUnavailable: 0       # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043f\u043b\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f       maxSurge: 20%   # \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u0434\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043f\u043b\u043e\u0439   selector:     matchLabels:       app: backend   # \u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0432   template:     metadata:       labels:         app: backend     spec:       containers:         - name: backend           # \u041e\u0431\u0440\u0430\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f           image: gitlab.my-services.ru:5050\/my-store\/my-store-backend:1.0.2213512           imagePullPolicy: IfNotPresent           # \u0420\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430           resources:             requests:               cpu: '0.5'               memory: '256Mi'             limits:               cpu: '1'               memory: '512Mi'           # \u041f\u043e\u0440\u0442\u044b           ports:             - name: backend               containerPort: 8081           # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f           livenessProbe:             httpGet:               path: \/health               port: 8081             initialDelaySeconds: 15             periodSeconds: 30             timeoutSeconds: 2             failureThreshold: 6       # \u0421\u0435\u043a\u0440\u0435\u0442\u044b \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Gitlab Registry       imagePullSecrets:         - name: docker-config-secret <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c Service:<\/p>\n<details class=\"spoiler\">\n<summary>service.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- apiVersion: v1 kind: Service metadata:   name: backend   labels:     app: backend spec:   # \u0414\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 - \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430   type: ClusterIP   ports:     - protocol: TCP       # \u041f\u043e\u0440\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430       port: 8081       # \u041f\u043e\u0440\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0440\u0430\u0444\u0438\u043a       # \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.       # \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u043e\u0440\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0431\u044d\u043a\u0435\u043d\u0434       targetPort: 8081   # \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u0434\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0440\u0430\u0444\u0438\u043a   selector:     app: backend <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c Secrets:<\/p>\n<details class=\"spoiler\">\n<summary>secrets.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- apiVersion: v1 kind: Secret metadata:   name: docker-config-secret data:   .dockerconfigjson: &lt;dockerconfigjson&gt; type: kubernetes.io\/dockerconfigjson <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>dockerconfigjson<\/code>, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/pull-image-private-registry\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0412\u043a\u0440\u0430\u0442\u0446\u0435:<\/p>\n<pre><code class=\"bash\">docker login cat ~\/.docker\/config.json | base64 --encode <\/code><\/pre>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, Vertical Pod Autoscaler:<\/p>\n<details class=\"spoiler\">\n<summary>vpa.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: autoscaling.k8s.io\/v1 kind: VerticalPodAutoscaler metadata:   name: backend-vpa spec:   # \u0426\u0435\u043b\u044c VPA - Deployment \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \"backend\"   targetRef:     apiVersion: apps\/v1     kind: Deployment     name: backend   # \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f   updatePolicy:     # \u0420\u0435\u0436\u0438\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f - \"Off\" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e VPA \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b     # \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438     # \u0434\u043b\u044f \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f.     # \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.     # \"Auto\" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439     updateMode: 'Off'   resourcePolicy:     # \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432 Deployment     containerPolicies:       # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u043a\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c       - containerName: '*'         # \u0420\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f VPA         controlledResources: ['cpu', 'memory'] <\/code><\/pre>\n<\/div>\n<\/details>\n<p>VPA \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b (\u0426\u041f, \u043f\u0430\u043c\u044f\u0442\u044c) \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432 \u043f\u043e\u0434\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>VPA \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u0445\u043e\u0434\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<p>k8s \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\" rel=\"noopener noreferrer nofollow\">Horizontal Pod Autoscaler (HPA)<\/a> \u0434\u043b\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0435\u043f\u043b\u0438\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430<\/h4>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>frontend<\/code>.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 Deployment:<\/p>\n<details class=\"spoiler\">\n<summary>deployment.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- apiVersion: apps\/v1 kind: Deployment metadata:   # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043f\u043b\u043e\u044f   name: frontend   # \u041c\u0435\u0442\u043a\u0438   labels:     app: frontend spec:   # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043f\u043b\u0438\u043a (\u043a\u043e\u043f\u0438\u0439) \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   replicas: 1   # \u041b\u0438\u043c\u0438\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0440\u0435\u043b\u0438\u0437\u043e\u0432.   # \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f   # \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438   revisionHistoryLimit: 12   # \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u0434\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043f\u043b\u043e\u0439   selector:     matchLabels:       app: frontend   # \u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0432   template:     metadata:       labels:         app: frontend     spec:       containers:         - name: frontend           # \u041e\u0431\u0440\u0430\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f           image: gitlab.my-services.ru:5050\/my-store\/my-store-frontend:1.0.2213511           imagePullPolicy: IfNotPresent           # \u0420\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430           resources:             requests:               cpu: '0.5'               memory: '256Mi'             limits:               cpu: '1'               memory: '512Mi'           # \u041f\u043e\u0440\u0442\u044b           ports:             - containerPort: 8080           # \u041a\u0430\u043a\u0438\u0435 \u0442\u043e\u043c\u0430 \u0438 \u043a\u0443\u0434\u0430 (\u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430) \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c           volumeMounts:             - name: nginx-config-volume               mountPath: \/etc\/nginx\/conf.d\/default.conf               subPath: default.conf       volumes:         - name: nginx-config-volume           # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 ConfigMap, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e Nginx           configMap:             name: frontend-nginx-config       # \u0421\u0435\u043a\u0440\u0435\u0442\u044b \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a Gitlab Registry.       # Secrets \u0438\u0437 \u0431\u044d\u043a\u0435\u043d\u0434\u0430       imagePullSecrets:         - name: docker-config-secret <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c Service:<\/p>\n<details class=\"spoiler\">\n<summary>service.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- apiVersion: v1 kind: Service metadata:   name: frontend spec:   # \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0432\u0438\u0441 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f ClusterIP - \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430   ports:     - protocol: TCP       # \u041f\u043e\u0440\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430       port: 80       # \u041f\u043e\u0440\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0440\u0430\u0444\u0438\u043a       # \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f       targetPort: 8080   # \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u0434\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0440\u0430\u0444\u0438\u043a   selector:     app: frontend <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c ConfigMap \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 Nginx (\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0430\u043d\u0435\u0435 <code>default.conf<\/code>, \u043a\u0440\u043e\u043c\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0430):<\/p>\n<details class=\"spoiler\">\n<summary>configmap.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- apiVersion: v1 kind: ConfigMap metadata:   name: frontend-nginx-config data:   default.conf: |     server {       listen 8080;        location \/ {         root   \/usr\/share\/nginx\/html;         index  index.html;         try_files $uri $uri\/ \/index.html;       }        location \/api\/ {         proxy_pass http:\/\/backend:8081\/;       }     } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c Ingress:<\/p>\n<details class=\"spoiler\">\n<summary>ingress.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">--- apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: frontend   annotations:     # \u041a\u0430\u043a\u043e\u0439 ClusterIssuer \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u044b\u0434\u0430\u0447\u0438 TLS-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 cert-manager     cert-manager.io\/cluster-issuer: 'http01-clusterissuer' spec:   # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 ingress-nginx   ingressClassName: 'nginx'   # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 HTTPS   tls:     # \u0414\u043e\u043c\u0435\u043d\u044b, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0443\u0436\u0435\u043d \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442     - hosts:         # \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439         - 'mysuperduper.host'       # \u0418\u043c\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u0430, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f TLS-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442.       # \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439       secretName: mysuperduper.host-tls   # \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430   rules:     # \u0414\u043e\u043c\u0435\u043d, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.     # \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439     - host: 'mysuperduper.host'       http:         # \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0442\u0435\u0439 \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432         paths:           # \u0412\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u043a\u043e\u0440\u043d\u044e \u0441\u0430\u0439\u0442\u0430           - path: \/             pathType: Prefix             backend:               service:                 # \u0422\u0440\u0430\u0444\u0438\u043a \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \"frontend\"                 name: frontend                 port:                   number: 80 <\/code><\/pre>\n<\/div>\n<\/details>\n<p>Ingress \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u043c HTTP(S)-\u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. <em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c k8s, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0431\u043b\u0430\u043a\u0430, \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Terraform.<\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u043c\u0435\u043d\u0430, \u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0435\u0433\u043e DNS \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u0438\u043f\u0430 A \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e IP Ingress. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>kubectl get svc -n &lt;namespace&gt; | grep ingress<\/code> (\u0441\u0442\u043e\u043b\u0431\u0435\u0446 <code>EXTERNAL_IP<\/code>).<\/p>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, ClusterIssuer:<\/p>\n<details class=\"spoiler\">\n<summary>cert-manager.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">apiVersion: cert-manager.io\/v1 kind: ClusterIssuer metadata:   name: http01-clusterissuer spec:   acme:     server: https:\/\/acme-v02.api.letsencrypt.org\/directory     # \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439     email: myname@mail.com     privateKeySecretRef:       name: http01-clusterissuer-key     solvers:       - http01:           ingress:             class: nginx <\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u0418\u0442\u043e\u0433\u043e<\/h3>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>kubernetes     | backend         | deployment.yaml         | secrets.yaml         | service.yaml         | vpa.yml     | frontend         | cert-manager.yaml         | configmap.yml         | deployment.yaml         | ingress.yaml         | service.yaml <\/code><\/pre>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">cd kubernetes\/ # \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c &lt;dockerconfigjson&gt; \u0432 backend\/secrets.yaml  # \u0417\u0430\u043f\u0443\u0441\u043a kubectl apply -R -f . # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 kubectl delete -R -f . <\/code><\/pre>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/harryheman\/blog-posts\/tree\/master\/devops-kubernetes\" rel=\"noopener noreferrer nofollow\">devops-kubernetes \u043d\u0430 GitHub<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 Kubernetes, \u043d\u043e \u0434\u0443\u043c\u0430\u044e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438 \u043a\u0430\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u041d\u0430\u0440\u044f\u0434\u0443 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0418\u0422-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 (Ansible, Terraform, Docker \u0438 \u0442.\u0434.), Kubernetes \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0430 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430.<\/p>\n<p>Happy devopsing!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/936584\/\"> https:\/\/habr.com\/ru\/articles\/936584\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0435\u0440\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/913426\/\" rel=\"noopener noreferrer nofollow\">DevOps Tutorials \u2014 Ansible: \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/930326\/\" rel=\"noopener noreferrer nofollow\">DevOps Tutorials \u2014 Terraform: \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441\u0435\u0442\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Ubuntu Linux \u0432 Yandex Cloud \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Terraform \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 Angular+Java \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c JavaScript+Go \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c JavaScript+Go \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0438\u0436\u0435) \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d Kubernetes (<a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl-linux\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0434\u043b\u044f Linux<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0432 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u0441 Ingress (\u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/yandex.cloud\/ru\/docs\/managed-kubernetes\/\" rel=\"noopener noreferrer nofollow\">Yandex Managed Service for Kubernetes<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Yandex Cloud \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/yandex.cloud\/ru\/docs\/cli\/operations\/install-cli\" rel=\"noopener noreferrer nofollow\">yc CLI<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/yandex.cloud\/ru\/docs\/iam\/concepts\/authorization\/oauth-token\" rel=\"noopener noreferrer nofollow\">OAuth-\u0442\u043e\u043a\u0435\u043d<\/a> (<code>yc config set token &lt;OAuth-\u0442\u043e\u043a\u0435\u043d&gt;<\/code>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 IP Ingress, \u043d\u043e \u044d\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b &#171;\u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u043c&#187; \u0441\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d (\u043a\u0443\u043f\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/cp.beget.com\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>)<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e Kubernetes<\/h3>\n<p><a href=\"https:\/\/kubernetes.io\/\" rel=\"noopener noreferrer nofollow\">Kubernetes<\/a> (k8s) \u2014 \u044d\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430-\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 (cluster) \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043f\u0438\u0439, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0442\u043e\u043c\u0430 (volumes) \u0438 \u0442.\u0434.), \u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0430\u043c\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0438\u0445 \u043f\u0440\u0438 \u0441\u0431\u043e\u0435, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0438 \u0442.\u043f.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 &#8212; \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434, \u0431\u044d\u043a\u0435\u043d\u0434, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b. \u041a\u0430\u0436\u0434\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Docker). \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0438 \u0441\u0431\u043e\u0435, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0438 \u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f.<\/p>\n<p>K8s \u0431\u0435\u0440\u0435\u0442 \u044d\u0442\u043e \u043d\u0430 \u0441\u0435\u0431\u044f:<\/p>\n<ul>\n<li>\n<p>\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0445 \u043f\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c (\u0443\u0437\u043b\u0430\u043c &#8212; nodes) \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043f\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0430\u0432\u0442\u043e\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u2014 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0443\u043f\u0430\u0432\u0448\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>\u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443 \u0438 \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043c\u0438\u0440\u0443<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e (rolling update)<\/p>\n<\/li>\n<\/ul>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h4>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=TlHvYWVUZyc&amp;t=39s\" rel=\"noopener noreferrer nofollow\">Kubernetes Explained in 6 Minutes | k8s Architecture<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c (control plane\/master) \u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u044b (worker nodes).<\/p>\n<p><strong>Control plane<\/strong><\/p>\n<ul>\n<li>\n<p>API Server \u2014 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 (REST API). \u0412\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e<\/p>\n<\/li>\n<li>\n<p>etcd \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 &#171;\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&#187;, \u0433\u0434\u0435 k8s \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441)<\/p>\n<\/li>\n<li>\n<p>kube-scheduler (\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a) \u2014 \u0440\u0435\u0448\u0430\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u0443\u0437\u043b\u0430\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u0434\u044b (pods)<\/p>\n<\/li>\n<li>\n<p>kube-controller-manager \u2014 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 (\u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432, \u0440\u0435\u043f\u043b\u0438\u043a (replication), \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (endpoints) \u0438 \u0434\u0440.), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u044f\u0442 \u0437\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441 \u043d\u0438\u043c<\/p>\n<\/li>\n<\/ul>\n<p><strong>Worker nodes<\/strong><\/p>\n<ul>\n<li>\n<p>kubelet \u2014 \u0430\u0433\u0435\u043d\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0437\u043b\u0435; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 API Server \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u043f\u043e\u0434\u043e\u0432 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0447\u0435\u0440\u0435\u0437 runtime<\/p>\n<\/li>\n<li>\n<p>container runtime (\u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, containerd, CRI-O) \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>kube-proxy \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c (\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c iptables\/iptables-replacement)<\/p>\n<\/li>\n<li>\n<p>CNI-\u043f\u043b\u0430\u0433\u0438\u043d\u044b (Calico, Flannel, WeaveNet \u0438 \u0434\u0440.) \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0434\u0430\u043c\u0438<\/p>\n<\/li>\n<\/ul>\n<h4>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/h4>\n<ul>\n<li>\n<p>Container (\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440) \u2014 \u043a\u0430\u043a \u0432 Docker: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 + \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>Pod (\u043f\u043e\u0434) \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 k8s: \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u043c\u0435\u0441\u0442\u0435 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u0435\u0442\u044c \u0438 \u0442\u043e\u043c\u0430. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 Pod \u2014 1 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 + \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b (sidecars). \u041f\u043e\u0434\u044b \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b<\/p>\n<\/li>\n<li>\n<p>ReplicaSet (\u043d\u0430\u0431\u043e\u0440 \u0440\u0435\u043f\u043b\u0438\u043a) \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043f\u0438\u0439 \u043f\u043e\u0434\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>Deployment (\u0434\u0435\u043f\u043b\u043e\u0439, \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435) \u2014 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439\/\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f ReplicaSet (\u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u043e\u0442\u043a\u0430\u0442\u044b). \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0431\u0435\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (stateless)<\/p>\n<\/li>\n<li>\n<p>StatefulSet (\u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439) \u2014 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c (stateful) (\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0447\u0435\u0440\u0435\u0434\u0438) \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0442\u043e\u043c\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>DaemonSet (\u043d\u0430\u0431\u043e\u0440 \u0434\u0435\u043c\u043e\u043d\u043e\u0432) \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043f\u0438\u044e \u043f\u043e\u0434\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c (\u0438\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445) \u0443\u0437\u043b\u0435 \u2014 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\/\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<li>\n<p>Job\/CronJob \u2014 \u0440\u0430\u0437\u043e\u0432\u044b\u0435 (Job) \u0438\u043b\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 (CronJob) \u0437\u0430\u0434\u0430\u0447\u0438<\/p>\n<\/li>\n<li>\n<p>Service (\u0441\u0435\u0440\u0432\u0438\u0441) \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u0434\u0430\u043c (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 IP + \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430). \u0422\u0438\u043f\u044b: ClusterIP (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430), NodePort, LoadBalancer<\/p>\n<\/li>\n<li>\n<p>Ingress \u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 (HTTP) \u0438 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440; \u0442\u0440\u0435\u0431\u0443\u0435\u0442 Ingress Controller (nginx-ingress, Traefik \u0438 \u0434\u0440.)<\/p>\n<\/li>\n<li>\n<p>ConfigMap\/Secret \u2014 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 \u043f\u043e\u0434\u0430\u0445. Secret \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e (\u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u2014 base64; \u0432 \u043f\u0440\u043e\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Vault)<\/p>\n<\/li>\n<li>\n<p>Volume, PersistentVolume (PV), PersistentVolumeClaim (PVC), StorageClass \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f; PVC \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 PV, StorageClass \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>Namespace (\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d) \u2014 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (multi-tenant, \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f)<\/p>\n<\/li>\n<li>\n<p>CRD (Custom Resource Definition)\/Operator \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 API k8s \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<h4>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b<\/h4>\n<ul>\n<li>\n<p>\u041c\u044b \u043f\u0438\u0448\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b (\u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 YAML) \u2014 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c Deployment, Service \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<li>\n<p><code>kubectl apply<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b (\u043e\u0431\u044a\u0435\u043a\u0442\u044b) \u0432 API Server<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0440\u0435\u0448\u0430\u044e\u0442, \u0433\u0434\u0435 \u0438 \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u0434\u044b; kubelet \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0447\u0435\u0440\u0435\u0437 runtime<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u043f\u043e\u0434 \u043f\u0430\u0434\u0430\u0435\u0442, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\/\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 Deployment \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 rolling update, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c<\/p>\n<\/li>\n<\/ul>\n<h4>\u0421\u0435\u0442\u044c<\/h4>\n<ul>\n<li>\n<p>\u0412 k8s \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c &#171;\u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0434\u0443 \u2014 \u0441\u0432\u043e\u0439 IP, \u043f\u043e\u0434\u044b \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e&#187;. \u042d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 CNI-\u043f\u043b\u0430\u0433\u0438\u043d<\/p>\n<\/li>\n<li>\n<p>Service \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u0434\u043e\u0432 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>Ingress \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u043c HTTP(S)-\u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b<\/p>\n<\/li>\n<li>\n<p>NetworkPolicy \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442, \u043a\u0442\u043e \u0441 \u043a\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f (\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u0434\u0430)<\/p>\n<\/li>\n<\/ul>\n<h4>\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u043f\u0438\u0437\u043e\u0434\u0438\u0447\u043d\u044b (\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c\u0438) \u2014 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f PersistentVolumes<\/p>\n<\/li>\n<li>\n<p>StorageClass \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0442\u043e\u043c\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0434\u0438\u0441\u043a\u0438 \u0432 GCE\/AWS)<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c (\u0411\u0414) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 StatefulSet + PVC<\/p>\n<\/li>\n<\/ul>\n<h4>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>Requests\/Limits (\u0437\u0430\u043f\u0440\u043e\u0441\u044b\/\u043b\u0438\u043c\u0438\u0442\u044b) \u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435\/\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b (\u0426\u041f, \u043f\u0430\u043c\u044f\u0442\u044c) \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430; \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 QoS<\/p>\n<\/li>\n<li>\n<p>Horizontal Pod Autoscaler (HPA) \u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043e\u0432 \u043f\u043e \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c<\/p>\n<\/li>\n<li>\n<p>Vertical Pod Autoscaler (VPA) \u2014 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b\/\u043b\u0438\u043c\u0438\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>Cluster Autoscaler \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\/\u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0443\u0437\u043b\u044b \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u043f\u043e\u0434 \u043d\u0443\u0436\u0434\u044b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<\/ul>\n<h4>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/h4>\n<ul>\n<li>\n<p>RBAC (Role-Based Access Control) \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a API<\/p>\n<\/li>\n<li>\n<p>NetworkPolicy \u2014 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0434\u0430\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>Secrets \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>Pod Security \u2014 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043e\u0432 (\u0440\u0430\u043d\u044c\u0448\u0435 \u0431\u044b\u043b\u0430 PodSecurityPolicy, \u0432 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0431\u044b\u043b\u0430 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u0430 \u043d\u0430 Pod Security Admission; \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435 Gatekeeper\/OPA)<\/p>\n<\/li>\n<li>\n<p>runtime &#8212; \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0441 \u043d\u0435\u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 capabilities, seccomp, SELinux\/AppArmor \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043c\u0435\u0442\u0440\u0438\u043a\u0438, \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430<\/h4>\n<ul>\n<li>\n<p>\u041e\u0442\u0447\u0435\u0442\u044b (\u043b\u043e\u0433\u0438): \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442 \u0430\u0433\u0435\u043d\u0442\u044b (fluentd\/fluent-bit, Logstash) \u0438 \u0445\u0440\u0430\u043d\u044f\u0442 \u0432 Elasticsearch\/Loki<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u0440\u0438\u043a\u0438: Prometheus + Grafana \u2014 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/p>\n<\/li>\n<li>\n<p>\u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430: Jaeger, OpenTelemetry \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b: \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e\u0434\u0430\/\u0443\u0437\u043b\u0430, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 (alerting), \u043f\u0430\u043d\u0435\u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 (dashboards)<\/p>\n<\/li>\n<\/ul>\n<h4>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h4>\n<ul>\n<li>\n<p>kubectl \u2014 CLI \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c<\/p>\n<\/li>\n<li>\n<p>kubeadm, kops, kubespray \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>minikube, kind \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>Helm \u2014 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (\u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0435\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435)<\/p>\n<\/li>\n<li>\n<p>Operators (\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b) \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (CRD + \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440)<\/p>\n<\/li>\n<li>\n<p>Managed Kubernetes: GKE (Google), EKS (AWS), AKS (Azure), Yandex Cloud \u2014 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 control plane.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e Deployment + Service<\/h4>\n<pre><code class=\"yaml\"># deployment.yaml apiVersion: apps\/v1 kind: Deployment metadata:   name: hello-deploy spec:   replicas: 3   selector:     matchLabels:       app: hello   template:     metadata:       labels:         app: hello     spec:       containers:         - name: hello           image: nginx:stable           ports:             - containerPort: 80           readinessProbe:             httpGet:               path: \/               port: 80             initialDelaySeconds: 5             periodSeconds: 10           resources:             requests:               cpu: \"100m\"               memory: \"128Mi\"             limits:               cpu: \"200m\"               memory: \"256Mi\"  --- # service.yaml apiVersion: v1 kind: Service metadata:   name: hello-svc spec:   type: ClusterIP   selector:     app: hello   ports:     - port: 80       targetPort: 80 <\/code><\/pre>\n<p>\u041c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u044d\u0442\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/home\/\" rel=\"noopener noreferrer nofollow\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.geeksforgeeks.org\/devops\/kubernetes-tutorial\/\" rel=\"noopener noreferrer nofollow\">Kubernetes Tutorial &#8212; GeeksForGeeks<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=X48VuDVv0do\" rel=\"noopener noreferrer nofollow\">Kubernetes Tutorial for Beginners<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f<\/h3>\n<p>\u041d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u043d\u0430 Vue.js \u0438 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043d\u0430 Go. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u0411\u0414, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0431\u0435\u0437 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c Dockerfile \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>Dockerfile \u0431\u044d\u043a\u0435\u043d\u0434\u0430:<\/p>\n<pre><code>FROM golang:1.21 as builder  WORKDIR \/app  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 COPY go.mod go.sum .\/ RUN go mod download  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f COPY . .  # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Linux # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c CGO_ENABLED=0 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, # \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0431\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a C RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .\/cmd\/api  # \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 Yandex Internal Root CA RUN curl https:\/\/storage.yandexcloud.net\/cloud-certs\/CA.pem -o YandexInternalRootCA.crt  FROM<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-471779","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471779","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=471779"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471779\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=471779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=471779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=471779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}