{"id":331319,"date":"2022-03-31T15:00:26","date_gmt":"2022-03-31T15:00:26","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=331319"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=331319","title":{"rendered":"<span>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f: \u041a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Kubernetes, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f gitlab ci \u0438 gitlab runner<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ls\/6t\/s7\/ls6ts7a_lx5bkvv_yfpj_olbrxc.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ls\/6t\/s7\/ls6ts7a_lx5bkvv_yfpj_olbrxc.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0433\u043e\u0440 \u041a\u043e\u043c\u0430\u0440\u043e\u0432, \u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 #CloudMTS.<\/p>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043e \u043e\u0431\u043b\u0430\u043a\u0430 \u0432 \u0434\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430), \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<ul>\n<li>\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0438\u0447\u0443 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430;<\/li>\n<li>\u0441\u0431\u0438\u043b\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c;<\/li>\n<li>\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439; <\/li>\n<li>\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043a\u0443\u0431\u0435\u0440\u0430.<\/li>\n<\/ul>\n<p>  \u042d\u0442\u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b gitlab ci. <br \/>  <a name=\"habracut\"><\/a><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/iw\/qo\/zj\/iwqozjj8hpq4xrl8x78kibn_e1a.png\" data-src=\"https:\/\/habrastorage.org\/webt\/iw\/qo\/zj\/iwqozjj8hpq4xrl8x78kibn_e1a.png\"\/><br \/>  <i>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/i><\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Kubernetes. <\/p>\n<p>  \u042f \u0441\u043e\u0437\u0434\u0430\u043b \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 <a href=\"https:\/\/gitlab.com\/Murrengan\/murr_server\">\u0433\u0438\u0442\u043b\u0430\u0431<\/a> \u0438 \u0432\u0437\u044f\u043b \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0433\u0438\u0442\u043b\u0430\u0431-\u0440\u0430\u043d\u043d\u0435\u0440\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/oy\/ot\/7m\/oyot7myao-bgagpi_gyrwr9unje.png\" data-src=\"https:\/\/habrastorage.org\/webt\/oy\/ot\/7m\/oyot7myao-bgagpi_gyrwr9unje.png\"\/><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vs\/vt\/uu\/vsvtuuwbwdpnb2bqa7wuoecrqag.png\" data-src=\"https:\/\/habrastorage.org\/webt\/vs\/vt\/uu\/vsvtuuwbwdpnb2bqa7wuoecrqag.png\"\/><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/w9\/mh\/v8\/w9mhv86bmql8vizyjsf6fwhlobk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/w9\/mh\/v8\/w9mhv86bmql8vizyjsf6fwhlobk.png\"\/><br \/>  <i>\u0422\u043e\u043a\u0435\u043d \u0432\u0441\u0442\u0430\u0432\u043b\u044e \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435<\/i><\/p>\n<p>  <a href=\"https:\/\/helm.sh\/\">\u0425\u0435\u043b\u043c<\/a> \u2014 \u044d\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u043b\u044f \u043a\u0443\u0431\u0435\u0440\u043d\u0435\u0442\u0438\u0441\u0430 (\u043a\u0430\u043a pip \u0434\u043b\u044f \u043f\u0438\u0442\u043e\u043d\u0430).<\/p>\n<p>  \u0414\u043b\u044f \u044e\u043d\u0438\u043a\u0441\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f, \u0434\u043b\u044f \u0432\u0438\u043d\u0434\u044b \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435: \u0441\u043a\u0430\u0447\u0430\u0439\u0442\u0435 <a href=\"https:\/\/get.helm.sh\/helm-canary-windows-amd64.zip\">Experimental Windows AMD64<\/a> \u043f\u043e <a href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<pre><code class=\"go\">helm repo add gitlab https:\/\/charts.gitlab.io helm repo update <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0433\u0438\u0442\u043b\u0430\u0431 ui \u0438 \u0433\u0438\u0442\u043b\u0430\u0431-\u0440\u0430\u043d\u043d\u0435\u0440 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043a\u0443\u0431\u0435\u0440\u0430,<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gj\/xq\/yi\/gjxqyius-psz8bvdhjoaf7wclry.png\" data-src=\"https:\/\/habrastorage.org\/webt\/gj\/xq\/yi\/gjxqyius-psz8bvdhjoaf7wclry.png\"\/><\/p>\n<p>  \u044f \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e registration token \u0438\u0437 \u043f\u0443\u043d\u043a\u0442\u0430 \u0432\u044b\u0448\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433 \u0433\u0438\u0442\u043b\u0430\u0431-\u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0438\u0437 \u0445\u0435\u043b\u043c\u0430:<\/p>\n<pre><code class=\"go\"># \u0432\u044b\u0432\u0435\u0434\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0432 .yml \u0444\u0430\u0439\u043b helm show values gitlab\/gitlab-runner > murr-gitlab-runner.yml <\/code><\/pre>\n<p>  \u0412 murr-gitlab-runner.yml \u043c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0442\u0440\u0438 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"go\">tags: \"murr_runner\"<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0442\u0435\u0433, \u0447\u0442\u043e\u0431\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0438\u0442\u043b\u0430\u0431-\u0440\u0430\u043d\u043d\u0435\u0440. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u0442\u0435\u0433\u0443 gitlab \u043f\u043e\u0439\u043c\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0434 \u0441\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/xl\/kw\/kv\/xlkwkvzi31eu7mijls82bfj3ufm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/xl\/kw\/kv\/xlkwkvzi31eu7mijls82bfj3ufm.png\"\/><\/p>\n<pre><code class=\"go\">gitlabUrl: https:\/\/gitlab.com\/<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u0433\u0438\u0442\u043b\u0430\u0431\u0443 (\u0433\u0438\u0442\u043b\u0430\u0431 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439).<\/p>\n<pre><code class=\"go\">runnerRegistrationToken: \"___\"<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0438\u0437 \u0448\u0430\u0433\u0430 \u0432\u044b\u0448\u0435.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043a\u0443\u0431\u0435\u0440\u043d\u0435\u0442\u0438\u0441\u0430 \u0432 <b><a href=\"https:\/\/cloud.mts.ru\/services\/managed-kubernetes\/?utm_source=habr.com&amp;utm_medium=owned_media&amp;utm_content=article&amp;utm_term=kubernetes\">\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435<\/a>.<\/b> <\/p>\n<p>  \u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 #CloudMTS \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u043c\u043d\u0435 \u043d\u043e\u0434\u0443 \u0432 \u043a\u0443\u0431\u0435\u0440\u0435, \u0432\u044b\u0434\u0435\u043b\u0438\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0432 \u0432\u0438\u0434\u0435 ingress-nginx (\u043f\u0443\u0441\u0442\u0438\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qc\/qg\/sc\/qcqgsc1oupuynjdbmyav5ngejfq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qc\/qg\/sc\/qcqgsc1oupuynjdbmyav5ngejfq.png\"\/><\/p>\n<p>  \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u044f \u0441\u043a\u0430\u0447\u0430\u044e \u043a\u0443\u0431\u043a\u043e\u043d\u0444\u0438\u0433.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/5q\/98\/7v\/5q987vnrxxgvyvyrzevkvfwiplw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/5q\/98\/7v\/5q987vnrxxgvyvyrzevkvfwiplw.png\"\/><\/p>\n<p>  \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u044e \u0432 config \u0438 \u0437\u0430\u043a\u0438\u043d\u0443 \u0432 C:\\Users\\Admin\\.kube<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ua\/qq\/k2\/uaqqk2debplyfffxbyfrmrwsmau.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ua\/qq\/k2\/uaqqk2debplyfffxbyfrmrwsmau.png\"\/><\/p>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<pre><code class=\"go\">kubectl get nodes NAME                         STATUS   ROLES    AGE   VERSION liberal-dove-dcddd8-115d1b   Ready    &lt;none>   84m   v1.21.11 <\/code><\/pre>\n<p>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u0440\u0430\u043d\u043d\u0435\u0440 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u043a\u0443\u0431\u0435\u0440\u0430. <br \/>  \u041d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0438\u0442\u043e\u043d\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b:<\/p>\n<pre><code class=\"go\">kubectl create ns gitlab-runner helm install --namespace gitlab-runner gitlab-runner -f murr-gitlab-runner.yml gitlab\/gitlab-runner <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/i3\/zx\/el\/i3zxelvp1fm_yw2fjp5ykzhnfvg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/i3\/zx\/el\/i3zxelvp1fm_yw2fjp5ykzhnfvg.png\"\/><\/p>\n<p>  \u0412\u044b\u0434\u0430\u043c \u043f\u043e\u043b\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u0440\u0430\u043d\u043d\u0435\u0440\u0443:<\/p>\n<pre><code class=\"go\">kubectl create clusterrolebinding --clusterrole=cluster-admin -n gitlab-runner --serviceaccount=gitlab-runner:default our-murr-runner <\/code><\/pre>\n<p>  \u041f\u043e\u0434\u043e\u0436\u0434\u0443 \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044e, \u0447\u0442\u043e \u0440\u0430\u043d\u043d\u0435\u0440 \u0437\u0430\u043f\u0443\u0449\u0435\u043d:<\/p>\n<pre><code class=\"go\">kubectl get po -n gitlab-runner -w NAME                                          READY   STATUS    RESTARTS   AGE gitlab-runner-gitlab-runner-994b96676-bjftj   1\/1     Running   0          3m33s <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0443\u0432\u0438\u0436\u0443 \u0440\u0430\u043d\u043d\u0435\u0440 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0433\u0438\u0442\u043b\u0430\u0431\u0430:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/0h\/ge\/uu\/0hgeuuuzbhqajn2vdnxlzkwbs-u.png\" data-src=\"https:\/\/habrastorage.org\/webt\/0h\/ge\/uu\/0hgeuuuzbhqajn2vdnxlzkwbs-u.png\"\/><\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043c go \u0441\u0435\u0440\u0432\u0435\u0440:<\/p>\n<pre><code class=\"go\">package main  import (   \"fmt\"   \"github.com\/rs\/cors\"   \"net\/http\" )  func main() {   fmt.Println(\"murr_server \u0437\u0430\u043f\u0443\u0449\u0435\u043d\")   mux := http.NewServeMux()   mux.HandleFunc(\"\/murrengan\/\", func(w http.ResponseWriter, r *http.Request) {      w.Header().Set(\"Content-Type\", \"application\/json\")      w.Write([]byte(\"{\\\"message\\\": \\\"\u041f\u0440\u0438\u0432\u0435\u0442, \u043c\u0443\u0440\u0440\u0435\u043d!\\\"}\"))      fmt.Println(\"\u0412\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e \u0440\u043e\u0443\u0442\u0443 murrengan\")   })   handler := cors.Default().Handler(mux)   err := http.ListenAndServe(\":1991\", handler)   if err != nil {      fmt.Println(\"murr_server \u0443\u043f\u0430\u043b:\", err)   } } <\/code><\/pre>\n<p>  \u041e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 json {\u201cmessage\u201d: \u201c\u041f\u0440\u0438\u0432\u0435\u0442, \u043c\u0443\u0440\u0440\u0435\u043d!\u201d} \u043f\u0440\u0438 \u0433\u0435\u0442-\u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441 \u043b\u044e\u0431\u043e\u0433\u043e IP \u043d\u0430 :1991\/murrengan\/ <\/p>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"go\">go run main.go murr_serve \u0437\u0430\u043f\u0443\u0449\u0435\u043d <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"http:\/\/127.0.0.1\">127.0.0.1<\/a>:1991\/murrengan\/ \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0442\u043a\u0440\u043e\u0435\u043c \u0435\u0433\u043e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ym\/qx\/ec\/ymqxecrevz10tsbevqi8hx4gkwy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ym\/qx\/ec\/ymqxecrevz10tsbevqi8hx4gkwy.png\"\/><\/p>\n<p>  \u0418\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<pre><code class=\"go\">curl http:\/\/127.0.0.1:1991\/murrengan\/ {\"message\": \"\u041f\u0440\u0438\u0432\u0435\u0442, \u043c\u0443\u0440\u0440\u0435\u043d!\"} <\/code><\/pre>\n<p>  \u0417\u0430\u0432\u0435\u0440\u043d\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 Dockerfile \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435:<\/p>\n<pre><code class=\"go\">FROM golang:1.17-alpine  WORKDIR \/  COPY go.mod .\/ COPY go.sum .\/ RUN go mod download  COPY *.go .\/  RUN go build -o \/murr_server  EXPOSE 1991   ENTRYPOINT [\"\/murr_server\"] <\/code><\/pre>\n<p>  \u0421\u0431\u0438\u043b\u0434\u0438\u043c \u0438\u043c\u0438\u0434\u0436:<\/p>\n<pre><code class=\"go\">docker build -t murr_server_in_docker:0.3.0 .<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u043c\u0438\u0434\u0436:<\/p>\n<pre><code class=\"go\">docker images REPOSITORY                  TAG        IMAGE ID       CREATED              SIZE murr_server_in_docker       0.3.0      18965967f809   About a minute ago   308MB <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"go\">docker run -it -p 1991:1991 murr_server_in_docker:0.3.0<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b gitlab runner \u0432 .gitlab-ci.yml<\/h3>\n<p>  <\/p>\n<pre><code class=\"go\"># \u0412 \u0440\u0430\u0431\u043e\u0442\u0435 2 \u0441\u0442\u0430\u0434\u0438\u0438 stages:  - build  - deploy  # https:\/\/github.com\/GoogleContainerTools\/kaniko # \u0412 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u0434\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u043e \u043a\u0430\u043d\u0438\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0430\u0448\u0438\u043c \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u043c. # \u041a\u0430\u043d\u0438\u043a\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0438\u043b\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445. .docker-login.: &amp;docker-login  before_script:    - mkdir -p \/kaniko\/.docker    - echo \"{\\\"auths\\\":{\\\"${CI_REGISTRY}\\\":{\\\"auth\\\":\\\"$(printf \"%s:%s\" \"${CI_REGISTRY_USER}\" \"${CI_REGISTRY_PASSWORD}\" | base64 | tr -d '\\n')\\\"}}}\" > \/kaniko\/.docker\/config.json  Build container:  image: gcr.io\/kaniko-project\/executor:debug  stage: build  &lt;&lt;: *docker-login  # \u0442\u0435\u0433 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0432 murr-gitlab-runner.yml  tags:    - murr_runner  only:    - new_prod  script:    # \u0442\u0443\u0442 \u043a\u0430\u043d\u0438\u043a\u043e \u0431\u0438\u043b\u0434\u0438\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u0447\u0435\u0440\u0435\u0437 --destination \u043f\u0443\u0448\u0438\u0442 \u043e\u0431\u0440\u0430\u0437 \u0432 \u0440\u0435\u0434\u0436\u0438\u0441\u0442\u0435\u0440\u0438    # \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u0448 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0437-\u0437\u0430 $CI_COMMIT_SHORT_SHA (\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0433\u0438\u0442\u043b\u0430\u0431-\u0440\u0430\u043d\u043d\u0435\u0440\u0430)    - \/kaniko\/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR\/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA  Deploy container:  image:    # \u044d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0437 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c kubectl \u0432 script    name: lachlanevenson\/k8s-kubectl:latest    entrypoint: [\"\/bin\/sh\", \"-c\"]  stage: deploy  tags:    - murr_runner  only:    - new_prod  script:    # \u0432 manifest.yaml \u044f \u0443\u043a\u0430\u0437\u0430\u043b \u0448\u0430\u0431\u043b\u043e\u043d image: registry.gitlab.com\/murrengan\/murr_server:change_thist_tag_on_gitlab_ci    # \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0447\u0435\u0440\u0435\u0437 \u0443\u0442\u0438\u043b\u0438\u0442\u0443 sed \u043c\u0435\u043d\u044f\u044e change_thist_tag_on_gitlab_ci \u043d\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442    - sed -i \"s|change_thist_tag_on_gitlab_ci|${CI_COMMIT_SHORT_SHA}|\" manifest.yaml    # \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e \u043d\u043e\u0432\u044b\u0439 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442    - kubectl apply -n default -f manifest.yaml <\/code><\/pre>\n<p>  \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c manifest.yaml. \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u2014 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043a\u0443\u0431\u0435\u0440\u043d\u0435\u0442\u0438\u0441. \u0422\u044b \u043f\u0438\u0448\u0435\u0448\u044c, \u043a\u0430\u043a \u0445\u043e\u0447\u0435\u0448\u044c, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e, \u0430 \u043a\u0443\u0431\u0435\u0440 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<pre><code class=\"go\">apiVersion: apps\/v1 kind: Deployment metadata:  name: murr-server-deployment spec:  selector:    matchLabels:      app: murr-server  replicas: 2  template:    metadata:      labels:        app: murr-server    spec:      containers:        - name: murr-server          image: registry.gitlab.com\/murrengan\/murr_server:change_thist_tag_on_gitlab_ci          imagePullPolicy: Always          ports:            - containerPort: 1991 --- kind: Service apiVersion: v1 metadata:  name: murr-server-service spec:  selector:    app: murr-server  ports:    - port: 1991 --- apiVersion: networking.k8s.io\/v1 kind: Ingress metadata:  name: murr-server-ingress  annotations:    kubernetes.io\/ingress.class: \"nginx\"    nginx.ingress.kubernetes.io\/rewrite-target: \/$2  spec:  rules:    - http:        paths:          - path: \/murr_server(\/|$)(.*)            pathType: ImplementationSpecific            backend:              service:                name: murr-server-service                port:                  number: 1991 <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ft\/ca\/xk\/ftcaxkgmfy7tziaj939hn9_xb6s.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ft\/ca\/xk\/ftcaxkgmfy7tziaj939hn9_xb6s.png\"\/><\/p>\n<p>  \u0414\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u0443\u0440\u0440_\u0441\u0435\u0440\u0432\u0435\u0440, \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c\u0438 \u043f\u043e\u0440\u0442\u0430\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u044f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e \u043c\u0443\u0440\u0440_\u0441\u0435\u0440\u0432\u0435\u0440, \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0435\u0439\u0442\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435 \u043f\u043e\u0434\u044b \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/35\/cp\/gn\/35cpgnffxyemh88qnz2nsexd5uu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/35\/cp\/gn\/35cpgnffxyemh88qnz2nsexd5uu.png\"\/><\/p>\n<p>  \u0421\u0435\u0440\u0432\u0438\u0441 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u0442\u0443 \u0436\u0434\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/r4\/m6\/fm\/r4m6fmr3wtogcxrxdigxw6uyer8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/r4\/m6\/fm\/r4m6fmr3wtogcxrxdigxw6uyer8.png\"\/><\/p>\n<p>  \u0418 \u043a\u0430\u043a \u0440\u0430\u0437 \u0432 \u0438\u043d\u0433\u0440\u0435\u0441\u0441\u0435 \u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0442\u0440\u0430\u0444\u0438\u043a \u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u044e \u0435\u0433\u043e \u043d\u0430 url \/murr_server \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e, url \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<code>http:\/\/EXTERNAL-IP_\u043e\u0442_\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430_\/murr_server\/murrengan\/<\/code><\/p>\n<p>  \u041f\u0443\u0448\u0438\u043c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0432\u0435\u0442\u043a\u0443 \u2014 new_prod:<\/p>\n<pre><code class=\"go\">git add . git commit git push --set-upstream origin new_prod <\/code><\/pre>\n<p>  \u0418\u0434\u0435\u043c \u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u0438 \u0432\u0438\u0434\u0438\u043c \u0437\u0430\u043f\u0443\u0441\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uy\/xv\/of\/uyxvofaqjkau8gbiolel2-aljpg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/uy\/xv\/of\/uyxvofaqjkau8gbiolel2-aljpg.png\"\/><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/h-\/gn\/po\/h-gnpoj49l5rimmrjxnvaibrkny.png\" data-src=\"https:\/\/habrastorage.org\/webt\/h-\/gn\/po\/h-gnpoj49l5rimmrjxnvaibrkny.png\"\/><\/p>\n<p>  \u0416\u0434\u0435\u043c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0434\u0436\u043e\u0431\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/q7\/-_\/dm\/q7-_dmfxypdcf3bh9vbmnsylpgg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/q7\/-_\/dm\/q7-_dmfxypdcf3bh9vbmnsylpgg.png\"\/><\/p>\n<p>  \u0416\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e:<\/p>\n<pre><code class=\"go\">kubectl get po -w NAME                                      READY   STATUS    RESTARTS   AGE murr-server-deployment-748f76bbb8-2hxxn   1\/1     Running   0          60s murr-server-deployment-748f76bbb8-77ldv   1\/1     Running   0          60s <\/code><\/pre>\n<p>  \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c EXTERNAL-IP \u0434\u043b\u044f murr-server-load-balancer. \u0422\u0435\u043f\u0435\u0440\u044c, \u0443\u043a\u0430\u0437\u0430\u0432 \u0435\u0433\u043e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043c\u0438\u0440\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/hb\/wz\/i-\/hbwzi-joatrnuz-3ctypgjvqvj8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/hb\/wz\/i-\/hbwzi-joatrnuz-3ctypgjvqvj8.png\"\/><\/p>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 url \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: <code>http:\/\/91.185.95.26\/murr_server\/murrengan\/<\/code><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432\u043e \u0432\u0441\u0435\u043c \u043c\u0438\u0440\u0435 24\/7.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0438 \u0437\u0430\u043f\u0443\u0448\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0413\u0438\u0442\u043b\u0430\u0431 \u0441\u0438\u0430\u0439 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u044f, \u0441\u0431\u0438\u043b\u0434\u0438\u0442 \u043d\u043e\u0432\u044b\u0439 \u0438\u043c\u0438\u0434\u0436 \u0432 \u0440\u0430\u043d\u043d\u0435\u0440\u0435 \u0443 \u043d\u0430\u0441 \u0432 \u043a\u0443\u0431\u0435\u0440\u0435, \u0437\u0430\u043b\u044c\u0435\u0442 \u0435\u0433\u043e \u0432 \u0440\u0435\u0434\u0436\u0435\u0441\u0442\u0435\u0440\u0438, \u043e\u0431\u043d\u043e\u0432\u0438\u0442 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442 \u043d\u043e\u0432\u044b\u0439 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442.<\/p>\n<p>  \u0412\u043f\u0435\u0440\u0435\u0434\u0438 \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u0447: \u043b\u0438\u043d\u0442\u0435\u0440, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434, https \u0438 murr_game\u2026<\/p>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u0442\u0435\u043c\u0435. \u041f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b.<\/p><\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/cloud_mts\/blog\/658427\/\"> https:\/\/habr.com\/ru\/company\/cloud_mts\/blog\/658427\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ls\/6t\/s7\/ls6ts7a_lx5bkvv_yfpj_olbrxc.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ls\/6t\/s7\/ls6ts7a_lx5bkvv_yfpj_olbrxc.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0433\u043e\u0440 \u041a\u043e\u043c\u0430\u0440\u043e\u0432, \u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 #CloudMTS.<\/p>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043e \u043e\u0431\u043b\u0430\u043a\u0430 \u0432 \u0434\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430), \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<ul>\n<li>\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0438\u0447\u0443 \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430;<\/li>\n<li>\u0441\u0431\u0438\u043b\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c;<\/li>\n<li>\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439; <\/li>\n<li>\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u043a\u0443\u0431\u0435\u0440\u0430.<\/li>\n<\/ul>\n<p>  \u042d\u0442\u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b gitlab ci.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-331319","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/331319","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=331319"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/331319\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=331319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=331319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=331319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}