{"id":399610,"date":"2024-06-29T14:46:25","date_gmt":"2024-06-29T14:46:25","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=399610"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=399610","title":{"rendered":"<span>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Kubernetes \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e K3s<\/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-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/997\/32c\/77e\/99732c77e2f9b734ef1cf61d17237ca3.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/997\/32c\/77e\/99732c77e2f9b734ef1cf61d17237ca3.png\"\/><\/div>\n<p>  <\/p>\n<h2>\u041d\u043e \u0437\u0430\u0447\u0435\u043c<\/h2>\n<p>  <\/p>\n<p>\u0417\u043d\u0430\u044e, \u043e \u0447\u0435\u043c \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u2014 Kubernetes? \u041d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435? \u041a\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <i>\u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e<\/i> \u0441\u0443\u043c\u0430\u0441\u0448\u0435\u0434\u0448\u0438\u043c? \u0427\u0442\u043e \u0436, \u0440\u0430\u043d\u044c\u0448\u0435 \u044f \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f \u0431\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e \u043c\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u042f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u0442 DevOps \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e \u0437\u043d\u0430\u043d\u0438\u0435\u043c Kubernetes (\u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c K8s), \u0438 \u0434\u0430\u0436\u0435 \u0431\u0443\u0434\u0443\u0447\u0438 \u0441\u0442\u0430\u0440\u044b\u043c \u043d\u0435\u043d\u0430\u0432\u0438\u0441\u0442\u043d\u0438\u043a\u043e\u043c K8s \u0438\u0437-\u0437\u0430 \u0435\u0433\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0441\u0442\u0438, \u0431\u044b\u043b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u043a \u043f\u043e\u0434\u0430\u043c. \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0430\u0437\u0430\u0440\u0442 \u043e\u0442 \u0443\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0432\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0432\u0435\u0440\u044f \u0434\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u043e\u0440\u0430\u0436\u0438\u0442 \u043c\u0435\u043d\u044f. \u0418 \u0432\u043e\u043e\u0431\u0449\u0435, K8s \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u0438\u0440 \u2014 \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0432\u0440\u0435\u0434\u044f\u0442.<a name=\"habracut\"><\/a><\/p>\n<p>  <\/p>\n<p>\u042f \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435 <i>\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u043d\u0430\u0442<\/i> K8s, \u043e\u0434\u043d\u0430\u043a\u043e \u0441 Docker <a href=\"https:\/\/chrisshort.net\/docker-inc-is-dead\/\">\u0432\u0441\u0451 \u043f\u043b\u043e\u0445\u043e<\/a>, \u0438 \u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442 Swarm \u0434\u0430\u0432\u043d\u043e \u043c\u0435\u0440\u0442\u0432; <a href=\"https:\/\/www.nomadproject.io\/\">Nomad<\/a> \u043d\u0435\u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435 (\u0438\u043b\u0438 \u043d\u0435 \u043d\u0430 100% \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0437\u0430 \u00ab\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439\u00bb \u0441\u0442\u0435\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430), \u0430 <a href=\"https:\/\/mesos.apache.org\/\">Mesos<\/a> \u043d\u0435 \u043d\u0430\u0431\u0440\u0430\u043b \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u0430\u0441\u0441\u044b. \u0412\u0441\u0435 \u044d\u0442\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u0435\u043b\u0430\u0435\u0442 K8s \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u043a\u0430\u043a \u043f\u043e\u0445\u0432\u0430\u043b\u0443 \u2014 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432 IT \u0443\u0441\u043f\u0435\u0445 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0443 (\u0441\u043c. Window \u0432 1995 \u0433\u043e\u0434\u0443). \u0418, \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, \u043e\u043d \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0439, \u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0412 \u043c\u043e\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u043e\u043a\u043e\u043b\u043e 35 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a wiki, \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043c\u0443\u0437\u044b\u043a\u0438 Airsonic, MinIO \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0435 \u0441 S3 API, \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0435\u0449\u0435, \u043f\u043b\u044e\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Samba \u0438 NFS, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f Kodi \u043d\u0430 \u043c\u043e\u0435\u043c Shield TV \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u041f\u041a\/\u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430 \u0434\u043e\u043c\u0430.<\/p>\n<p>  <\/p>\n<p>\u0423\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 5 \u043b\u0435\u0442 \u044f \u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0430 <a href=\"https:\/\/www.openmediavault.org\/\">OpenMediaVault<\/a>, \u043e\u0434\u043d\u0430\u043a\u043e \u0442\u0435\u043c\u043f\u044b \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u043b\u0438\u0441\u044c, \u0438, \u0431\u0443\u0434\u0443\u0447\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 Debian, \u043e\u043d \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u00ab\u0440\u0435\u043b\u0438\u0437\u043e\u0432\u00bb. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u044b\u0439 \u0432\u044b\u043f\u0443\u0441\u043a Debian, \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u042f \u0436\u0438\u043b \u0441 \u044d\u0442\u0438\u043c \u0441 Debian 8 \u0438\u043b\u0438 9, \u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0439 11-\u0439 \u0432\u044b\u043f\u0443\u0441\u043a \u0438\u0437\u0440\u044f\u0434\u043d\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u043e\u043c\u0430\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d. \u042f \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0447\u0442\u043e \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f OpenMediaVault \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e K8s \u0441\u0440\u0435\u0434\u0438 \u00ab\u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445\u00bb \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u0432 NAS, \u0435\u0441\u043b\u0438 \u0441\u0443\u0434\u0438\u0442\u044c \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <a href=\"https:\/\/github.com\/topics\/k8s-at-home\">\u00abeasy\u00bb \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 K8s<\/a> \u043d\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0445 \u0435\u043c\u0443<a href=\"https:\/\/discord.com\/invite\/k8s-at-home\"> Discord-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445<\/a> \u0438 Github. \u0414\u043e\u0432\u0435\u0440\u0438\u0435 \u043a \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u043f\u0430\u043b\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438, \u2014 \u043d\u0435 \u043c\u043e\u0439 \u0441\u0442\u0438\u043b\u044c, \u0438 \u0435\u0441\u043b\u0438 \u044f \u0434\u043e\u0432\u0435\u0440\u044f\u044e \u0447\u0435\u043c\u0443-\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0438\u043c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0442\u043e \u043a \u0447\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u043c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0438\u0432\u0430\u0442\u044c \u0443\u0439\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0438 \u044f \u0440\u0435\u0434\u043a\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0434\u0435\u0442 161-\u0439 \u0434\u0435\u043d\u044c \u0430\u043f\u0442\u0430\u0439\u043c\u0430! \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435\u043d\u043a\u043e\u0439. \u041f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c OpenMediaVault, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d ZFS, \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0439 4-\u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0439 \u043f\u0443\u043b ZFS, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Samba \u0438 NFS, \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/www.portainer.io\/\">Portainer<\/a>, \u0437\u0430\u043d\u043e\u0432\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u043e\u0438 <code>docker-compose<\/code> \u0444\u0430\u0439\u043b\u044b\u2026 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0431\u043e\u0440. K8s \u0436\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <i>\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c<\/i> \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 (\u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438) \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 ZFS, \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u043b, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u044b, \u0438 \u0432\u0443\u0430\u043b\u044f! \u0412 \u0442\u0435\u043e\u0440\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u041c\u0438\u043d\u0443\u0442\u043e\u0447\u043a\u0443. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u2014 \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0430\u043a\u043e\u0435 Kubernetes?<\/p>\n<p>  <\/p>\n<h2>\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 Kubernetes<\/h2>\n<p>  <\/p>\n<p><a href=\"https:\/\/kubernetes.io\/\">Kubernetes<\/a> (\u043f\u043e-\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438 \u00ab\u043a\u043e\u0440\u043c\u0447\u0438\u0439\u00bb) \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0434\u043b\u044f \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 Google. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d\u0438 \u043d\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0447\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0442\u0435\u043e\u0440\u0438\u044e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0422\u0440\u043e\u044f\u043d\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u044c, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u043d\u0438 \u043e\u0434\u043d\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0440\u043e\u0441\u0438\u0442 \u0438\u043c \u0432\u044b\u0437\u043e\u0432 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0448\u0442\u0443\u043a\u043e\u0439 (\u044d\u0442\u043e, \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0441\u043b\u043e\u0436\u043d\u043e).<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, \u0432\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438\u043b\u0438, \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u043d\u0430 \u043d\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a. \u041e\u043d \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0438\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u0441 \u043d\u0438\u043c \u043f\u0443\u0442\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f YAML \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0438\u0445 <i>\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f<\/i> \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443, \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>kubectl<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 YAML \u0432 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 JSON, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 REST API \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 K8s \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445:<\/p>\n<p>  <\/p>\n<ul>\n<li><strong>\u041f\u043e\u0434 (Pod)<\/strong>, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438\u043b\u0438 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u041f\u043e\u0434\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u0443\u0437\u043b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. K8s \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u0430\u043c IP-\u0430\u0434\u0440\u0435\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u0440\u0443\u0433 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0430, \u043d\u043e \u043d\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u0430\u0445. \u0412\u0430\u043c \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434\u0430\u043c\u0438, \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0421\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/li>\n<li><strong>\u0421\u0435\u0440\u0432\u0438\u0441\u044b (Services)<\/strong> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440\u044b \u043f\u043e\u0434\u043e\u0432 \u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0438 \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u044b\u043c \u0446\u0435\u043b\u044b\u043c. \u041e\u043d\u0438 \u043d\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u043e\u0434\u0430\u043c\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e (\u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 ReplicaSets), \u043d\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432\u0430\u043c \u0434\u0430\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435. \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u043d\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <i>\u043c\u0435\u0442\u043e\u043a<\/i>.<\/li>\n<li><strong>\u041c\u0435\u0442\u043a\u0438 (Labels)<\/strong>. \u041a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0432 K8s \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u041c\u0435\u0442\u043a\u0438 \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0438\u0445 \u0444\u043e\u0440\u043c, \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u2014 \u0434\u0440\u0443\u0433\u0430\u044f. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 K8s \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438.<\/li>\n<li><strong>\u0422\u043e\u043c\u0430 (Volumes)<\/strong>, \u043a\u0430\u043a \u0438 \u0432 Docker, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c. \u041d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 S3 \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0441 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c\u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f\u043c\u0438, \u043d\u043e \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u043e\u043c\u0430 hostPath, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u0430\u043f\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 K8s \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u044d\u0442\u043e \u2014 \u0434\u043b\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c Persistent Volume (PV) \u0438 PersistentVolumeClaim (PVC). \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f hostPath \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u043e\u0434\u043d\u0430\u043a\u043e PVS \u0438 PVCS \u0434\u0430\u0434\u0443\u0442 \u0432\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u043c\u0430.<\/li>\n<li>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 <strong>\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f (deployments)<\/strong> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u043c\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u043c\u0438. \u041e\u043d\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442, \u043a\u0430\u043a\u043e\u0439 Docker-\u043e\u0431\u0440\u0430\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a\u0438\u0435 \u0442\u043e\u043c\u0430 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0440\u0442\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u0437\u0430\u0431\u043e\u0442\u044f\u0442\u0441\u044f \u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/li>\n<li><strong>ConfigMaps<\/strong> \u2014 \u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u0444\u043e\u0440\u043c\u0435 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0438\u0437 ConfigMap \u2014 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043b\u0438 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438.<\/li>\n<li><strong>Ingress<\/strong>. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u0430\u0448\u0438 \u043f\u043e\u0434\u044b \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u044b \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u0438\u0440\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f nginx ingresses.<\/li>\n<li><strong>Jobs<\/strong> \u0438 <strong>CronJobs<\/strong> \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043e\u0432\u044b\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c, \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 K8s \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/extend-kubernetes\/custom-resources\/custom-resource-definitions\/\">CRD<\/a>. <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> \u2014 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u043f\u0440\u043e\u0439\u0442\u0438 \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0443\u0442\u044c \u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443.<\/p>\n<p>  <\/p>\n<h2>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e!<\/h2>\n<p>  <\/p>\n<h3>\u0428\u0430\u0433 1 \u2014 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Linux<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c VirtualBox (\u043e\u043d \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439) \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 Debian 11 \u0431\u0435\u0437 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0441 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c OpenSSH. \u0414\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u043c\u0438, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0430 \u043d\u0430 Debian. \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 Arch, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u00ab\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0440\u0435\u043b\u0438\u0437\u0430\u043c\u0438\u00bb, \u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0435\u043c\u043d\u043e\u0436\u043a\u0443. \u041f\u043e\u0441\u043b\u0435 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0441 \u043d\u0443\u043b\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 (\u0443 \u043c\u0435\u043d\u044f \u0438\u0445 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f), \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443-\u043a\u043b\u043e\u043d, \u0441\u043d\u043e\u0432\u0430 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043d\u044d\u043f\u0448\u043e\u0442\u044b \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u043d\u043e, \u043f\u043e-\u043c\u043e\u0435\u043c\u0443, \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e.<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/2ea\/4cf\/222\/2ea4cf222ace9bd0b2c3add1dc3384b3.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2ea\/4cf\/222\/2ea4cf222ace9bd0b2c3add1dc3384b3.png\"\/><\/div>\n<p>  <\/p>\n<p><i>\u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b<\/i><\/p>\n<p>  <\/p>\n<p>\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0432\u0430\u0448\u0435\u0439 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 <code>Bridged<\/code> \u0438 \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 MAC-\u0430\u0434\u0440\u0435\u0441, \u0447\u0442\u043e \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 IP-\u0430\u0434\u0440\u0435\u0441. \u042d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442 \u043f\u0440\u043e\u0431\u0440\u043e\u0441 \u043f\u043e\u0440\u0442\u043e\u0432 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0435.<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/8f0\/b3b\/a08\/8f0b3ba08fd28fdb8a27ffad8810372c.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8f0\/b3b\/a08\/8f0b3ba08fd28fdb8a27ffad8810372c.png\"\/><\/div>\n<p>  <\/p>\n<p><i>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 MAC-\u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b<\/i><\/p>\n<p>  <\/p>\n<p>\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0440\u0442\u044b \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0431\u0440\u043e\u0448\u0435\u043d\u044b \u043d\u0430 IP-\u0430\u0434\u0440\u0435\u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li>80\/TCP http<\/li>\n<li>443\/TCP https<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u0442\u043e\u0439 \u0436\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u0447\u0442\u043e \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 (DigitalOcean, Amazon \u0438 \u0442.\u0434.), \u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u044c\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0440\u0442\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li>22\/TCP ssh<\/li>\n<li>6443\/TCP K8s API<\/li>\n<li>10250\/UDP kubelet<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u0432\u043e\u0439 SSH-\u043a\u043b\u044e\u0447 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 c root \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0431\u0435\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0430\u0440\u043e\u043b\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435\u0441\u044c \u043a \u043d\u0435\u043c\u0443 \u043f\u043e SSH. \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Host k3s   User root   Hostname &lt;your VM or server's IP><\/code><\/pre>\n<p>  <\/p>\n<p>\u0432 \u0432\u0430\u0448 \u0444\u0430\u0439\u043b <code>.ssh\/config<\/code>, \u0442\u043e \u043f\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>ssh k3s<\/code> \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 root.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <code>kubectl<\/code>. \u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e <a href=\"https:\/\/github.com\/asdf-community\/asdf-kubectl\">\u043f\u043b\u0430\u0433\u0438\u043d asdf.<\/a><\/p>\n<p>  <\/p>\n<h3>\u0428\u0430\u0433 2 \u2014 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 k3s <\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 Kubernetes \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u043c \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u043d\u0443\u044e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0443 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/k3s.io\/\">K3s<\/a>, \u0433\u0438\u0431\u043a\u043e\u0435 single-binary \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u0430 100 % \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0435 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 K8s.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c K3s \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Makefile<\/code> (\u0441\u0442\u0430\u0440\u0430\u044f \u0448\u043a\u043e\u043b\u0430 \u2014 \u043c\u043e\u0439 \u0441\u0442\u0438\u043b\u044c). \u0412\u0432\u0435\u0440\u0445\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\"># set your host IP and name HOST_IP=192.168.1.60 HOST=k3s # do not change the next line KUBECTL=kubectl --kubeconfig ~\/.kube\/k3s-vm-config<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 IP \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, <code>HOST<\/code>\u2014 \u044d\u0442\u043e \u043c\u0435\u0442\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>.ssh\/config<\/code>, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c <code>user@HOST_IP<\/code>, \u043d\u043e \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0444\u0430\u0439\u043b Makefile \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e. \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>KUBECTL<\/code> \u043f\u0440\u043e\u044f\u0441\u043d\u0438\u0442\u0441\u044f, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c K3s. \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 Makefile \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0446\u0435\u043b\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">k3s_install:   ssh ${HOST} 'export INSTALL_K3S_EXEC=\" --no-deploy servicelb --no-deploy traefik\"; \\     curl -sfL https:\/\/get.k3s.io | sh -'   scp ${HOST}:\/etc\/rancher\/k3s\/k3s.yaml .   sed -r 's\/(\\b[0-9]{1,3}\\.){3}[0-9]{1,3}\\b'\/\"${HOST_IP}\"\/ k3s.yaml > ~\/.kube\/k3s-vm-config &amp;&amp; rm k3s.yaml <\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u041a, \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u0435-\u0447\u0442\u043e \u043f\u0440\u043e\u044f\u0441\u043d\u0438\u0442\u044c. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e Ssh \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 K3s \u0441 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<ul>\n<li>servicelb \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/li>\n<li>traefik \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c nginx \u0434\u043b\u044f ingresses, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 ingress-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 <code>k3s.yaml<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u0435\u0433\u043e API. \u0422\u0440\u0435\u0442\u044c\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 IP-\u0430\u0434\u0440\u0435\u0441 <code>127.0.0.1<\/code> \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>.kube<\/code> \u0432\u0430\u0448\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 $HOME (\u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442). \u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c <code>kubectl<\/code> \u043d\u0430\u0439\u0434\u0435\u0442 \u0435\u0433\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u044f\u0432\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>KUBECTL<\/code> \u0432 Makefile \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>  <\/p>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ssh k3s 'export INSTALL_K3S_EXEC=\" --no-deploy servicelb --no-deploy traefik\"; \\   curl -sfL https:\/\/get.k3s.io | sh -' [INFO]  Finding release for channel stable [INFO]  Using v1.21.7+k3s1 as release [INFO]  Downloading hash https:\/\/github.com\/k3s-io\/k3s\/releases\/download\/v1.21.7+k3s1\/sha256sum-amd64.txt [INFO]  Downloading binary https:\/\/github.com\/k3s-io\/k3s\/releases\/download\/v1.21.7+k3s1\/k3s [INFO]  Verifying binary download [INFO]  Installing k3s to \/usr\/local\/bin\/k3s [INFO]  Skipping installation of SELinux RPM [INFO]  Creating \/usr\/local\/bin\/kubectl symlink to k3s [INFO]  Creating \/usr\/local\/bin\/crictl symlink to k3s [INFO]  Creating \/usr\/local\/bin\/ctr symlink to k3s [INFO]  Creating killall script \/usr\/local\/bin\/k3s-killall.sh [INFO]  Creating uninstall script \/usr\/local\/bin\/k3s-uninstall.sh [INFO]  env: Creating environment file \/etc\/systemd\/system\/k3s.service.env [INFO]  systemd: Creating service file \/etc\/systemd\/system\/k3s.service [INFO]  systemd: Enabling k3s unit Created symlink \/etc\/systemd\/system\/multi-user.target.wants\/k3s.service \u2192 \/etc\/systemd\/system\/k3s.service. [INFO]  systemd: Starting k3s scp k3s:\/etc\/rancher\/k3s\/k3s.yaml . k3s.yaml                                         100% 2957    13.1MB\/s   00:00 sed -r 's\/(\\b[0-9]{1,3}\\.){3}[0-9]{1,3}\\b'\/\"YOUR HOST IP HERE\"\/ k3s.yaml > ~\/.kube\/k3s-vm-config &amp;&amp; rm k3s.yaml <\/code><\/pre>\n<p>  <\/p>\n<p>\u042f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0435, \u043a\u0430\u043a \u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0445, <code>sed<\/code> \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>kubectl --kubeconfig ~\/.kube\/k3s-vm-config get nodes<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NAME     STATUS   ROLES                  AGE    VERSION k3s-vm   Ready    control-plane,master   2m4s   v1.21.7+k3s1<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 K8s \u0442\u0435\u043f\u0435\u0440\u044c \u0433\u043e\u0442\u043e\u0432 \u043a \u043f\u0440\u0438\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a!<\/p>\n<p>  <\/p>\n<h3>\u0428\u0430\u0433 2.5 \u041a\u043b\u0438\u0435\u043d\u0442\u044b (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441<\/p>\n<p>  <\/p>\n<p>K8s, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/k9scli.io\/\">k9s <\/a>(CLI) \u041c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0441 \u043d\u0438\u043c \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c.<\/li>\n<\/ul>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/a51\/fa7\/f98\/a51fa7f983f8cb70ae6580687ea8b2ab.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a51\/fa7\/f98\/a51fa7f983f8cb70ae6580687ea8b2ab.png\"\/><\/div>\n<p>  <\/p>\n<p><i>k9s<\/i><\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"http:\/\/lens\">Lens<\/a> (GUI) \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043d\u0430 \u043d\u0435\u0433\u043e, \u0437\u0434\u0435\u0441\u044c \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/582\/b23\/78a\/582b2378a2bb0165805db8068afb5036.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/582\/b23\/78a\/582b2378a2bb0165805db8068afb5036.png\"\/><\/div>\n<p>  <\/p>\n<p><i>Lens<\/i><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0448\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 <code>~\/.kube<\/code>.<\/p>\n<p>  <\/p>\n<h3>\u0428\u0430\u0433 3 \u2014 nginx ingress, Let\u2019s Encrypt \u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/h3>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0446\u0435\u043b\u044c \u0432 \u043d\u0430\u0448\u0435\u043c Makefile \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 nginx ingress-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 Let\u2019s Encrypt, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0438 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u043b\u0438 \u0438\u043c\u0435\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b TLS (\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e!). \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439. <\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">base:   ${KUBECTL} apply -f k8s\/ingress-nginx-v1.0.4.yml   ${KUBECTL} wait --namespace ingress-nginx \\             --for=condition=ready pod \\             --selector=app.kubernetes.io\/component=controller \\             --timeout=60s   ${KUBECTL} apply -f k8s\/cert-manager-v1.0.4.yaml   @echo   @echo \"waiting for cert-manager pods to be ready... \"   ${KUBECTL} wait --namespace=cert-manager --for=condition=ready pod --all --timeout=60s   ${KUBECTL} apply -f k8s\/lets-encrypt-staging.yml   ${KUBECTL} apply -f k8s\/lets-encrypt-prod.yml <\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0439\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043c\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/gist.github.com\/sardaukar\/6a950ea9abcfe651e68876dbc6001fb0\">\u0442\u0443\u0442<\/a>. Nginx ingress YAML \u043f\u043e\u043b\u0443\u0447\u0435\u043d <a href=\"https:\/\/github.com\/jetstack\/cert-manager\/releases\/download\/v1.0.4\/cert-manager.yaml\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>, \u043d\u043e \u0441 \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 323:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">dnsPolicy: ClusterFirstWithHostNet hostNetwork: true<\/code><\/pre>\n<p>  <\/p>\n<p>\u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c DNS \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0441 \u043e\u0434\u043d\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/dns-pod-service\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b <code>cert-manager<\/code> \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a <a href=\"https:\/\/cert-manager.io\/docs\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u043f\u043e \u043d\u0435\u043c\u0443. \u0414\u043b\u044f \u0432\u044b\u0434\u0430\u0447\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 Let&#8217;s Encrypt \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>ClusterIssuer<\/code>. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430, \u043e\u0434\u0438\u043d \u0434\u043b\u044f staging API \u0438 \u043e\u0434\u0438\u043d \u0434\u043b\u044f production. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 staging issuer \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0430\u0447\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0432 \u043e\u0431\u043e\u0438\u0445 issuers \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># k8s\/lets-encrypt-staging.yml apiVersion: cert-manager.io\/v1 kind: ClusterIssuer metadata:   name: letsencrypt-staging   namespace: cert-manager spec:   acme:     server: https:\/\/acme-staging-v02.api.letsencrypt.org\/directory     email: YOUR.EMAIL@DOMAIN.TLD     privateKeySecretRef:       name: letsencrypt-staging     solvers:     - http01:         ingress:           class: nginx<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># k8s\/lets-encrypt-prod.yml apiVersion: cert-manager.io\/v1 kind: ClusterIssuer metadata:   name: letsencrypt-prod   namespace: cert-manager spec:   acme:     server: https:\/\/acme-v02.api.letsencrypt.org\/directory     email: YOUR.EMAIL@DOMAIN.TLD     privateKeySecretRef:       name: letsencrypt-prod     solvers:     - http01:         ingress:           class: nginx<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>kubectl apply<\/code> \u043e\u0434\u043d\u0443 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0431\u044b \u043d\u0435\u0443\u0434\u0430\u0447\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a cert-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 \u0443\u0436\u0435 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c ingress-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c. \u0421 \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u0432 <code>kubectl<\/code> \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u043f\u043e\u0434\u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>wait<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u043c\u0435\u0442\u043a\u0438 (\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0438\u0445?) \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u0442\u043e\u0432\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0442\u0440\u044b\u0432\u043e\u043a \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0448\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">${KUBECTL} wait --namespace ingress-nginx \\             --for=condition=ready pod \\             --selector=app.kubernetes.io\/component=controller \\             --timeout=60s<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 60 \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043f\u043e\u0434\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0443 <code>app.kubernetes.io\/component=controller<\/code>, \u043d\u0435 \u0441\u0442\u0430\u043d\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <code>ready<\/code>. \u0415\u0441\u043b\u0438 \u0438\u0441\u0442\u0435\u0447\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, Makefile \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u0442\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0446\u0435\u043b\u0435\u0439 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <code>make base<\/code> \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u0438 \u0435\u0441\u043b\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043e\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435!<\/p>\n<p>  <\/p>\n<h3>\u0428\u0430\u0433 4 \u2014 Portrainer <\/h3>\n<p>  <\/p>\n<p>\u041c\u043d\u0435 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 <a href=\"https:\/\/www.portainer.io\/\">Portainer<\/a> \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0438, \u043f\u043e \u0443\u0434\u0430\u0447\u043d\u043e\u043c\u0443 \u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432, \u043e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u043a K8s, \u0442\u0430\u043a \u0438 Docker. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0447\u0430\u0441\u0442\u044f\u043c \u0444\u0430\u0439\u043b\u0430 YAML:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">--- apiVersion: v1 kind: Namespace metadata:   name: portainer<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, Portainer \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">--- apiVersion: v1 kind: PersistentVolume metadata:   labels:     type: local   name: portainer-pv spec:   storageClassName: local-storage   capacity:     storage: 1Gi   accessModes:     - ReadWriteOnce   hostPath:     path: \"\/zpool\/volumes\/portainer\/claim\" --- # Source: portainer\/templates\/pvc.yaml kind: \"PersistentVolumeClaim\" apiVersion: \"v1\" metadata:   name: portainer   namespace: portainer   annotations:     volume.alpha.kubernetes.io\/storage-class: \"generic\"   labels:     io.portainer.kubernetes.application.stack: portainer     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer     app.kubernetes.io\/version: \"ce-latest-ee-2.10.0\" spec:   accessModes:     - \"ReadWriteOnce\"   resources:     requests:       storage: \"1Gi\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u0442\u043e\u043c (\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043d\u0438\u043c claim), \u0433\u0434\u0435 Portainer \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 <code>PersistentVolume<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c <code>nodeAffinity<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0438 \u0445\u043e\u0441\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0438\u043b\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b). \u042f \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">--- # Source: portainer\/templates\/service.yaml apiVersion: v1 kind: Service metadata:   name: portainer   namespace: portainer   labels:     io.portainer.kubernetes.application.stack: portainer     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer     app.kubernetes.io\/version: \"ce-latest-ee-2.10.0\" spec:   type: NodePort   ports:     - port: 9000       targetPort: 9000       protocol: TCP       name: http       nodePort: 30777     - port: 9443       targetPort: 9443       protocol: TCP       name: https       nodePort: 30779     - port: 30776       targetPort: 30776       protocol: TCP       name: edge       nodePort: 30776   selector:     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043f\u043e\u0440\u0442\u044b (\u043d\u0430\u0448 ingress \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445). \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">--- # Source: portainer\/templates\/deployment.yaml apiVersion: apps\/v1 kind: Deployment metadata:   name: portainer   namespace: portainer   labels:     io.portainer.kubernetes.application.stack: portainer     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer     app.kubernetes.io\/version: \"ce-latest-ee-2.10.0\" spec:   replicas: 1   strategy:     type: \"Recreate\"   selector:     matchLabels:       app.kubernetes.io\/name: portainer       app.kubernetes.io\/instance: portainer   template:     metadata:       labels:         app.kubernetes.io\/name: portainer         app.kubernetes.io\/instance: portainer     spec:       nodeSelector:         {}       serviceAccountName: portainer-sa-clusteradmin       volumes:         - name: portainer-pv           persistentVolumeClaim:             claimName: portainer       containers:         - name: portainer           image: \"portainer\/portainer-ce:latest\"           imagePullPolicy: Always           args:           - '--tunnel-port=30776'           volumeMounts:             - name: portainer-pv               mountPath: \/data           ports:             - name: http               containerPort: 9000               protocol: TCP             - name: https               containerPort: 9443               protocol: TCP             - name: tcp-edge               containerPort: 8000               protocol: TCP           livenessProbe:             httpGet:               path: \/               port: 9443               scheme: HTTPS           readinessProbe:             httpGet:               path: \/               port: 9443               scheme: HTTPS           resources:             {}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043c\u0435\u0442\u043a\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435. \u041c\u044b \u0432\u0438\u0434\u0438\u043c \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043c\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 Doker-\u043e\u0431\u0440\u0430\u0437, \u043f\u043e\u0440\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431 readiness \u0438 liveness. \u041e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 K8s \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u0433\u043e\u0442\u043e\u0432\u044b \u043b\u0438 \u043f\u043e\u0434\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044e\u0442 \u043b\u0438 \u043e\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">--- apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: portainer-ingress   namespace: portainer   annotations:     kubernetes.io\/ingress.class: nginx     cert-manager.io\/cluster-issuer: letsencrypt-staging spec:   rules:     - host: portainer.domain.tld       http:         paths:           - path: \/             pathType: Prefix             backend:               service:                 name: portainer                 port:                   name: http   tls:     - hosts:       - portainer.domain.tld       secretName: portainer-staging-secret-tls<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, ingress, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0441 \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u043e\u043c\u0435\u043d, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 IP-\u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 Let&#8217;s Encrypt \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u0432\u043d\u0435. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043d\u0430 \u0432\u0430\u0448 IP-\u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f <code>domain.tld<\/code> \u0438 <code>*.domain.tld<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u2014 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 ingress \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <code>cert-manager.io\/cluster-issuer : letsencrypt-staging<\/code> (\u0438\u043b\u0438 <code>prod<\/code>) \u0438 \u043a\u043b\u044e\u0447 <code>tls<\/code> \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0445\u043e\u0441\u0442\u0430 \u0438 \u0438\u043c\u0435\u043d\u0435\u043c \u0441\u0435\u043a\u0440\u0435\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043a\u043b\u044e\u0447 TLS. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0438 \u043a\u043b\u044e\u0447 <code>tls<\/code>.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">Kustomize<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0432\u0435\u0449\u044c: \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/kustomize.io\/\">Kustomize<\/a> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430\u043c\u0438 YAML \u043f\u0440\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, <a href=\"https:\/\/kustomize.io\/\">Kompose<\/a>, \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 YAML \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 docker-compose \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u044b K8s. Kustomize \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0438\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432\u043e\u0442 \u0444\u0430\u0439\u043b\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Portainer:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># stacks\/portainer\/kustomization.yaml apiVersion: kustomize.config.k8s.io\/v1beta1 kind: Kustomization  resources:   - portainer.yaml<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># stacks\/portainer\/portainer.yaml --- apiVersion: v1 kind: Namespace metadata:   name: portainer --- apiVersion: v1 kind: ServiceAccount metadata:   name: portainer-sa-clusteradmin   namespace: portainer   labels:     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer     app.kubernetes.io\/version: \"ce-latest-ee-2.10.0\" --- apiVersion: v1 kind: PersistentVolume metadata:   labels:     type: local   name: portainer-pv spec:   storageClassName: local-storage   capacity:     storage: 1Gi   accessModes:     - ReadWriteOnce   hostPath:     path: \"\/zpool\/volumes\/portainer\/claim\"   nodeAffinity:     required:       nodeSelectorTerms:         - matchExpressions:             - key: kubernetes.io\/hostname               operator: In               values:                 - k3s-vm --- # Source: portainer\/templates\/pvc.yaml kind: \"PersistentVolumeClaim\" apiVersion: \"v1\" metadata:   name: portainer   namespace: portainer   annotations:     volume.alpha.kubernetes.io\/storage-class: \"generic\"   labels:     io.portainer.kubernetes.application.stack: portainer     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer     app.kubernetes.io\/version: \"ce-latest-ee-2.10.0\" spec:   accessModes:     - \"ReadWriteOnce\"   resources:     requests:       storage: \"1Gi\" --- # Source: portainer\/templates\/rbac.yaml apiVersion: rbac.authorization.k8s.io\/v1 kind: ClusterRoleBinding metadata:   name: portainer   labels:     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer     app.kubernetes.io\/version: \"ce-latest-ee-2.10.0\" roleRef:   apiGroup: rbac.authorization.k8s.io   kind: ClusterRole   name: cluster-admin subjects: - kind: ServiceAccount   namespace: portainer   name: portainer-sa-clusteradmin --- # Source: portainer\/templates\/service.yaml apiVersion: v1 kind: Service metadata:   name: portainer   namespace: portainer   labels:     io.portainer.kubernetes.application.stack: portainer     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer     app.kubernetes.io\/version: \"ce-latest-ee-2.10.0\" spec:   type: NodePort   ports:     - port: 9000       targetPort: 9000       protocol: TCP       name: http       nodePort: 30777     - port: 9443       targetPort: 9443       protocol: TCP       name: https       nodePort: 30779     - port: 30776       targetPort: 30776       protocol: TCP       name: edge       nodePort: 30776   selector:     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer --- # Source: portainer\/templates\/deployment.yaml apiVersion: apps\/v1 kind: Deployment metadata:   name: portainer   namespace: portainer   labels:     io.portainer.kubernetes.application.stack: portainer     app.kubernetes.io\/name: portainer     app.kubernetes.io\/instance: portainer     app.kubernetes.io\/version: \"ce-latest-ee-2.10.0\" spec:   replicas: 1   strategy:     type: \"Recreate\"   selector:     matchLabels:       app.kubernetes.io\/name: portainer       app.kubernetes.io\/instance: portainer   template:     metadata:       labels:         app.kubernetes.io\/name: portainer         app.kubernetes.io\/instance: portainer     spec:       nodeSelector:         {}       serviceAccountName: portainer-sa-clusteradmin       volumes:         - name: portainer-pv           persistentVolumeClaim:             claimName: portainer       containers:         - name: portainer           image: \"portainer\/portainer-ce:latest\"           imagePullPolicy: Always           args:           - '--tunnel-port=30776'           volumeMounts:             - name: portainer-pv               mountPath: \/data           ports:             - name: http               containerPort: 9000               protocol: TCP             - name: https               containerPort: 9443               protocol: TCP             - name: tcp-edge               containerPort: 8000               protocol: TCP           livenessProbe:             httpGet:               path: \/               port: 9443               scheme: HTTPS           readinessProbe:             httpGet:               path: \/               port: 9443               scheme: HTTPS           resources:             {} --- apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: portainer-ingress   namespace: portainer   annotations:     kubernetes.io\/ingress.class: nginx     cert-manager.io\/cluster-issuer: letsencrypt-staging spec:   rules:     - host: portainer.domain.tld       http:         paths:           - path: \/             pathType: Prefix             backend:               service:                 name: portainer                 port:                   name: http   tls:     - hosts:       - portainer.domain.tld       secretName: portainer-staging-secret-tls<\/code><\/pre>\n<p>  <\/p>\n<p>\u0426\u0435\u043b\u044c \u0432 Makefike:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">portainer:   ${KUBECTL} apply -k stacks\/portainer<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">> make portainer kubectl --kubeconfig ~\/.kube\/k3s-vm-config apply -k stacks\/portainer namespace\/portainer created serviceaccount\/portainer-sa-clusteradmin created clusterrolebinding.rbac.authorization.k8s.io\/portainer created service\/portainer created persistentvolume\/portainer-pv created persistentvolumeclaim\/portainer created deployment.apps\/portainer created ingress.networking.k8s.io\/portainer-ingress created<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430, \u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">> make portainer kubectl --kubeconfig ~\/.kube\/k3s-vm-config apply -k stacks\/portainer namespace\/portainer unchanged serviceaccount\/portainer-sa-clusteradmin unchanged clusterrolebinding.rbac.authorization.k8s.io\/portainer unchanged service\/portainer unchanged persistentvolume\/portainer-pv unchanged persistentvolumeclaim\/portainer unchanged deployment.apps\/portainer configured ingress.networking.k8s.io\/portainer-ingress unchanged<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0428\u0430\u0433 5 \u2014 Samba share<\/h3>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 Samba \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u043e\u0442 \u043d\u0430\u0448\u0438 \u0444\u0430\u0439\u043b\u044b YAML:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># stacks\/samba\/kustomization.yaml apiVersion: kustomize.config.k8s.io\/v1beta1 kind: Kustomization  secretGenerator:   - name: smbcredentials     envs:     - auth.env  resources:   - deployment.yaml   - service.yaml<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 kustomization \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c <code>apply -k<\/code> \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b, \u0432\u0441\u0435 \u043e\u043d\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d.<\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># stacks\/samba\/service.yaml apiVersion: v1 kind: Service metadata:   name: smb-server spec:   ports:     - port: 445       protocol: TCP       name: smb   selector:     app: smb-server<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0436\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># stacks\/samba\/deployment.yaml kind: Deployment apiVersion: apps\/v1 metadata:   name: smb-server spec:   replicas: 1   selector:     matchLabels:       app: smb-server   strategy:     type: Recreate   template:     metadata:       name: smb-server       labels:         app: smb-server     spec:       volumes:         - name: smb-volume           hostPath:             path: \/zpool\/shares\/smb             type: DirectoryOrCreate       containers:         - name: smb-server           image: dperson\/samba           args: [             \"-u\",             \"$(USERNAME1);$(PASSWORD1)\",             \"-u\",             \"$(USERNAME2);$(PASSWORD2)\",             \"-s\",             # name;path;browsable;read-only;guest-allowed;users;admins;writelist;comment             \"share;\/smbshare\/;yes;no;no;all;$(USERNAME1);;mainshare\",             \"-p\"           ]           env:             - name: PERMISSIONS               value: \"0777\"             - name: USERNAME1               valueFrom:                 secretKeyRef:                   name: smbcredentials                   key: username1             - name: PASSWORD1               valueFrom:                 secretKeyRef:                   name: smbcredentials                   key: password1             - name: USERNAME2               valueFrom:                 secretKeyRef:                   name: smbcredentials                   key: username2             - name: PASSWORD2               valueFrom:                 secretKeyRef:                   name: smbcredentials                   key: password2           volumeMounts:             - mountPath: \/smbshare               name: smb-volume           ports:             - containerPort: 445               hostPort: 445<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u043c\u0435\u0441\u0442\u043e PV \u0438 PVC \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>hostPath<\/code>. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e <code>type<\/code> \u043a\u0430\u043a <code>DirectoryOrCreate,<\/code> \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0433\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c docker-\u043e\u0431\u0440\u0430\u0437 <a href=\"https:\/\/github.com\/dperson\/samba\">dperson\/samba<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043e\u0431\u0449\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u043b\u0435\u0442\u0443. \u0417\u0434\u0435\u0441\u044c \u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e\u0434\u0438\u043d \u043e\u0431\u0449\u0438\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u0441 <code>USERNAME1<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430). \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438 \u043f\u0430\u0440\u043e\u043b\u0438 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 env:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\"># stacks\/samba\/auth.env username1=alice password1=foo  username2=bob password2=bar<\/code><\/pre>\n<p>  <\/p>\n<p>\u0426\u0435\u043b\u044c \u0432 Makefile:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">samba:   ${KUBECTL} apply -k stacks\/samba<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">> make samba kubectl --kubeconfig ~\/.kube\/k3s-vm-config apply -k stacks\/samba secret\/smbcredentials-59k7fh7dhm created service\/smb-server created deployment.apps\/smb-server created<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0428\u0430\u0433 6 \u2014 BookStack<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Kompose \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>docker-compose.yaml<\/code> \u0432 \u0444\u0430\u0439\u043b\u044b K8s \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c wiki-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/BookStackApp\/BookStack\">BookStack<\/a>.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u0439 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 <code>docker-compose<\/code> \u0444\u0430\u0439\u043b \u0434\u043b\u044f BookStack:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">version: '2' services:   mysql:     image: mysql:5.7.33     environment:     - MYSQL_ROOT_PASSWORD=secret     - MYSQL_DATABASE=bookstack     - MYSQL_USER=bookstack     - MYSQL_PASSWORD=secret     volumes:     - mysql-data:\/var\/lib\/mysql     ports:     - 3306:3306    bookstack:     image: solidnerd\/bookstack:21.05.2     depends_on:     - mysql     environment:     - DB_HOST=mysql:3306     - DB_DATABASE=bookstack     - DB_USERNAME=bookstack     - DB_PASSWORD=secret     volumes:     - uploads:\/var\/www\/bookstack\/public\/uploads     - storage-uploads:\/var\/www\/bookstack\/storage\/uploads     ports:     - \"8080:8080\"  volumes:  mysql-data:  uploads:  storage-uploads:<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kompose \u043f\u0440\u043e\u0441\u0442\u043e: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">> kompose convert -f bookstack-original-compose.yaml WARN Unsupported root level volumes key - ignoring WARN Unsupported depends_on key - ignoring INFO Kubernetes file \"bookstack-service.yaml\" created INFO Kubernetes file \"mysql-service.yaml\" created INFO Kubernetes file \"bookstack-deployment.yaml\" created INFO Kubernetes file \"uploads-persistentvolumeclaim.yaml\" created INFO Kubernetes file \"storage-uploads-persistentvolumeclaim.yaml\" created INFO Kubernetes file \"mysql-deployment.yaml\" created INFO Kubernetes file \"mysql-data-persistentvolumeclaim.yaml\" created<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u043b\u043e\u043c, \u043d\u0430\u043c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u0442\u043e\u043c\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>depends_on<\/code> \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u041d\u043e \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0412 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430\u0445 \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u044f \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0434\u043b\u0438\u043d\u043d\u0435\u0435, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># stacks\/bookstack\/kustomization.yaml apiVersion: kustomize.config.k8s.io\/v1beta1 kind: Kustomization  resources:   - bookstack-build.yaml<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># stacks\/bookstack\/bookstack-build.yaml apiVersion: v1 kind: Service metadata:   labels:     io.kompose.service: bookstack   name: bookstack spec:   ports:   - name: bookstack-port     port: 10000     targetPort: 8080   - name: bookstack-db-port     port: 10001     targetPort: 3306   selector:     io.kompose.service: bookstack --- apiVersion: v1 kind: PersistentVolume metadata:   name: bookstack-storage-uploads-pv spec:   capacity:     storage: 5Gi   hostPath:     path: >-       \/zpool\/volumes\/bookstack\/storage-uploads     type: DirectoryOrCreate   accessModes:     - ReadWriteOnce   persistentVolumeReclaimPolicy: Retain   storageClassName: local-path   volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata:   labels:     io.kompose.service: bookstack-storage-uploads-pvc   name: bookstack-storage-uploads-pvc spec:   accessModes:     - ReadWriteOnce   resources:     requests:       storage: 5Gi   storageClassName: local-path   volumeName: bookstack-storage-uploads-pv --- apiVersion: v1 kind: PersistentVolume metadata:   name: bookstack-uploads-pv spec:   capacity:     storage: 5Gi   hostPath:     path: >-       \/zpool\/volumes\/bookstack\/uploads     type: DirectoryOrCreate   accessModes:     - ReadWriteOnce   persistentVolumeReclaimPolicy: Retain   storageClassName: local-path   volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata:   labels:     io.kompose.service: bookstack-uploads-pvc   name: bookstack-uploads-pvc spec:   accessModes:     - ReadWriteOnce   resources:     requests:       storage: 5Gi   storageClassName: local-path   volumeName: bookstack-uploads-pv --- apiVersion: v1 kind: PersistentVolume metadata:   name: bookstack-mysql-data-pv spec:   capacity:     storage: 5Gi   hostPath:     path: >-       \/zpool\/volumes\/bookstack\/mysql-data     type: DirectoryOrCreate   accessModes:     - ReadWriteOnce   persistentVolumeReclaimPolicy: Retain   storageClassName: local-path   volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata:   labels:     io.kompose.service: bookstack-mysql-data-pvc   name: bookstack-mysql-data-pvc spec:   accessModes:     - ReadWriteOnce   resources:     requests:       storage: 5Gi   storageClassName: local-path   volumeName: bookstack-mysql-data-pv --- apiVersion: v1 kind: ConfigMap metadata:   name: bookstack-config   namespace: default data:   DB_DATABASE: bookstack   DB_HOST: bookstack:10001   DB_PASSWORD: secret   DB_USERNAME: bookstack   APP_URL: https:\/\/bookstack.domain.tld   MAIL_DRIVER: smtp   MAIL_ENCRYPTION: SSL   MAIL_FROM: user@domain.tld   MAIL_HOST: smtp.domain.tld   MAIL_PASSWORD: vewyvewysecretpassword   MAIL_PORT: \"465\"   MAIL_USERNAME: user@domain.tld --- apiVersion: v1 kind: ConfigMap metadata:   name: bookstack-mysql-config   namespace: default data:   MYSQL_DATABASE: bookstack   MYSQL_PASSWORD: secret   MYSQL_ROOT_PASSWORD: secret   MYSQL_USER: bookstack --- apiVersion: apps\/v1 kind: Deployment metadata:   labels:     io.kompose.service: bookstack   name: bookstack spec:   replicas: 1   selector:     matchLabels:       io.kompose.service: bookstack   strategy:     type: Recreate   template:     metadata:       labels:         io.kompose.service: bookstack     spec:       containers:       - name: bookstack         image: reddexx\/bookstack:21112         securityContext:           allowPrivilegeEscalation: false         envFrom:         - configMapRef:             name: bookstack-config         ports:         - containerPort: 8080         volumeMounts:         - name: bookstack-uploads-pv           mountPath: \/var\/www\/bookstack\/public\/uploads         - name: bookstack-storage-uploads-pv           mountPath: \/var\/www\/bookstack\/storage\/uploads       - name: mysql         image: mysql:5.7.33         envFrom:         - configMapRef:             name: bookstack-mysql-config         ports:         - containerPort: 3306         volumeMounts:         - mountPath: \/var\/lib\/mysql           name: bookstack-mysql-data-pv       volumes:       - name: bookstack-uploads-pv         persistentVolumeClaim:           claimName: bookstack-uploads-pvc       - name: bookstack-storage-uploads-pv         persistentVolumeClaim:           claimName: bookstack-storage-uploads-pvc       - name: bookstack-mysql-data-pv         persistentVolumeClaim:           claimName: bookstack-mysql-data-pvc --- apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:   name: bookstack-ingress   annotations:     kubernetes.io\/ingress.class: nginx     cert-manager.io\/cluster-issuer: letsencrypt-staging spec:   rules:     - host: bookstack.domain.tld       http:         paths:           - path: \/             pathType: Prefix             backend:               service:                 name: bookstack                 port:                   name: bookstack-port   tls:     - hosts:       - bookstack.domain.tld       secretName: bookstack-staging-secret-tls<\/code><\/pre>\n<p>  <\/p>\n<p>Kompose \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043e\u0431\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430 <code>docker-compose<\/code> \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b \u0438\u0445 \u0432 \u043e\u0434\u0438\u043d \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a config map \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">envFrom: - configMapRef:     name: bookstack-config<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0435\u0433\u043c\u0435\u043d\u0442 <code>chown<\/code> \u0432 Makefile \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 docker-\u043e\u0431\u0440\u0430\u0437\u0430 BookStack. \u0423 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0442, \u043e\u0434\u043d\u0430\u043a\u043e PHP-\u043e\u0431\u0440\u0430\u0437\u044b \u0435\u044e \u0441\u043b\u0430\u0432\u044f\u0442\u0441\u044f. \u0411\u0435\u0437 \u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 wiki \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c Makefile \u044d\u0442\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">bookstack:   ${KUBECTL} apply -k stacks\/bookstack   @echo   @echo \"waiting for deployments to be ready... \"   @${KUBECTL} wait --namespace=default --for=condition=available deployments\/bookstack --timeout=60s   @echo   ssh ${HOST} chmod 777 \/zpool\/volumes\/bookstack\/storage-uploads\/   ssh ${HOST} chmod 777 \/zpool\/volumes\/bookstack\/uploads\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c kustomization \u0438 \u0437\u0430\u0442\u0435\u043c \u0436\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u043e\u0431\u0430 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u0442\u043e\u0432\u044b, \u0447\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u043c\u0430 \u0431\u0443\u0434\u0443\u0442 \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b, \u043b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e SSH, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0442\u043e\u043c\u043e\u0432 \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0433\u0440\u0443\u043f\u043f. \u041d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041e\u0431\u0440\u0430\u0437 MySQL \u043f\u0440\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0432 \u044d\u0442\u043e\u043c \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0443 <code>depends_on<\/code> \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>docker-compose<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0434\u044b \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.<\/p>\n<p>  <\/p>\n<h3>\u0428\u0430\u0433 8 \u2014 \u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e!<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<a href=\"https:\/\/github.com\/sardaukar\/k8s-at-home-with-k3s\"> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0437\u0434\u0435\u0441\u044c<\/a>. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0432\u0435\u0441\u044c Makefile \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\"># set your host IP and name HOST_IP=192.168.1.60 HOST=k3s #### don't change anything below this line! KUBECTL=kubectl --kubeconfig ~\/.kube\/k3s-vm-config  .PHONY: k3s_install base bookstack portainer samba  k3s_install:   ssh ${HOST} 'export INSTALL_K3S_EXEC=\" --no-deploy servicelb --no-deploy traefik\"; \\     curl -sfL https:\/\/get.k3s.io | sh -'   scp ${HOST}:\/etc\/rancher\/k3s\/k3s.yaml .   sed -r 's\/(\\b[0-9]{1,3}\\.){3}[0-9]{1,3}\\b'\/\"${HOST_IP}\"\/ k3s.yaml > ~\/.kube\/k3s-vm-config &amp;&amp; rm k3s.yaml  base:   ${KUBECTL} apply -f k8s\/ingress-nginx-v1.0.4.yml   ${KUBECTL} wait --namespace ingress-nginx \\             --for=condition=ready pod \\             --selector=app.kubernetes.io\/component=controller \\             --timeout=60s   ${KUBECTL} apply -f k8s\/cert-manager-v1.0.4.yaml   @echo   @echo \"waiting for cert-manager pods to be ready... \"   ${KUBECTL} wait --namespace=cert-manager --for=condition=ready pod --all --timeout=60s   ${KUBECTL} apply -f k8s\/lets-encrypt-staging.yml   ${KUBECTL} apply -f k8s\/lets-encrypt-prod.yml  bookstack:   ${KUBECTL} apply -k stacks\/bookstack   @echo   @echo \"waiting for deployments to be ready... \"   @${KUBECTL} wait --namespace=default --for=condition=available deployments\/bookstack --timeout=60s   @echo   ssh ${HOST} chmod 777 \/zpool\/volumes\/bookstack\/storage-uploads\/   ssh ${HOST} chmod 777 \/zpool\/volumes\/bookstack\/uploads\/  portainer:   ${KUBECTL} apply -k stacks\/portainer  samba:   ${KUBECTL} apply -k stacks\/samba<\/code><\/pre>\n<p>  <\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0437\u0430\u0447\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e? \u041c\u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0438 \u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0431\u0438\u043b\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u043e\u0431 \u043c\u043e\u043d\u0438\u0442\u043e\u0440, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0430\u043b \u043b\u0443\u0447\u0448\u0435\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Kubernetes \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, \u043a\u0430\u043a \u0435\u0433\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0441 \u044d\u0442\u0438\u043c Makefile \u043c\u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e 4 \u043c\u0438\u043d\u0443\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e NAS \u0434\u043b\u044f 3 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0434\u044e\u0436\u0438\u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 <code>docker-compose<\/code> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0430\u0437\u043e\u043c \u044d\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u043e\u0449\u0435.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/cloud.timeweb.com\/?utm_source=habr&amp;utm_medium=banner&amp;utm_campaign=cloud&amp;utm_content=direct&amp;utm_term=low\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wn\/cq\/lp\/wncqlp9abeml4npwzsybuvhzcta.png\" data-src=\"https:\/\/habrastorage.org\/webt\/wn\/cq\/lp\/wncqlp9abeml4npwzsybuvhzcta.png\"\/><\/a><\/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\/594533\/\"> https:\/\/habr.com\/ru\/articles\/594533\/<\/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-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/997\/32c\/77e\/99732c77e2f9b734ef1cf61d17237ca3.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/997\/32c\/77e\/99732c77e2f9b734ef1cf61d17237ca3.png\"\/><\/div>\n<p>  <\/p>\n<h2>\u041d\u043e \u0437\u0430\u0447\u0435\u043c<\/h2>\n<p>  <\/p>\n<p>\u0417\u043d\u0430\u044e, \u043e \u0447\u0435\u043c \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u2014 Kubernetes? \u041d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435? \u041a\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <i>\u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e<\/i> \u0441\u0443\u043c\u0430\u0441\u0448\u0435\u0434\u0448\u0438\u043c? \u0427\u0442\u043e \u0436, \u0440\u0430\u043d\u044c\u0448\u0435 \u044f \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f \u0431\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e \u043c\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u042f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u0442 DevOps \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e \u0437\u043d\u0430\u043d\u0438\u0435\u043c Kubernetes (\u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c K8s), \u0438 \u0434\u0430\u0436\u0435 \u0431\u0443\u0434\u0443\u0447\u0438 \u0441\u0442\u0430\u0440\u044b\u043c \u043d\u0435\u043d\u0430\u0432\u0438\u0441\u0442\u043d\u0438\u043a\u043e\u043c K8s \u0438\u0437-\u0437\u0430 \u0435\u0433\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0441\u0442\u0438, \u0431\u044b\u043b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u043a \u043f\u043e\u0434\u0430\u043c. \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0430\u0437\u0430\u0440\u0442 \u043e\u0442 \u0443\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0432\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0432\u0435\u0440\u044f \u0434\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u043e\u0440\u0430\u0436\u0438\u0442 \u043c\u0435\u043d\u044f. \u0418 \u0432\u043e\u043e\u0431\u0449\u0435, K8s \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u0438\u0440 \u2014 \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u0438\u0448\u043d\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0432\u0440\u0435\u0434\u044f\u0442.<\/p>\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-399610","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/399610","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=399610"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/399610\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=399610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=399610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=399610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}