{"id":323713,"date":"2021-05-25T09:01:00","date_gmt":"2021-05-25T09:01:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=323713"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=323713","title":{"rendered":"Kubernetes-in-Kubernetes \u0438 \u0444\u0435\u0440\u043c\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043f\u043e PXE"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1c5\/449\/a3d\/1c5449a3d5864b48ca0d6791742cc4be.png\" width=\"850\" height=\"463\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 2 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430, \u0442\u044b\u0441\u044f\u0447\u0438 \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0438 \u0438 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u043e\u0442\u0435\u043d \u0442\u044b\u0441\u044f\u0447 \u0441\u0430\u0439\u0442\u043e\u0432, Kubernetes \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0434\u043e\u0431\u0440\u043e\u043c. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kubernetes \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043d\u043e \u0438 \u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0435\u043c \u0447\u0435\u0448\u0441\u043a\u043e\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435 WEDOS Internet a.s \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0434\u0432\u0443\u0445 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u2014 <a href=\"https:\/\/github.com\/kvaps\/kubernetes-in-kubernetes\"><u>Kubernetes-in-Kubernetes<\/u><\/a> \u0438 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\"><u>Kubefarm<\/u><\/a>.<\/p>\n<p>\u0421 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430 \u043f\u0430\u0440\u0443 \u043a\u043e\u043c\u0430\u043d\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Helm, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 Kubernetes \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u041a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c? \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442<\/p>\n<hr>\n<p><iframe id=\"60aca129d0e17eb5ff472403\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/60aca129d0e17eb5ff472403\" class=\"embed_video embed__content\" allowfullscreen=\"true\"><\/iframe><\/p>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430\u0448\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u0412\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b: control-plane \u0438 compute nodes. Control plane \u043d\u043e\u0434\u044b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0438\u043c\u0435\u044e\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u041e\u0421 \u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0431, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u0432 Kubernetes. \u0417\u0430\u0434\u0430\u0447\u0430 \u044d\u0442\u0438\u0445 \u043d\u043e\u0434 \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u0435\u0440\u0435\u0431\u043e\u0439\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. Compute \u043d\u043e\u0434\u044b \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0438, \u0430 \u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u043f\u043e \u0441\u0435\u0442\u0438 \u043f\u0440\u044f\u043c\u043e \u0441 control-plane \u043d\u043e\u0434. \u0418\u0445 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c5e\/494\/df0\/c5e494df05a7cec7299458b560fdcef9.jpg\" width=\"1068\" height=\"536\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 control-plane \u043d\u043e\u0434\u0430\u0445 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u044b \u0442\u0430\u043a\u0436\u0435 PXE- \u0438&nbsp;DHCP-\u0441\u0435\u0440\u0432\u0435\u0440\u044b. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0438 compute-\u043d\u043e\u0434\u044b, \u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u2014 \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a DHCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u041e\u043d, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0434\u0435, \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f: \u00ab\u0423 \u0442\u0435\u0431\u044f \u0442\u0430\u043a\u043e\u0439-\u0442\u043e IP, \u0433\u0440\u0443\u0437\u0438\u0441\u044c \u0441 \u0442\u0430\u043a\u043e\u0433\u043e-\u0442\u043e PXE-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u00bb. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u043e\u0434\u044b \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442 \u043e\u0431\u0440\u0430\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0435\u0433\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0433\u043e.&nbsp;<\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0437, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u0441\u0432\u044f\u0437\u0438 \u0441 PXE-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c PXE-\u0441\u0435\u0440\u0432\u0435\u0440 \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0434\u0430\u0451\u0442 \u043e\u0431\u0440\u0430\u0437 \u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043d\u0430\u0448\u0438 \u043d\u043e\u0434\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438\u0441\u044c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c PXE-\u0441\u0435\u0440\u0432\u0435\u0440, \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0441 \u043d\u0438\u043c\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/436\/beb\/94d\/436beb94d92b9785c21c4a0ee1081c14.jpg\" width=\"1131\" height=\"592\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u043d\u0430\u0448\u0438 \u043d\u043e\u0434\u044b \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 kubeadm join. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u0434\u0436\u043e\u0439\u043d\u0438\u043b\u0438\u0441\u044c \u0432 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u0434\u043b\u044f control-plane \u043d\u043e\u0434. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e kube-scheduler \u043c\u043e\u0433 \u0448\u0435\u0434\u0443\u043b\u043b\u0438\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.&nbsp;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ba\/47f\/e20\/1ba47fe20bdf414731cb50963d8b8565.jpg\" width=\"1097\" height=\"547\"><figcaption><\/figcaption><\/figure>\n<p>\u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0443 \u043d\u0430\u0441 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445 \u043b\u0435\u0442. \u041f\u043e\u0437\u0436\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u0451 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Kubernetes. \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u0430\u0432\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0430 \u043d\u0430\u0448\u0438\u0445 control-plane \u043d\u043e\u0434\u0430\u0445 (\u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0438 \u0432\u0441\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c&nbsp;admin-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435). \u0410 compute-\u043d\u043e\u0434\u044b \u0434\u0436\u043e\u0439\u043d\u044f\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0432 \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u2014 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0451 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.&nbsp;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f12\/bb3\/a13\/f12bb3a1357e06294a5b8a1ba36e3e15.jpg\" width=\"1105\" height=\"554\"><figcaption><\/figcaption><\/figure>\n<h2>Kubefarm<\/h2>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0441 \u0446\u0435\u043b\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0431\u043e\u0439 \u0441\u043c\u043e\u0433 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0437\u0430 \u043f\u0430\u0440\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Helm \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u0443\u0448\u043b\u0438 \u043e\u0442 \u0438\u0434\u0435\u0438 \u043c\u043e\u043d\u043e\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442&nbsp;\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Kubernetes \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a multi-tenant \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0435&nbsp;\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c. \u0418 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u2014 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0434 \u0443 \u0432\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u043e\u043c\u0435\u043d \u043e\u0442\u043a\u0430\u0437\u0430 \u0438 \u0442\u0435\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0435\u0435 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0410 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 Kubernetes.<\/p>\n<p>\u0422\u0430\u043a \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\"><u>Kubefarm<\/u><\/a>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"http:\/\/github.com\/kvaps\/kubernetes-in-kubernetes\"><u>Kubernetes-in-Kubernetes<\/u><\/a>, <a href=\"https:\/\/github.com\/ltsp\/ltsp\/\"><u>LTSP<\/u><\/a> \u2014 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 PXE-\u0441\u0435\u0440\u0432\u0435\u0440, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u043d\u043e\u0434\u044b, \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e DHCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/kvaps\/dnsmasq-controller\"><u>dnsmasq-controller<\/u><\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a3d\/e2b\/6f9\/a3de2b6f9d424507778c7d9d40006a14.jpeg\" width=\"584\" height=\"265\"><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0412\u043e\u043e\u0431\u0449\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 Kubernetes \u043a\u0430\u043a \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u043e\u043d \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b <a href=\"https:\/\/12factor.net\/ru\/\"><u>The Twelve-Factor App<\/u><\/a>, \u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e. \u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c Kubernetes \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a Kubernetes \u0432 Kubernetes<\/h3>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2fa\/09c\/7cc\/2fa09c7cc287f4ecb04a1d538e18f45b.jpg\" width=\"1323\" height=\"698\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 Helm \u0432 <a href=\"https:\/\/github.com\/kvaps\/kubernetes-in-kubernetes\/blob\/master\/deploy\/helm\/kubernetes\/values.yaml\"><u>values-\u0444\u0430\u0439\u043b<\/u><\/a>:<\/p>\n<details class=\"spoiler\">\n<summary>kubernetes\/values.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">controlPlaneEndpoint:  persistence:   enabled: true   accessModes:     - ReadWriteOnce   size: 1Gi   # storageClassName: default   annotations: {}   finalizers:     - kubernetes.io\/pvc-protection    backup:     # existingClaim: your-claim     # subPath: backups     accessModes:       - ReadWriteOnce     size: 1Gi     # storageClassName: default     annotations: {}     finalizers:       - kubernetes.io\/pvc-protection  etcd:   enabled: true   image:     repository: k8s.gcr.io\/etcd     tag: 3.4.13-0     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 3   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    certSANs:     dnsNames: []     ipAddresses: []    extraArgs: {}     # advertise-address is required for kube-proxy     #advertise-address: 10.9.8.10   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    ports:     client: 2379     peer: 2380     metrics: 2381   service:     enabled: true     type: ClusterIP     ports:       client: 2379       peer: 2380       metrics: 2381     labels: {}     annotations: {}     loadBalancerIP:    backup:     enabled: false     schedule: \"0 *\/12 * * *\"     successfulJobsHistoryLimit: 3     failedJobsHistoryLimit: 3     extraArgs: #{}       debug: true     resources:       requests:         cpu: 100m         memory: 128Mi       # limits:       #   cpu: 100m       #   memory: 128Mi      labels: {}     annotations: {}     podLabels: {}     podAnnotations: {}     nodeSelector: {}     tolerations: []     podAffinity: soft     podAffinityTopologyKey: kubernetes.io\/hostname     affinity: {}     extraEnv: []     sidecars: []     extraVolumes: []     extraVolumeMounts: []  apiServer:   enabled: true   image:     repository: k8s.gcr.io\/kube-apiserver     tag: v1.20.5     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    certSANs:     dnsNames: []     ipAddresses: []    serviceClusterIPRange: 10.96.0.0\/12    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []     port: 6443   service:     enabled: true     type: ClusterIP # NodePort \/ LoadBalancer     port: 6443     # Specify nodePort for apiserver service (30000-32767)     nodePort:     labels: {}     annotations: {}     loadBalancerIP:  controllerManager:   enabled: true   image:     repository: k8s.gcr.io\/kube-controller-manager     tag: v1.20.5     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    port: 10257   service:     enabled: true     type: ClusterIP     port: 10257     labels: {}     annotations: {}     loadBalancerIP:  scheduler:   enabled: true   image:     repository: k8s.gcr.io\/kube-scheduler     tag: v1.20.5     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    port: 10259   service:     enabled: true     type: ClusterIP     port: 10259     labels: {}     annotations: {}     loadBalancerIP:  admin:   enabled: true   image:     repository: ghcr.io\/kvaps\/kubernetes-tools     tag: v0.9.2     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 1   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    job:     enabled: true     schedule: \"0 0 1 *\/6 *\"     successfulJobsHistoryLimit: 3     failedJobsHistoryLimit: 3    labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []  kubeProxy:   enabled: true  coredns:   enabled: true  konnectivityServer:   enabled: false   image:     repository: us.gcr.io\/k8s-artifacts-prod\/kas-network-proxy\/proxy-server     tag: v0.0.14     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    ports:     server: 8131     agent: 8132     admin: 8133     health: 8134   service:     enabled: true     type: ClusterIP     ports:       server: 8131       agent: 8132       admin: 8133     nodePorts:       server:       agent:       admin:     labels: {}     annotations: {}     loadBalancerIP:  konnectivityAgent:   enabled: false   image:     repository: us.gcr.io\/k8s-artifacts-prod\/kas-network-proxy\/proxy-agent     tag: v0.0.14     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   hostNetwork: true    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    ports:     admin: 8133     health: 8134  # these manifests will be applied inside the cluster extraManifests: {}   #namespace.yaml:   #  apiVersion: v1   #  kind: Namespace   #  metadata:   #    name: example<\/code><\/pre>\n<\/div>\n<\/details>\n<figure class=\"float bordered\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d8c\/7ad\/fd5\/d8c7adfd5e340862871d4177f336a0c9.jpg\" alt=\"\" title=\"\" width=\"343\" height=\"281\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e persistence (\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430) \u0442\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e control-plane: \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: etcd-\u043a\u043b\u0430\u0441\u0442\u0435\u0440, apiserver, controller-manager \u0438 scheduler. \u042d\u0442\u043e \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b Kubernetes. \u0412\u0441\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u0448\u0443\u0442\u043a\u0443, \u0447\u0442\u043e Kubernetes \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e 5 \u0431\u0438\u043d\u0430\u0440\u0435\u0439. \u0422\u0430\u043a \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u0435\u0439.&nbsp;<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e kubeadm, \u0442\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0432\u0430\u043c \u0435\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u043f\u043e\u043c\u043d\u0438\u0442. \u041d\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 Kubernetes \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 admin-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440. \u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u0432\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430: kubectl \u0438 kubeadm. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c kubeconfig\u2019\u0438 \u0434\u043b\u044f \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0422\u0430\u043a\u0436\u0435, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0435\u0433\u043e, \u043a \u043d\u0435\u043c\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0440\u0435\u043b\u0438\u0437 <a href=\"https:\/\/asciinema.org\/a\/407280\"><u>\u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0441\u044f<\/u><\/a>, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043e\u0432: admin-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, apiserver \u0432 \u0434\u0432\u0443\u0445 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445, controller-manager, etcd-\u043a\u043b\u0430\u0441\u0442\u0435\u0440, scheduller \u0438 \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0436\u043e\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u0410 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 admin-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f0a\/81d\/891\/f0a81d8911c3b0358bdde2ffe029c4e3.jpeg\" width=\"842\" height=\"454\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. \u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430-\u043b\u0438\u0431\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438 Kubernetes, \u0442\u043e \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c <em>\u0441\u0442\u0440\u0430\u0448\u043d\u0430\u044f \u043f\u0430\u043f\u043e\u0447\u043a\u0430<\/em> \/etc\/kubernetes\/pki \u0441 \u043a\u0443\u0447\u0435\u0439 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. \u041d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0438. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 Helm, \u043a\u0430\u043a\u0438\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u0438 cert-manager \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eeb\/50a\/92f\/eeb50a92fcf53e5dd5214ceb589a619b.jpeg\" width=\"837\" height=\"194\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432&nbsp;\u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f apiserver, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a DNS-\u0438\u043c\u0435\u043d \u0438 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0438\u0437\u0432\u043d\u0435, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0448\u0438\u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 DNS-\u0438\u043c\u0435\u043d\u0430&nbsp;\u0432 values-\u0444\u0430\u0439\u043b\u0435 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0440\u0435\u043b\u0438\u0437 \u2014 \u044d\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430, \u0430 cert-manager \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442 \u2014 \u0438 \u0432\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f&nbsp;\u0434\u0443\u043c\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c. \u0415\u0441\u043b\u0438 \u0432 kubeadm \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u0440\u0435\u0436\u0435 \u0447\u0435\u043c \u0440\u0430\u0437 \u0432 \u0433\u043e\u0434, \u0442\u043e \u0437\u0434\u0435\u0441\u044c cert-manager \u0441\u0430\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8f9\/707\/158\/8f970715834445b3a0ef8a4361346cba.jpeg\" width=\"826\" height=\"463\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043b\u043e\u0433\u0438\u043d\u0438\u043c\u0441\u044f \u0432 admin-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438 \u043d\u043e\u0434\u044b. \u041d\u043e\u0434, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u043a\u0430 \u043d\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e control-plane \u0434\u043b\u044f Kubernetes. \u041d\u043e \u0432 kube-system \u0443\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043f\u043e\u043a\u0430 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0437\u0430\u0448\u0435\u0434\u0443\u043b\u043b\u0435\u043d\u043d\u044b\u0435 coredns-\u043f\u043e\u0434\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u043c\u0430\u043f\u044b \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/914\/847\/44c\/91484744c536a3539e75e8975ea56ba4.jpeg\" width=\"846\" height=\"254\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 <a href=\"https:\/\/kvaps.github.io\/images\/posts\/Kubernetes-in-Kubernetes-%D0%B8-%D1%84%D0%B5%D1%80%D0%BC%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%B2-%D1%81-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%BE%D0%B9-%D0%BF%D0%BE-PXE\/Argo_CD_kink_network.html\"><u>\u0441\u0445\u0435\u043c\u0430<\/u><\/a> \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 Kubernetes: apiserver, controller-manager, etcd-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438 scheduler. \u0410 \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u043f\u043e\u0434\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0438 \u0432\u0435\u0434\u0443\u0442. \u0421\u0445\u0435\u043c\u0430, \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430 \u0432 <a href=\"https:\/\/argoproj.github.io\/argo-cd\/\"><u>ArgoCD<\/u><\/a> \u2014 GitOps-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438, \u0438 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0435\u0433\u043e \u0444\u0438\u0448\u0435\u043a:&nbsp;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3fb\/248\/11b\/3fb24811b09d25f9702de58f3273c5d2.jpg\" width=\"944\" height=\"509\"><figcaption><\/figcaption><\/figure>\n<h3>\u041e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432<\/h3>\n<p>\u041e\u041a, \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c control-plane Kubernetes, \u043d\u043e \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0451\u0442 worker-\u043d\u043e\u0434, \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c? \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0443 \u043d\u0430\u0441 bare metal \u2014 \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Kubernetes, \u0430 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041f\u043b\u044e\u0441 \u043c\u044b \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 Linux \u043f\u043e \u0441\u0435\u0442\u0438. \u041f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430, \u0430 \u043d\u0435 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438: \u043a\u043e\u0433\u0434\u0430 \u043d\u043e\u0434\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f, \u0442\u043e \u0433\u0440\u0443\u0437\u044f\u0442 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u043c\u0438\u0434\u0436 \u0434\u043b\u044f \u043d\u0438\u0445. \u0422\u043e \u0435\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043d\u043e\u0434\u0443, \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u2014 \u0438 \u043e\u043d\u0430 \u0441\u043a\u0430\u0447\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0438\u043c\u0438\u0434\u0436. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\"><u>Kubefarm<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/tree\/master\/examples\"><u>examples<\/u><\/a>. \u0421\u0430\u043c\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u2014 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/tree\/master\/examples\/generic\"><u>generic<\/u><\/a>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/blob\/master\/examples\/generic\/values.yaml\"><u>values.yaml<\/u><\/a>:<\/p>\n<details class=\"spoiler\">\n<summary>generic\/values.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ------------------------------------------------------------------------------ # Kubernetes control-plane # ------------------------------------------------------------------------------ kubernetes:   apiServer:     certSANs:       ipAddresses:       - 10.28.36.72       #dnsNames:       #- generic-cluster.example.org     extraArgs:       advertise-address: 10.28.36.72  # ------------------------------------------------------------------------------ # Network boot server configuration # ------------------------------------------------------------------------------ ltsp:    config:      # from \/usr\/share\/zoneinfo\/&lt;timezone&gt; (eg. Europe\/Moscow)     timezone: Europe\/Prague      # SSH-keys authorized to access the nodes     sshAuthorizedKeys:       - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSdizJARrlcOWVYswKPYbQ3FMa2eLJeE1utgUH7sDcOCsbpQh+Pu09biGkvO3QYGmeRXf64rQDx8adSf1Y\/AutVJ6b044GEYoGWrenAPnt2VKyu7IrPvLr+0QLTuPsUPhKQToxs84j7eJ+Yzaro6etM2aPMlCuqHv9ZWFda198YQT3xr8ceAk6+Ni\/q5vw5FDkmKtGVNl2UXHKovFxnGOkwYaPUlizTnj4WpK8e4FUQ95p75IQulGWGkL5RTbABhyFDuiVlGlW71qit79EaZDO4WA1tkdXYIQauIHQ073\/ogI3YBlkD1QDsLXobjDHDaD3XMXK7lePudUkhiUng225 id_rsa      # Hashed password for root, use `openssl passwd -1` to generate one     rootPasswd: $1$jaKnTiEb$IhpsNUfssXQ8eQg8orald0 # hackme      # Modules to load during startup     modules:       - br_netfilter       - ip_vs       - ip_vs_rr       - ip_vs_wrr       - ip_vs_sh      # Extra options for ltsp.conf     options:       DEBUG_SHELL: 1       MENU_TIMEOUT: 0       KERNEL_PARAMETERS: \"forcepae console=tty1 console=ttyS0,9600n8\"  # ------------------------------------------------------------------------------ # Nodes configuration # ------------------------------------------------------------------------------ nodePools:   -     # DHCP range for the node pool, required for issuing leases.     # See --dhcp-range option syntax on dnsmasq-man page.     # Note: the range will automatically be appended with the set:{{ .Release.Name }}-ltsp option.     #     # WARNING setting broadcast-address is required! (see: https:\/\/www.mail-archive.com\/dnsmasq-discuss@lists.thekelleys.org.uk\/msg14137.html)     range: 10.28.0.0,static,255.255.0.0,10.28.0.0,infinite      # DHCP configuration for each node     nodes:       - name: m1c29         mac: 94:57:a5:d3:ec:f2,94:57:a5:d3:ec:f3         ip: 10.28.36.173       - name: m1c31         mac: 94:57:a5:d3:ef:92,94:57:a5:d3:ef:93         ip: 10.28.36.174       - name: m1c35         mac: 94:57:a5:d3:d9:de,94:57:a5:d3:d9:df         ip: 10.28.36.175       - name: m1c37         mac: 94:57:a5:d3:ed:ee,94:57:a5:d3:ed:ef         ip: 10.28.36.176       - name: m1c41         mac: 94:57:a5:d3:f3:9e,94:57:a5:d3:f3:9f         ip: 10.28.36.177    - nodes:       - name: m1c43         mac: 94:57:a5:d3:ee:5a,94:57:a5:d3:ee:5b         ip: 10.28.36.178     tags:       - debug       - foo  # ------------------------------------------------------------------------------ # Extra options can be specified for each tag # (\"all\" options are aplicable for any node) # ------------------------------------------------------------------------------ tags:   dhcpOptions:     # dnsmasq options     # see all available options list (https:\/\/git.io\/JJ0dH)     all:       router: \t10.28.0.1       dns-server: 10.28.0.1    ltspOptions:     debug:       DEBUG_SHELL: \"1\"    kubernetesLabels:     all: {}     foo:       label1: value1       label2: value2    kubernetesTaints:     all: {}     foo:       - effect: NoSchedule         key: foo         value: bar<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0447\u0430\u0440\u0442 Kubernetes-in-Kubernetes. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 control-plane \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441, \u043d\u043e \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u043a\u0430\u043a\u043e\u0435-\u043d\u0438\u0431\u0443\u0434\u044c DNS-\u0438\u043c\u044f.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f PXE-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e timezone. \u041c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c SSH-\u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u0430 \u0431\u0435\u0437 \u043f\u0430\u0440\u043e\u043b\u044f (\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u043f\u0430\u0440\u043e\u043b\u044c), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0434\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f nodePools, \u0442.\u0435. \u0441\u0430\u043c\u0438\u0445 \u043d\u043e\u0434. \u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c terraform-\u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0434\u043b\u044f gke, \u0442\u043e \u044d\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u0430\u043c \u0435\u0433\u043e \u043d\u0430\u043f\u043e\u043c\u043d\u0438\u0442. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u043e\u0434\u044b \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:&nbsp;<\/p>\n<ul>\n<li>\n<p>\u0418\u043c\u044f (host name);<\/p>\n<\/li>\n<li>\n<p>MAC-\u0430\u0434\u0440\u0435\u0441 \u2014 \u0443 \u043d\u0430\u0441 \u043d\u043e\u0434\u044b \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0434\u0435\u0441\u044c MAC-\u0430\u0434\u0440\u0435\u0441\u043e\u0432;&nbsp;<\/p>\n<\/li>\n<li>\n<p>IP-\u0430\u0434\u0440\u0435\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 DHCP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0434\u0430\u0442\u044c \u044d\u0442\u043e\u0439 \u043d\u043e\u0434\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u043f\u0443\u043b\u0430: \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u2014 \u043f\u044f\u0442\u044c \u043d\u043e\u0434, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u2014 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430, \u043d\u043e \u043a \u043d\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0435\u0449\u0435 \u0434\u0432\u0430 \u0442\u044d\u0433\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0422\u044d\u0433\u0438 \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043d\u043e\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0443\u043b\u044b \u0432\u0435\u0448\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 DHCP-\u043e\u043f\u0446\u0438\u0438, \u043e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f PXE-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c debug) \u0438 \u043f\u0430\u0440\u0443 \u043e\u043f\u0446\u0438\u0439 KubernetesLabels \u0438 KubernetesTaints. \u0427\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442?<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c nodePool \u0441 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u043e\u0439, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0442\u044d\u0433\u0438 debug \u0438 foo. \u0421\u043c\u043e\u0442\u0440\u0438\u043c KubernetesLabels, \u0442\u044d\u0433 foo. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043d\u043e\u0434\u0430 m1c43 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 labels \u0438 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c taint. \u0412\u0440\u043e\u0434\u0435 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 <a href=\"https:\/\/asciinema.org\/a\/407282\"><u>\u0441\u0434\u0435\u043b\u0430\u0435\u043c<\/u><\/a> \u044d\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<h3>\u0414\u0435\u043c\u043e<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/tree\/master\/examples\"><u>examples<\/u><\/a> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0430\u0440\u0442\u0430 \u0434\u043e Kubefarm. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/tree\/master\/examples\/generic\"><u>generic<\/u><\/a> \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u043e\u0434\u044b. \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f PXE-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043e\u0434\u043d\u0430 \u0434\u0436\u043e\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u0438\u0434\u0435\u0442 \u0432 Kubernetes \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0435 12 \u0447\u0430\u0441\u043e\u0432 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u043e\u0434\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/05b\/4c6\/0e8\/05b4c60e814d9568ebe975d8e339f257.jpeg\" width=\"855\" height=\"469\"><figcaption><\/figcaption><\/figure>\n<p><a href=\"https:\/\/kvaps.github.io\/images\/posts\/Kubernetes-in-Kubernetes-%D0%B8-%D1%84%D0%B5%D1%80%D0%BC%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%B2-%D1%81-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%BE%D0%B9-%D0%BF%D0%BE-PXE\/Argo_CD_Applications_kubefarm-network.html\"><u>\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438<\/u><\/a> \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 apiserver \u0441\u0442\u0430\u043b \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u0440\u0443\u0436\u0443.&nbsp;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b22\/032\/afb\/b22032afb9cec39e286cff563d6a5410.jpeg\" width=\"1155\" height=\"465\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u0441\u0445\u0435\u043c\u0435 \u0437\u0435\u043b\u0435\u043d\u044b\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d IP, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u0442\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430\u0448 PXE-\u0441\u0435\u0440\u0432\u0435\u0440. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 Kubernetes \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 LoadBalancer-\u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f TCP- \u0438 UDP-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043d\u043e \u0441 \u043e\u0434\u043d\u0438\u043c IP-\u0430\u0434\u0440\u0435\u0441\u043e\u043c. \u041e\u0434\u0438\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f TFTP, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0434\u043b\u044f HTTP, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0437.<\/p>\n<p>\u041d\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0435\u0441\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/tree\/master\/examples\/advanced_network\"><u>advanced_network<\/u><\/a>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/tree\/master\/examples\/advanced_network\"><u>values-\u0444\u0430\u0439\u043b<\/u><\/a> \u0441 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u043c shell-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c. \u0423 \u043d\u0430\u0441 \u043e\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f network.sh.<\/p>\n<details class=\"spoiler\">\n<summary>network.sh<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ------------------------------------------------------------------------------ # Network boot server configuration # ------------------------------------------------------------------------------ ltsp:    config:      # Extra options for ltsp.conf     options:       POST_INIT_NETWORKING: \". \/etc\/ltsp\/network.sh\"      extraFiles:       network.sh: |         mask2cidr() {           nbits=0           IFS=.           for dec in $1 ; do             case $dec in               255) nbits=$((nbits+8));;               254) nbits=$((nbits+7));;               252) nbits=$((nbits+6));;               248) nbits=$((nbits+5));;               240) nbits=$((nbits+4));;               224) nbits=$((nbits+3));;               192) nbits=$((nbits+2));;               128) nbits=$((nbits+1));;               0);;               *) echo \"Error: $dec is not recognised\"; exit 1             esac           done           echo \"$nbits\"         }         set -e         # Load additional parameters         IPCONFIG_IPV4CIDR=$(mask2cidr $IPCONFIG_IPV4NETMASK)         DATA_IPV4ADDR=$(echo ${IPCONFIG_IPV4ADDR} | sed 's\/^10\\.28\\.\/10.29.\/')         # Remove on-boot config         rm -rf \/run\/netplan         # Write new netplan config         mkdir -p \/etc\/netplan         cat &gt;\/etc\/netplan\/00-config.yaml &lt;&lt;EOT         network:           version: 2           renderer: networkd           ethernets:             eno1:               mtu: 9000               dhcp4: no               optional: true             eno1d1:               mtu: 9000               dhcp4: no               optional: true           bonds:             bond0:               mtu: 9000               dhcp4: no               macaddress: ${MAC_ADDRESS}               interfaces: [eno1, eno1d1]               parameters:                 mode: 802.3ad                 mii-monitor-interval: 100                 down-delay: 200                 up-delay: 200                 lacp-rate: fast                 transmit-hash-policy: layer3+4                 ad-select: bandwidth               addresses: [${IPCONFIG_IPV4ADDR}\/${IPCONFIG_IPV4CIDR}]               gateway4: ${IPCONFIG_IPV4GATEWAY}           vlans:             bond0.2:               addresses: [${DATA_IPV4ADDR}\/${IPCONFIG_IPV4CIDR}]               id: 2               link: bond0         EOT<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u0435, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u2014 \u0431\u0435\u0440\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0438 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043d\u0438\u0445, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u0435\u0442\u0438: \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u043a\u043b\u0430\u0434\u0435\u0442 \u0442\u0443\u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433 netplan. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f bonding-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0432 \u044d\u0442\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0438 \u0434\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438. \u0412\u0441\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 bash \u0438\u043b\u0438 \u0432 shell, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u044e\u0434\u0430, \u0438 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/asciinema.org\/a\/407284\"><u>\u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c<\/u><\/a>. \u041f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c generic values-\u0444\u0430\u0439\u043b, \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 values-\u0444\u0430\u0439\u043b. \u0414\u043b\u044f Helm \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/03c\/c17\/3ee\/03cc173eecaf1ae68f4434a7cb8b6c17.jpeg\" width=\"854\" height=\"252\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c configmap foo-kubernetes-ltsp \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e netboot-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442 network.sh \u0438 \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/175\/4c4\/ce5\/1754c4ce57b44304813cde34870f4f48.jpeg\" width=\"808\" height=\"373\"><figcaption><\/figcaption><\/figure>\n<p><a href=\"https:\/\/asciinema.org\/a\/407286\"><u>\u0417\u0434\u0435\u0441\u044c<\/u><\/a> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435. \u0412 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0448\u0430\u0441\u0441\u0438, \u0433\u0434\u0435 \u0443 \u043d\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u043e\u0434\u044b (\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c HPE Moonshots 1500), \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 show node list \u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043d\u043e\u0434. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/50c\/a35\/a37\/50ca35a37c5b20b26aa1b6ad75cbb8fc.jpeg\" width=\"852\" height=\"486\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0445 MAC-\u0430\u0434\u0440\u0435\u0441\u0430 \u2014 show node macaddr all. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0445\u0438\u0442\u0440\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u042d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 DHCP, \u043a\u043e\u043f\u0438\u0440\u0443\u044f \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u043b\u044f dnsmasq-controller \u0432 Kubernetes. \u0418 \u043e\u0442\u0441\u044e\u0434\u0430 \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0430\u043c\u0438\u043c\u0438 \u043d\u043e\u0434\u0430\u043c\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0445.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u0430\u043a \u0443 \u043d\u0430\u0441, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0439\u0442\u0438 \u043d\u0430 \u0448\u0430\u0441\u0441\u0438 \u0447\u0435\u0440\u0435\u0437 iLO \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a MAC-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u043e\u0434, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0441 <a href=\"https:\/\/asciinema.org\/a\/407287\"><u>catchall-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c<\/u><\/a> \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c DHCP-\u043f\u0443\u043b\u043e\u043c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0435 \u043d\u043e\u0434\u044b, \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c, \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/43f\/e20\/1f6\/43fe201f656e6e2439b88d075de911c7.jpeg\" width=\"848\" height=\"224\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u043e\u0434\u044b. \u041e\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 MAC-\u0430\u0434\u0440\u0435\u0441\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0438\u043c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0417\u0434\u0435\u0441\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0440\u0435\u0437\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u043d\u043e\u0434\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 BIOS \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b, \u0437\u0434\u0435\u0441\u044c \u043e\u043d\u0430 \u0441 \u0442\u0430\u043a\u043e\u0433\u043e-\u0442\u043e MAC-\u0430\u0434\u0440\u0435\u0441\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a DHCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u0430 \u0442\u043e\u0442 \u0435\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 PXE-\u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c\u0443 HTTP-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0435\u0439 \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u044f\u0434\u0440\u043e \u0438&nbsp;initrd-\u043e\u0431\u0440\u0430\u0437:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7d5\/b4c\/6f0\/7d5b4c6f0b8e75aca116d375e0310c55.jpeg\" width=\"816\" height=\"424\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u044f\u0434\u0440\u0430 \u043d\u043e\u0434\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 initramfs-\u043e\u0431\u0440\u0430\u0437 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 systemd. \u0414\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0434\u0435\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0430 \u0441\u0430\u043c\u0430 \u043d\u043e\u0434\u0430 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043a Kubernetes:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/701\/6f4\/ec4\/7016f4ec40503d59d3f878f6b8c8c019.jpeg\" width=\"846\" height=\"383\"><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 fstab, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0438: \/var\/lib\/docker \u0438 \/var\/lib\/kubelet, \u043e\u043d\u0438 \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a tmpfs (\u043f\u043e \u0441\u0443\u0442\u0438 \u2014 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u0440\u0435\u043d\u044c \u0443 \u043d\u0430\u0441 \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043a\u0430\u043a overlayfs, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0437\u0434\u0435\u0441\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u044b.&nbsp;<\/p>\n<p>\u0418\u0437 \u0431\u043b\u043e\u0447\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u043d\u043e\u0434\u0435 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d nvme-\u0434\u0438\u0441\u043a, \u043d\u043e \u043e\u043d \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d. \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 loop device \u2014 \u044d\u0442\u043e \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 initramfs-\u043e\u0431\u0440\u0430\u0437 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 653 \u041c\u0431 \u0438 \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 loop.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \/etc\/ltsp, \u043c\u044b \u043d\u0430\u0439\u0434\u0435\u043c \u043d\u0430\u0448 \u0444\u0430\u0439\u043b network.sh, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435. \u0418\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438\u0441\u044c kube-proxy, \u0430 \u0442\u0430\u043a\u0436\u0435 pause-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u043d\u0435\u0433\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3b7\/ad8\/30b\/3b7ad830b94f0ac3083ee81bade59d8a.jpeg\" width=\"849\" height=\"494\"><figcaption><\/figcaption><\/figure>\n<h2>\u0414\u0435\u0442\u0430\u043b\u0438<\/h2>\n<h3>\u041e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043e \u0441\u0435\u0442\u0438<\/h3>\n<p>\u041d\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u0436\u0435 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0437? \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u2014 \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u043d\u043e\u0434 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/tree\/master\/build\/ltsp\"><u>Dockerfile<\/u><\/a> \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c <a href=\"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/\"><u>Docker multi-stage build<\/u><\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u044f\u0434\u0440\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e <a href=\"https:\/\/github.com\/kvaps\/kubefarm\/blob\/master\/build\/ltsp\/Dockerfile\"><u>\u0442\u0430\u043a<\/u><\/a>:<\/p>\n<details class=\"spoiler\">\n<summary>Dockerfile<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#------------------------------------------------------------------------------- # Base part used for ltsp-server and ltsp-client #-------------------------------------------------------------------------------  FROM ubuntu:20.04 as ltsp  ENV VERSION=v0.10.2 ENV DEBIAN_FRONTEND=noninteractive  # Install updates and LTSP package RUN apt-get -y update \\  &amp;&amp; apt-get -y upgrade \\  &amp;&amp; apt-get -y install \\       curl \\  &amp;&amp; apt-get clean  RUN printf '%s\\n' \\       'deb http:\/\/ppa.launchpad.net\/ltsp\/ppa\/ubuntu focal main' \\       'deb http:\/\/ppa.launchpad.net\/ltsp\/proposed\/ubuntu focal main' \\       &gt; \/etc\/apt\/sources.list.d\/ltsp.list \\  &amp;&amp; curl -L https:\/\/ltsp.org\/misc\/ltsp_ubuntu_ppa.gpg \\       -o \/etc\/apt\/trusted.gpg.d\/ltsp_ubuntu_ppa.gpg  RUN apt-get -y update \\  &amp;&amp; apt-get -y install \\       ltsp-cloud \\  &amp;&amp; apt-get clean  #------------------------------------------------------------------------------- # Installing Kernel and basic software #-------------------------------------------------------------------------------  FROM ltsp as rootfs-pre  # Install packages RUN echo 'APT::Install-Recommends \"0\";\\nAPT::Install-Suggests \"0\";' \\       &gt;&gt; \/etc\/apt\/apt.conf.d\/01norecommend \\  &amp;&amp; mkdir -p \/var\/lib\/resolvconf \\  &amp;&amp; touch \/var\/lib\/resolvconf\/linkified \\  &amp;&amp; apt-get update \\  &amp;&amp; apt-get -y install \\       adduser \\       apparmor-utils \\       apt-transport-https \\       arping \\       bash-completion \\       bridge-utils \\       ca-certificates \\       curl \\       dbus-user-session \\       gnupg \\       gpg-agent \\       htop \\       ifenslave \\       initramfs-tools \\       ipset \\       ipvsadm \\       jnettop \\       jq \\       linux-image-generic \\       lm-sensors \\       lvm2 \\       openssh-server \\       nano \\       net-tools \\       nfs-common \\       pciutils \\       resolvconf \\       rsync \\       screen \\       squashfs-tools \\       ssh \\       sysstat \\       systemd \\       sudo \\       tcpdump \\       telnet \\       thin-provisioning-tools \\       ubuntu-minimal \\       vim \\       vlan \\       wget \\       zfsutils-linux \\  &amp;&amp; apt-get clean \\  &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*  # Disable systemd-resolved RUN systemctl disable systemd-resolved.service \\  &amp;&amp; systemctl mask systemd-resolved.service  # Install docker ARG DOCKER_VERSION=20.10 RUN curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | apt-key add - \\  &amp;&amp; echo \"deb https:\/\/download.docker.com\/linux\/ubuntu focal stable\" \\       &gt; \/etc\/apt\/sources.list.d\/docker.list \\  &amp;&amp; apt-get update \\  &amp;&amp; DOCKER_VERSION=$(apt-cache madison docker-ce | awk '{print $3}' | grep -m1 \"$DOCKER_VERSION\") \\  &amp;&amp; apt-get -y install docker-ce=\"$DOCKER_VERSION\" \\  &amp;&amp; apt-mark hold docker-ce  # Install kubeadm, kubelet and kubectl # https:\/\/kubernetes.io\/docs\/setup\/independent\/install-kubeadm\/#installing-kubeadm-kubelet-and-kubectl ARG KUBE_VERSION=1.20 RUN curl -s https:\/\/packages.cloud.google.com\/apt\/doc\/apt-key.gpg | apt-key add - \\  &amp;&amp; echo \"deb http:\/\/apt.kubernetes.io\/ kubernetes-xenial main\" \\       &gt; \/etc\/apt\/sources.list.d\/kubernetes.list \\  &amp;&amp; apt-get update \\  &amp;&amp; KUBE_VERSION=$(apt-cache madison kubelet | awk '{print $3}' | grep -m1 \"$KUBE_VERSION\") \\  &amp;&amp; apt-get -y install kubelet=$KUBE_VERSION kubeadm=$KUBE_VERSION kubectl=$KUBE_VERSION cri-tools \\  &amp;&amp; apt-mark hold kubelet kubeadm kubectl  # Disable automatic updates RUN rm -f \/etc\/apt\/apt.conf.d\/20auto-upgrades  # Disable apparmor profiles RUN find \/etc\/apparmor.d \\       -maxdepth 1 \\       -type f \\       -name \"sbin.*\" \\       -o -name \"usr.*\" \\       -exec ln -sf \"{}\" \/etc\/apparmor.d\/disable\/ \\;  # Setup locales RUN printf '%s\\n' \\       'LANG=en_US.UTF-8' \\       'LC_TIME=en_DK.UTF-8' \\       'LC_CTYPE=en_US.UTF-8' \\       &gt; \/etc\/locale.conf \\  &amp;&amp; locale-gen en_US.UTF-8 en_DK.UTF-8  #------------------------------------------------------------------------------- # Build kernel modules #-------------------------------------------------------------------------------  FROM rootfs-pre as modules  # Install kernel-headers and dkms RUN apt-get update \\  &amp;&amp; KERNEL_VERSION=\"$(ls -1 \/lib\/modules\/ | tail -n1)\" \\  &amp;&amp; apt-get -y install \"linux-headers-${KERNEL_VERSION}\" dkms \\  &amp;&amp; apt-get clean  # Install DRBD modules RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CC1B5A793C04BB3905AD837734893610CEAA9512 \\  &amp;&amp; echo \"deb http:\/\/ppa.launchpad.net\/linbit\/linbit-drbd9-stack\/ubuntu focal main\" \\       &gt; \/etc\/apt\/sources.list.d\/linbit.list \\  &amp;&amp; apt-get update \\  &amp;&amp; apt-get -y install drbd-dkms  #------------------------------------------------------------------------------- # Build rootfs image #-------------------------------------------------------------------------------  FROM rootfs-pre as rootfs  # Copy kernel modules COPY --from=modules \/lib\/modules\/ \/lib\/modules\/  # Generate initramfs with new modules RUN update-initramfs -u  # Generate motd COPY motd \/etc\/motd RUN sed -i \"s\/\\${VERSION}\/${VERSION}\/\" \/etc\/motd  # Generate image ENV OMIT_FUNCTIONS=\"remove_users\" RUN ltsp image -I \/  #------------------------------------------------------------------------------- # Build dnsmasq with tftp single port support #-------------------------------------------------------------------------------  FROM ltsp as builder  # Common build-dependencies RUN apt-get -y update \\  &amp;&amp; apt-get -y install \\       git \\       build-essential \\  &amp;&amp; apt-get clean \\  &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/* \\  # Build dnsmasq ARG DNSMAQ_VERSION=2.81-12-g619000a RUN git clone git:\/\/thekelleys.org.uk\/dnsmasq.git \\  &amp;&amp; cd dnsmasq\/ \\  &amp;&amp; git checkout ${DNSMAQ_VERSION} \\  &amp;&amp; make  #------------------------------------------------------------------------------- # LTSP-Server #-------------------------------------------------------------------------------  FROM ltsp  RUN apt-get -y update \\  &amp;&amp; apt-get -y install \\       grub-pc-bin \\       grub-efi-amd64-bin \\       inotify-tools \\       nginx \\  &amp;&amp; apt-get clean \\  &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*  # Generate nginx config RUN ltsp http -I  COPY --from=builder \/dnsmasq\/src\/dnsmasq \/usr\/sbin\/dnsmasq COPY --from=rootfs \/srv\/ltsp\/images \/srv\/ltsp\/images COPY --from=rootfs \/srv\/tftp\/ltsp \/srv\/tftp\/ltsp<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u0443\u044e Ubuntu 20.04 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u043c \u043f\u0430\u043a\u0435\u0442\u044b. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u2014 \u044f\u0434\u0440\u043e, lvm, systemd, SSH \u2014 \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0451 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u043e\u0434\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 stage. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Docker \u0441 Kubernetes kubelet \u0438 kubeadm, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0436\u043e\u0439\u043d\u0430 \u043d\u043e\u0434\u044b \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443.<\/p>\n<p>\u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c stage \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 tftp \u0441 nginx (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0434\u0430\u044e\u0442 \u043d\u0430\u0448 \u043e\u0431\u0440\u0430\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c), grub (\u043d\u0430\u0448 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a), \u0438 \u0432 \u044d\u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u0440\u0430\u0437 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 stages. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0441\u0443\u0442\u0438 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0437, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440, \u0442\u0430\u043a \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043d\u043e\u0434. \u0412 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0438\u0437\u043c\u0435\u043d\u044f\u044f Dockerfile, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c.<\/p>\n<h3>\u0412\u0435\u0431\u0445\u0443\u043a\u0438 \u0438 API aggregation layerapiserver<\/h3>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0445\u043e\u0447\u0443 \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0432\u0435\u0431\u0445\u0443\u043a\u043e\u0432 \u0438 aggregation layer. \u0412\u043e\u043e\u0431\u0449\u0435 \u0432\u0435\u0431\u0445\u0443\u043a\u0438 \u2014 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c Kubernetes, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 Kubernetes \u0445\u043e\u0434\u0438\u043b \u043a \u043a\u0430\u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b, \u0432\u0435\u0440\u043d\u0430 \u043b\u0438 \u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f, \u0438\u043b\u0438 \u0432\u043d\u043e\u0441\u0438\u043b \u0431\u044b \u0432 \u043d\u0435\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.&nbsp;<\/p>\n<p>\u041d\u043e \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0435\u0431\u0445\u0443\u043a\u043e\u0432 apiserver \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0410 \u0435\u0441\u043b\u0438 \u043e\u043d \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u043a\u0430\u043a \u0443 \u043d\u0430\u0441, \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c Konnectivity. Konnectivity \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043d\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 Kubernetes.<\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 4 \u043d\u043e\u0434\u044b, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u043f\u0443\u0449\u0435\u043d kubelet \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b Kubernetes: apiserver, scheduller \u0438 controller-manager. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0445\u043e\u0434\u044f\u0442 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 apiserver\u2019\u043e\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u044d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b Kubernetes. \u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u043e\u0434\u0430 \u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c kubectl exec, \u0442\u043e apiserver \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u0438\u0437 kubelet\u2019\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac4\/697\/13d\/ac469713d202e3cc3cda9b7c26e2d9bd.jpg\" width=\"995\" height=\"565\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0435\u0431\u0445\u0443\u043a, \u0442\u043e \u043e\u043d, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0430 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u0418 \u043a\u043e\u0433\u0434\u0430 apiserver \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u043a \u043d\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a in-cluster \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 webhook.namespace.svc:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aa1\/b25\/430\/aa1b25430c44ff5a6984c02db53ca70a.jpg\" width=\"1052\" height=\"564\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 Konnectivity \u2014 \u0445\u0438\u0442\u0440\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f Kubernetes. \u041e\u043d \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0440\u044f\u0434\u043e\u043c \u0441 apiserver. \u0410 Konnectivity-agent \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0445\u043e\u0434\u0438\u0442\u044c, \u0442\u0430\u043a\u0436\u0435 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445. \u0410\u0433\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 apiserver \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0442 \u0441\u043c\u043e\u0433 \u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0438 \u0438\u043c\u0435\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0432\u0435\u0431\u0445\u0443\u043a\u0430\u043c\u0438 \u0438 \u0432\u0441\u0435\u043c\u0438 kubelet\u2019\u0430\u043c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Konnectivity-server:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ae\/5a2\/cf0\/6ae5a2cf0d5941b46cd44327853133da.jpg\" width=\"1039\" height=\"566\"><figcaption><\/figcaption><\/figure>\n<h2>\u041d\u0430\u0448\u0438 \u043f\u043b\u0430\u043d\u044b<\/h2>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f. \u041c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0443\u0442 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043b\u044e\u0434\u0438. \u0418 \u0435\u0441\u043b\u0438 \u043d\u0430\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u0430\u0441\u0441\u0430, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c Kubernetes-in-Kubernetes \u043f\u043e\u0434 \u043a\u0440\u044b\u043b\u043e Kubernetes-SIGs, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0432 \u0435\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e Kubernetes Helm-\u0447\u0430\u0440\u0442\u0430. \u0418, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u0430\u043a \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438.&nbsp;<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 Machine Controller Manager, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c worker\u2019\u044b, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445, \u0430 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f kubevirt \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0445 \u0432 \u0442\u043e\u043c \u0436\u0435 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c \u043a\u0441\u0442\u0430\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0438 \u0432 \u043e\u0431\u043b\u0430\u043a\u0430\u0445, \u0438\u043c\u0435\u044f control-plane, \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043d\u044b\u0439 \u0443 \u0441\u0435\u0431\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.&nbsp;<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Cluster-API, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kubefarm \u043f\u0440\u044f\u043c\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 Kubernetes. \u041d\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0443\u0432\u0435\u0440\u0435\u043d \u0432 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0435. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u044b\u0441\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442, \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u0438\u0445 \u0432\u044b\u0441\u043b\u0443\u0448\u0430\u044e.<\/p>\n<blockquote>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 <a href=\"http:\/\/devopsconf.io\/moscow\/2021\">DevOpsConf<\/a> \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0432 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0438 \u043e\u043d\u043b\u0430\u0439\u043d- \u0438 \u043e\u0444\u043b\u0430\u0439\u043d-\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438, \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0441\u043f\u0438\u043a\u0435\u0440\u0430\u043c \u0438 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044f\u0445 \u0432 \u0437\u043e\u043d\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<p><a href=\"https:\/\/conf.ontico.ru\/conference\/join\/dc2021-moscow.html?popup=2\">\u0411\u0440\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435<\/a> \u0431\u0438\u043b\u0435\u0442\u044b \u0438 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 \u0444\u0430\u043d\u0430\u0442\u043e\u0432 DevOps-\u043f\u043e\u0434\u0445\u043e\u0434\u0430! \u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 <a href=\"https:\/\/devopsconf.io\/moscow\/2021\/schedule\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<\/blockquote>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/558900\/\"> https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/558900\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 2 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430, \u0442\u044b\u0441\u044f\u0447\u0438 \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0438 \u0438 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u043e\u0442\u0435\u043d \u0442\u044b\u0441\u044f\u0447 \u0441\u0430\u0439\u0442\u043e\u0432, Kubernetes \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0434\u043e\u0431\u0440\u043e\u043c. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kubernetes \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043d\u043e \u0438 \u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0435\u043c \u0447\u0435\u0448\u0441\u043a\u043e\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435 WEDOS Internet a.s \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0434\u0432\u0443\u0445 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u2014 <a href=\"https:\/\/github.com\/kvaps\/kubernetes-in-kubernetes\"><u>Kubernetes-in-Kubernetes<\/u><\/a> \u0438 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\"><u>Kubefarm<\/u><\/a>.<\/p>\n<p>\u0421 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430 \u043f\u0430\u0440\u0443 \u043a\u043e\u043c\u0430\u043d\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Helm, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 Kubernetes \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u041a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c? \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442<\/p>\n<hr>\n<p><iframe id=\"60aca129d0e17eb5ff472403\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/60aca129d0e17eb5ff472403\" class=\"embed_video embed__content\" allowfullscreen=\"true\"><\/iframe><\/p>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430\u0448\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u0412\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b: control-plane \u0438 compute nodes. Control plane \u043d\u043e\u0434\u044b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0438\u043c\u0435\u044e\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u041e\u0421 \u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0431, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u043e\u0432 Kubernetes. \u0417\u0430\u0434\u0430\u0447\u0430 \u044d\u0442\u0438\u0445 \u043d\u043e\u0434 \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u0435\u0440\u0435\u0431\u043e\u0439\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. Compute \u043d\u043e\u0434\u044b \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0438, \u0430 \u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u043f\u043e \u0441\u0435\u0442\u0438 \u043f\u0440\u044f\u043c\u043e \u0441 control-plane \u043d\u043e\u0434. \u0418\u0445 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 control-plane \u043d\u043e\u0434\u0430\u0445 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u044b \u0442\u0430\u043a\u0436\u0435 PXE- \u0438&nbsp;DHCP-\u0441\u0435\u0440\u0432\u0435\u0440\u044b. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0438 compute-\u043d\u043e\u0434\u044b, \u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u2014 \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a DHCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u041e\u043d, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0434\u0435, \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f: \u00ab\u0423 \u0442\u0435\u0431\u044f \u0442\u0430\u043a\u043e\u0439-\u0442\u043e IP, \u0433\u0440\u0443\u0437\u0438\u0441\u044c \u0441 \u0442\u0430\u043a\u043e\u0433\u043e-\u0442\u043e PXE-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u00bb. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u043e\u0434\u044b \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442 \u043e\u0431\u0440\u0430\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0435\u0433\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0433\u043e.&nbsp;<\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0437, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u0441\u0432\u044f\u0437\u0438 \u0441 PXE-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c PXE-\u0441\u0435\u0440\u0432\u0435\u0440 \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0434\u0430\u0451\u0442 \u043e\u0431\u0440\u0430\u0437 \u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043d\u0430\u0448\u0438 \u043d\u043e\u0434\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438\u0441\u044c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c PXE-\u0441\u0435\u0440\u0432\u0435\u0440, \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0441 \u043d\u0438\u043c\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u043d\u0430\u0448\u0438 \u043d\u043e\u0434\u044b \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 kubeadm join. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u0434\u0436\u043e\u0439\u043d\u0438\u043b\u0438\u0441\u044c \u0432 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u0434\u043b\u044f control-plane \u043d\u043e\u0434. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e kube-scheduler \u043c\u043e\u0433 \u0448\u0435\u0434\u0443\u043b\u043b\u0438\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.&nbsp;<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0443 \u043d\u0430\u0441 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445 \u043b\u0435\u0442. \u041f\u043e\u0437\u0436\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u0451 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Kubernetes. \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u0430\u0432\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0430 \u043d\u0430\u0448\u0438\u0445 control-plane \u043d\u043e\u0434\u0430\u0445 (\u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0438 \u0432\u0441\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c&nbsp;admin-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435). \u0410 compute-\u043d\u043e\u0434\u044b \u0434\u0436\u043e\u0439\u043d\u044f\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0432 \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u2014 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0451 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.&nbsp;<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>Kubefarm<\/h2>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0441 \u0446\u0435\u043b\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0431\u043e\u0439 \u0441\u043c\u043e\u0433 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0437\u0430 \u043f\u0430\u0440\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Helm \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u0443\u0448\u043b\u0438 \u043e\u0442 \u0438\u0434\u0435\u0438 \u043c\u043e\u043d\u043e\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442&nbsp;\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Kubernetes \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a multi-tenant \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0435&nbsp;\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c. \u0418 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u2014 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0434 \u0443 \u0432\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u043e\u043c\u0435\u043d \u043e\u0442\u043a\u0430\u0437\u0430 \u0438 \u0442\u0435\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0435\u0435 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0410 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 Kubernetes.<\/p>\n<p>\u0422\u0430\u043a \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/kvaps\/kubefarm\"><u>Kubefarm<\/u><\/a>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"http:\/\/github.com\/kvaps\/kubernetes-in-kubernetes\"><u>Kubernetes-in-Kubernetes<\/u><\/a>, <a href=\"https:\/\/github.com\/ltsp\/ltsp\/\"><u>LTSP<\/u><\/a> \u2014 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 PXE-\u0441\u0435\u0440\u0432\u0435\u0440, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u043d\u043e\u0434\u044b, \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e DHCP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/kvaps\/dnsmasq-controller\"><u>dnsmasq-controller<\/u><\/a>:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0412\u043e\u043e\u0431\u0449\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 Kubernetes \u043a\u0430\u043a \u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u043e\u043d \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b <a href=\"https:\/\/12factor.net\/ru\/\"><u>The Twelve-Factor App<\/u><\/a>, \u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e. \u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c Kubernetes \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a Kubernetes \u0432 Kubernetes<\/h3>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 Helm \u0432 <a href=\"https:\/\/github.com\/kvaps\/kubernetes-in-kubernetes\/blob\/master\/deploy\/helm\/kubernetes\/values.yaml\"><u>values-\u0444\u0430\u0439\u043b<\/u><\/a>:<\/p>\n<details class=\"spoiler\">\n<summary>kubernetes\/values.yaml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">controlPlaneEndpoint:  persistence:   enabled: true   accessModes:     - ReadWriteOnce   size: 1Gi   # storageClassName: default   annotations: {}   finalizers:     - kubernetes.io\/pvc-protection    backup:     # existingClaim: your-claim     # subPath: backups     accessModes:       - ReadWriteOnce     size: 1Gi     # storageClassName: default     annotations: {}     finalizers:       - kubernetes.io\/pvc-protection  etcd:   enabled: true   image:     repository: k8s.gcr.io\/etcd     tag: 3.4.13-0     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 3   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    certSANs:     dnsNames: []     ipAddresses: []    extraArgs: {}     # advertise-address is required for kube-proxy     #advertise-address: 10.9.8.10   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    ports:     client: 2379     peer: 2380     metrics: 2381   service:     enabled: true     type: ClusterIP     ports:       client: 2379       peer: 2380       metrics: 2381     labels: {}     annotations: {}     loadBalancerIP:    backup:     enabled: false     schedule: \"0 *\/12 * * *\"     successfulJobsHistoryLimit: 3     failedJobsHistoryLimit: 3     extraArgs: #{}       debug: true     resources:       requests:         cpu: 100m         memory: 128Mi       # limits:       #   cpu: 100m       #   memory: 128Mi      labels: {}     annotations: {}     podLabels: {}     podAnnotations: {}     nodeSelector: {}     tolerations: []     podAffinity: soft     podAffinityTopologyKey: kubernetes.io\/hostname     affinity: {}     extraEnv: []     sidecars: []     extraVolumes: []     extraVolumeMounts: []  apiServer:   enabled: true   image:     repository: k8s.gcr.io\/kube-apiserver     tag: v1.20.5     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    certSANs:     dnsNames: []     ipAddresses: []    serviceClusterIPRange: 10.96.0.0\/12    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []     port: 6443   service:     enabled: true     type: ClusterIP # NodePort \/ LoadBalancer     port: 6443     # Specify nodePort for apiserver service (30000-32767)     nodePort:     labels: {}     annotations: {}     loadBalancerIP:  controllerManager:   enabled: true   image:     repository: k8s.gcr.io\/kube-controller-manager     tag: v1.20.5     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    port: 10257   service:     enabled: true     type: ClusterIP     port: 10257     labels: {}     annotations: {}     loadBalancerIP:  scheduler:   enabled: true   image:     repository: k8s.gcr.io\/kube-scheduler     tag: v1.20.5     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    port: 10259   service:     enabled: true     type: ClusterIP     port: 10259     labels: {}     annotations: {}     loadBalancerIP:  admin:   enabled: true   image:     repository: ghcr.io\/kvaps\/kubernetes-tools     tag: v0.9.2     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 1   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    job:     enabled: true     schedule: \"0 0 1 *\/6 *\"     successfulJobsHistoryLimit: 3     failedJobsHistoryLimit: 3    labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []  kubeProxy:   enabled: true  coredns:   enabled: true  konnectivityServer:   enabled: false   image:     repository: us.gcr.io\/k8s-artifacts-prod\/kas-network-proxy\/proxy-server     tag: v0.0.14     pullPolicy: IfNotPresent     pullSecrets: []   replicaCount: 2   resources:     requests:       cpu: 100m       memory: 128Mi     # limits:     #   cpu: 100m     #   memory: 128Mi    extraArgs: {}   labels: {}   annotations: {}   podLabels: {}   podAnnotations: {}   nodeSelector: {}   tolerations: []   podAntiAffinity: soft   podAntiAffinityTopologyKey: kubernetes.io\/hostname   affinity: {}   extraEnv: []   sidecars: []   extraVolumes: []   extraVolumeMounts: []    ports:     server: 8131     agent: 8132     admin: 8133     health: 8134   service:     enabled: true     type: ClusterIP    <\/code><\/pre>\n<\/div>\n<\/details>\n<\/hr>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-323713","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/323713","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=323713"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/323713\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=323713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=323713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=323713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}