{"id":493197,"date":"2026-09-02T09:37:14","date_gmt":"2026-09-02T09:37:14","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=493197"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=493197","title":{"rendered":"Sheeternetes: \u043a\u0430\u043a \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 Google \u0422\u0430\u0431\u043b\u0438\u0446 (\u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u041e\u0421 \u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0444\u043e\u043d\u0434)"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0425\u0430\u0431\u0440, \u043f\u0440\u0438\u0432\u0435\u0442! \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0432 \u00ab\u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438\u00bb \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u044b \u0432 \u0442\u0440\u0438 \u0447\u0430\u0441\u0430 \u043d\u043e\u0447\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0448\u044c <code>kubelet<\/code>-\u0443, \u0447\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u044d\u0442\u043e \u0435\u0433\u043e \u043d\u043e\u0432\u044b\u0439 control plane. \u0422\u0430\u043a \u0432\u044b\u0448\u043b\u043e \u0438 \u0442\u0443\u0442, \u0432\u0441\u0451 \u0440\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u0437 \u0441\u0443\u0431\u0431\u043e\u0442\u043d\u0435\u0439 \u0448\u0443\u0442\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c <a href=\"https:\/\/t.me\/kuber_community\" rel=\"noopener nofollow\">\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b\u0435 \u043f\u043e \u043a\u0443\u0431\u0435\u0440\u043d\u0435\u0442\u0435\u0441\u0443<\/a>.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u0435: \u0440\u0430\u0437 \u0432\u0435\u0441\u044c \u043c\u0438\u0440 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u044d\u043a\u0441\u0435\u043b\u044c\u043a\u0435, \u0442\u043e \u043f\u0443\u0441\u043a\u0430\u0439 \u0432\u0441\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0436\u0438\u0432\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041d\u0435 \u00ab\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u00bb, \u043d\u0435 \u00ab\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 CSV\u00bb \u2014 \u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e: Deployments, Nodes, Pods, Events \u2014 \u044d\u0442\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 Google Sheets (\u0438\u043b\u0438 \u043b\u0438\u0441\u0442\u044b Excel). \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0447\u0438\u0442\u0430\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442 \u044f\u0447\u0435\u0439\u043a\u0438. <code>kubectl<\/code>-\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0418 \u2014 \u0432\u043e\u0442 \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u2014 <strong>\u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u043a\u0440\u0443\u0442\u044f\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/strong>. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 <em>\u0438 \u0435\u0441\u0442\u044c<\/em> \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>Sheeternetes<\/strong>. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0448\u0443\u0442\u043a\u0430. \u041d\u043e \u0448\u0443\u0442\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043d\u043e\u0434\u044b.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u2014 \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0443 \u0441\u0435\u0431\u044f \u0437\u0430 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 bare metal \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 (\u0432 Excel \u0438 LibreOffice), \u043a\u0430\u043a \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0432 \u0444\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u0436\u0438\u0432\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439, \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c <strong>\u043f\u0440\u044f\u043c\u043e \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445<\/strong>, \u2014 \u0438 \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0432\u044b\u0440\u043e\u0441\u043b\u043e \u0432 \u0446\u0435\u043b\u044b\u0439 \u0444\u043e\u043d\u0434 \u0441 30 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0434. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u2014 \u0441\u043d\u0438\u043c\u0438\u0442\u0435 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u0434\u0438\u0430\u043b\u043e\u0433 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. It reconciles.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0437\u0434\u0435\u0441\u044c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441 bin-packing \u0438 failover, HMAC-\u043f\u043e\u0434\u043f\u0438\u0441\u0438, live-\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f make-before-break, \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041f\u0440\u043e\u0441\u0442\u043e \u0441\u0443\u0431\u0441\u0442\u0440\u0430\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0435\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0436\u0451\u0441\u0442\u043a\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u0441\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u0441\u0442\u0435\u0442\u0438\u043a\u0430: \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u0431\u043b\u0438\u0446.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0441\u0442\u0438\u043d\u044b<\/h3>\n<p>Kubernetes \u2014 \u044d\u0442\u043e, \u0435\u0441\u043b\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u00ab\u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 etcd + \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u043e\u0434\u044f\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u043c\u0443\u00bb. \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u0435 etcd \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 Google Sheets, \u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u2014 \u043d\u0430 Apps Script \u0438 bash-\u0434\u0435\u043c\u043e\u043d, \u0438 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Sheeternetes.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/890\/10c\/bc3\/89010cbc3febafa7f28dd5969ad146c4.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Sheeternetes\" title=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Sheeternetes\" width=\"1500\" height=\"900\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/890\/10c\/bc3\/89010cbc3febafa7f28dd5969ad146c4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/890\/10c\/bc3\/89010cbc3febafa7f28dd5969ad146c4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Sheeternetes<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u0422\u0430\u0431\u043b\u0438\u0446\u0430<\/strong> \u2014 durable store \u0438 single source of truth. \u0427\u0435\u0442\u044b\u0440\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438: <code>Deployments<\/code>, <code>Nodes<\/code>, <code>Pods<\/code>, <code>Events<\/code>. \u0421\u0442\u0440\u043e\u043a\u0430 = \u043e\u0431\u044a\u0435\u043a\u0442, \u0448\u0430\u043f\u043a\u0430 = \u0441\u0445\u0435\u043c\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>apiserver<\/strong> \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e HTTP \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a. \u0412 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e Google Apps Script, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435; \u0432 on-prem \u2014 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 Python-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0432\u0435\u0440\u0445 <code>.xlsx<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>kubelet<\/strong> \u2014 <a href=\"http:\/\/kubelet.sh\" rel=\"noopener nofollow\"><code>kubelet.sh<\/code><\/a>, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 bash-\u0441\u043a\u0440\u0438\u043f\u0442. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 Docker-\u0445\u043e\u0441\u0442 \u0432 \u00ab\u043d\u043e\u0434\u0443\u00bb: \u0448\u043b\u0451\u0442 heartbeat \u0432 apiserver, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0438 \u0441\u0432\u043e\u0434\u0438\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Docker \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>skctl<\/strong> \u2014 \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u044b\u0439 <code>kubectl<\/code>. <code>curl<\/code> + <code>jq<\/code> \u043f\u043e\u0432\u0435\u0440\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 apiserver.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u7b80\u5355:<\/p>\n<pre><code>GET  ?token=&lt;T&gt;&amp;kind=pods|nodes|deployments|events   -&gt;  { \"items\": [ ... ] }POST { \"token\": T, \"action\": \"apply|scale|delete\", ... }POST { \"token\": T, \"node\": ..., \"pods\": [...] }         # heartbeat \u043a\u0443\u0431\u0435\u043b\u0435\u0442\u0430 -&gt; desired pods<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u00ab\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb. \u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0442\u0430\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0432\u0430\u0433\u043e\u043d.<\/p>\n<h3>\u041f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/h3>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u043d\u0430 Google Sheets. \u041d\u0443\u0436\u043d\u044b Google-\u0430\u043a\u043a\u0430\u0443\u043d\u0442, Docker-\u0445\u043e\u0441\u0442, <code>bash<\/code>, <code>curl<\/code>, <code>jq<\/code>. \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u2014 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/sncfoundation\/sheeternetes\" rel=\"noopener nofollow\">github.com\/sncfoundation\/sheeternetes<\/a>.<\/p>\n<p><strong>\u0428\u0430\u0433 1. Control plane.<\/strong> \u0428\u0430\u0431\u043b\u043e\u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u2014 \u0435\u0433\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435\u0442: \u043f\u0443\u0441\u0442\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u0430\u043c\u0430.<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c <strong>\u043f\u0443\u0441\u0442\u0443\u044e<\/strong> Google-\u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Extensions \u2192 Apps Script<\/strong>, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c <a href=\"http:\/\/Code.gs\" rel=\"noopener nofollow\"><code>Code.gs<\/code><\/a> \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0432\u043e\u0439 <code>TOKEN<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0434\u0438\u043d \u0440\u0430\u0437 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>setup()<\/code> \u2014 \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u043b\u0438\u0441\u0442 \u0432 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443: \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438, \u043f\u0430\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432-\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 reconcile-\u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Deploy \u2192 New deployment \u2192 Web app<\/strong> (<em>Execute as: Me<\/em>, <em>Who has access: Anyone<\/em>), \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c <code>\/exec<\/code> URL.<\/p>\n<\/li>\n<\/ol>\n<p>\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0436\u0438\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044f? \u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/sncfoundation.github.io\/demo.html\" rel=\"noopener nofollow\">\u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u043e\u0435 \u0434\u0435\u043c\u043e \u043d\u0430 \u0442\u0440\u0451\u0445 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445<\/a> \u2014 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0435 running-state \u043f\u0440\u044f\u043c\u043e \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445.<\/p>\n<p><strong>\u0428\u0430\u0433 2.<\/strong> \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043d\u043e\u0434\u0443 \u2014 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 Docker:<\/p>\n<pre><code class=\"bash\">export WEBAPP_URL=https:\/\/script.google.com\/macros\/s\/XXXX\/execexport TOKEN=secretNODE_NAME=node-a CPU_TOTAL=4000 MEM_TOTAL=8192 .\/kubelet.sh# [kubelet] node=node-a ip=10.0.0.1 cpu=4000m mem=8192Mi -&gt; ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435\u0442 \u0442\u0440\u0451\u0445 \u043c\u0430\u0448\u0438\u043d? <code>.\/<\/code><a href=\"http:\/\/local-cluster.sh\" rel=\"noopener nofollow\"><code>local-cluster.sh<\/code><\/a> \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 node-a\/b\/c \u043a\u0430\u043a \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u043a\u0443\u0431\u0435\u043b\u0435\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u043c Docker-\u0434\u0435\u043c\u043e\u043d\u0435 \u2014 \u0443\u0434\u043e\u0431\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0438 failover \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p><strong>\u0428\u0430\u0433 3.<\/strong> \u0414\u0435\u043f\u043b\u043e\u0438\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 JSON:<\/p>\n<pre><code class=\"json\">{  \"deployments\": [    { \"name\": \"web\",   \"image\": \"nginx:alpine\",       \"replicas\": 2, \"cpu_req\": 100, \"mem_req\": 32 },    { \"name\": \"hello\", \"image\": \"hashicorp\/http-echo\", \"replicas\": 1, \"cpu_req\": 50,  \"mem_req\": 16,      \"command\": \"-text=hello-from-a-spreadsheet -listen=:8080\" }  ]}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code class=\"bash\">skctl apply lab\/hello-web.jsonskctl get pods<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0433\u0438\u044f: \u0432\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u2014 \u0438 <strong>\u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0438<\/strong>. \u0412\u043a\u043b\u0430\u0434\u043a\u0430 <code>Deployments<\/code> \u2014 \u044d\u0442\u043e \u0432\u0430\u0448\u0438 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u044b. \u0412\u043a\u043b\u0430\u0434\u043a\u0430 <code>Pods<\/code> \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0441 \u0438\u0445 \u043d\u043e\u0434\u0430\u043c\u0438 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438. \u041c\u0435\u043d\u044f\u0435\u0442\u0435 <code>replicas<\/code> \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0440\u0443\u043a\u0430\u043c\u0438 \u2014 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c heartbeat \u0434\u043e\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u043e\u0434\u044b. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u044d\u0442\u043e <code>kubectl edit<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/04b\/4b3\/0e3\/04b4b30e36c4d8b6c8ef4d661ddbb018.png\" alt=\"\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\" width=\"1470\" height=\"840\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/04b\/4b3\/0e3\/04b4b30e36c4d8b6c8ef4d661ddbb018.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/04b\/4b3\/0e3\/04b4b30e36c4d8b6c8ef4d661ddbb018.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u00ab\u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0439\u00bb \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f59\/97a\/030\/f5997a030719c1d6119620fd55e5b86a.png\" alt=\"skctl \u0432 \u0434\u0435\u043b\u0435\" width=\"1350\" height=\"810\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f59\/97a\/030\/f5997a030719c1d6119620fd55e5b86a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f59\/97a\/030\/f5997a030719c1d6119620fd55e5b86a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>skctl \u0432 \u0434\u0435\u043b\u0435<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"bash\">$ skctl get podsNAME    DEPLOYMENT  NODE    PHASE    CONTAINERweb-1   web         node-a  Running  a1b2c3d4e5f6web-2   web         node-b  Running  b2c3d4e5f6a7hello-1 hello       node-a  Running  c3d4e5f6a7b8<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435. <code>docker ps<\/code> \u043d\u0430 \u043d\u043e\u0434\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0438\u0445. Sheetlium (\u043d\u0430\u0448 \u00abCilium\u00bb) \u0437\u0430\u043e\u0434\u043d\u043e \u043a\u043b\u0430\u0434\u0451\u0442 \u0438\u0445 \u0432 \u043e\u0431\u0449\u0443\u044e Docker-\u0441\u0435\u0442\u044c \u0438 \u0432\u0435\u0448\u0430\u0435\u0442 \u043d\u0430 \u0438\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430 network-alias \u2014 \u0432\u043e\u0442 \u0432\u0430\u043c \u0438 Service c DNS.<\/p>\n<h3>\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a: \u043d\u0435 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439<\/h3>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0447\u0430\u0441\u0442\u043e\u0435 \u0432\u043e\u0437\u0440\u0430\u0436\u0435\u043d\u0438\u0435: \u00ab\u043d\u0443 \u044d\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a, \u043a\u0430\u043a\u043e\u0439 \u0442\u0430\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u00bb. \u0410 \u0432\u043e\u0442 \u0438 \u043d\u0435\u0442. \u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 heartbeat apiserver \u0447\u0435\u0441\u0442\u043d\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043f\u043e \u043d\u043e\u0434\u0430\u043c, \u0438 \u044d\u0442\u043e \u0447\u0438\u0441\u0442\u0430\u044f, \u043f\u043e\u043a\u0440\u044b\u0442\u0430\u044f \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u0427\u0442\u043e \u043e\u043d\u0430 \u0443\u043c\u0435\u0435\u0442:<\/p>\n<ul>\n<li>\n<p><strong>Bin-packing \u043f\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c.<\/strong> \u041f\u043e\u0434 \u0441 <code>cpu_req<\/code>\/<code>mem_req<\/code> \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u043d\u0430 \u043d\u043e\u0434\u0443, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0441\u0442\u043e. \u041d\u0435 \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u043d\u0438\u043a\u0443\u0434\u0430 \u2014 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>Unschedulable<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Sticky placement.<\/strong> \u041f\u043e\u0434 \u043d\u0435 \u0441\u043a\u0430\u0447\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u043d\u043e\u0434\u0430\u043c\u0438 \u0431\u0435\u0437 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u2014 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u0431\u044b\u043b, \u043f\u043e\u043a\u0430 \u043d\u043e\u0434\u0430 \u0436\u0438\u0432\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Failover.<\/strong> \u041d\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u0441\u043b\u0430\u0442\u044c heartbeat \u0434\u043e\u043b\u044c\u0448\u0435 <code>NODE_TTL<\/code> (30\u0441) \u2014 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>NotReady<\/code>, \u0435\u0451 \u043f\u043e\u0434\u044b \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044e\u0442 \u043d\u0430 \u0436\u0438\u0432\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>cordon \/ drain \/ migrate.<\/strong> \u0420\u043e\u0432\u043d\u043e \u043a\u0430\u043a \u0432 kubectl.<\/p>\n<\/li>\n<li>\n<p><strong>affinity + taints\/tolerations.<\/strong> \u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e: <code>node_selector<\/code> \u043f\u0440\u043e\u0442\u0438\u0432 \u043b\u0435\u0439\u0431\u043b\u043e\u0432 \u043d\u043e\u0434\u044b, <code>NoSchedule<\/code>-\u0442\u0435\u0439\u043d\u0442\u044b \u043f\u0440\u043e\u0442\u0438\u0432 \u0442\u043e\u043b\u0435\u0440\u0435\u0439\u0448\u0435\u043d\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0434\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">skctl cordon node-a          # \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u0434\u044b \u0441\u044e\u0434\u0430 \u043d\u0435 \u0435\u0434\u0443\u0442, \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442skctl drain  node-a          # \u044d\u0432\u0430\u043a\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u044b \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445, \u0437\u0430\u0442\u0435\u043c cordonskctl uncordon node-a        # \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u0439skctl migrate web-1 node-b   # \u043f\u0435\u0440\u0435sel\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u043e\u0434 (make-before-break)skctl label  node-a disk=ssdskctl taint  node-a gpu=true:NoSchedule<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c GPU-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0437\u0430 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043d\u043e\u0434\u0430\u043c\u0438? \u041e\u0431\u044b\u0447\u043d\u044b\u0439 <code>node_selector<\/code> \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435:<\/p>\n<pre><code class=\"json\">{ \"name\": \"ml-infer\", \"image\": \"sicf:tinyllm\", \"replicas\": 1,  \"cpu_req\": 800, \"mem_req\": 256, \"node_selector\": \"accel=gpu\", \"tolerations\": \"gpu=true\" }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e failover \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u0433\u0440\u0443\u0431\u043e: \u0443\u0431\u0438\u0432\u0430\u0435\u0442\u0435 kubelet \u043d\u0430 <code>node-a<\/code>, \u0436\u0434\u0451\u0442\u0435 TTL \u2014 \u0438 \u0432\u0438\u0434\u0438\u0442\u0435, \u043a\u0430\u043a \u043f\u043e\u0434\u044b \u0441\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 <code>node-b<\/code>. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u042d\u0442\u043e, \u0447\u0435\u0441\u0442\u043d\u043e, \u0433\u0438\u043f\u043d\u043e\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442.<\/p>\n<h3>SheetOS: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0430 \u0434\u043b\u044f \u043d\u043e\u0434\u044b<\/h3>\n<p>\u0420\u0430\u0437 \u0443\u0436 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 \u043d\u043e\u0434\u0430-\u041e\u0421. \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435 <strong>SheetOS<\/strong> \u2014 \u00abTalos \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u00bb: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f, \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u0430\u044f, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e, \u0438 \u2014 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u2014 <strong>\u0441\u0430\u043c\u043e\u0440\u0430\u0441\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f<\/strong>.<\/p>\n<p>\u0418\u0434\u0435\u044f: <code>sheetstrap<\/code> \u0431\u0435\u0440\u0451\u0442 \u00ab\u043e\u0431\u0440\u0430\u0437\u00bb \u043d\u043e\u0434\u044b \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0435\u0431\u044f runtime, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a Node \u0438 \u2014 \u0435\u0441\u043b\u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u043c\u0443 \u2014 \u0441\u0430\u043c \u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0435\u0431\u044f Sheeternetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0430-\u041e\u0421 \u0431\u0443\u0442\u0441\u0442\u0440\u0430\u043f\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443-\u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u041c\u0430\u0442\u0440\u0451\u0448\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0449\u0451 \u0438 reconcile-\u0438\u0442\u0441\u044f.<\/p>\n<pre><code class=\"bash\"># \u043d\u043e\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u0440\u0430\u0437\/\u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0435\u0431\u044fsheetstrap up --config nodeconfig.json# \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0441\u0442\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u043e join-\u0442\u043e\u043a\u0435\u043d\u0443sheetstrap join --token &lt;...&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>SheetOS \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u00ab\u0430 \u0432\u0430\u0448\u0430 \u041e\u0421 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f?\u00bb \u2014 \u0434\u0430, \u0438 \u043e\u043d\u0430 \u0443\u043c\u0435\u0435\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0435\u0431\u044f \u0436\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f.<\/p>\n<h3>Bare metal: Sheeternetes \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0432 Excel \u0438 LibreOffice<\/h3>\n<p>\u041e\u0431\u043b\u0430\u043a\u043e \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043c\u0443\u0436\u0441\u043a\u0430\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u2014 \u044d\u0442\u043e <strong>air-gapped on-prem \u043d\u0430 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/strong>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u2014 <code>sheeternetes-onprem<\/code>.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c apiserver \u2014 \u044d\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Python-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0432\u0435\u0440\u0445 <code>.xlsx<\/code>, \u0441 \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c, \u0447\u0442\u043e \u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439. \u0422\u043e \u0435\u0441\u0442\u044c <a href=\"http:\/\/kubelet.sh\" rel=\"noopener nofollow\"><code>kubelet.sh<\/code><\/a> \u0438 <code>skctl<\/code> \u0446\u0435\u043f\u043b\u044f\u044e\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443 <strong>\u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u0438<\/strong>. \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d: \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u2014 apiserver.<\/p>\n<pre><code class=\"bash\">pip install openpyxlcp .skctl.env.example .skctl.env      # WEBAPP_URL=http:\/\/localhost:8787, TOKEN=...make up      # \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b 1: apiserver \u043f\u043e\u0432\u0435\u0440\u0445 cluster.xlsx \u043d\u0430 :8787make node    # \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b 2: kubelet (\u044d\u0442\u043e\u0442 \u0445\u043e\u0441\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0434\u043e\u0439)make apply   # \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b 3: \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c lab\/hello-web.jsonmake pods    # \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u0434\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u043f\u0435: <a href=\"http:\/\/apiserver.py\" rel=\"noopener nofollow\"><code>apiserver.py<\/code><\/a> (control plane + \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a), <a href=\"http:\/\/kubelet.sh\" rel=\"noopener nofollow\"><code>kubelet.sh<\/code><\/a>, <code>skctl<\/code>, <code>Makefile<\/code>, \u043b\u0430\u0431-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442. \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u2014 \u0442\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e \u0432 \u043e\u0431\u043b\u0430\u043a\u0435: bin-packing, failover, cordon\/drain\/migrate, affinity\/taints. \u041c\u0443\u043b\u044c\u0442\u0438\u043d\u043e\u0434\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 <a href=\"http:\/\/kubelet.sh\" rel=\"noopener nofollow\"><code>kubelet.sh<\/code><\/a> \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0432 LAN, \u0443\u043a\u0430\u0437\u0430\u0432 \u0438\u043c \u0430\u0434\u0440\u0435\u0441 apiserver.<\/p>\n<p>\u041f\u0440\u043e <strong>Excel \u0438 LibreOffice<\/strong> \u0447\u0435\u0441\u0442\u043d\u043e: <code>openpyxl<\/code> \u0447\u0438\u0442\u0430\u0435\u0442 <code>.xlsx<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 LibreOffice Calc \u0434\u0435\u043b\u0430\u0435\u043c <code>Save As \u2192 Excel 2007-365 (.xlsx)<\/code>. \u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 <code>.ods<\/code> \u0447\u0435\u0440\u0435\u0437 Python-UNO \u2014 \u0432 \u0440\u043e\u0430\u0434\u043c\u0430\u043f\u0435. \u0418 \u0434\u0430, \u0443 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0435\u0441\u0442\u044c \u0436\u0451\u0441\u0442\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u044b (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0439\u0434\u0451\u043c \u0434\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0441\u043f\u043e\u0439\u043b\u0435\u0440: Excel \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0438\u043c\u0438\u0442\u043e\u0432).<\/p>\n<p>\u0412\u0441\u044f \u044d\u0442\u0430 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u2014 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 (47 \u0448\u0442\u0443\u043a) \u0438 CI. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u00ab\u0448\u0443\u0442\u043a\u0430\u00bb \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0431\u0435\u0437 \u0442\u0435\u0441\u0442\u043e\u0432\u00bb.<\/p>\n<h3>\u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044f: \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439<\/h3>\n<p>\u041e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u2014 \u044d\u0442\u043e \u0441\u043a\u0443\u0447\u043d\u043e. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0446\u0435\u043b\u044c \u2014 <strong>\u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u0432 \u0444\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044e<\/strong>, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Excel-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u2194 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 Google Sheets-\u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>On-prem \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0441\u0442 <a href=\"http:\/\/bridge.py\" rel=\"noopener nofollow\"><code>bridge.py<\/code><\/a> <strong>\u0437\u0432\u043e\u043d\u0438\u0442 \u043d\u0430\u0440\u0443\u0436\u0443 \u0441\u0430\u043c<\/strong>: \u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 apiserver \u0438 \u0441\u0432\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u0441 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u043c \u043f\u0438\u0440\u043e\u043c (Google Sheets-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u043e\u0434\u043e\u0439). \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c cross-substrate service discovery.<\/p>\n<pre><code class=\"bash\"># \u0444\u0435\u0434\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (+ --push \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u044b \u043f\u0438\u0440\u0443)python3 bridge.py status  --local http:\/\/localhost:8787 --local-token secret \\                          --peer  https:\/\/script.google.com\/macros\/s\/XXXX\/exec --peer-token secret2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u2014 \u0442\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0432\u0441\u0451 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u043e\u0441\u044c \u2014 <strong>\u0436\u0438\u0432\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u0443\u0431\u0441\u0442\u0440\u0430\u0442\u0430\u043c\u0438<\/strong>, make-before-break:<\/p>\n<pre><code class=\"bash\">python3 bridge.py migrate web --from local --to peer --rollback-window 30 \\                          --local http:\/\/localhost:8787 --local-token secret \\                          --peer  https:\/\/script.google.com\/macros\/s\/XXXX\/exec --peer-token secret2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430: \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u043a\u0443 \u043d\u0430 target \u2192 <strong>\u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u0442\u0430\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0441\u044f<\/strong> \u2192 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u0441\u043d\u044f\u0442\u044c \u0441 source. \u041d\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e\u0441\u044c \u2014 source \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c, \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u043d\u043e\u043b\u044c. \u0410 <code>--rollback-window<\/code> \u0435\u0449\u0451 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 target \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 <strong>\u043e\u0442\u043a\u0430\u0442\u0438\u0442<\/strong> \u043d\u0430 source, \u0435\u0441\u043b\u0438 \u0442\u043e\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u043b.<\/p>\n<p>\u041f\u043b\u044e\u0441 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u043a \u0434\u0435\u043c\u043e\u043d:<\/p>\n<pre><code class=\"bash\">python3 bridge.py sync --interval 60 --local ... --peer ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 <strong>HMAC-\u043f\u043e\u0434\u043f\u0438\u0441\u0438<\/strong> \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0435 apiserver \u0441 <code>SIGNING_KEY<\/code>, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 POST \u043e\u0431\u044f\u0437\u0430\u043d \u043d\u0435\u0441\u0442\u0438 <code>X-SNCF-Timestamp<\/code> + <code>X-SNCF-Signature<\/code> \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 TTL (\u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0438 \u0438 replay):<\/p>\n<pre><code class=\"bash\">SIGNING_KEY=shared-secret WORKBOOK=cluster.xlsx python3 apiserver.pypython3 bridge.py sync --peer-signing-key shared-secret --local ... --peer ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430, \u0443 \u043d\u0430\u0441 HMAC \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445. \u041c\u044b \u0442\u043e\u0436\u0435 \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u043a\u0430\u043a \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0448\u043b\u0438.<\/p>\n<h3>\u0414\u0432\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432: \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0438 \u00ab\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0439\u00bb<\/h3>\n<p>\u0412\u043e\u0442 \u044d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c. Sheeternetes \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u0432 <strong>\u0434\u0432\u0443\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445<\/strong>, \u0438 \u043e\u043d\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b.<\/p>\n<p><strong>1. OCI-\u0440\u0435\u0436\u0438\u043c (\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b).<\/strong> \u0412 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 <code>image: nginx:alpine<\/code> \u2014 kubelet \u0442\u044f\u043d\u0435\u0442 \u043e\u0431\u0440\u0430\u0437 \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 Docker. \u041f\u043e\u043b\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u0443\u0436\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f Sheeternetes \u0433\u043e\u043d\u044f\u0435\u0442 \u0441\u0430\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 OCI-\u043e\u0431\u0440\u0430\u0437\u044b \u2014 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <em>\u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/em>, \u0430 \u0431\u0430\u0439\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0438\u0437 Docker Hub.<\/p>\n<p><strong>2. SICF native \u2014 \u043e\u0431\u0440\u0430\u0437 \u0436\u0438\u0432\u0451\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/strong> <code>image: sicf:web:v1<\/code> \u2014 \u0438 \u043e\u0431\u0440\u0430\u0437 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u0441\u044f \u0438\u0437 <strong>\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432<\/strong>, \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0440\u0435\u0435\u0441\u0442\u0440\u0430. \u041a\u0430\u043a? \u0421\u043b\u043e\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 <code>Layers<\/code>, \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0435 \u043d\u0430 base64-\u0447\u0430\u043d\u043a\u0438 \u0438 \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u043c\u044b\u0435 \u043f\u043e <code>sha256:<\/code>-\u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0443; \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u2014 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 <code>Images<\/code>. Puller \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u043e\u0438 \u0438\u0437 \u044f\u0447\u0435\u0435\u043a, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 rootfs \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442. \u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e air-gapped, \u00ab\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u044d\u0442\u043e \u0440\u0435\u0435\u0441\u0442\u0440\u00bb.<\/p>\n<p>\u041c\u0435\u0436\u0434\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 \u2014 \u043c\u043e\u0441\u0442 (<code>sheetbuild<\/code>), \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c:<\/p>\n<pre><code class=\"bash\">sheetbuild import nginx:alpine    # \u0442\u044f\u043d\u0435\u0442 OCI-\u043e\u0431\u0440\u0430\u0437 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u0430\u043a SICFsheetbuild export web:v1 ghcr.io\/you\/web:v1   # \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 OCI-\u0440\u0435\u0435\u0441\u0442\u0440<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u0430\u0434\u0440\u0435\u0441\u0443\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043e\u0434\u043d\u0438\u043c\u0438 \u0438 \u0442\u0435\u043c\u0438 \u0436\u0435 <code>sha256:<\/code>-\u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>import \u2192 export<\/code> \u2014 \u044d\u0442\u043e round-trip.<\/p>\n<p>\u0415\u0441\u0442\u044c, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0444\u0438\u0437\u0438\u043a\u0430. Google Sheets: 50 000 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0443 \u0438 10 \u043c\u043b\u043d \u044f\u0447\u0435\u0435\u043a \u043d\u0430 \u043a\u043d\u0438\u0433\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u2014 \u0434\u043b\u044f <strong>\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432<\/strong>: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 Go\/Rust-\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438, <code>scratch<\/code>\/<code>alpine<\/code>, \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e WASM-\u043c\u043e\u0434\u0443\u043b\u0438 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u043e\u0436\u0430\u0442\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e). \u041c\u043d\u043e\u0433\u043e\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u043d\u044b\u0439 CUDA-\u043e\u0431\u0440\u0430\u0437 \u2014 \u044d\u0442\u043e OCI-\u0440\u0435\u0436\u0438\u043c \u0441 \u0440\u0435\u0435\u0441\u0442\u0440\u043e\u043c, \u0438 \u0442\u043e\u0447\u043a\u0430.<\/p>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043e \u043d\u0435 \u043a\u0430\u043a \u00ab\u0444\u0438\u0447\u0430\u00bb, \u0430 \u043a\u0430\u043a <strong>\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442<\/strong> \u2014 \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u0433\u043b\u0430\u0432\u0435 \u043f\u0440\u043e \u0444\u043e\u043d\u0434.<\/p>\n<h3>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c: Prometheus \u0438 Grafana, \u043d\u043e \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445<\/h3>\n<p>\u041a\u0443\u0434\u0430 \u0436\u0435 \u0431\u0435\u0437 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432. <strong>Sheetheus<\/strong> \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 (\u0432 \u0442\u0430\u0431 <code>Metrics<\/code>), <strong>Sheetfana<\/strong> \u0440\u0438\u0441\u0443\u0435\u0442 \u0438\u0445 \u2014 \u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u043f\u0430\u0440\u043a\u043b\u0430\u0439\u043d\u043e\u0432. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b51\/ee6\/737\/b51ee6737add1c9c2787ede2218ecdeb.png\" alt=\"\u0414\u0430\u0448\u0431\u043e\u0440\u0434 Sheetfana\" width=\"1470\" height=\"780\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b51\/ee6\/737\/b51ee6737add1c9c2787ede2218ecdeb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b51\/ee6\/737\/b51ee6737add1c9c2787ede2218ecdeb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0430\u0448\u0431\u043e\u0440\u0434 Sheetfana<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0430\u043d\u0435\u043b\u0438 \u00abPods Running\u00bb, \u00abNodes Ready\u00bb, \u00abCPU Allocated\u00bb, \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0434\u043e\u0432 \u043f\u043e \u043d\u043e\u0434\u0430\u043c, \u0442\u0430\u0439\u043c-\u0441\u0435\u0440\u0438\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 CPU \u2014 \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0438. <code>SheetAIOps<\/code> \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 <code>Events<\/code> \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0438\u0434, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u0438.<\/p>\n<h2>Sheet-Native Computing Foundation<\/h2>\n<p>\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441\u0442\u0430\u043b\u043e \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0441\u0435\u0431\u0435 \u0444\u043e\u043d\u0434. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <strong>SNCF \u2014 Sheet-Native Computing Foundation<\/strong>: \u0432\u0435\u043d\u0434\u043e\u0440-\u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u043c \u0434\u043b\u044f \u00absheet-native computing\u00bb, \u043f\u0430\u0440\u043e\u0434\u0438\u044f \u043d\u0430 CNCF, \u043a\u043e\u0442\u043e\u0440\u0430\u044f\u2026 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0417\u0430 \u0448\u0443\u0442\u043a\u043e\u0439 \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434: \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441 failover, \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0436\u0438\u0432\u043e\u0435 \u0434\u0435\u043c\u043e \u043d\u0430 \u0442\u0440\u0451\u0445 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 Google-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/p>\n<h3>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442: Sheet Container Initiative (SCI)<\/h3>\n<p>\u0413\u0434\u0435 \u0434\u0432\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0442\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f. \u0423 \u043d\u0430\u0441 \u0438\u0445 \u0434\u0432\u0435 (Apps Script \u0438 Python), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <strong>SCI<\/strong> \u2014 \u043f\u043e \u043e\u0431\u0440\u0430\u0437\u0446\u0443 OCI, \u0442\u0440\u0438 \u0441\u043f\u0435\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><strong>SCRI<\/strong> (Sheet Container Runtime Interface) \u2014 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 apiserver\u2194kubelet. \u0423\u0436\u0435 v0.1, \u0441 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 conformance Core\/Full.<\/p>\n<\/li>\n<li>\n<p><strong>SICF<\/strong> (Sheet-Native Image Container Format) \u2014 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0434\u0432\u0443\u0445\u0440\u0435\u0436\u0438\u043c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u0422\u043e\u0436\u0435 v0.1.<\/p>\n<\/li>\n<li>\n<p><strong>SDS<\/strong> (Sheet Distribution Spec) \u2014 \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0437\u044b \u0435\u0437\u0434\u044f\u0442 \u043c\u0435\u0436\u0434\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0438 \u0440\u0435\u0435\u0441\u0442\u0440\u0430\u043c\u0438. \u0412 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043f\u0435\u043a\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b <strong>\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f<\/strong> (\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0442\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f), \u0441 \u043d\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 MUST\/SHOULD \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c conformance-\u0441\u044c\u044e\u0442\u043e\u043c. \u042d\u0442\u043e, \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e, \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0443\u0447\u0435\u0431\u043d\u0438\u043a \u043f\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 CRI \u0438 OCI \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435.<\/p>\n<h3>\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f: \u0441 \u0441\u0435\u0440\u0438\u0439\u043d\u044b\u043c\u0438 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u0440\u0430\u043d\u0433\u0430\u043c\u0438<\/h3>\n<p>\u0414\u0430, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <strong>\u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432<\/strong>. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 issue \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430 \u2192 GitHub Action \u0447\u0435\u043a\u0430\u043d\u0438\u0442 \u0441\u0435\u0440\u0438\u0439\u043d\u0438\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>SFE000001<\/code>) \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440. 19 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c (\u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442), \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0432\u043e\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ed\/d78\/b9a\/9edd78b9a7f3c54064ecf26a4d0f15a9.png\" alt=\"\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 CSFE\" width=\"1500\" height=\"1020\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9ed\/d78\/b9a\/9edd78b9a7f3c54064ecf26a4d0f15a9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ed\/d78\/b9a\/9edd78b9a7f3c54064ecf26a4d0f15a9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 CSFE<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043e\u0431\u0440\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u2014 \u043c\u043e\u0436\u0435\u0448\u044c \u043f\u043e\u0434\u0430\u0442\u044c\u0441\u044f \u043d\u0430 <strong>\u0440\u0430\u043d\u0433<\/strong>, \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442 \u0442\u0435\u0431\u044f \u043f\u043e \u0440\u0435\u0435\u0441\u0442\u0440\u0443:<\/p>\n<ul>\n<li>\n<p>\ud83d\ude80 <strong>SheetCadet<\/strong> \u2014 1 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442<\/p>\n<\/li>\n<li>\n<p>\ud83d\udc68\u200d\ud83d\ude80 <strong>SheetAstronaut<\/strong> \u2014 3<\/p>\n<\/li>\n<li>\n<p>\ud83d\udef0\ufe0f <strong>SheetCommander<\/strong> \u2014 6<\/p>\n<\/li>\n<li>\n<p>\ud83c\udf0c <strong>SheetAdmiral<\/strong> \u2014 10+<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/912\/b58\/199\/912b581997c36e2a2a277d2923349707.png\" alt=\"\u0420\u0430\u043d\u0433 SheetAdmiral\" width=\"1500\" height=\"1020\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/912\/b58\/199\/912b581997c36e2a2a277d2923349707.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/912\/b58\/199\/912b581997c36e2a2a277d2923349707.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0430\u043d\u0433 SheetAdmiral<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438 \u0440\u0430\u043d\u0433\u0430 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0438\u0439\u043d\u0438\u043a \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0440\u0435\u0435\u0441\u0442\u0440\u0435. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u00ab\u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e\u00bb \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u0441\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439\u00bb.<\/p>\n<h3>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0444\u043e\u043d\u0434\u0430<\/h3>\n<ul>\n<li>\n<p><strong>Sheeternetes<\/strong> \u2014 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0424\u043b\u0430\u0433\u043c\u0430\u043d.<\/p>\n<\/li>\n<li>\n<p><strong>SheetOS<\/strong> \u2014 \u043d\u043e\u0434\u0430-\u041e\u0421 (Talos).<\/p>\n<\/li>\n<li>\n<p><strong>sheeternetes-onprem<\/strong> \u2014 bare-metal \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u043d\u0430 Excel\/LibreOffice + \u0444\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>Sheetlium<\/strong> \u2014 \u0441\u0435\u0442\u044c (Cilium). <strong>Sheetmesh<\/strong> \u2014 service mesh (Istio).<\/p>\n<\/li>\n<li>\n<p><strong>Sheetlux CD<\/strong> \u2014 GitOps-\u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 (Argo CD).<\/p>\n<\/li>\n<li>\n<p><strong>Sheetstor<\/strong> \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u0431\u043b\u043e\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 (LINSTOR).<\/p>\n<\/li>\n<li>\n<p><strong>SheetHub<\/strong> \u2014 DevOps-\u0444\u043e\u0440\u0436 (GitLab). <em>\u0423\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u043e\u043c \u2014 \u0441\u043c. \u043d\u0438\u0436\u0435.<\/em><\/p>\n<\/li>\n<li>\n<p><strong>Sheetheus<\/strong> \/ <strong>Sheetfana<\/strong> \u2014 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b (Prometheus\/Grafana).<\/p>\n<\/li>\n<li>\n<p><strong>SheetFinOps<\/strong> \u2014 \u0443\u0447\u0451\u0442 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b ($0, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f).<\/p>\n<\/li>\n<li>\n<p><strong>SheetAssembly<\/strong> \u2014 WASI\/WASM-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. <strong>skctl-wasm<\/strong> \u2014 CLI \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>Sheetelligence<\/strong> \/ <strong>SheetAIOps<\/strong> \u2014 LLM-\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438 AIOps.<\/p>\n<\/li>\n<li>\n<p><strong>Cloud connectors<\/strong> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u0432 managed-\u043e\u0431\u043b\u0430\u043a\u0430\u0445 (Cloud Run, ACI, Yandex, ECS\u2026).<\/p>\n<\/li>\n<li>\n<p><strong>Data &amp; Storage<\/strong> \u2014 Sheedis (Redis), Sheetgres (Postgres), MySheet (MySQL), SheetMongo (Mongo), Sheethouse (ClickHouse), Sheetka (Kafka), SheetWire (\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0411\u0414 \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435).<\/p>\n<\/li>\n<li>\n<p><strong>\u042f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b<\/strong> \u2014 PowerShell, Lisp \u0438, \u0434\u043b\u044f \u043e\u0442\u0432\u0430\u0436\u043d\u044b\u0445, Brainfuck.<\/p>\n<\/li>\n<li>\n<p><strong>SCI<\/strong> \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 (SCRI\/SICF\/SDS).<\/p>\n<\/li>\n<\/ul>\n<h3>\u0420\u043e\u0430\u0434\u043c\u0430\u043f (\u043a\u0440\u0430\u0442\u043a\u043e)<\/h3>\n<ul>\n<li>\n<p><strong>Sheeternetes:<\/strong> \u043c\u0443\u043b\u044c\u0442\u0438-\u0445\u043e\u0441\u0442 overlay-\u0441\u0435\u0442\u044c, \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 Secrets (\u0432 \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u043b\u0438\u0441\u0442\u0430\u0445), RBAC \u0447\u0435\u0440\u0435\u0437 protected ranges, HPA \u0447\u0435\u0440\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 DR \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0440\u0435\u0432\u0438\u0437\u0438\u0439, conformance-\u0441\u044c\u044e\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>SheetVirt:<\/strong> \u0430\u043d\u0430\u043b\u043e\u0433 KubeVirt \u2014 VM \u043a\u0430\u043a \u043f\u043e\u0434\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>SICF\/native:<\/strong> \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 + \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 (\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0432\u043b\u0435\u0437\u0435\u0442 \u0432 Excel, \u043f\u043e\u043a\u0430 \u043e\u043d \u043d\u0435 \u0432\u0437\u043c\u043e\u043b\u0438\u0442\u0441\u044f \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0432\u0441\u0435\u0440\u044c\u0451\u0437 \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f).<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c:<\/strong> SheetFalco (runtime security), SheetSign (\u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043e\u0431\u0440\u0430\u0437\u043e\u0432), SheetPolicy (admission \u0447\u0435\u0440\u0435\u0437 \u0444\u043e\u0440\u043c\u0443\u043b\u044b).<\/p>\n<\/li>\n<li>\n<p><strong>\u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/strong> \u0441 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c (\u0438\u043c\u043f\u043e\u0440\u0442 Kubernetes\/Compose-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432).<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c<\/h3>\n<p>\u042d\u0442\u043e open source, Apache 2.0, \u0438 \u043e\u043d \u0436\u0438\u0432\u043e\u0439. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440 \u043d\u0435\u0434\u0430\u0432\u043d\u043e <strong>\u0441 \u043d\u0443\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b SheetHub<\/strong> (apiserver + web-UI + CLI + \u0442\u0435\u0441\u0442\u044b), \u043f\u0440\u043e\u0448\u0451\u043b \u0442\u0440\u0451\u0445\u043b\u0438\u043d\u0437\u043e\u0432\u043e\u0435 \u0440\u0435\u0432\u044c\u044e \u0441 \u043f\u0430\u0440\u043e\u0439 security-\u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439, \u043f\u043e\u0447\u0438\u043d\u0438\u043b \u0432\u0441\u0451 \u0437\u0430 \u043f\u044f\u0442\u044c \u0447\u0430\u0441\u043e\u0432 \u2014 \u0438 \u044d\u0442\u043e \u0441\u043c\u0451\u0440\u0436\u0435\u043d\u043e. \u0420\u043e\u0432\u043d\u043e \u0442\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u0441\u044f open source.<\/p>\n<p>\u041a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 \u2014 \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0435 \u0438 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0435 (\u043d\u043e \u043f\u043e\u043a\u0430 \u0442\u0430\u043c \u043e\u0434\u0438\u043d \u044f), \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435\u0441\u044c \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<ul>\n<li>\n<p>\ud83c\udf93 \u041f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 <a href=\"https:\/\/sncfoundation.github.io\/certification.html\" rel=\"noopener nofollow\">\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e<\/a> \u2014 \u0441 \u0441\u0435\u0440\u0438\u0439\u043d\u0438\u043a\u043e\u043c, \u043f\u043e 19 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p>\ud83d\udee0\ufe0f \u0412\u043e\u0437\u044c\u043c\u0438\u0442\u0435 good-first-issue \u0432 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\ud83d\udcac \u041a\u0430\u043d\u0430\u043b\u044b: <strong>Slack<\/strong> \u2014 <a href=\"https:\/\/join.slack.com\/t\/sheetncf\/shared_invite\/zt-48hz81tiv-4F6O7Ae~04kT1CZbsxdgCg\" rel=\"noopener nofollow\">sheetncf<\/a>, Telegram \u2014 <a href=\"https:\/\/t.me\/stncf\" rel=\"noopener nofollow\">t.me\/stncf<\/a>, LinkedIn \u2014 <a href=\"https:\/\/www.linkedin.com\/company\/sheetncf\" rel=\"noopener nofollow\">company\/sheetncf<\/a>. Twitter \u2014 \u0441\u043a\u043e\u0440\u043e.<\/p>\n<\/li>\n<li>\n<p>\ud83c\udf10 \u0412\u0435\u0441\u044c \u043a\u043e\u0434: <a href=\"https:\/\/github.com\/sncfoundation\" rel=\"noopener nofollow\">github.com\/sncfoundation<\/a> \u0438 <a href=\"http:\/\/sncfoundation.github.io\" rel=\"noopener nofollow\">sncfoundation.github.io<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u2709\ufe0f \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0438\u0447\u043d\u043e \u2014 Telegram <a href=\"https:\/\/t.me\/tym83\" rel=\"noopener nofollow\">@tym83<\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0442\u043e\u0433\u043e<\/h3>\n<p>Sheeternetes \u2014 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043e\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u0434\u043e \u0430\u0431\u0441\u0443\u0440\u0434\u0430 \u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442: \u00ab\u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u2014 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0441\u0451 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u00bb. \u041d\u043e \u043f\u043e \u0434\u043e\u0440\u043e\u0433\u0435 \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c: \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b (\u0432 \u0434\u0432\u0443\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 \u2014 \u043e\u0431\u044b\u0447\u043d\u043e\u043c OCI \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u043c), \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441 bin-packing \u0438 failover, on-prem \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0444\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u0436\u0438\u0432\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 HMAC, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 SCRI\/SICF, \u0442\u0435\u0441\u0442\u044b, CI \u0438 \u0434\u0430\u0436\u0435 \u0444\u043e\u043d\u0434 \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u041d\u0438\u0447\u0435\u0433\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432 \u043f\u0440\u043e\u0434\u0435. \u041d\u043e, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0438\u043c \u0442\u0430\u043a \u0432\u0435\u0441\u0435\u043b\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u2014 \u0438, \u0447\u0442\u043e \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e, \u043d\u0430 \u044d\u0442\u043e\u043c \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 control plane, \u0447\u0435\u043c reconcile \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u044f, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b CRI \u0438 OCI, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d make-before-break \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0435\u0441\u0442\u044c \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u044b.<\/p>\n<p>\u0418 \u043f\u043e\u043c\u043d\u0438\u0442\u0435: It reconciles.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1077612\/\">https:\/\/habr.com\/ru\/articles\/1077612\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0425\u0430\u0431\u0440, \u043f\u0440\u0438\u0432\u0435\u0442! \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0432 \u00ab\u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438\u00bb \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u044b \u0432 \u0442\u0440\u0438 \u0447\u0430\u0441\u0430 \u043d\u043e\u0447\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0448\u044c kubelet-\u0443, \u0447\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u044d\u0442\u043e \u0435\u0433\u043e \u043d\u043e\u0432\u044b\u0439 control plane. \u0422\u0430\u043a \u0432\u044b\u0448\u043b\u043e \u0438 \u0442\u0443\u0442, \u0432\u0441\u0451 \u0440\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u0437 \u0441\u0443\u0431\u0431\u043e\u0442\u043d\u0435\u0439 \u0448\u0443\u0442\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b\u0435 \u043f\u043e \u043a\u0443\u0431\u0435\u0440\u043d\u0435\u0442\u0435\u0441\u0443.\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u0435: \u0440\u0430\u0437 \u0432\u0435\u0441\u044c \u043c\u0438\u0440 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u044d\u043a\u0441\u0435\u043b\u044c\u043a\u0435, \u0442\u043e \u043f\u0443\u0441\u043a\u0430\u0439 \u0432\u0441\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0436\u0438\u0432\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041d\u0435 \u00ab\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u00bb, \u043d\u0435 \u00ab\u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 CSV\u00bb \u2014 \u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e: Deployments, Nodes, Pods, Events \u2014 \u044d\u0442\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 Google Sheets (\u0438\u043b\u0438 \u043b\u0438\u0441\u0442\u044b Excel). \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0447\u0438\u0442\u0430\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442 \u044f\u0447\u0435\u0439\u043a\u0438. kubectl-\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0418 \u2014 \u0432\u043e\u0442 \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u2014 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u043a\u0440\u0443\u0442\u044f\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440.\u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Sheeternetes. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0448\u0443\u0442\u043a\u0430. \u041d\u043e \u0448\u0443\u0442\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043d\u043e\u0434\u044b.\u041d\u0438\u0436\u0435 \u2014 \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0443 \u0441\u0435\u0431\u044f \u0437\u0430 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 bare metal \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 (\u0432 Excel \u0438 LibreOffice), \u043a\u0430\u043a \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0432 \u0444\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u0436\u0438\u0432\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439, \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445, \u2014 \u0438 \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0432\u044b\u0440\u043e\u0441\u043b\u043e \u0432 \u0446\u0435\u043b\u044b\u0439 \u0444\u043e\u043d\u0434 \u0441 30 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u041d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0434. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u2014 \u0441\u043d\u0438\u043c\u0438\u0442\u0435 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u0434\u0438\u0430\u043b\u043e\u0433 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. It reconciles.\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0437\u0434\u0435\u0441\u044c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441 bin-packing \u0438 failover, HMAC-\u043f\u043e\u0434\u043f\u0438\u0441\u0438, live-\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f make-before-break, \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041f\u0440\u043e\u0441\u0442\u043e \u0441\u0443\u0431\u0441\u0442\u0440\u0430\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0435\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0436\u0451\u0441\u0442\u043a\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u0441\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u0441\u0442\u0435\u0442\u0438\u043a\u0430: \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u0431\u043b\u0438\u0446.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0441\u0442\u0438\u043d\u044bKubernetes \u2014 \u044d\u0442\u043e, \u0435\u0441\u043b\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u00ab\u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 etcd + \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u043e\u0434\u044f\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u043c\u0443\u00bb. \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u0435 etcd \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 Google Sheets, \u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u2014 \u043d\u0430 Apps Script \u0438 bash-\u0434\u0435\u043c\u043e\u043d, \u0438 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Sheeternetes.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Sheeternetes\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 durable store \u0438 single source of truth. \u0427\u0435\u0442\u044b\u0440\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438: Deployments, Nodes, Pods, Events. \u0421\u0442\u0440\u043e\u043a\u0430 = \u043e\u0431\u044a\u0435\u043a\u0442, \u0448\u0430\u043f\u043a\u0430 = \u0441\u0445\u0435\u043c\u0430.apiserver \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e HTTP \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a. \u0412 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e Google Apps Script, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435; \u0432 on-prem \u2014 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 Python-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0432\u0435\u0440\u0445 .xlsx.kubelet \u2014 kubelet.sh, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 bash-\u0441\u043a\u0440\u0438\u043f\u0442. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 Docker-\u0445\u043e\u0441\u0442 \u0432 \u00ab\u043d\u043e\u0434\u0443\u00bb: \u0448\u043b\u0451\u0442 heartbeat \u0432 apiserver, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0438 \u0441\u0432\u043e\u0434\u0438\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Docker \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443.skctl \u2014 \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u044b\u0439 kubectl. curl + jq \u043f\u043e\u0432\u0435\u0440\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 apiserver.\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u7b80\u5355:GET  ?token=&lt;T&gt;&amp;kind=pods|nodes|deployments|events   -&gt;  { &#171;items&#187;: [ &#8230; ] }POST { &#171;token&#187;: T, &#171;action&#187;: &#171;apply|scale|delete&#187;, &#8230; }POST { &#171;token&#187;: T, &#171;node&#187;: &#8230;, &#171;pods&#187;: [&#8230;] }         # heartbeat \u043a\u0443\u0431\u0435\u043b\u0435\u0442\u0430 -&gt; desired pods\u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u00ab\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb. \u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0442\u0430\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0432\u0430\u0433\u043e\u043d.\u041f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u043d\u0430 Google Sheets. \u041d\u0443\u0436\u043d\u044b Google-\u0430\u043a\u043a\u0430\u0443\u043d\u0442, Docker-\u0445\u043e\u0441\u0442, bash, curl, jq. \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u2014 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 github.com\/sncfoundation\/sheeternetes.\u0428\u0430\u0433 1. Control plane. \u0428\u0430\u0431\u043b\u043e\u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u2014 \u0435\u0433\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435\u0442: \u043f\u0443\u0441\u0442\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u0430\u043c\u0430.\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0443\u0441\u0442\u0443\u044e Google-\u0442\u0430\u0431\u043b\u0438\u0446\u0443.Extensions \u2192 Apps Script, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c Code.gs \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0432\u043e\u0439 TOKEN.\u041e\u0434\u0438\u043d \u0440\u0430\u0437 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c setup() \u2014 \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u043b\u0438\u0441\u0442 \u0432 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443: \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438, \u043f\u0430\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432-\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 reconcile-\u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443.Deploy \u2192 New deployment \u2192 Web app (Execute as: Me, Who has access: Anyone), \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \/exec URL.\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0436\u0438\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044f? \u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0435\u0441\u0442\u044c \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u043e\u0435 \u0434\u0435\u043c\u043e \u043d\u0430 \u0442\u0440\u0451\u0445 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u2014 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0435 running-state \u043f\u0440\u044f\u043c\u043e \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445.\u0428\u0430\u0433 2. \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043d\u043e\u0434\u0443 \u2014 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 Docker:export WEBAPP_URL=https:\/\/script.google.com\/macros\/s\/XXXX\/execexport TOKEN=secretNODE_NAME=node-a CPU_TOTAL=4000 MEM_TOTAL=8192 .\/kubelet.sh# [kubelet] node=node-a ip=10.0.0.1 cpu=4000m mem=8192Mi -&gt; &#8230;\u041d\u0435\u0442 \u0442\u0440\u0451\u0445 \u043c\u0430\u0448\u0438\u043d? .\/local-cluster.sh \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 node-a\/b\/c \u043a\u0430\u043a \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u043a\u0443\u0431\u0435\u043b\u0435\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u043c Docker-\u0434\u0435\u043c\u043e\u043d\u0435 \u2014 \u0443\u0434\u043e\u0431\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0438 failover \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.\u0428\u0430\u0433 3. \u0414\u0435\u043f\u043b\u043e\u0438\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 JSON:{  &#171;deployments&#187;: [    { &#171;name&#187;: &#171;web&#187;,   &#171;image&#187;: &#171;nginx:alpine&#187;,       &#171;replicas&#187;: 2, &#171;cpu_req&#187;: 100, &#171;mem_req&#187;: 32 },    { &#171;name&#187;: &#171;hello&#187;, &#171;image&#187;: &#171;hashicorp\/http-echo&#187;, &#171;replicas&#187;: 1, &#171;cpu_req&#187;: 50,  &#171;mem_req&#187;: 16,      &#171;command&#187;: &#171;-text=hello-from-a-spreadsheet -listen=:8080&#187; }  ]}skctl apply lab\/hello-web.jsonskctl get pods\u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0433\u0438\u044f: \u0432\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u2014 \u0438 \u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0438. \u0412\u043a\u043b\u0430\u0434\u043a\u0430 Deployments \u2014 \u044d\u0442\u043e \u0432\u0430\u0448\u0438 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u044b. \u0412\u043a\u043b\u0430\u0434\u043a\u0430 Pods \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0441 \u0438\u0445 \u043d\u043e\u0434\u0430\u043c\u0438 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438. \u041c\u0435\u043d\u044f\u0435\u0442\u0435 replicas \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0440\u0443\u043a\u0430\u043c\u0438 \u2014 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c heartbeat \u0434\u043e\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u043e\u0434\u044b. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u044d\u0442\u043e kubectl edit, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c.\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u0430\u043a \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\u0410 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u00ab\u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0439\u00bb \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440:skctl \u0432 \u0434\u0435\u043b\u0435$ skctl get podsNAME    DEPLOYMENT  NODE    PHASE    CONTAINERweb-1   web         node-a  Running  a1b2c3d4e5f6web-2   web         node-b  Running  b2c3d4e5f6a7hello-1 hello       node-a  Running  c3d4e5f6a7b8\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435. docker ps \u043d\u0430 \u043d\u043e\u0434\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0438\u0445. Sheetlium (\u043d\u0430\u0448 \u00abCilium\u00bb) \u0437\u0430\u043e\u0434\u043d\u043e \u043a\u043b\u0430\u0434\u0451\u0442 \u0438\u0445 \u0432 \u043e\u0431\u0449\u0443\u044e Docker-\u0441\u0435\u0442\u044c \u0438 \u0432\u0435\u0448\u0430\u0435\u0442 \u043d\u0430 \u0438\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430 network-alias \u2014 \u0432\u043e\u0442 \u0432\u0430\u043c \u0438 Service c DNS.\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a: \u043d\u0435 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439\u0421\u0430\u043c\u043e\u0435 \u0447\u0430\u0441\u0442\u043e\u0435 \u0432\u043e\u0437\u0440\u0430\u0436\u0435\u043d\u0438\u0435: \u00ab\u043d\u0443 \u044d\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a, \u043a\u0430\u043a\u043e\u0439 \u0442\u0430\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u00bb. \u0410 \u0432\u043e\u0442 \u0438 \u043d\u0435\u0442. \u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 heartbeat apiserver \u0447\u0435\u0441\u0442\u043d\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u043f\u043e \u043d\u043e\u0434\u0430\u043c, \u0438 \u044d\u0442\u043e \u0447\u0438\u0441\u0442\u0430\u044f, \u043f\u043e\u043a\u0440\u044b\u0442\u0430\u044f \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u0427\u0442\u043e \u043e\u043d\u0430 \u0443\u043c\u0435\u0435\u0442:Bin-packing \u043f\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c. \u041f\u043e\u0434 \u0441 cpu_req\/mem_req \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u043d\u0430 \u043d\u043e\u0434\u0443, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0441\u0442\u043e. \u041d\u0435 \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u043d\u0438\u043a\u0443\u0434\u0430 \u2014 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f Unschedulable.Sticky placement. \u041f\u043e\u0434 \u043d\u0435 \u0441\u043a\u0430\u0447\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u043d\u043e\u0434\u0430\u043c\u0438 \u0431\u0435\u0437 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u2014 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u0431\u044b\u043b, \u043f\u043e\u043a\u0430 \u043d\u043e\u0434\u0430 \u0436\u0438\u0432\u0430.Failover. \u041d\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u0441\u043b\u0430\u0442\u044c heartbeat \u0434\u043e\u043b\u044c\u0448\u0435 NODE_TTL (30\u0441) \u2014 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f NotReady, \u0435\u0451 \u043f\u043e\u0434\u044b \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u044e\u0442 \u043d\u0430 \u0436\u0438\u0432\u044b\u0445.cordon \/ drain \/ migrate. \u0420\u043e\u0432\u043d\u043e \u043a\u0430\u043a \u0432 kubectl.affinity + taints\/tolerations. \u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e: node_selector \u043f\u0440\u043e\u0442\u0438\u0432 \u043b\u0435\u0439\u0431\u043b\u043e\u0432 \u043d\u043e\u0434\u044b, NoSchedule-\u0442\u0435\u0439\u043d\u0442\u044b \u043f\u0440\u043e\u0442\u0438\u0432 \u0442\u043e\u043b\u0435\u0440\u0435\u0439\u0448\u0435\u043d\u043e\u0432.\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0434\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:skctl cordon node-a          # \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u0434\u044b \u0441\u044e\u0434\u0430 \u043d\u0435 \u0435\u0434\u0443\u0442, \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442skctl drain  node-a          # \u044d\u0432\u0430\u043a\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u044b \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445, \u0437\u0430\u0442\u0435\u043c cordonskctl uncordon node-a        # \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u0439skctl migrate web-1 node-b   # \u043f\u0435\u0440\u0435sel\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u043e\u0434 (make-before-break)skctl label  node-a disk=ssdskctl taint  node-a gpu=true:NoSchedule\u0425\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c GPU-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0437\u0430 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043d\u043e\u0434\u0430\u043c\u0438? \u041e\u0431\u044b\u0447\u043d\u044b\u0439 node_selector \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435:{ &#171;name&#187;: &#171;ml-infer&#187;, &#171;image&#187;: &#171;sicf:tinyllm&#187;, &#171;replicas&#187;: 1,  &#171;cpu_req&#187;: 800, &#171;mem_req&#187;: 256, &#171;node_selector&#187;: &#171;accel=gpu&#187;, &#171;tolerations&#187;: &#171;gpu=true&#187; }\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e failover \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u0433\u0440\u0443\u0431\u043e: \u0443\u0431\u0438\u0432\u0430\u0435\u0442\u0435 kubelet \u043d\u0430 node-a, \u0436\u0434\u0451\u0442\u0435 TTL \u2014 \u0438 \u0432\u0438\u0434\u0438\u0442\u0435, \u043a\u0430\u043a \u043f\u043e\u0434\u044b \u0441\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 node-b. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u042d\u0442\u043e, \u0447\u0435\u0441\u0442\u043d\u043e, \u0433\u0438\u043f\u043d\u043e\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442.SheetOS: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0430 \u0434\u043b\u044f \u043d\u043e\u0434\u044b\u0420\u0430\u0437 \u0443\u0436 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 \u043d\u043e\u0434\u0430-\u041e\u0421. \u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435 SheetOS \u2014 \u00abTalos \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u00bb: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f, \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u0430\u044f, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e, \u0438 \u2014 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u2014 \u0441\u0430\u043c\u043e\u0440\u0430\u0441\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f.\u0418\u0434\u0435\u044f: sheetstrap \u0431\u0435\u0440\u0451\u0442 \u00ab\u043e\u0431\u0440\u0430\u0437\u00bb \u043d\u043e\u0434\u044b \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0435\u0431\u044f runtime, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a Node \u0438 \u2014 \u0435\u0441\u043b\u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u043c\u0443 \u2014 \u0441\u0430\u043c \u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0435\u0431\u044f Sheeternetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0430-\u041e\u0421 \u0431\u0443\u0442\u0441\u0442\u0440\u0430\u043f\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443-\u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u041c\u0430\u0442\u0440\u0451\u0448\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0449\u0451 \u0438 reconcile-\u0438\u0442\u0441\u044f.# \u043d\u043e\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u0440\u0430\u0437\/\u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0435\u0431\u044fsheetstrap up &#8212;config nodeconfig.json# \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0441\u0442\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u043e join-\u0442\u043e\u043a\u0435\u043d\u0443sheetstrap join &#8212;token &lt;&#8230;&gt;SheetOS \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u00ab\u0430 \u0432\u0430\u0448\u0430 \u041e\u0421 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f?\u00bb \u2014 \u0434\u0430, \u0438 \u043e\u043d\u0430 \u0443\u043c\u0435\u0435\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0435\u0431\u044f \u0436\u0435. \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f.Bare metal: Sheeternetes \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0432 Excel \u0438 LibreOffice\u041e\u0431\u043b\u0430\u043a\u043e \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043c\u0443\u0436\u0441\u043a\u0430\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u2014 \u044d\u0442\u043e air-gapped on-prem \u043d\u0430 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u2014 sheeternetes-onprem.\u0417\u0434\u0435\u0441\u044c apiserver \u2014 \u044d\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Python-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0432\u0435\u0440\u0445 .xlsx, \u0441 \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c, \u0447\u0442\u043e \u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439. \u0422\u043e \u0435\u0441\u0442\u044c kubelet.sh \u0438 skctl \u0446\u0435\u043f\u043b\u044f\u044e\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u0438. \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d: \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u2014 apiserver.pip install openpyxlcp .skctl.env.example .skctl.env      # WEBAPP_URL=http:\/\/localhost:8787, TOKEN=&#8230;make up      # \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b 1: apiserver \u043f\u043e\u0432\u0435\u0440\u0445 cluster.xlsx \u043d\u0430 :8787make node    # \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b 2: kubelet (\u044d\u0442\u043e\u0442 \u0445\u043e\u0441\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0434\u043e\u0439)make apply   # \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b 3: \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c lab\/hello-web.jsonmake pods    # \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u0434\u044b\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u043f\u0435: apiserver.py (control plane + \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a), kubelet.sh, skctl, Makefile, \u043b\u0430\u0431-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442. \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u2014 \u0442\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e \u0432 \u043e\u0431\u043b\u0430\u043a\u0435: bin-packing, failover, cordon\/drain\/migrate, affinity\/taints. \u041c\u0443\u043b\u044c\u0442\u0438\u043d\u043e\u0434\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 kubelet.sh \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0432 LAN, \u0443\u043a\u0430\u0437\u0430\u0432 \u0438\u043c \u0430\u0434\u0440\u0435\u0441 apiserver.\u041f\u0440\u043e Excel \u0438 LibreOffice \u0447\u0435\u0441\u0442\u043d\u043e: openpyxl \u0447\u0438\u0442\u0430\u0435\u0442 .xlsx, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 LibreOffice Calc \u0434\u0435\u043b\u0430\u0435\u043c Save As \u2192 Excel 2007-365 (.xlsx). \u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 .ods \u0447\u0435\u0440\u0435\u0437 Python-UNO \u2014 \u0432 \u0440\u043e\u0430\u0434\u043c\u0430\u043f\u0435. \u0418 \u0434\u0430, \u0443 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0435\u0441\u0442\u044c \u0436\u0451\u0441\u0442\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u044b (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0439\u0434\u0451\u043c \u0434\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0441\u043f\u043e\u0439\u043b\u0435\u0440: Excel \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0438\u043c\u0438\u0442\u043e\u0432).\u0412\u0441\u044f \u044d\u0442\u0430 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u2014 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 (47 \u0448\u0442\u0443\u043a) \u0438 CI. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u00ab\u0448\u0443\u0442\u043a\u0430\u00bb \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0431\u0435\u0437 \u0442\u0435\u0441\u0442\u043e\u0432\u00bb.\u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044f: \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439\u041e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u2014 \u044d\u0442\u043e \u0441\u043a\u0443\u0447\u043d\u043e. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u0432 \u0444\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044e, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 Excel-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u2194 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 Google Sheets-\u043a\u043b\u0430\u0441\u0442\u0435\u0440.On-prem \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0441\u0442 bridge.py \u0437\u0432\u043e\u043d\u0438\u0442 \u043d\u0430\u0440\u0443\u0436\u0443 \u0441\u0430\u043c: \u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 apiserver \u0438 \u0441\u0432\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u0441 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u043c \u043f\u0438\u0440\u043e\u043c (Google Sheets-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u043e\u0434\u043e\u0439). \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c cross-substrate service discovery.# \u0444\u0435\u0434\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (+ &#8212;push \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u044b \u043f\u0438\u0440\u0443)python3 bridge.py status  &#8212;local http:\/\/localhost:8787 &#8212;local-token secret \\                          &#8212;peer&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-493197","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/493197","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=493197"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/493197\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=493197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=493197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=493197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}