{"id":289475,"date":"2018-09-17T04:10:02","date_gmt":"2018-09-17T00:10:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=289475"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=289475","title":{"rendered":"\u041d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043d\u043e \u044f \u0432\u0441\u0435\u0433\u043e-\u043b\u0438\u0448\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043a\u043e\u0434\u0430. \u0412\u044b\u0445\u043e\u0434 \u0435\u0441\u0442\u044c"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/j9\/qc\/fb\/j9qcfbdq_raamw7rwyt02ci1an8.png\"><\/p>\n<p>  \u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a. \u041e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430 \u0438\u0437 \u043c\u043e\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e \u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e, \u0435\u0441\u043b\u0438 \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c, \u0430 \u0440\u044f\u0434\u043e\u043c \u043d\u0435\u0442 <b>devOps<\/b> \u0440\u0435\u0431\u044f\u0442. \u041d\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430 \u0436\u0438\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043f\u043e\u0434\u043d\u044f\u0442\u043e\u0439 \u0437\u0430 \u043d\u043e\u0447\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438.<\/p>\n<p>  \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u2014 <b>AWS <\/b>+ <b>Terraform <\/b>+ <b>kops <\/b>. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043c\u043d\u0435 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0435. \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. <br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>-1. \u0422\u043e, \u0441 \u0447\u0435\u043c \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e<\/h2>\n<p>  \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u2014 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0434\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0418 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0439, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0430\u044f html \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445, \u043f\u0440\u043e\u0434 \u0441\u0442\u0435\u043d\u0434\u0430\u0445 \u0438 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0435\u043f\u043b\u043e\u044f.<\/p>\n<blockquote><p>\u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 <b>Laravel<\/b>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041d\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0440\u043e\u0441\u0441\u044b\u043f\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 go, python-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u0430\u0439\u0442\u044b \u043d\u0430 WP, html-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e. \u0414\u043e \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043b\u0443\u0447\u0448\u0438\u0442 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442.<\/p><\/blockquote>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e <b>GoLand, PhpStorm, Docker, Git<\/b> \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435. \u0414\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u043e\u0441\u0441\u044b\u043f\u044c\u044e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u041e\u0421, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435, \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044f \u0432\u0441\u0435 \u0432\u0435\u0449\u0438 \u0432 \u0434\u043e\u043a\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/p>\n<h2>0. \u0413\u043e\u0442\u043e\u0432\u0438\u043c\u0441\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/h2>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u0430 <b>AWS<\/b>, \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043b\u0438\u043c\u0438\u0442\u044b \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u043b\u0438 <b>IAM<\/b> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <b>Access Key<\/b> + <b>Secret Key<\/b>. \u0417\u043e\u043d\u0430 \u2014 <b> us-east-1<\/b>.<\/p>\n<p>  \u0427\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435? <b>AWS CLI<\/b>, <b>Terraform<\/b> \u0434\u043b\u044f \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <b>AWS<\/b>, <b>kubectl<\/b>, <b>kops<\/b> \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 <b>Helm<\/b>, \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c <b>Dockerfile<\/b> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0434\u0430\u0432\u043d\u043e \u043d\u0430\u0448\u0435\u043b \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0433\u0438\u0442\u0445\u0430\u0431\u0430, \u043d\u043e \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u0439\u0442\u0438 \u0433\u0434\u0435). \u041f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 <b>docker-compose.yml<\/b> \u0434\u043b\u044f \u043c\u0430\u0443\u043d\u0442\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0438 <b>Makefile<\/b> \u0434\u043b\u044f \u0430\u043b\u0438\u0430\u0441\u043e\u0432.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Dockerfile<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>FROM ubuntu:16.04  ARG AWSCLI_VERSION=1.12.1 ARG HELM_VERSION=2.8.2 ARG ISTIO_VERSION=0.6.0 ARG KOPS_VERSION=1.9.0 ARG KUBECTL_VERSION=1.10.1 ARG TERRAFORM_VERSION=0.11.0  # Install generally useful things RUN apt-get update                                          \\   &amp;&amp; apt-get -y --force-yes install --no-install-recommends \\     curl                                                    \\     dnsutils                                                \\     git                                                     \\     jq                                                      \\     net-tools                                               \\     ssh                                                     \\     telnet                                                  \\     unzip                                                   \\     vim                                                     \\     wget                                                    \\   &amp;&amp; apt-get clean                                          \\   &amp;&amp; apt-get autoclean                                      \\   &amp;&amp; apt-get autoremove                                     \\   &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/*  # Install AWS CLI RUN apt-get update                                          \\   &amp;&amp; apt-get -y --force-yes install                         \\     python-pip                                              \\   &amp;&amp; pip install awscli==${AWSCLI_VERSION}                  \\   &amp;&amp; apt-get clean                                          \\   &amp;&amp; apt-get autoclean                                      \\   &amp;&amp; apt-get autoremove                                     \\   &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/*  # Install Terraform RUN wget -O terraform.zip https:\/\/releases.hashicorp.com\/terraform\/${TERRAFORM_VERSION}\/terraform_${TERRAFORM_VERSION}_linux_amd64.zip \\   &amp;&amp; unzip terraform.zip \\   &amp;&amp; mv terraform \/usr\/local\/bin\/terraform \\   &amp;&amp; chmod +x \/usr\/local\/bin\/terraform \\   &amp;&amp; rm terraform.zip  # Install kubectl ADD https:\/\/storage.googleapis.com\/kubernetes-release\/release\/v${KUBECTL_VERSION}\/bin\/linux\/amd64\/kubectl \/usr\/local\/bin\/kubectl RUN chmod +x \/usr\/local\/bin\/kubectl  # Install Kops ADD https:\/\/github.com\/kubernetes\/kops\/releases\/download\/${KOPS_VERSION}\/kops-linux-amd64 \/usr\/local\/bin\/kops RUN chmod +x \/usr\/local\/bin\/kops  # Install Helm RUN wget -O helm.tar.gz https:\/\/storage.googleapis.com\/kubernetes-helm\/helm-v${HELM_VERSION}-linux-amd64.tar.gz \\ \t&amp;&amp; tar xfz helm.tar.gz \\ \t&amp;&amp; mv linux-amd64\/helm \/usr\/local\/bin\/helm \\ \t&amp;&amp; chmod +x \/usr\/local\/bin\/helm \\ \t&amp;&amp; rm -Rf linux-amd64 \\ \t&amp;&amp; rm helm.tar.gz  # Create default user \"kops\" RUN useradd -ms \/bin\/bash kops WORKDIR \/home\/kops USER kops  # Ensure the prompt doesn't break if we don't mount the ~\/.kube directory RUN mkdir \/home\/kops\/.kube \\   &amp;&amp; touch \/home\/kops\/.kube\/config <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">docker-compose.yml<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>version: '2.1' services:   cluster-main:     container_name: cluster.com     image: cluster.com     user: root     stdin_open: true     volumes:       - .\/data:\/data       - .\/.ssh:\/root\/.ssh       - .\/.kube:\/root\/.kube       - .\/.aws:\/root\/.aws    cluster-proxy:     container_name: cluster.com-kubectl-proxy     image: cluster.com     user: root     entrypoint: kubectl proxy --address='0.0.0.0' --port=8001 --accept-hosts='.*'     ports:       - \"8001:8001\"     stdin_open: true     volumes:       - .\/data:\/data       - .\/.ssh:\/root\/.ssh       - .\/.kube:\/root\/.kube       - .\/.aws:\/root\/.aws <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Makefile<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>docker.build:   docker build -t cluster500.com .  docker.run:   docker-compose up -d  docker.bash:   docker exec -it cluster500.com bash<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>Dockerfile <\/b> \u2014 \u0431\u0435\u0440\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 ubuntu \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0441\u044c \u0441\u043e\u0444\u0442. <b>Makefile <\/b> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0430\u043b\u0438\u0430\u0441\u043e\u0432. <b>Docker-compose.yml<\/b> \u2014 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 <a href=\"https:\/\/github.com\/kubernetes\/dashboard\">K8S Dashboard<\/a>, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0438 <b>data<\/b>, <b>.ssh<\/b>, <b>.kube<\/b>, <b>.aws<\/b> \u0432 \u043a\u043e\u0440\u043d\u0435 \u0438 \u043a\u043b\u0430\u0434\u0435\u043c \u0442\u0443\u0434\u0430 \u043d\u0430\u0448 \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f aws, ssh \u043a\u043b\u044e\u0447\u0438 \u0438 \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 <b>make docker.build &amp; make docker.run<\/b>.<\/p>\n<p>  \u041d\u0443 \u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 <b>data<\/b> \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u043e\u0436\u0438\u043c <b>yaml<\/b> \u0444\u0430\u0439\u043b\u044b <b>k8s<\/b>, \u0430 \u0440\u044f\u0434\u043e\u043c \u0432\u0442\u043e\u0440\u0443\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>terraform<\/b> \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 <a href=\"https:\/\/github.com\/tw3eX\/k8s-example-1\"><b>\u043f\u043e\u043b\u043e\u0436\u0438\u043b \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431<\/b><\/a>.<\/p>\n<h2>1. \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/h2>\n<p>  <\/p>\n<blockquote><p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 <a href=\"https:\/\/ryaneschinger.com\/blog\/kubernetes-aws-vpc-kops-terraform\/\">\u044d\u0442\u043e\u0439 <\/a>\u0437\u0430\u043c\u0435\u0442\u043a\u0438. \u042f \u043e\u043f\u0443\u0449\u0443 \u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0432\u044b\u0436\u0438\u043c\u043a\u0443. \u0412\u0441\u0435 \u0442\u0430\u043a\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u043c\u043e\u0435\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u2014 tldr.<\/p><\/blockquote>\n<p>  \u0412 \u043d\u0430\u0448\u0443 \u043f\u0430\u043f\u043a\u0443 <b>data\/aws-cluster-init-kops-terraform<\/b> \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 <a href=\"https:\/\/github.com\/ryane\/kubernetes-aws-vpc-kops-terraform\">\u044d\u0442\u043e\u043c <\/a>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 <b>make docker.bash<\/b>. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0441\u0441\u044b\u043f\u044c \u0441\u043a\u0443\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<h4>AWS CLI<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <b>kops <\/b>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c <b>AWS CLI<\/b> \u043d\u0430 \u043d\u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442 \u0441\u0443\u043f\u0435\u0440\u044e\u0437\u0435\u0440\u0430.<\/p>\n<pre><code class=\"bash\">aws iam create-group --group-name kops  # \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy\/AmazonEC2FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy\/AmazonRoute53FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy\/AmazonS3FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy\/IAMFullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy\/AWSCertificateManagerFullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy\/AmazonVPCFullAccess --group-name kops   aws iam create-user --user-name kops   aws iam add-user-to-group --user-name kops --group-name kops   aws iam create-access-key --user-name kops <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"bash\">aws configure  <\/code><\/pre>\n<p>  <\/p>\n<h4>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c Terraform<\/h4>\n<p>  \u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 <b>data\/aws-cluster-init-kops-terraform\/variables.tf<\/b> \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0430 \u043d\u0443\u0436\u043d\u043e\u0435. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <b>update.json<\/b> \u043d\u0430\u0448\u0438 dns \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0445 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u043e\u043a\u0443\u043f\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d. <\/p>\n<pre><code class=\"bash\"># \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 cd \/data\/aws-cluster-init-kops-terraform  # \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0442 AWS CLI export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)   # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c terraform terraform init terraform get terraform apply   # \u0411\u0435\u0440\u0435\u043c NS \u0441\u0435\u0440\u0432\u0435\u0440\u0430 cat update-zone.json \\  | jq \".Changes[].ResourceRecordSet.Name=\\\"$(terraform output name).\\\"\" \\  | jq \".Changes[].ResourceRecordSet.ResourceRecords=$(terraform output -json name_servers | jq '.value|[{\"Value\": .[]}]')\" \\  &gt; update-zone.json <\/code><\/pre>\n<p>  <\/p>\n<h4>Kops<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 <b>kops<\/b>, \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044f \u043a\u043e\u043d\u0444\u0438\u0433 \u0432 <b>.tf<\/b> \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"bash\">export NAME=$(terraform output cluster_name) export KOPS_STATE_STORE=$(terraform output state_store) export ZONES=$(terraform output -json availability_zones | jq -r '.value|join(\",\")')  kops create cluster \\     --master-zones $ZONES \\     --zones $ZONES \\     --topology private \\     --dns-zone $(terraform output public_zone_id) \\     --networking calico \\     --vpc $(terraform output vpc_id) \\     --target=terraform \\     --out=. \\     ${NAME} <\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430. <b>Terraform<\/b> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 <b>VPC<\/b>, \u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043e\u0442\u0434\u0430\u0441\u0442 <b>kops<\/b>. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 <b>ryane\/gensubnets:0.1<\/b>  <\/p><\/blockquote>\n<p>  <\/p>\n<pre><code class=\"bash\"># \u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0435\u0439\u043d\u0435\u0440\u0430 terraform output -json &gt; subnets.json <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"bash\"># \u041d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0445\u043e\u0441\u0442\u0430 echo subnets.json | docker run --rm -i ryane\/gensubnets:0.1 <\/code><\/pre>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043b\u044f route53.<\/p>\n<pre><code>additionalPolicies:   master: |     [       {         \"Effect\": \"Allow\",         \"Action\": [\"route53:ListHostedZonesByName\"],         \"Resource\": [\"*\"]       },       {         \"Effect\": \"Allow\",         \"Action\": [\"elasticloadbalancing:DescribeLoadBalancers\"],         \"Resource\": [\"*\"]       },       {         \"Effect\": \"Allow\",         \"Action\": [\"route53:ChangeResourceRecordSets\"],         \"Resource\": [\"*\"]       }     ]   node: |     [       {         \"Effect\": \"Allow\",         \"Action\": [\"route53:ListHostedZonesByName\"],         \"Resource\": [\"*\"]       },       {         \"Effect\": \"Allow\",         \"Action\": [\"elasticloadbalancing:DescribeLoadBalancers\"],         \"Resource\": [\"*\"]       },       {         \"Effect\": \"Allow\",         \"Action\": [\"route53:ChangeResourceRecordSets\"],         \"Resource\": [\"*\"]       }     ] <\/code><\/pre>\n<p>  \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <b>kops edit cluster ${NAME}<\/b>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yw\/wg\/w4\/ywwgw42_afdmr__elg0og_yjruk.png\"><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440. <\/p>\n<pre><code class=\"bash\">kops update cluster \\   --out=. \\   --target=terraform \\   ${NAME}  terraform apply <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 <b>kubectl<\/b> \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f. \u0412 \u043f\u0430\u043f\u043a\u0435 <b>data\/aws-cluster-init-kops-terraform<\/b> \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0441\u0435 \u0432 <b>git<\/b> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0431\u0438\u0442\u0431\u0430\u043a\u0435\u0442\u0430.<\/p>\n<pre><code class=\"bash\">$ kubectl get nodes NAME                            STATUS         AGE ip-10-20-101-252.ec2.internal   Ready,master   7m ip-10-20-103-232.ec2.internal   Ready,master   7m ip-10-20-103-75.ec2.internal    Ready          5m ip-10-20-104-127.ec2.internal   Ready,master   6m ip-10-20-104-6.ec2.internal     Ready          5m <\/code><\/pre>\n<p>  <\/p>\n<h2>2. \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0447\u0442\u043e-\u0442\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043d\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u044f \u043f\u043e\u043b\u043e\u0436\u0443 \u0432 <a href=\"https:\/\/github.com\/tw3eX\/k8s-example-1\">\u044d\u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a>. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0447\u043a\u043e\u0439 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 <b>data\/k8s<\/b>. <\/p>\n<h4>\u0421\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0435 \u0448\u0443\u0442\u043a\u0438<\/h4>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439. \u041d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c <b>helm<\/b>, <b>route53<\/b>, <b>storage-classes<\/b> \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u043c\u0443 <b>registry<\/b> \u043d\u0430 <a href=\"https:\/\/hub.docker.com\/\">hub.docker.com<\/a>. \u041d\u0443 \u0438\u043b\u0438 \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435.<\/p>\n<pre><code class=\"bash\"># Init helm kubectl create serviceaccount --namespace kube-system tiller kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller kubectl patch deploy --namespace kube-system tiller-deploy -p '{\"spec\":{\"template\":{\"spec\":{\"serviceAccount\":\"tiller\"}}}}' helm init <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"bash\">kubectl apply -f default-namespace.yaml kubectl apply -f storage-classes.yaml kubectl apply -f route53.yaml kubectl apply -f docker-hub-secret.yml kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes\/dashboard\/master\/src\/deploy\/recommended\/kubernetes-dashboard.yaml <\/code><\/pre>\n<p>  <\/p>\n<h4>PostgreSQL + Redis<\/h4>\n<p>  \u042f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u043e\u0431\u0436\u0438\u0433\u0430\u043b\u0441\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u043e\u043a\u0435\u0440 \u043d\u0435 \u0434\u043b\u044f <b>stateless<\/b> \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043f\u043e\u043a\u0430 \u0441\u0435\u0431\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/github.com\/sorintlab\/stolon\"><b>Stolon<\/b><\/a>, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c. \u041e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430 \u043f\u043e\u043b\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439.<\/p>\n<p>  \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c <b>helm-charts<\/b> \u0438 \u043f\u0430\u0440\u0443 \u0431\u044b\u0441\u0442\u0440\u0435\u043d\u044c\u043a\u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 <b>Redis<\/b>.<\/p>\n<pre><code class=\"bash\"># \u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c etcd \u0434\u043b\u044f stolon cd etcd-chart helm install --name global-etcd .  # \u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0430\u043c stolon cd stolon-chart helm dep build helm install --name global-postgres .  # \u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c redis kubectl apply -f redis <\/code><\/pre>\n<p>  <\/p>\n<h4>Nginx + PHP<\/h4>\n<p>  \u041e\u0431\u044b\u0447\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u043a\u0430. <b>Nginx<\/b> \u0438 <b>php-fpm<\/b>. \u041a\u043e\u043d\u0444\u0438\u0433\u0438 \u044f \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0432\u044b\u0447\u0438\u0449\u0430\u043b, \u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434 \u0441\u0435\u0431\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c. \u041f\u0435\u0440\u0435\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0431\u0440\u0430\u0442\u044c \u043a\u043e\u0434 + \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0438\u0437 <b>AWS Certificate Manager<\/b>. \u0421\u0430\u043c php \u2014 \u043c\u043e\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0434\u043e\u043a\u0435\u0440\u0445\u0430\u0431\u0430, \u043d\u043e \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<pre><code class=\"bash\">kubectl apply -f nginx kubectl apply -f php <\/code><\/pre>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u043c \u043e\u0431\u0440\u0430\u0437\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0435 <b>\/crm-code<\/b>. \u041f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 \u0441\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0437 \u0438 \u043e\u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0424\u0430\u0439\u043b \u2014 <b>nginx\/deployment.yml<\/b>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xy\/0k\/0a\/xy0k0axs4muxujs3b-dyp8ncske.png\"><\/p>\n<p>  \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430\u0440\u0443\u0436\u0443 \u0434\u043e\u043c\u0435\u043d. <b>Route53<\/b> \u0441\u0435\u0440\u0432\u0438\u0441 \u0435\u0433\u043e \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u0438\u0442, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\/\u0434\u043e\u0431\u0430\u0432\u0438\u0442 DNS \u0437\u0430\u043f\u0438\u0441\u0438, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u043d\u0430 <b>ELB<\/b> \u0438\u0437 <b>AWS Certificate Manager<\/b>. \u0424\u0430\u0439\u043b \u2014 <b>nginx\/service.yml<\/b>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/aw\/nl\/ya\/awnlyaieynoajtmb_feavw2_qke.png\"><\/p>\n<p>  \u041f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c env \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 php, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a <b>PostgreSQL\/Redis<\/b>. \u0424\u0430\u0439\u043b \u2014 <b>php\/deployment.yml<\/b>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ry\/n9\/v4\/ryn9v42o_jvzafh16vr3m2rcpo4.png\"><\/p>\n<p>  \u041a\u0430\u043a \u0438\u0442\u043e\u0433, \u043c\u044b \u0438\u043c\u0435\u0435\u043c <b>K8S<\/b> \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043d\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u043d\u043e\u0434\u044b), \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <b>PostgreSQL, PHP, Nginx<\/b> \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0436\u0438\u0442\u044c \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f. <\/p>\n<p>  \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043a\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u044d\u043a\u0430\u043f\u043e\u0432\/\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0434\u043e\u0431\u0440\u0430. \u041d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <b>localhost:8001\/ui<\/b> \u043e\u0442 <a href=\"https:\/\/github.com\/kubernetes\/dashboard\">K8S Dashboard<\/a> \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041f\u043e\u0437\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c <b>Prometheus<\/b>, <b>Grafana<\/b>, <b>Barman<\/b>, \u043b\u0438\u0431\u043e \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0445\u043e\u0436\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u043b\u0438\u0431\u043e <b>Teamcity<\/b>, <b>Jenkins<\/b> \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a.<\/p>\n<pre><code class=\"bash\"># \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u0441 \u043a\u043e\u0434\u043e\u043c \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438\u043b\u0438 \u0432 Teamcity docker build -t GROUP\/crm-code:latest . docker push GROUP\/crm-code:latest  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u0434 (\u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043b\u0430\u0439\u0444\u0445\u0430\u043a\u043e\u0432) kubectl set image deployment\/php-fpm php-fpm=GROUP\/php-fpm kubectl rollout status deployment\/php-fpm kubectl set image deployment\/php-fpm php-fpm=GROUP\/php-fpm:latest  kubectl set image deployment\/nginx nginx=danday74\/nginx-lua kubectl rollout status deployment\/nginx kubectl set image deployment\/nginx nginx=danday74\/nginx-lua:latest  kubectl rollout status deployment\/php-fpm kubectl rollout status deployment\/nginx <\/code><\/pre>\n<p>  \u0411\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438 \u0432\u0434\u0432\u043e\u0439\u043d\u0435 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043c\u043e\u0436\u0435\u0442. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0415\u0449\u0435 \u0440\u0430\u0437 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <a href=\"https:\/\/github.com\/tw3eX\/k8s-example-1\">\u043e\u0434\u0438\u043d <\/a>\u0438 <a href=\"https:\/\/github.com\/ryane\/kubernetes-aws-vpc-kops-terraform\">\u0434\u0432\u0430<\/a>.<\/div>\n<p>        <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <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\/post\/423481\/\"> https:\/\/habr.com\/post\/423481\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/j9\/qc\/fb\/j9qcfbdq_raamw7rwyt02ci1an8.png\"><\/p>\n<p>  \u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a. \u041e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430 \u0438\u0437 \u043c\u043e\u0435\u0433\u043e \u043e\u043f\u044b\u0442\u0430. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e \u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e, \u0435\u0441\u043b\u0438 \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c, \u0430 \u0440\u044f\u0434\u043e\u043c \u043d\u0435\u0442 <b>devOps<\/b> \u0440\u0435\u0431\u044f\u0442. \u041d\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430 \u0436\u0438\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043f\u043e\u0434\u043d\u044f\u0442\u043e\u0439 \u0437\u0430 \u043d\u043e\u0447\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438.<\/p>\n<p>  \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u2014 <b>AWS <\/b>+ <b>Terraform <\/b>+ <b>kops <\/b>. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043c\u043d\u0435 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0435. \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.   <\/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-289475","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/289475","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=289475"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/289475\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=289475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=289475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=289475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}