{"id":398784,"date":"2024-06-29T14:16:42","date_gmt":"2024-06-29T14:16:42","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=398784"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T14:16:42","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=398784","title":{"rendered":"<span>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Managed Service for PostgreSQL,Managed Service for Kubernetes \u0432 YandexCloud c \u043f\u043e\u043c\u043e\u0449\u044c\u044e terraform<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 <a href=\"https:\/\/cloud.yandex.ru\/services\/managed-postgresql\" rel=\"nofollow noopener noreferrer\">Managed Service for PostgreSQL<\/a> \u0438 <a href=\"https:\/\/cloud.yandex.ru\/services\/managed-kubernetes\" rel=\"nofollow noopener noreferrer\">Managed Service for Kubernetes<\/a> \u0432 <a href=\"https:\/\/cloud.yandex.ru\/\" rel=\"nofollow noopener noreferrer\">Yandex Cloud<\/a> c \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/www.terraform.io\/\" rel=\"nofollow noopener noreferrer\">terraform<\/a>. \u0412 <a href=\"https:\/\/kubernetes.io\/ru\/\" rel=\"nofollow noopener noreferrer\">Kubernetes<\/a> \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 <a href=\"https:\/\/flask.palletsprojects.com\/en\/2.0.x\/\" rel=\"nofollow noopener noreferrer\">flask<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Managed Service for PostgreSQL. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 flask \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/helm.sh\/\" rel=\"nofollow noopener noreferrer\">helm<\/a> \u0447\u0430\u0440\u0442\u0435 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e helm. \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 <a href=\"https:\/\/cloud.yandex.ru\/services\/network-load-balancer\" rel=\"nofollow noopener noreferrer\">Network load balancer<\/a>, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/ingress\/\" rel=\"nofollow noopener noreferrer\">Ingress<\/a>. Ingress \u2013 \u044d\u0442\u043e \u0440\u0435\u0441\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0432 \u0441\u043b\u0443\u0436\u0431\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 kubernetes.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 install.sh. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f. \u0412 \u043f\u043e\u0441\u0442\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zf\/l9\/7r\/zfl97rfszbckd9tipns_5zjfgca.png\" data-src=\"https:\/\/habrastorage.org\/webt\/zf\/l9\/7r\/zfl97rfszbckd9tipns_5zjfgca.png\"\/><\/p>\n<p>  <\/p>\n<h2 id=\"neobhodimo-chtoby-byli-ustanovleny-sleduyuschie-programmy\">\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/h2>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043d\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b <a href=\"https:\/\/github.com\/devops-works\/binenv\" rel=\"nofollow noopener noreferrer\">binenv<\/a>, \u043a\u0440\u043e\u043c\u0435 Yandex.Cloud (CLI) \u0438 git.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/cloud.yandex.ru\/docs\/cli\/operations\/install-cli\" rel=\"nofollow noopener noreferrer\">yc<\/a><\/li>\n<li>terraform<\/li>\n<li>kubectl<\/li>\n<li>helm<\/li>\n<li>git<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"neobhodimo-inicializirovat-yandexcloud-i-poluchit-privatnye-tokeny\">\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c Yandex.Cloud \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b<\/h2>\n<p>  <\/p>\n<pre><code class=\"plaintext\">yc init<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"kloniruem-repo\">\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e<\/h1>\n<p>  <\/p>\n<pre><code class=\"plaintext\">git clone https:\/\/github.com\/patsevanton\/app_k8s_terraform_psql_yandex_cloud.git<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"ustanovka-vsego-stenda-s-pomoschyu-skripta-installsh\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 install.sh<\/h1>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u043d\u0444\u0441\u0442\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b .tf. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 install.sh<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">.\/install.sh<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"rassmotrim-chto-delaet-skript-installsh-prohozhdenie-vseh-etapov-skripta-vruchnuyu\">\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 install.sh. \u041f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/h1>\n<p>  <\/p>\n<p><code>set -o errexit<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u043b\u0438\u0431\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0432\u0435\u0441\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0442\u0435\u0440\u043f\u0438\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u0443.<\/p>\n<p>  <\/p>\n<p><code>set -o pipefail<\/code> \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0430\u0448\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0432\u044b\u0445\u043e\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043a\u043e\u0434 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<p><code>set -o nounset<\/code> \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u043b\u0438\u0431\u043e \u0438\u0437 \u0432\u0430\u0448\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430<\/p>\n<p>  <\/p>\n<h1 id=\"proverka-dostupnosti-komand-yc-terraform-kubectl-helm\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 yc terraform kubectl helm<\/h1>\n<p>  <\/p>\n<pre><code class=\"plaintext\">list_command_available=(yc terraform kubectl helm)  for i in ${list_command_available[*]} do     if ! command -v $i &amp;> \/dev\/null     then         echo \"$i could not be found\"         exit 1     fi done<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"proverka-chto-yandexcloud-cli-skonfigurirovan\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0442\u043e Yandex.Cloud (CLI) \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d<\/h1>\n<p>  <\/p>\n<pre><code class=\"plaintext\">if yc config list | grep -q 'token'; then   echo \"yc configured. Passed\" else   echo \"yc doesn't configured.\"   echo \"Please run 'yc init'\"   exit 1 fi<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"ustanovka-managed-service-for-postgresql-i-managed-service-for-kubernetes-v-yandex-cloud-c-pomoschyu-terraform\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Managed Service for PostgreSQL \u0438 Managed Service for Kubernetes \u0432 Yandex Cloud c \u043f\u043e\u043c\u043e\u0449\u044c\u044e terraform<\/h2>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e terraform-k8s-mdb<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">cd terraform-k8s-mdb<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"eksport-tokenov-iz-yandexcloud-cli-v-privateautotfvars\">\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438\u0437 Yandex.Cloud (CLI) \u0432 private.auto.tfvars<\/h1>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 <code>yc config list<\/code> \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">token: xxx cloud-id: yyy folder-id: zzz compute-default-zone: ru-central1-c<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 terraform \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0432\u043d\u043e \u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430\u0434\u043e \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u043e\u0439\u043d\u044b\u043c\u0438 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0437 \u0432\u044b\u0432\u043e\u0434\u0430 <code>yc config list<\/code> \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b private.auto.tfvars.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432\u044b\u0432\u043e\u0434 yc config list \u0432 \u0444\u0430\u0439\u043b private.auto.tfvars<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">yc config list > private.auto.tfvars<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u043d\u044f\u0435\u043c \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435 \u043d\u0430 \u0437\u043d\u0430\u043a \u0440\u0430\u0432\u043d\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sed 's\/:\/=\/g' -i private.auto.tfvars<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e &#8216;compute-default-zone&#8217;, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sed '\/compute-default-zone\/d' -i private.auto.tfvars<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sed 's\/ \/\/g' -i private.auto.tfvars<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sed 's\/$\/\"\/' -i private.auto.tfvars<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0441\u043b\u0435 \u0437\u043d\u0430\u043a\u0430 \u0440\u0430\u0432\u043d\u043e \u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sed 's\/=\/=\"\/g' -i private.auto.tfvars<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b private.auto.tfvars<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">token=\"xxx\" cloud-id=\"yyy\" folder-id=\"zzz\"<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"inicializaciya-i-primenenie-konfiguracii-terraform\">\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 terraform<\/h1>\n<p>  <\/p>\n<pre><code class=\"plaintext\">terraform init terraform apply -auto-approve<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"formirovanie-kubernetes-konfiga-iz-vyvoda-terraform-output-kubeconfig\">\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 kubernetes \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0438\u0437 \u0432\u044b\u0432\u043e\u0434\u0430 terraform output kubeconfig<\/h1>\n<p>  <\/p>\n<pre><code class=\"plaintext\">mkdir -p \/home\/$USER\/.kube terraform output kubeconfig > \/home\/$USER\/.kube\/config sed '\/EOT\/d' -i \/home\/$USER\/.kube\/config<\/code><\/pre>\n<p>  <\/p>\n<p>Kubernetes config \u0432\u043d\u0443\u0442\u0440\u0438 terraform \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">locals {   kubeconfig = &lt;&lt;KUBECONFIG apiVersion: v1 clusters: - cluster:     server: ${yandex_kubernetes_cluster.zonal_k8s_cluster.master[0].external_v4_endpoint}     certificate-authority-data: ${base64encode(yandex_kubernetes_cluster.zonal_k8s_cluster.master[0].cluster_ca_certificate)}   name: kubernetes contexts: - context:     cluster: kubernetes     user: yc   name: ycmk8s current-context: ycmk8s users: - name: yc   user:     exec:       apiVersion: client.authentication.k8s.io\/v1beta1       command: yc       args:       - k8s       - create-token KUBECONFIG }  output \"kubeconfig\" {   value = \"${local.kubeconfig}\" }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"sozdaem-ingress\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c ingress<\/h2>\n<p>  <\/p>\n<pre><code class=\"plaintext\">helm repo add ingress-nginx https:\/\/kubernetes.github.io\/ingress-nginx &amp;&amp; helm repo update helm install nginx-ingress ingress-nginx\/ingress-nginx --version 3.36.0  <\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044e 3.36.0, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e Kubernetes \u0432\u0435\u0440\u0441\u0438\u0438 >= v1.19<\/p>\n<p>  <\/p>\n<h2 id=\"sozdanie-peremennyh-dbpass-and-dbhost-iz-terraform-output-delaem-v-direktorii-terraform-k8s-mdb\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 DBPASS and DBHOST \u0438\u0437 terraform output. \u0414\u0435\u043b\u0430\u0435\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 terraform-k8s-mdb<\/h2>\n<p>  <\/p>\n<pre><code class=\"plaintext\">export DBHOST=$(terraform output dbhosts | sed -e 's\/^\"\/\/' -e 's\/\"$\/\/') export DBPASS=$(terraform output dbpassword | sed -e 's\/^\"\/\/' -e 's\/\"$\/\/') cd ..<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"poluchenie-external-ip-vneshnego-ip-kubernetes-servisa-nginx-ingress-ingress-nginx-controller\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 External IP (\u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e IP) Kubernetes \u0441\u0435\u0440\u0432\u0438\u0441\u0430 nginx-ingress-ingress-nginx-controller<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">export IP=$(kubectl get services nginx-ingress-ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"ustanovka-flask-postgres-ispolzuya-helm\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 flask-postgres \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f helm<\/h2>\n<p>  <\/p>\n<pre><code class=\"plaintext\">URL=flask-postgres.$IP.sslip.io helm install --atomic --set DBPASS=$DBPASS,DBHOST=$DBHOST,ingress.enabled=true,ingress.hosts[0].host=$URL,ingress.hosts[0].paths[0].path=\/ flask-postgres .\/flask-postgres<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"proverka-podklyucheniya-iz-kubernetes-v-postgresql-vruchnuyu-posle-vypolneniya-skripta-installsh\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437 kubernetes \u0432 PostgreSQL (\u0412\u0440\u0443\u0447\u043d\u0443\u044e. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 install.sh)<\/h2>\n<p>  <\/p>\n<pre><code class=\"plaintext\">cd terraform-k8s-mdb export DBHOST=$(terraform output dbhosts | sed -e 's\/^\"\/\/' -e 's\/\"$\/\/') export DBPASS=$(terraform output dbpassword | sed -e 's\/^\"\/\/' -e 's\/\"$\/\/') cd .. kubectl run pgsql-postgresql-client --rm --tty -i --restart='Never' --namespace default --image docker.io\/bitnami\/postgresql:11.7.0-debian-10-r9 --env=\"PGPASSWORD=$DBPASS\" --command -- psql  --host $DBHOST -U user_name -d db_name -p 6432<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 flask-postgres \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0443\u043a\u0430\u0437\u0430\u043d \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vh\/y4\/pt\/vhy4ptdn5lismhu85lhlfkgumdi.png\" data-src=\"https:\/\/habrastorage.org\/webt\/vh\/y4\/pt\/vhy4ptdn5lismhu85lhlfkgumdi.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0412\u0432\u043e\u0434\u0438\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jh\/yu\/ov\/jhyuovzf5w8vth250-e6bn_1zgq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jh\/yu\/ov\/jhyuovzf5w8vth250-e6bn_1zgq.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c. \u0417\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a PostgreSQL \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u043a\u043b\u0430\u043c\u044b: \u041d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 <a href=\"https:\/\/rotoro.cloud\/\" rel=\"nofollow noopener noreferrer\">https:\/\/rotoro.cloud\/<\/a> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043a\u0443\u0440\u0441\u044b \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0437\u0430\u043d\u044f\u0442\u0438\u044f\u043c\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/rotoro.cloud\/ld-courses\/ansible-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%BE%D0%BF%D1%8B%D1%82\/\" rel=\"nofollow noopener noreferrer\">Ansible \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 + \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442<\/a><\/li>\n<li><a href=\"https:\/\/rotoro.cloud\/ld-courses\/certified-kubernetes-administrator-cka-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%BE%D0%BF%D1%8B%D1%82\/\" rel=\"nofollow noopener noreferrer\">Certified Kubernetes Administrator (CKA) + \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442<\/a><\/li>\n<li><a href=\"https:\/\/rotoro.cloud\/ld-courses\/docker-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%BE%D0%BF%D1%8B%D1%82\/\" rel=\"nofollow noopener noreferrer\">Docker \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 + \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442<\/a><\/li>\n<li><a href=\"https:\/\/rotoro.cloud\/ld-courses\/kubernetes-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%BE%D0%BF%D1%8B%D1%82\/\" rel=\"nofollow noopener noreferrer\">Kubernetes \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 + \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442<\/a><\/li>\n<li><a href=\"https:\/\/rotoro.cloud\/ld-courses\/terraform-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%BE%D0%BF%D1%8B%D1%82\/\" rel=\"nofollow noopener noreferrer\">Terraform \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 + \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442<\/a><\/li>\n<li><a href=\"https:\/\/rotoro.cloud\/ld-courses\/wiki-practice\/\" rel=\"nofollow noopener noreferrer\">\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 IT (Linux, Docker, git, Jenkins)<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/575722\/\"> https:\/\/habr.com\/ru\/articles\/575722\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 <a href=\"https:\/\/cloud.yandex.ru\/services\/managed-postgresql\" rel=\"nofollow noopener noreferrer\">Managed Service for PostgreSQL<\/a> \u0438 <a href=\"https:\/\/cloud.yandex.ru\/services\/managed-kubernetes\" rel=\"nofollow noopener noreferrer\">Managed Service for Kubernetes<\/a> \u0432 <a href=\"https:\/\/cloud.yandex.ru\/\" rel=\"nofollow noopener noreferrer\">Yandex Cloud<\/a> c \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/www.terraform.io\/\" rel=\"nofollow noopener noreferrer\">terraform<\/a>. \u0412 <a href=\"https:\/\/kubernetes.io\/ru\/\" rel=\"nofollow noopener noreferrer\">Kubernetes<\/a> \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 <a href=\"https:\/\/flask.palletsprojects.com\/en\/2.0.x\/\" rel=\"nofollow noopener noreferrer\">flask<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Managed Service for PostgreSQL. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 flask \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/helm.sh\/\" rel=\"nofollow noopener noreferrer\">helm<\/a> \u0447\u0430\u0440\u0442\u0435 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e helm. \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 <a href=\"https:\/\/cloud.yandex.ru\/services\/network-load-balancer\" rel=\"nofollow noopener noreferrer\">Network load balancer<\/a>, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/ingress\/\" rel=\"nofollow noopener noreferrer\">Ingress<\/a>. Ingress \u2013 \u044d\u0442\u043e \u0440\u0435\u0441\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0432 \u0441\u043b\u0443\u0436\u0431\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 kubernetes.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 install.sh. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f. \u0412 \u043f\u043e\u0441\u0442\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.<\/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-398784","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/398784","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=398784"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/398784\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=398784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=398784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=398784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}