<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://wiki.autosys.tk/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>wiki.autosys.tk - devops</title>
        <description></description>
        <link>https://wiki.autosys.tk/</link>
        <lastBuildDate>Tue, 07 Apr 2026 06:13:47 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>https://wiki.autosys.tk/_media/wiki/dokuwiki.svg</url>
            <title>wiki.autosys.tk</title>
            <link>https://wiki.autosys.tk/</link>
        </image>
        <item>
            <title>ansible_tips</title>
            <link>https://wiki.autosys.tk/devops/ansible_tips</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;чтобы_в_логах_ansible_увидеть_понятные_сообщения_без_n&quot;&gt;Чтобы в логах ansible увидеть понятные сообщения без \n&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook -i ./inventory.yml ./playbook.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0427\u0442\u043e\u0431\u044b \u0432 \u043b\u043e\u0433\u0430\u0445 ansible \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \\n&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0447\u0442\u043e\u0431\u044b_\u0432_\u043b\u043e\u0433\u0430\u0445_ansible_\u0443\u0432\u0438\u0434\u0435\u0442\u044c_\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435_\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f_\u0431\u0435\u0437_n&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-192&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;чтобы_ускорить_исполнение_плейбука_на_многих_нодах_-_pipelining&quot;&gt;Чтобы ускорить исполнение плейбука на многих нодах - PIPELINING&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;ANSIBLE_PIPELINING=true ansible-playbook -i ./inventory.yml ./playbook.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0427\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430 \u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u043d\u043e\u0434\u0430\u0445 - PIPELINING&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0447\u0442\u043e\u0431\u044b_\u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c_\u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435_\u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0430_\u043d\u0430_\u043c\u043d\u043e\u0433\u0438\u0445_\u043d\u043e\u0434\u0430\u0445_-_pipelining&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;193-392&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;отключить_проверку_known_hosts&quot;&gt;Отключить проверку known hosts&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i ./inventory.yml ./playbook.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 known hosts&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c_\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443_known_hosts&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;393-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 19 Dec 2022 12:00:09 +0000</pubDate>
        </item>
        <item>
            <title>argocd</title>
            <link>https://wiki.autosys.tk/devops/argocd</link>
            <description>
&lt;p&gt;
Я хочу протестирвоать и научиться работать с ArgoCD.
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;установка&quot;&gt;Установка&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://argo-cd.readthedocs.io/en/stable/operator-manual/installation/&quot; class=&quot;urlextern&quot; title=&quot;https://argo-cd.readthedocs.io/en/stable/operator-manual/installation/&quot; rel=&quot;ugc nofollow&quot;&gt;https://argo-cd.readthedocs.io/en/stable/operator-manual/installation/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/master/manifests/install.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;92-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 01 Jun 2023 08:15:45 +0000</pubDate>
        </item>
        <item>
            <title>aws</title>
            <link>https://wiki.autosys.tk/devops/aws</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;делегирование_прав_неосновному_аккаунту&quot;&gt;Делегирование прав неосновному аккаунту&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Вот у меня есть основой &lt;strong&gt;Management Account 8xxxxxxx0080&lt;/strong&gt; и неосновной &lt;strong&gt;8xxxxxxx9007&lt;/strong&gt;. Мне надо дать часть прав из основного аккаунта в неосновной. &lt;br/&gt;

Для этого:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Логинимся в основной &lt;strong&gt;Management Account&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Идем в меню в правом верхнем углу, потом → &lt;strong&gt;Security Credentials&lt;/strong&gt; → &lt;strong&gt;Roles&lt;/strong&gt; → &lt;strong&gt;Create Role&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создаем роль с &lt;strong&gt;Custom trust policy&lt;/strong&gt;, где указываем  &lt;strong&gt;arn:aws:iam::8xxxxxxx9007:username/username&lt;/strong&gt; что данная роль предназначена для вот такого аккаунта &lt;pre class=&quot;code&quot;&gt;{
	&amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
	&amp;quot;Statement&amp;quot;: [
		{
			&amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
			&amp;quot;Principal&amp;quot;: { &amp;quot;AWS&amp;quot;: 
                [
                    &amp;quot;arn:aws:iam::8xxxxxxx9007:username/username&amp;quot;
                ]
			},
			&amp;quot;Action&amp;quot;: &amp;quot;sts:AssumeRole&amp;quot;
		}
	]
}&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 втором шаге &lt;strong&gt;AddPermissions&lt;/strong&gt; - ищем что надо, например - &lt;strong&gt;route53fullaccess&lt;/strong&gt; и выбираем эту политику. &lt;br/&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 дальше - при доступе к из &lt;strong&gt;aws cli&lt;/strong&gt; надо в файле &lt;strong&gt;~/.aws/config&lt;/strong&gt; прописать профиль, который будет свитчиться в ту роль. Примерно так: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[profile specialrole]
   role_arn = arn:aws:iam::8xxxxxxx0080:role/SpecialPrivilegesRole
   source_profile = default&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 aws-cli юзать так: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;aws route53 list-hosted-zones --profile specialrole&lt;/pre&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0430\u0432 \u043d\u0435\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0443&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u043f\u0440\u0430\u0432_\u043d\u0435\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443_\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0443&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-1655&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;найти_ec2_инстанс_по_ip&quot;&gt;Найти EC2 Инстанс по IP&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Например - есть публичный IP адрес машинки. надо найти где она - в каком регионе и как называется. &lt;br/&gt;

Для начала - определим регион. Для этого скачиваем файлик с соотвествием IP-диапазонов и регионов:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;wget https://ip-ranges.amazonaws.com/ip-ranges.json&lt;/pre&gt;

&lt;p&gt;
Теперь найдем:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;jq -r &amp;#039;.prefixes | .[]&amp;#039; &amp;lt; ip-ranges.json | grep 13.53 -A1&lt;/pre&gt;

&lt;p&gt;
Ну и теперь можем посмотреть машинки в нужном регионе:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;AWS_PROFILE=main aws ec2 --region eu-north-1 describe-instances   --filter &amp;quot;Name=instance-state-name,Values=running&amp;quot;   --query &amp;quot;Reservations[*].Instances[*].[PublicIpAddress, Tags[?Key==&amp;#039;Name&amp;#039;].Value|[0], InstanceId]&amp;quot;   --output text&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0439\u0442\u0438 EC2 \u0418\u043d\u0441\u0442\u0430\u043d\u0441 \u043f\u043e IP&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0439\u0442\u0438_ec2_\u0438\u043d\u0441\u0442\u0430\u043d\u0441_\u043f\u043e_ip&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1656-2540&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;перезагрузить_ec2_instance&quot;&gt;Перезагрузить EC2 Instance&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;AWS_PROFILE=main aws ec2 --region eu-north-1 reboot-instances --instance-ids i-02d4044d1542ab62e&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c EC2 Instance&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c_ec2_instance&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;2541-2694&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;создать_ключи_для_деплоя_в_кластер_eks&quot;&gt;Создать ключи для деплоя в кластер EKS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Мне нужно создать пользователя и ключи дл ядеплоя в кластер EKS. &lt;br/&gt;

Для этого:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; идем в меню справа сверху → &lt;strong&gt;Security Credentials&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Слева - &lt;strong&gt;Users&lt;/strong&gt; → &lt;strong&gt;Add user&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Создаем пользователя, &lt;strong&gt;Credentials&lt;/strong&gt; type ставим &lt;strong&gt;Access key - Programmatic access&lt;/strong&gt;, никаких политик ему не назначаем. После создания не забываем скаать &lt;strong&gt;csv&lt;/strong&gt; с ключем.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Дальше даем права юзеру в кластере:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;pre class=&quot;code&quot;&gt;kubectl -n kube-system edit configmap aws-auth&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Редактируем &lt;strong&gt;mapRoles&lt;/strong&gt; и добавлем туда пользователя. Внимание! &lt;strong&gt;mapRoles&lt;/strong&gt; - это строка, а не список:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  mapUsers: |
    - userarn: arn:aws:iam::123456789011:user/xxx
      username: xxx
      groups:
        - system: masters&lt;/pre&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 EKS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u0442\u044c_\u043a\u043b\u044e\u0447\u0438_\u0434\u043b\u044f_\u0434\u0435\u043f\u043b\u043e\u044f_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440_eks&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2695-3740&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;скачать_файлы_логов_rds&quot;&gt;Скачать файлы логов RDS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
set -e
export AWS_PAGER=&amp;quot;&amp;quot;
RDS_DB_ID=&amp;#039;database-pps-instance-1&amp;#039;

LOG_FILES=`aws rds describe-db-log-files --db-instance-identifier ${RDS_DB_ID} | grep LogFileName | awk &amp;#039;{print $2}&amp;#039; | tr -d &amp;#039;,&amp;#039; | tr -d &amp;#039;&amp;quot;&amp;#039;`
for FILE in ${LOG_FILES}; do
    echo ${FILE}
    aws rds download-db-log-file-portion \
        --db-instance-identifier ${RDS_DB_ID} \
        --starting-token 0 --output text \
        --log-file-name ${FILE} &amp;gt; `echo ${FILE} | cut -d&amp;#039;/&amp;#039; -f2`
done&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043b\u043e\u0433\u043e\u0432 RDS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043a\u0430\u0447\u0430\u0442\u044c_\u0444\u0430\u0439\u043b\u044b_\u043b\u043e\u0433\u043e\u0432_rds&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3741-4277&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;сравнение_serverless_и_ec2_instances_на_rds_postgres&quot;&gt;Сравнение serverless и ec2 instances на RDS Postgres&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Я не проводил нагрузочного тестирования. Имею только данные мониторинга загрузки от AWS. &lt;br/&gt;

Тестировал кластер с одним и тем же набором малонагруженных приложений и БД Aurora Postgres 15.8. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Serverless&lt;/strong&gt; с MaxCapacity=0.5. Загрузка ACU - 100%. Стоимость инстанса ~$0.07 в час (зона eu-west-1, 1ACU - $0.14/hour).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Инстанс &lt;strong&gt;db.t4g.medium&lt;/strong&gt;. Загрузка CPU &amp;lt;20%. Swap usage - 0%. Стоимость $0.069 On Demand и вдвое ниже 3 year reserved.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Реальную скорость не проверял, приложения малонагруженные, но похоже инстансы на гравитоне выигрывают.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 serverless \u0438 ec2 instances \u043d\u0430 RDS Postgres&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435_serverless_\u0438_ec2_instances_\u043d\u0430_rds_postgres&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;4278-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 23 Jan 2025 05:15:14 +0000</pubDate>
        </item>
        <item>
            <title>aws_acm_letsencrypt_renew_lambda_terraform</title>
            <link>https://wiki.autosys.tk/devops/aws_acm_letsencrypt_renew_lambda_terraform</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;задача&quot;&gt;Задача&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Есть пара зон в &lt;strong&gt;Amazon Route53&lt;/strong&gt; и несколько сертификатов (в том числе и wild-card) в &lt;strong&gt;Amazon Certificate Manager&lt;/strong&gt;. &lt;br/&gt;

С недавних пор &lt;strong&gt;Amazon&lt;/strong&gt; перестал выпускать (и обновлять) сертификаты для зоны &lt;strong&gt;.ru&lt;/strong&gt;. &lt;br/&gt;

Необходимо:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Выпустить сертификаты от &lt;strong&gt;Let&amp;#039;s Encrypt&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настроить Lambda-функцию для периодической проверки срока действия сертов и их обновления.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-604&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;решение&quot;&gt;Решение&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Я нашел &lt;a href=&quot;https://github.com/binbashar/terraform-aws-certbot-lambda&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/binbashar/terraform-aws-certbot-lambda&quot; rel=&quot;ugc nofollow&quot;&gt;проект на GitHub&lt;/a&gt;, представляющий собой модуль для terraform, который создает Lambda-функцию со свей необходимой обвязкой (политики, таймер для запуска). &lt;br/&gt;

Однако - он не очень-то заработал со свежим terraform, а также выполнял только сохранение сертов в S3. &lt;br/&gt;

Я переделал его под свои нужды - &lt;a href=&quot;https://github.com/KindDevOps/terraform-aws-certbot-lambda/tree/acm_only&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/KindDevOps/terraform-aws-certbot-lambda/tree/acm_only&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/KindDevOps/terraform-aws-certbot-lambda/tree/acm_only&lt;/a&gt; (ветка acm_only). &lt;br/&gt;

В директории &lt;a href=&quot;https://github.com/KindDevOps/terraform-aws-certbot-lambda/tree/acm_only/example&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/KindDevOps/terraform-aws-certbot-lambda/tree/acm_only/example&quot; rel=&quot;ugc nofollow&quot;&gt;examples есть пример рабочего кода&lt;/a&gt;. &lt;br/&gt;

Данный код получает на входе:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Регион AWS
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Список доменов. Домены второго уровня нужно указывать с точкой - &lt;strong&gt;.domain.com&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Адрес почты для регистрации в &lt;strong&gt;Let&amp;#039;s Encrypt&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Предполагается, что в &lt;strong&gt;AWS Route53&lt;/strong&gt; уже созданы зоны с этими доменами. &lt;br/&gt;

В итоге код делает вот что:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создает самоподписанный сертификат в &lt;strong&gt;ACM&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создает Lambda-функцию, которой в качестве параметров передаются список имен для сертификата, &lt;strong&gt;id&lt;/strong&gt; зоны в &lt;strong&gt;Route53&lt;/strong&gt;, и &lt;strong&gt;arn&lt;/strong&gt; сертификата в &lt;strong&gt;ACM&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создает разрешения для Lambda-функции.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Для выпуска серта - достаточно выполнить:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;terraform init
terraform plan
terraform apply&lt;/pre&gt;

&lt;p&gt;
И затем - запустить созданную Lambda-функцию.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0448\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0448\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;605-2553&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;maintf&quot;&gt;main.tf&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;terraform {
  required_providers {
    aws = {
      source  = &amp;quot;hashicorp/aws&amp;quot;
    }
  }
}

provider &amp;quot;aws&amp;quot; {
  region = &amp;quot;${var.aws_region}&amp;quot;
}

module &amp;quot;certbot-lambda&amp;quot; {
  source  = &amp;quot;github.com/KindDevOps/terraform-aws-certbot-lambda?ref=acm_only&amp;quot;

  name                                  = &amp;quot;${local.lambda-name}&amp;quot;
  contact_email                         = &amp;quot;${var.certbot_contact_email}&amp;quot;
  certificate_domains                   = &amp;quot;${local.certificate_domains}&amp;quot;
  # Route53 Zones list to apply policy
  hosted_zones_ids                      = data.aws_route53_zone.zones
  certificate_arn                       = aws_acm_certificate.cert.arn
  
  function_trigger_schedule_expression  = &amp;quot;cron(12 20 * * ? *)&amp;quot;
}

locals {
  lambda-name = replace(regex(&amp;quot;\\.*(.*)&amp;quot;, &amp;quot;${var.certificate_domains[0]}&amp;quot;)[0], &amp;quot;.&amp;quot;, &amp;quot;-&amp;quot;)
  certificate_domains = join(&amp;quot;,&amp;quot;, [ for domain in var.certificate_domains : regex(&amp;quot;\\.*(.*)&amp;quot;, domain)[0] ] )
}

data &amp;quot;aws_route53_zone&amp;quot; &amp;quot;zones&amp;quot; {
  for_each = toset( var.certificate_domains )

  name = regex(&amp;quot;.*?[[:punct:]]*(.*)&amp;quot;, each.value)[0] 
  private_zone = false
}

resource &amp;quot;tls_private_key&amp;quot; &amp;quot;stub&amp;quot; {
  algorithm = &amp;quot;RSA&amp;quot;
}

resource &amp;quot;tls_self_signed_cert&amp;quot; &amp;quot;stub&amp;quot; {
  private_key_pem = tls_private_key.stub.private_key_pem

  subject {
    common_name  = &amp;quot;${var.certificate_domains[0]}&amp;quot;
    organization = &amp;quot;ACME Examples, Inc&amp;quot;
  }

  validity_period_hours = 12

  allowed_uses = [
    &amp;quot;key_encipherment&amp;quot;,
    &amp;quot;digital_signature&amp;quot;,
    &amp;quot;server_auth&amp;quot;,
  ]
}

resource &amp;quot;aws_acm_certificate&amp;quot; &amp;quot;cert&amp;quot; {
  private_key      = tls_private_key.stub.private_key_pem
  certificate_body = tls_self_signed_cert.stub.cert_pem
}&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;main.tf&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;maintf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;2554-4215&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;variablestf&quot;&gt;variables.tf&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;variable &amp;quot;aws_region&amp;quot; {
  type    = string
  default = &amp;quot;us-east-2&amp;quot;
}

variable &amp;quot;certificate_domains&amp;quot; {
  type = list
  default = [
    &amp;quot;.voximplant.com&amp;quot;,
    &amp;quot;*.voximplant.com&amp;quot;,
    &amp;quot;.voximplant.ru&amp;quot;,
    &amp;quot;*.voximplant.ru&amp;quot;
  ]
  # Front dots should be used to allow automatic Route53 zone id detection for second level domains.
}

variable &amp;quot;certbot_contact_email&amp;quot; {
  type    = string
  default = &amp;quot;usik@voximplant.com&amp;quot;
}&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;variables.tf&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;variablestf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;4216-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 19 Apr 2022 08:40:11 +0000</pubDate>
        </item>
        <item>
            <title>aws_certified_cloud_practitioner</title>
            <link>https://wiki.autosys.tk/devops/aws_certified_cloud_practitioner</link>
            <description>
&lt;p&gt;
Тут я оставляю заметки при подгтовке к экзамену &lt;strong&gt;AWS Certified Cloud Practitioner - CLF-C01&lt;/strong&gt;
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;cloud_computing&quot;&gt;1. Cloud Computing&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;1. Cloud Computing&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cloud_computing&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;138-170&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;шесть_преимуществ_использования_облаков&quot;&gt;Шесть преимуществ использования облаков&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Бизнес тратится только на то что нужно для работы - капитальные вложения в инфраструктуру &lt;strong&gt;CAPEX (capital expense)&lt;/strong&gt; превращаются в операционные расходы &lt;strong&gt;OPEX (operating expense)&lt;/strong&gt; на облачные ресурсы.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Экономия на масштабе - вместо покупки инфрастурктуры по ритейловым ценам облачные провайдеры предлагают более низкие цены за счет масштаба и специализации.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Гибкое планирование. Необходимые ресурсы можно приобрести именно когжа они нужны и отказаться от них если они стали не нужны.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Скорость и гибкость. Вместо заказа, покупки, исталляции и эксплуатаци собственной инфрастурктуры можно получить то же самое в пару кликов и за несколько секунд.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Отсутствие затрат на датацентр, который надо строить, запитывать, охлаждать, мониторить и т.д.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Глобальность и отказоустойчивость. Облачные провайдеры готовы предоставить ресурсы в тех регионах, где они нужны - максимально близко к пользователям, а также - обеспечить отказоустойчивость на уровне глобаьных регионов.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0428\u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u043a\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0448\u0435\u0441\u0442\u044c_\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432_\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f_\u043e\u0431\u043b\u0430\u043a\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;171-2006&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;виртуализация_vs_cloud_computing&quot;&gt;Виртуализация vs Cloud Computing&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Cloud Computing выгодно отличается от банальной виртуализации:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Развитые интерфейсы &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; для управления ресурсами
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Наличие инструментов CLI
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Возможность управлять более сложными ресурсами (базы данных, брокеры сообщений и т.д.), а не банальным виртуалкам. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f vs Cloud Computing&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f_vs_cloud_computing&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;2007-2523&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;различные_модели_облачных_ресурсов&quot;&gt;Различные модели облачных ресурсов&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;IaaS&lt;/strong&gt; - Инфрастурктура как сервис. То есть предоставление доступа к виртуальным аппаратным ресурсам, хранилищам и сетям.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Paas&lt;/strong&gt; - Платформа как сервис. Предоставление ресурсов, решающих конкретные задачи в рамках решений работающих в облаке. То есть это managed базы данных, брокеры сообщений, объектные хранилища.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;SaaS&lt;/strong&gt; - ПО как сервис. Это законченные решения, предоставляемые конечным пользователям. Например - &lt;strong&gt;Microsoft Office 365&lt;/strong&gt; или &lt;strong&gt;Google Workspace&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435_\u043c\u043e\u0434\u0435\u043b\u0438_\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445_\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2524-3410&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;обзор_глобальной_инфраструктуры_aws&quot;&gt;2. Обзор глобальной инфраструктуры AWS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;2. \u041e\u0431\u0437\u043e\u0440 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u0437\u043e\u0440_\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439_\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3411-3492&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;регионы_и_зоны_доступности&quot;&gt;Регионы и зоны доступности&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Регион (AWS region)&lt;/strong&gt; - это большой кластер датацентров в пределах географического региона.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Зона доступности (Availability Zone)&lt;/strong&gt; - это логически и физически сгруппированные датацентры в рамках региона. AZ удаленны друг от друга не более чем на 100 км для синхронной репликации. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Всего у AWS есть 77 зон доступности в 24 регионах (это наверное на 2021 год). &lt;br/&gt;

В каждом регионе есть две или более зоны доступности. Крупные регионы содержат до шести зон. Основным регионом считается &lt;strong&gt;N.Virginia - us-east-1&lt;/strong&gt;. В нем сервисы появляются раньше всех. &lt;br/&gt;

Регионы позволяют:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Разместить ресурсы ближе к конечным потребителям, тем самым уменьшив задержки.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обеспечить соотвествие местному законодательству в области хранения и обработки данных.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обеспечить отказоустойчивость.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Зоны доступности позволяют:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обеспечить отказоустойчивость в рамках региона (близкое расположение зон и хорошие каналы между ними позволяют использовать синхронную репликацию данных между сервисами в нескольких зонах). 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0433\u0438\u043e\u043d\u044b \u0438 \u0437\u043e\u043d\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0433\u0438\u043e\u043d\u044b_\u0438_\u0437\u043e\u043d\u044b_\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;3493-5325&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;edge_locations&quot;&gt;Edge Locations&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Они расположены близко к регионам (но не зависят от них). &lt;br/&gt;

Используются для кеширования наиболее востребованных статических ресурсов. &lt;br/&gt;

В том числе - и для кеширования объектов выгружаемых/загружаемых из/в хранилищ(а) S3 (Amazon S3 Transfer Acceleration). &lt;br/&gt;

Также - существуют &lt;strong&gt;Region Edge Locations&lt;/strong&gt; в рамках регионов, которые обладают большими объемами.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Edge Locations&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;edge_locations&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;5326-5955&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit8&quot; id=&quot;глобальные_региональные_и_on-premises_ресурсы&quot;&gt;Глобальные, Региональные и On-premises ресурсы&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Объекты большинства сервисов привязаны к регионам. Например - если создается сервер или кластер базы данных, то при создании необходимо указать регион, а в дальнейшем указывать регион при обращении к данному объекту. Это связано с физической инфрастурктурой, задействованной в работе объекта. &lt;br/&gt;

Однако, есть и глобальные сервисы:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS IAM&lt;/strong&gt; - сервис управления учетными записями и привилегиями.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Cloud Front&lt;/strong&gt; - сервис CDN, используемый для доставки статичного контента. Запрашиваемы ресурсы динамически кешируются в наиболее близкой к потребителю локации.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Route 53&lt;/strong&gt; - &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-сервис
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon S3&lt;/strong&gt; - бакеты в рамках сервиса привязаны к регионам, но сам сервис - глобален. То есть в консоли сервиса видны бакеты из всех регионов.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Сервисы размещаемые у заказчика (On-Premises) для создания гибридной инфраструктуры:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Snow Family&lt;/strong&gt; - &lt;strong&gt;SnowBall Edge Devices&lt;/strong&gt;, &lt;strong&gt;SnowCone&lt;/strong&gt; и &lt;strong&gt;Snowmobile&lt;/strong&gt;. Это сервис перемещения данных от заказчика в облако AWS. Заказчику привозят дисковые корзины, на которые он копирует данные, а потом они физически уезжают в облако AWS. Также предоставляются некоторые вычислительные ресурсы, для анализа и необходимой обработки копируемых данных.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Storage Gateway&lt;/strong&gt; - по сути является кешем и предоставляет бесшовную интеграцию с облачным хранилищем S3. Приложения заказчика обращаются к &lt;strong&gt;Storage Gateway&lt;/strong&gt;, а он - либо выгружает “холодные” данные на облако, тем самым расширяя доступный объем хранилища, либо, если скорости работы с облаком недостаточно - обеспечивает резервное копирование в облако.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Outposts&lt;/strong&gt; - это стойки 42U (немного меньше стандартных 48U) с оборудованием и софтом для управления, совместимым с облачным AWS, но размещаемые в датацентре заказчика. На этом оборудовании могут рабоать как просто машины &lt;strong&gt;EC2&lt;/strong&gt;, так и хранилища, базы &lt;strong&gt;RDS&lt;/strong&gt;, а также - &lt;strong&gt;Elastic Container Services (ECS)&lt;/strong&gt;, &lt;strong&gt;Elastic Kubernetes Services (EKS)&lt;/strong&gt;, &lt;strong&gt;Elastic MapReduce (EMR)&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435, \u0420\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 On-premises \u0440\u0435\u0441\u0443\u0440\u0441\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435_\u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435_\u0438_on-premises_\u0440\u0435\u0441\u0443\u0440\u0441\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;5956-9312&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit9&quot; id=&quot;планы_поддержки_aws&quot;&gt;Планы поддержки AWS&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043b\u0430\u043d\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043b\u0430\u043d\u044b_\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;9313-9359&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit10&quot; id=&quot;basic&quot;&gt;Basic&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Только базовая поддержка по e-mail, в чатах и по телефону 24/7 при проблемах с аккаунтом, а также доступ к открытой документации и форумам. &lt;br/&gt;

Семь базовых проверок &lt;strong&gt;Trusted Advisor Tool&lt;/strong&gt;.
Мониторинг и оповещение через - &lt;strong&gt;Personal Health Dashboard&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Basic&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;basic&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;9360-9778&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit11&quot; id=&quot;developer&quot;&gt;Developer&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Рекомендуется для экспериментов и тестирования. &lt;br/&gt;

Базовая поддержка по технической части компонентов AWS и юзкейсам. &lt;br/&gt;

Только по e-mail в рабочее время. &lt;br/&gt;

Количество тикетов - не ограничено. &lt;br/&gt;

Время реакции - 24 часа для обычных вопросов и 12 часов для системных проблем. 
В остальном - то же что и в Basic-плане.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Developer&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;developer&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;9779-10350&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit12&quot; id=&quot;business&quot;&gt;Business&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Рекомендуется для продукционных сред. &lt;br/&gt;

Техническая поддержка по e-mail, в чатах и по телефону 24/7. &lt;br/&gt;

Время реакции - зависит от проблемы, но, к примеру, если упала продукционная система, то можно ожидать поддежки от Cloud Engineer в течение часа. &lt;br/&gt;

Работа с проблемами взаимодействия между сервисами AWS и сторонним ПО. &lt;br/&gt;

За дополнительные деньги доступен инструмент &lt;strong&gt;Infrastructure Event Management&lt;/strong&gt;, который позволяет проанализировать инфрастурктуру, оценить её готовность и выявить риски перед серьезными мероприятиями типа запуска в прод или миграциями. &lt;br/&gt;

Доступен полный набор проверок &lt;strong&gt;Trusted Advisor&lt;/strong&gt; и рекомендаций по их мотивам:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Cost Optimization
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Security
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Fault Tolerance
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Performance
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Service Limits
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Business&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;business&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;10351-11569&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit13&quot; id=&quot;enterprise&quot;&gt;Enterprise&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Начинается с $15000 в месяц. &lt;br/&gt;

Доступен персональный менеджер - &lt;strong&gt;Technical Account Manager (TAM)&lt;/strong&gt;, который активно мониторит состояние инфраструктуры и предлагает решения проблем. &lt;br/&gt;

Доступны Well-Archtected Review грамотными специалистами. &lt;br/&gt;

Техническая поддержка по e-mail, в чатах и по телефону 24/7. &lt;br/&gt;

Время реакции для business critical проблем - 15 минут. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Enterprise&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;enterprise&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;11570-12174&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit14&quot; id=&quot;таблица&quot;&gt;Таблица&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;div class=&quot;table sectionedit15&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;Basic &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Developer &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Business &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;Enterprise &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt;Только нетехническая поддержка &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;по e-mail с 8:00 до 18:00 в TZ клиента &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;по e-mail, в чатах и по телефону 24/7 &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; по e-mail, в чатах и по телефону 24/7 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Простая техподержка сервисов AWS. SLA - 24 часа &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Простая техподержка сервисов AWS. SLA - 24 часа &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; Простая техподержка сервисов AWS. SLA - 24 часа &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt;Реакция на системные проблемы - 12 часов &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Реакция на системные проблемы - 12 часов &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;Реакция на системные проблемы - 12 часов &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Реакция на проблемы продукционных систем - 4 часа &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;Реакция на проблемы продукционных систем - 4 часа &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt;Реакция на отказы продукционных систем - 1 час &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;Реакция на отказы продукционных систем - 1 час &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt;Реакция на отказы business-critical систем - 15 минут &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;secid&amp;quot;:15,&amp;quot;range&amp;quot;:&amp;quot;12200-13391&amp;quot;} --&gt;
&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0430\u0431\u043b\u0438\u0446\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0430\u0431\u043b\u0438\u0446\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;12175-13392&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit16&quot; id=&quot;aws_personal_health_dashboard&quot;&gt;AWS Personal Health Dashboard&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Раньше была доступна на &lt;a href=&quot;https://status.aws.amazon.com&quot; class=&quot;urlextern&quot; title=&quot;https://status.aws.amazon.com&quot; rel=&quot;ugc nofollow&quot;&gt;https://status.aws.amazon.com&lt;/a&gt; , а сейчаc редиректит на &lt;a href=&quot;https://phd.aws.amazon.com&quot; class=&quot;urlextern&quot; title=&quot;https://phd.aws.amazon.com&quot; rel=&quot;ugc nofollow&quot;&gt;https://phd.aws.amazon.com&lt;/a&gt; &lt;br/&gt;

Показывает состояние сервисов во всех регионах. &lt;br/&gt;

Позволяет настроить какие-то реакции на события.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Personal Health Dashboard&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_personal_health_dashboard&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:16,&amp;quot;range&amp;quot;:&amp;quot;13393-13764&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit17&quot; id=&quot;управление_аккаунтами&quot;&gt;3. Управление аккаунтами&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Amazon рекомендует создавать столько учеток, сколько необходимо. Для эффективнго управления учетками предуемотрен ряд инструментов. &lt;br/&gt;

Использование мультиаккаунтного подхода позволяет:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обеспечить административное разделение ресурсов для лучшего контроля и планирования.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обеспечить явную изоляцию ресурсов и исключить их взаимное автообнаружение.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Устранить избыточные манипуляции с учетками пользователей. Например - вместо того, чтобы создавать отдельные дублирующие учетки пользователей в каждом проекте AWS, можно слить учетки всех пользователей в одну &lt;strong&gt;AWS Identity Management Account&lt;/strong&gt; и раздавать права с помощью &lt;strong&gt;cross-account&lt;/strong&gt; разрешений и политик.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обеспечить изолированные учетки для аудита или восстановления.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;3. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430\u043c\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435_\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430\u043c\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:17,&amp;quot;range&amp;quot;:&amp;quot;13765-15130&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit18&quot; id=&quot;aws_landing_zone&quot;&gt;AWS Landing Zone&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Landing Zone&lt;/strong&gt; - уже устаревший инструмент, замененный &lt;strong&gt;AWS Control Tower&lt;/strong&gt;. Представляет собой гайдлайн для планирования и реализации лучших практик мультиаккаунтного окружения.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Landing Zone&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_landing_zone&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:18,&amp;quot;range&amp;quot;:&amp;quot;15131-15469&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit19&quot; id=&quot;aws_control_tower&quot;&gt;AWS Control Tower&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Данный инструмент позволяет создавать мультиаккаунтные окружения (landing zones) с помощью шаблонов, включающих следующие элементы:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Собственно сама &lt;strong&gt;AWS Organization&lt;/strong&gt; и многоучеточное окружение
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настраивать SSO
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Федерацию различных каталогов с помощью SSO
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Централизованное логирование
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Окружение, созданное с помощью &lt;strong&gt;AWS Control Tower&lt;/strong&gt; использует рекомендуемые политики и подходы - &lt;strong&gt;guardrails&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Control Tower&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_control_tower&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:19,&amp;quot;range&amp;quot;:&amp;quot;15470-16194&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit20&quot; id=&quot;aws_organization&quot;&gt;AWS Organization&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Organization&lt;/strong&gt; - бесплатный сервис, для централизованного управления учетками. &lt;br/&gt;

Каждый инстанс сервиса &lt;strong&gt;AWS Organization&lt;/strong&gt; содержит одну основную &lt;strong&gt;management&lt;/strong&gt; (&lt;strong&gt;master&lt;/strong&gt;) учетку и позволяет создать учетки пользователей. &lt;br/&gt;

Сходные по функционалу учетки могут быть объединены в &lt;strong&gt;Organization Unit&lt;/strong&gt; и управляться как единое целое. &lt;br/&gt;

К OU-шкам (или отдельным учеткам) могут применяться &lt;strong&gt;Service Control Policies&lt;/strong&gt;. котрые определяют конкретные права на ресурсы.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Organization&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_organization&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:20,&amp;quot;range&amp;quot;:&amp;quot;16195-16987&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit21&quot; id=&quot;consolidated_billing&quot;&gt;Consolidated Billing&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Organization&lt;/strong&gt; позволяет централизованно следить за расходами на ресурсы для каждой учетки отдельно и вцелом для всех учеток. &lt;br/&gt;

Отвественной за платежи является вляделец management-учетки. &lt;br/&gt;

Объединение счетов позволяет поользоваться скидками за большие объемы ресурсов.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Consolidated Billing&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;consolidated_billing&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:21,&amp;quot;range&amp;quot;:&amp;quot;16988-17505&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit22&quot; id=&quot;планирование_архитектуры_учеток&quot;&gt;Планирование архитектуры учеток&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Иерархия учеток (и распространения привилегий) строится на нескольких простых принципах:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Политики примененные к OU-шке распространяются на вложенные элементы - OU-шки и учетки в них
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 У каждой OU-шки может быть только одна родительская OU-шка.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Каждая учетка может входить только в одну OU-шку.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Обязательно должны существовать пара OU-шек с учетками:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Infrastructure Services&lt;/strong&gt; - учетки для доступа к общим инфраструктурными сервисам - сетевым, репам образов и прочее.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Security Services&lt;/strong&gt; - OU-шка с учетками для доступа к логам и security-сервисам
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Вообще - нихрена непонятно на первый взгляд. Надо почитать тут: &lt;a href=&quot;https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/recommended-ous.html&quot; class=&quot;urlextern&quot; title=&quot;https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/recommended-ous.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/recommended-ous.html&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0443\u0447\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b_\u0443\u0447\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:22,&amp;quot;range&amp;quot;:&amp;quot;17506-18747&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit23&quot; id=&quot;aws_free_tier_accounts&quot;&gt;AWS Free Tier Accounts&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Free Tier Account&lt;/strong&gt; - обычная стандартная учетка, которая имеет досступ ко множеству сервисов AWS бесплатно 12 месяцев с момента регистрации. С ограничениями по потребляемым ресурсам. &lt;br/&gt;

Также - есть доступ к ряду инструментов и сервисов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS Cloud Formation&lt;/strong&gt; - сервис и тулзы для IaC. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Elastic Beanstalk&lt;/strong&gt; - сервис оркестрации, который создает и настраивает ресурсы (например - S3 и балансировщики) под нужды приложения. Разработчику достаточно залить код, а &lt;strong&gt;Amazon Elastic Beanstalk&lt;/strong&gt; создаст необходимую для работы приложения инфраструктуру. Сам сервис - бесплатен, но ресурсы им создаваемые - нет!
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Free Tier Accounts&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_free_tier_accounts&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:23,&amp;quot;range&amp;quot;:&amp;quot;18748-19819&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit24&quot; id=&quot;вечнобесплатные_сервисы&quot;&gt;Вечнобесплатные сервисы&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Сервисы, в которых можно создавать бесплатные ресурсы (с учетом некоторых ограничений):
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon CloudWatch&lt;/strong&gt; - сервис для мониторинга ресурсов и приложений. Бесплытные - 10 метрик, 10 оповещений и миллион вызовов &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Lambda&lt;/strong&gt; - бессерверные вычисления. Кода, запускаемый в ответ на события. Бесплатно - миллион вызовов &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; и 3.2 миллиона секунд машинного времени в месяц.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS Organizations&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u0435\u0447\u043d\u043e\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0435\u0447\u043d\u043e\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435_\u0441\u0435\u0440\u0432\u0438\u0441\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:24,&amp;quot;range&amp;quot;:&amp;quot;19820-20560&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit25&quot; id=&quot;пробные_бесплатные_сервисы&quot;&gt;Пробные бесплатные сервисы&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Сервисы с бесплатным пробным 30-девным периодом:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Workspaces&lt;/strong&gt; - сервис VDI (Windows и Linux). Стандартный план предполагает две виртуалки 80GB на систему и 50Gb на данные. В месяц - 40 часов. Период - два месяца.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Detective&lt;/strong&gt; - сервис оценки и визуализации потенциальных проблем с безопасностью.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Redshift&lt;/strong&gt; - сервис хранения и анализа больших объемов структурированных и неструктурированных данных. 2 месяца триал включает ежемесячные 750 часов работы инстанса DC2.Large.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0431\u043d\u044b\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0431\u043d\u044b\u0435_\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435_\u0441\u0435\u0440\u0432\u0438\u0441\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:25,&amp;quot;range&amp;quot;:&amp;quot;20561-21443&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit26&quot; id=&quot;технологии_aws&quot;&gt;4. Технологии AWS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;4. \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:26,&amp;quot;range&amp;quot;:&amp;quot;21444-21486&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit27&quot; id=&quot;identity_and_access_management_-_iam&quot;&gt;Identity and Access management - IAM&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
В иерархии IAM есть соедующие учетки:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;root user&lt;/strong&gt; - основная учетка аккаунта. Не должна использоваться для повседнейвных операций.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;additional users&lt;/strong&gt; - непривилегированные пользователи, имеющие набор привилегий, свойственный их задачам. А также - сервисные учетки для автоматизации.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Identity and Access management - IAM&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;identity_and_access_management_-_iam&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:27,&amp;quot;range&amp;quot;:&amp;quot;21487-22037&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit28&quot; id=&quot;двухфактораня_аутентификация_-_mfa&quot;&gt;Двухфактораня аутентификация - MFA&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Позволяет защитить учетки от подбора или воровства паролей. &lt;br/&gt;

Используют принцип - для аутентификации должны использоваться две сущности - одна которую пользователь знает (пароль), вторая - нечто что принадлежит пользователю и есть у него прямо сейчас (источник второго фактора SMS или OTP). &lt;br/&gt;

Управление вторым фактором происходит в разделе &lt;strong&gt;Secure Credentials&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0432\u0443\u0445\u0444\u0430\u043a\u0442\u043e\u0440\u0430\u043d\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f - MFA&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0432\u0443\u0445\u0444\u0430\u043a\u0442\u043e\u0440\u0430\u043d\u044f_\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f_-_mfa&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:28,&amp;quot;range&amp;quot;:&amp;quot;22038-22756&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit29&quot; id=&quot;политики_паролей&quot;&gt;Политики паролей&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Настраивают сложность паролей. &lt;br/&gt;

Настройки в разделе &lt;strong&gt;Account Settings&lt;/strong&gt; (в меню справа в консоли IAM)
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438_\u043f\u0430\u0440\u043e\u043b\u0435\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:29,&amp;quot;range&amp;quot;:&amp;quot;22757-22967&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit30&quot; id=&quot;iam_access_keys&quot;&gt;IAM Access Keys&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Подобны паре логин-пароль и используются для программного (из &lt;strong&gt;aws cli&lt;/strong&gt; или &lt;strong&gt;SDK&lt;/strong&gt;) доступа к платформе (в отличие от логина-пароля и второго фактора, используемых при доступе к web-консоли). &lt;br/&gt;

Каждая пользовательская учетка может иметь два &lt;strong&gt;access key&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;IAM Access Keys&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;iam_access_keys&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:30,&amp;quot;range&amp;quot;:&amp;quot;22968-23438&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit31&quot; id=&quot;iam_groups&quot;&gt;IAM Groups&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Позволяют объединять пользовательские учетки в группы и назначать привилегии (привязывать политики) на группу, что имеет эффект на всех пользователей в группе. &lt;br/&gt;

Добавление пользователя в группу распространяет на него все политики. привязанные к этой группе.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;IAM Groups&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;iam_groups&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:31,&amp;quot;range&amp;quot;:&amp;quot;23439-23938&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit32&quot; id=&quot;iam_roles&quot;&gt;IAM Roles&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Если используются сервисные пользовательские учетки, то для повышения безопасности могут понадобиться механизмы ротации учетных данных. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;IAM Roles&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;iam_roles&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:32,&amp;quot;range&amp;quot;:&amp;quot;23939-24217&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit33&quot; id=&quot;назначение_привилегий_с_помощью_политик_iam&quot;&gt;Назначение привилегий с помощью политик IAM&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Политики представляют собой &lt;strong&gt;json&lt;/strong&gt;-документы. &lt;br/&gt;

Политики позволяют реализовать принцип “наименьших привилегий” (&lt;strong&gt;least privileges&lt;/strong&gt;) и давать необходимый минимум прав. &lt;br/&gt;

Когда пользователь обращается к ресурсу, то IAM вычисляет результирующую политику для его учетки и ролей этой учетки и принимает решение о предоставлении доступа. &lt;br/&gt;

Шесть типов политик:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Identity-based&lt;/strong&gt; - эти политики привязываются к пользователям, группам и ролям и дают им права. Действуют в рамках аккаунта (то есть невозможно привязать политику к пользователю из другого аккаунта), однако - можно назначить роль пользователю из другого аккаунта. Таким образом - реализовать авторизацию внешних пользователей для доступа к ресурсам вашей учетки.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Resource-based&lt;/strong&gt; - политики привязываются к ресурсам. В них прописано какие пользователи (группы, роли) имеют доступ к данному ресурсу. Анонимный доступ - &lt;strong&gt;&lt;/strong&gt;*.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Permission Boundaries&lt;/strong&gt; - привязываются к юзеру или роли и задают максимум привилегий, которе могут быть заданы с помощью &lt;strong&gt;Identity-based&lt;/strong&gt;-политик.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Organization Services Control Policies&lt;/strong&gt; (&lt;strong&gt;SCPs&lt;/strong&gt;) - задают максимальный уровень привилегий для пользователей в организации. Сами по себе не дают никаких прав, но задают максимально доступный ровень.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Access Control lists&lt;/strong&gt; - задают права для доступа к конкретным экземплярам ресурсов (например - бакетам S3) для внешних (не находящихся в данном аккаунте) пользователям и ролям. Похожи на &lt;strong&gt;Resource-based&lt;/strong&gt;-политики, но задаваемый в &lt;abbr title=&quot;Access Control List&quot;&gt;ACL&lt;/abbr&gt; набор привилегий ограничен. &lt;abbr title=&quot;Access Control List&quot;&gt;ACL&lt;/abbr&gt; представляют собой не &lt;strong&gt;json&lt;/strong&gt;-документы.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  &lt;strong&gt;Session Policies&lt;/strong&gt; - позволяют дать прав конкретной сессии про программном доступе.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a IAM&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435_\u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_\u043f\u043e\u043b\u0438\u0442\u0438\u043a_iam&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:33,&amp;quot;range&amp;quot;:&amp;quot;24218-27115&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit34&quot; id=&quot;типы_identity-based_политик&quot;&gt;Типы Identity-based политик&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
В свою очередь &lt;strong&gt;Identity-based&lt;/strong&gt;-политики делятся на:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Managed AWS Policies&lt;/strong&gt; - дефолтные политики, которые создает AWS и управляет ими. Задают типичные привилегии. КОнечные пользователи не могут их изменить.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Customer Managed Policies&lt;/strong&gt; - политики, которые создает и редактирует пользователь.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Inline policies&lt;/strong&gt; - политики, существующие как часть субъекта IAM (пользователя, группы или роли) и неотделимы от него. Эти политики существуют, пока существует субьект IAM.
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0438\u043f\u044b Identity-based \u043f\u043e\u043b\u0438\u0442\u0438\u043a&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0438\u043f\u044b_identity-based_\u043f\u043e\u043b\u0438\u0442\u0438\u043a&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:34,&amp;quot;range&amp;quot;:&amp;quot;27116-27948&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit35&quot; id=&quot;пример_политики&quot;&gt;Пример политики&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;{
  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-07&amp;quot;,
  &amp;quot;Statement&amp;quot;: [
    {
      &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
      &amp;quot;Action&amp;quot;: [
        &amp;quot;s3:Get*&amp;quot;,
        &amp;quot;s3:List*&amp;quot;
      ],
      &amp;quot;Resource&amp;quot;: &amp;quot;*&amp;quot;
    }
  ]
}&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Version&lt;/strong&gt; - всегда “2012-10-07”
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Statement&lt;/strong&gt; - собственно список параметров (объектов и разрешений) политики
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Effect&lt;/strong&gt; - что политика делает. Разрешает или Запрещает.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Action&lt;/strong&gt; - список действий.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Resource&lt;/strong&gt; - ARN ресурса (или вайлдкард как тут).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0438\u043c\u0435\u0440_\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:35,&amp;quot;range&amp;quot;:&amp;quot;27949-28589&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit36&quot; id=&quot;arn_-_amazon_resource_name&quot;&gt;ARN - Amazon Resource Name&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Может быть в форматах:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;arn : partition : service : region : account-id : resource-id
arn : partition : service : region : account-id : resource-type/resource-id
arn : partition : service : region : account-id : resource-type : resource-id&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;partition&lt;/strong&gt; - Группа клиентов AWS. Для большинства стандартных клиентов - &lt;strong&gt;aws&lt;/strong&gt;. Для Китая - &lt;strong&gt;aws-cn&lt;/strong&gt;. Могут быть и другие
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;service&lt;/strong&gt; - название сервиса (продукта) AWS. &lt;strong&gt;s3&lt;/strong&gt; или &lt;strong&gt;acm&lt;/strong&gt; и т.д.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;region&lt;/strong&gt; - Регион, где существует данный ресурс. Для глобальных сервсов может быть и пустым, тогда заменяется на дополнительную &lt;strong&gt;:&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;account-id&lt;/strong&gt; - 12-знаковый номер учетки, в которой создан ресурс. Может быть пустым, тогда заменяется на дополнительную &lt;strong&gt;:&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;resource-type&lt;/strong&gt; - тип сесурса - &lt;strong&gt;user&lt;/strong&gt; или &lt;strong&gt;instance&lt;/strong&gt; и т.д
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;resource-id&lt;/strong&gt; - имя (идентификатор) ресурса
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Condition&lt;/strong&gt; - дополнительные условия применения политики. Например - для ограничения доступа с определенных IP-адресов.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;ARN - Amazon Resource Name&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;arn_-_amazon_resource_name&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:36,&amp;quot;range&amp;quot;:&amp;quot;28590-30031&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit37&quot; id=&quot;iam_policy_simulator&quot;&gt;IAM Policy simulator&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Тулза для проверки политик: &lt;a href=&quot;https://policysim.aws.amazon.com&quot; class=&quot;urlextern&quot; title=&quot;https://policysim.aws.amazon.com&quot; rel=&quot;ugc nofollow&quot;&gt;https://policysim.aws.amazon.com&lt;/a&gt; &lt;br/&gt;

Там все просто:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 слева вибираешь пользователя, видишь привязанные к нему политики и можешь их включать/отключать
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 справа выбираешь сервис и действие. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 жмешь &lt;strong&gt;Run Simulation&lt;/strong&gt;, чтобы увидеть &lt;strong&gt;deny&lt;/strong&gt; или &lt;strong&gt;allow&lt;/strong&gt; 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;IAM Policy simulator&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;iam_policy_simulator&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:37,&amp;quot;range&amp;quot;:&amp;quot;30032-30519&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit38&quot; id=&quot;получение_привилегий_с_помощью_ролей&quot;&gt;Получение привилегий с помощью ролей&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Пользовательские учетные записи - это идентификаторы, назначенные людям или сервисам (для программного доступа к ресурсам). &lt;br/&gt;

В то же время роли - могут рассматриваться как самостоятельный тип идентификаторов, имеющих собственный набор политик и привилегий. Роль может быть назначена субъекту для выполнения некоторых задач. &lt;br/&gt;

Например:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Экземпляру сервиса AWS можно назначить роль для доступа к экземплярам других сервисов в пределах данного аккаунта. Например - инстансу EC2 для работы с базой данных.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Пользователю из одного аккаунта можно назначить роль для доступа к ресурсам другого аккаунта.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Учетной записи пользователи из внешних провайдеров (Active Directory LDAP, OpenID Google,facebook или Amazon) можно назначить роль и тем самым дать прав на заданные сервисы и ресурсы в аккаунте AWS. При этом создавать учетку пользователя в аккаунте AWS не нужно.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u043e\u043b\u0435\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435_\u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_\u0440\u043e\u043b\u0435\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:38,&amp;quot;range&amp;quot;:&amp;quot;30520-32133&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit39&quot; id=&quot;автоматическое_обновление_учетных_данных_при_использовании_ролей&quot;&gt;Автоматическое обновление учетных данных при использовании ролей&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Одним из ключевых свойств ролей является автоматическая ротация учетных данных при доступе внешних пользователей к ресурсам. &lt;br/&gt;

Таким образом - исключается долговременное хранение учетных данных на клиентах и обеспечивается нужный уровень безопасности. &lt;br/&gt;

Данный функционал обеспечивает &lt;strong&gt;Security Token Service&lt;/strong&gt; (&lt;strong&gt;STS&lt;/strong&gt;), который выдает обновляемые короткоживущие токены при назначении роли, а также контролирует их прозрачное. &lt;br/&gt;

Временные учетные данные включают в себя:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 access key ID
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 secret access key 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 security token
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Вот этот самый &lt;strong&gt;security token&lt;/strong&gt; и есть обновляемая короткоживущая часть кредов. &lt;br/&gt;

При создании роли содается политика доверия (&lt;strong&gt;trust policy&lt;/strong&gt;), которая описывает субъектов, имеющих право получить данную роль. Кроме того, субъект должен иметь разрешение на получение данной роли. &lt;br/&gt;

Использование ролей - предпочтительный способ назначения привилегий, вместо создания отдельных учеток для внешних пользователей.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u043e\u043b\u0435\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435_\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435_\u0443\u0447\u0435\u0442\u043d\u044b\u0445_\u0434\u0430\u043d\u043d\u044b\u0445_\u043f\u0440\u0438_\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438_\u0440\u043e\u043b\u0435\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:39,&amp;quot;range&amp;quot;:&amp;quot;32134-33903&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit40&quot; id=&quot;отчеты_об_использовании_учеток&quot;&gt;Отчеты об использовании учеток&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
AWS позволяет строить различные отчеты об учетных записях и выгружать их в CSV
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0442\u0447\u0435\u0442\u044b \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0443\u0447\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u0447\u0435\u0442\u044b_\u043e\u0431_\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438_\u0443\u0447\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:40,&amp;quot;range&amp;quot;:&amp;quot;33904-34111&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit41&quot; id=&quot;работа_с_инструментами_aws_cli&quot;&gt;Работа с инструментами AWS CLI&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Инструменты командной строки могут значительно ускорить работу с сервисами AWS, позволяя одной командой выполнять довольно сложные манипуляции, а также обхединять множество действий в скрипты. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 AWS CLI&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0431\u043e\u0442\u0430_\u0441_\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438_aws_cli&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:41,&amp;quot;range&amp;quot;:&amp;quot;34112-34534&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit42&quot; id=&quot;настройка_доступа_к_сервсам_aws_через_aws_cli&quot;&gt;Настройка доступа к сервсам AWS через AWS CLI&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Следует избегать использования &lt;strong&gt;root&lt;/strong&gt;-учетки для работы с CLI, поскольку учетные данные в этом случае хранятся локально. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0441\u0430\u043c AWS \u0447\u0435\u0440\u0435\u0437 AWS CLI&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0434\u043e\u0441\u0442\u0443\u043f\u0430_\u043a_\u0441\u0435\u0440\u0432\u0441\u0430\u043c_aws_\u0447\u0435\u0440\u0435\u0437_aws_cli&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:42,&amp;quot;range&amp;quot;:&amp;quot;34535-34839&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit43&quot; id=&quot;установка_инструментов_aws_cli&quot;&gt;Установка инструментов AWS CLI&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Надо скачать и установить отсюда: &lt;a href=&quot;https://aws.amazon.com/cli/&quot; class=&quot;urlextern&quot; title=&quot;https://aws.amazon.com/cli/&quot; rel=&quot;ugc nofollow&quot;&gt;https://aws.amazon.com/cli/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 AWS CLI&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432_aws_cli&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:43,&amp;quot;range&amp;quot;:&amp;quot;34840-34995&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit44&quot; id=&quot;первичная_настройка_инструментов_aws_cli&quot;&gt;Первичная настройка инструментов AWS CLI&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
После установки надо запустить:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;aws configure&lt;/pre&gt;

&lt;p&gt;
И предоставить следующие данные:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;access key ID&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;secret access key&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 дефолтный &lt;strong&gt;region&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В итоге - эти данные попадут в файл &lt;strong&gt;~/.aws/credentials&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[default]
aws_access_key_id = ...............
aws_secret_access_key = ............&lt;/pre&gt;

&lt;p&gt;
В данном случае &lt;strong&gt;[default]&lt;/strong&gt; - это имя профиля &lt;strong&gt;AWS&lt;/strong&gt;. Их может быть несколько, а переключаться между ними можно задавая значение переменной &lt;strong&gt;AWS_PROFILE&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export AWS_PROFILE=another_profile&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 AWS CLI&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f_\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432_aws_cli&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:44,&amp;quot;range&amp;quot;:&amp;quot;34996-35775&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit45&quot; id=&quot;amazon_simple_storage_service_s3&quot;&gt;5. Amazon Simple Storage Service (S3)&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Amazon S3 - надежное объектное хранилище. Надежность на уровне “11 девяток”. &lt;br/&gt;

Объекты организованы в контейнеры - бакеты. Внутри контейнера струкрутры нет. &lt;br/&gt;

Имена бакетов должны быть уникальны в пределах всей инфраструктуры &lt;strong&gt;AWS&lt;/strong&gt;. &lt;br/&gt;

Доступ к объектам (файлам) бакета может быть осуществлен одним из способов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Virtual hosted-style endpoints&lt;/strong&gt;: &lt;a href=&quot;https://___BUCKET_NAME___.s3.amazonaws.com/___FILE_NAME___&quot; class=&quot;urlextern&quot; title=&quot;https://___BUCKET_NAME___.s3.amazonaws.com/___FILE_NAME___&quot; rel=&quot;ugc nofollow&quot;&gt;https://___BUCKET_NAME___.s3.amazonaws.com/___FILE_NAME___&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Website endpoint&lt;/strong&gt;: &lt;strong&gt;s3-website -(dash) Region&lt;/strong&gt; (&lt;a href=&quot;http://___BUCKET_NAME___.s3-website-Region.amazonaws.com/___FILE_NAME___&quot; class=&quot;urlextern&quot; title=&quot;http://___BUCKET_NAME___.s3-website-Region.amazonaws.com/___FILE_NAME___&quot; rel=&quot;ugc nofollow&quot;&gt;http://___BUCKET_NAME___.s3-website-Region.amazonaws.com/___FILE_NAME___&lt;/a&gt;) или &lt;strong&gt;s3-website .(dot) Region&lt;/strong&gt; (&lt;a href=&quot;http://___BUCKET_NAME___.s3-website.Region.amazonaws.com/___FILE_NAME___&quot; class=&quot;urlextern&quot; title=&quot;http://___BUCKET_NAME___.s3-website.Region.amazonaws.com/___FILE_NAME___&quot; rel=&quot;ugc nofollow&quot;&gt;http://___BUCKET_NAME___.s3-website.Region.amazonaws.com/___FILE_NAME___&lt;/a&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Максимальный размер объекта в &lt;strong&gt;Amazon S3&lt;/strong&gt; - 5Tb (терабайт). &lt;br/&gt;

Имя файла (объекта) обычно называется &lt;strong&gt;key&lt;/strong&gt;, а его содержимое - &lt;strong&gt;value&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;5. Amazon Simple Storage Service (S3)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_simple_storage_service_s3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:45,&amp;quot;range&amp;quot;:&amp;quot;35776-36941&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit46&quot; id=&quot;имена_бакетов&quot;&gt;Имена бакетов&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 уникальны в  пределах всей инфраструктуры AWS
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 не менее 3 и не более 63 символов длиной
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 могут содержать только маленькие буквы, цифры, точки и тире
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 могут начинаться только с цифры или буквы
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 не могут быть подобны IP-адресам (192.168.1.1 - не валидно)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 бакеты, доступ к которым происходит с помощью &lt;strong&gt;Amazon S3 Transfer Acceleration&lt;/strong&gt; не могут содержать в названии точки.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Бакеты не могут быть вложенными.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Точки в именах могут использоваться только при Web-style доступе, который осуществляется по незащищенному протоколу HTTP.  &lt;strong&gt;Virtual hosted-style endpoints&lt;/strong&gt; предполагает использование HTTPS и имена с точками не проходят через SNI. Если совершенно необходимо использовать точки в именах бакетов при доступе по HTTPS, то можно использовать какой-то балансировщик, который будет терминировать SSL. Например - &lt;strong&gt;Amazon Cloud-Front&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u043c\u0435\u043d\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u043c\u0435\u043d\u0430_\u0431\u0430\u043a\u0435\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:46,&amp;quot;range&amp;quot;:&amp;quot;36942-38406&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit47&quot; id=&quot;имена_ключей_объектов_файлов&quot;&gt;Имена ключей (объектов, файлов)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 длина до 1024 байт
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Могут содержать буквы, цифры и спецсимволы - !-_.*()
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u043c\u0435\u043d\u0430 \u043a\u043b\u044e\u0447\u0435\u0439 (\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0444\u0430\u0439\u043b\u043e\u0432)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u043c\u0435\u043d\u0430_\u043a\u043b\u044e\u0447\u0435\u0439_\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432_\u0444\u0430\u0439\u043b\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:47,&amp;quot;range&amp;quot;:&amp;quot;38407-38603&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit48&quot; id=&quot;организация_объектов_в_бакете&quot;&gt;Организация объектов в бакете&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
В интерфейсе есть кнопка &lt;strong&gt;Create folder&lt;/strong&gt;, которая позволяет создать как-бы иерархию директорий в бакете, однако структура объектов всё-равно остается плоской. &lt;br/&gt;

Это достигается за счет использования &lt;strong&gt;префиксов&lt;/strong&gt; (имен директорий) и разделителей &lt;strong&gt;/&lt;/strong&gt; в именах ключей. То есть ключ (имя объекта в бакете) может содержать в себе привычную структуру директорий, которая отобразится в интерфейсе. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f_\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432_\u0432_\u0431\u0430\u043a\u0435\u0442\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:48,&amp;quot;range&amp;quot;:&amp;quot;38604-39377&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit49&quot; id=&quot;префиксы_и_скрость_доступа_к_объектам&quot;&gt;Префиксы и скрость доступа к объектам&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
AWS ограничивает IOPS не на уровне бакета, а на уровне префиксов. То есть если вам доступны 5500 IOPS для методов &lt;strong&gt;GET/HEAD&lt;/strong&gt;, то для получения скорости на уровне 27500 IOPS достаточно использовать 5 различных префиксов в именах ключей. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u0438 \u0441\u043a\u0440\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b_\u0438_\u0441\u043a\u0440\u043e\u0441\u0442\u044c_\u0434\u043e\u0441\u0442\u0443\u043f\u0430_\u043a_\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:49,&amp;quot;range&amp;quot;:&amp;quot;39378-39861&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit50&quot; id=&quot;регионы_размещения_данных_s3&quot;&gt;Регионы размещения данных S3&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
При создании бакета обяхательно указывать регион, где данные физически будут расположены. &lt;br/&gt;

AWS НИКОГДА не реплицирует данные в другие регионы. Физически данные всегда в том регионе, где создан бакет. Однако, пользовватель может настроить репликацию в другой бакет в другом регионе. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0433\u0438\u043e\u043d\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 S3&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0433\u0438\u043e\u043d\u044b_\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f_\u0434\u0430\u043d\u043d\u044b\u0445_s3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:50,&amp;quot;range&amp;quot;:&amp;quot;39862-40445&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit51&quot; id=&quot;права_доступа_к_объектам_в_s3&quot;&gt;Права доступа к объектам в S3&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
По дефолту - права на объекты в бакете есть только у создавшей его учетки. &lt;br/&gt;

Основных способов раздачи прав на объекты S3 два:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;resource-based&lt;/strong&gt;-политика (&lt;strong&gt;bucket-policy&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Списки доступа (ACLs)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Также ограниченно могут использоваться IAM-политики. &lt;br/&gt;

&lt;strong&gt;Deny&lt;/strong&gt; - всегда сильнее, чем &lt;strong&gt;Allow&lt;/strong&gt;. Но взаимоисключающими не являются. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0432 S3&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0430\u0432\u0430_\u0434\u043e\u0441\u0442\u0443\u043f\u0430_\u043a_\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c_\u0432_s3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:51,&amp;quot;range&amp;quot;:&amp;quot;40446-41059&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit52&quot; id=&quot;бакет-полиси&quot;&gt;Бакет-полиси&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
JSON-документ. &lt;br/&gt;

Раздает права (в том числе и анонимный доступ) как на саму корзинку, так и на объекты в ней. &lt;br/&gt;

Могут давать права юзерам и ролям из других аккаунтов. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0411\u0430\u043a\u0435\u0442-\u043f\u043e\u043b\u0438\u0441\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0430\u043a\u0435\u0442-\u043f\u043e\u043b\u0438\u0441\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:52,&amp;quot;range&amp;quot;:&amp;quot;41060-41390&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit53&quot; id=&quot;списки_доступа&quot;&gt;Списки доступа&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Считаются legacy и вместо них всегда лучше использовать политики. &lt;br/&gt;

Не могут давать доступ отдельным юзерам (только аккаунту целиком). &lt;br/&gt;

Есть случаи, когда &lt;abbr title=&quot;Access Control List&quot;&gt;ACL&lt;/abbr&gt; всё еще используется
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043a\u0438_\u0434\u043e\u0441\u0442\u0443\u043f\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:53,&amp;quot;range&amp;quot;:&amp;quot;41391-41750&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit54&quot; id=&quot;iam_политики&quot;&gt;IAM политики&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
На первый взгляд - могут использоваться для раздачи прав на ресурсы S3. Однако - не могут быть привязаны напрямую к ресурсу. &lt;br/&gt;

Вместо этого - следует создавать роль, давать ей права на ресурсы S3, создавать политику доверия (чтобы пользователь мог принять роль). &lt;br/&gt;

Также - IAM-политики не могут использоваться для раздачи анонимного доступа, так как всегда должны быть привязаны к какому-то субъекту (айдентити). &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;IAM \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;iam_\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:54,&amp;quot;range&amp;quot;:&amp;quot;41751-42524&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit55&quot; id=&quot;классы_хранилищ_s3&quot;&gt;Классы хранилищ S3&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
различаются по следующим параметрам:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Скорость доступа
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Постоянная/непостоянная доступность
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Стоимость
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Стоимость в свою очередь определяется параметрами:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Стоимость собственно хранения (в долларах в месяц за гигабайт)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Количество запросов на запись/извлечение
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 использование ускорения доставки
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 использование обработки и аналитики, в том числе и Lambda-функциями
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 возможность потери части данных
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Стоимость закачки данных В S3 - бесплатно! &lt;br/&gt;

важно понимать, что в пределах одного бакета могут храниться объекты на хранилищах разных классов. То есть создавать для каждого класса отдельный бакет не нужно. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u043b\u0430\u0441\u0441\u044b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 S3&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043b\u0430\u0441\u0441\u044b_\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449_s3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:55,&amp;quot;range&amp;quot;:&amp;quot;42525-43699&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit56&quot; id=&quot;классы_хранилищ_s3_для_объектов_частого_доступа&quot;&gt;Классы хранилищ S3 для объектов частого доступа&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon S3 Standard&lt;/strong&gt; - дефолтный класс. Обеспечивает 11 девяток надежности и 4 девятки доступности. Данные реплицируются как минимум на три зоны доступности в регионе. &lt;br/&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u043b\u0430\u0441\u0441\u044b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 S3 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0447\u0430\u0441\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043b\u0430\u0441\u0441\u044b_\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449_s3_\u0434\u043b\u044f_\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432_\u0447\u0430\u0441\u0442\u043e\u0433\u043e_\u0434\u043e\u0441\u0442\u0443\u043f\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:56,&amp;quot;range&amp;quot;:&amp;quot;43700-44093&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit57&quot; id=&quot;классы_хранилищ_s3_для_нечастого_доступа&quot;&gt;Классы хранилищ S3 для нечастого доступа&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Хранение стоит дешевле, однако есть плата за извлечение. Минимальный размер обхекта - 128kB (То есть даже пустой файл занимает 128kB).
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Amazon S3 Standard Infrequent Access&lt;/strong&gt; (S3 Standard IA) - для хранения важных, но нечасто нужных данных. Идеальны для бекапов или &lt;strong&gt;Disaster Recovery&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Amazon S3 One Zone Infrequent Access&lt;/strong&gt; (S3 One Zone IA) - Данные хранятся только в одной AZ в регионе. Доступность падает до 99.5%. Если в зоне проблемы - данные могут быть некоторое время недоступны. Теоретически - возможны безвозвратные потери. Рекомендуется для вторых бекапов и восстановимых данных. &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u043b\u0430\u0441\u0441\u044b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 S3 \u0434\u043b\u044f \u043d\u0435\u0447\u0430\u0441\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043b\u0430\u0441\u0441\u044b_\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449_s3_\u0434\u043b\u044f_\u043d\u0435\u0447\u0430\u0441\u0442\u043e\u0433\u043e_\u0434\u043e\u0441\u0442\u0443\u043f\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:57,&amp;quot;range&amp;quot;:&amp;quot;44094-45138&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit58&quot; id=&quot;архивные_классы_хранилищ_s3&quot;&gt;Архивные классы хранилищ S3&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Не предполагают мгновенного доступа к данным, а доступ по запросу - извлечение может занимать от нескольких минут, до 12 часов и более.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Amazon Glacier&lt;/strong&gt; - для долговременного хранения и нечастого достап по запросу. Данные подготавливаются в течение нескольких часов (до 12).&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Amazon Glacier Deep Archive&lt;/strong&gt; - самый недорогой способ хранения старых данных. Извлечение может занимать 12 часов и более.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0410\u0440\u0445\u0438\u0432\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 S3&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0430\u0440\u0445\u0438\u0432\u043d\u044b\u0435_\u043a\u043b\u0430\u0441\u0441\u044b_\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449_s3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:58,&amp;quot;range&amp;quot;:&amp;quot;45139-45890&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit59&quot; id=&quot;amazon_intelligent_tiering&quot;&gt;Amazon Intelligent Tiering&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Класс хранилища &lt;strong&gt;Intelligent Tiering&lt;/strong&gt; мониторит частоту обращений к обектам и делает следующее:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Если объект не запрашивался 30 дней - его класс хранения изменяется на более дешевый &lt;strong&gt;Standard IA&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Опционально можно подключить и архивные классы хранения. Объекты не запрашиваемые 90 дней - переезжают в &lt;strong&gt;Amazon Glacier&lt;/strong&gt;. А после 180 дней - &lt;strong&gt;Glacier Deep Archive&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Intelligent Tiering&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_intelligent_tiering&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:59,&amp;quot;range&amp;quot;:&amp;quot;45891-46532&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit60&quot; id=&quot;s3_в_amazon_outposts&quot;&gt;S3 в Amazon Outposts&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Outposts&lt;/strong&gt; - 42U стойки с железом на площадке заказчика с AWS-совместимым набором управляющего софта. &lt;br/&gt;

При использовании аутпостов доступен еще один класс хранения - &lt;strong&gt;S3 Outposts&lt;/strong&gt;. &lt;br/&gt;

&lt;strong&gt;S3 Outposts&lt;/strong&gt; позволяет:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 хранить от 48 до 96 терабайт данных
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 до 100 бакетов на 1 аутпост
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;S3 \u0432 Amazon Outposts&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;s3_\u0432_amazon_outposts&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:60,&amp;quot;range&amp;quot;:&amp;quot;46533-47035&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit61&quot; id=&quot;aws_s3_versioning&quot;&gt;AWS S3 Versioning&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Защита от случайного (нежелательного) удаления/изменения объектов. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 По дефолту - выключена. Включается на уровне бакета для всех объектов в нем.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 При загрузке нового объекта с именем уже существующего - старый помечается как предыдущая версия, а новый - как текущая.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 При  удалении - фактически объект помечается как удаленный специальным маркером, но не удаляется. Для восстанволения - нужно просто удалить маркер.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Версионирование может быть выключено (дефолт), включено или включено, но приостановлено.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
После включения версионирования - выключить его невозможно. Но можно приостановить.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS S3 Versioning&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_s3_versioning&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:61,&amp;quot;range&amp;quot;:&amp;quot;47036-48155&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit62&quot; id=&quot;s3_replication&quot;&gt;S3 Replication&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Асинхронная репликация данных между бакетами бывает двух видов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Cross-Region Replication (CRR) - для обеспечения лучше йдоступности данных или отказоустойчивости
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Same-Region Replication (SRR) - для аггрегации данных из нескольких бакетов в один или репликациями между окружениями (dev - prod) 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Для работы репликации должно быть включено версионирование. &lt;br/&gt;

Реплицировать можно как бакеты одного аккаунта, так и между аккаунтами. Также - реплика может иметь другой класс хранения.&lt;br/&gt;

Можно реплицировать из одного бакета во многие. И наоборот - из многих - в один.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;S3 Replication&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;s3_replication&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:62,&amp;quot;range&amp;quot;:&amp;quot;48156-49156&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit63&quot; id=&quot;amazon_s3_lifecycle_management&quot;&gt;Amazon S3 Lifecycle Management&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Механизм оптимизации стоимости хранения данных. &lt;br/&gt;

Может быть применен к бакету или просто набору объектов с помощью префикса. &lt;br/&gt;

Настраиваются правила. Два типа действий:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 изменение класса хранилища в зависимости от востребованности данных
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 удаление, когда данные остаются невостребованными по истечение некоторого срока
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon S3 Lifecycle Management&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_s3_lifecycle_management&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:63,&amp;quot;range&amp;quot;:&amp;quot;49157-49798&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit64&quot; id=&quot;шифрование_s3&quot;&gt;Шифрование S3&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Данные могут храниться в зашифрованном виде. &lt;br/&gt;

Шифрование может происходить как на стороне клиента, так и на стороне сервера Amazon S3. &lt;br/&gt;

При шифровании на стороне клиента - все заботы о шифровании/дешифровании лежат на клиенте. &lt;br/&gt;

при шифровании на стороне сервера возможны три взаимоисключающих механизма:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Server-side Encryption&lt;/strong&gt; with &lt;strong&gt;Amazon S3 Managed Keys&lt;/strong&gt; - &lt;strong&gt;SSE-S3&lt;/strong&gt;. Каждый объект шифруется уникальным ключем, а ключи в свою очередь шифруются &lt;strong&gt;master&lt;/strong&gt;-ключем. AWS автоматически управляет ключами и ротирует их.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Server-side Encryption&lt;/strong&gt; with &lt;strong&gt;Customer Managed Keys&lt;/strong&gt; - &lt;strong&gt;SSE-CMKs&lt;/strong&gt;. Ключи хранятся в &lt;strong&gt;AWS Key Management Service&lt;/strong&gt; (SSE-KMS). То же самое, что и SSE-S3, только можно управлять ключами и аудировать их использование. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Server-side Encryption&lt;/strong&gt; with &lt;strong&gt;Customer Provided Keys&lt;/strong&gt; - &lt;strong&gt;SSE-CPKs&lt;/strong&gt;. Amazon S3 шифрует данные с помощью предоставленных клиентом ключей. Идеально для соотвествия регуляторным требованиям.  
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 S3&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435_s3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:64,&amp;quot;range&amp;quot;:&amp;quot;49799-51325&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit65&quot; id=&quot;хостинг_статических_ресурсов_на_aws_s3&quot;&gt;Хостинг статических ресурсов на AWS S3&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Файлики можно хостить на S3, предоставляя к ним анонимный доступ. &lt;br/&gt;

Таким образом можно хостить как просто файлы, так и целые сайты. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0425\u043e\u0441\u0442\u0438\u043d\u0433 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 AWS S3&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0445\u043e\u0441\u0442\u0438\u043d\u0433_\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445_\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432_\u043d\u0430_aws_s3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:65,&amp;quot;range&amp;quot;:&amp;quot;51326-51644&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit66&quot; id=&quot;amazon_s3_transfer_acceleration_-_s3ta&quot;&gt;Amazon S3 Transfer Acceleration - S3TA&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Позволяет ускорить доступ клиентов к объектам в AWS S3 с помощью &lt;strong&gt;Amazon Cloud Front Edge Locations&lt;/strong&gt; - точек доступа к AWS S3 (как на аплоад, так и на скачивание). &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon S3 Transfer Acceleration - S3TA&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_s3_transfer_acceleration_-_s3ta&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:66,&amp;quot;range&amp;quot;:&amp;quot;51645-51954&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit67&quot; id=&quot;amazon_glacier&quot;&gt;Amazon Glacier&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Хранит данные в виде архивов zip или tar. &lt;br/&gt;

В одном архиве может быть либо один либо несколько объектов. &lt;br/&gt;

Размер одного архива - до  40 ТБ (при том что один объект может быть размером до 5ТБ). &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Glacier&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_glacier&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:67,&amp;quot;range&amp;quot;:&amp;quot;51955-52320&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit68&quot; id=&quot;amazon_storage_gateway&quot;&gt;Amazon Storage Gateway&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Программное решение (виртуалка). Таже доступно в виде предконфигурированного физического сервера.&lt;br/&gt;

Обеспечивает прозрачный доступ к данным на инфрраструктуре AWS S3. &lt;br/&gt;

Виртуалки устанавливаются на стороне заказчика, а для доступа к данным серверы заказчика обращаются по протоколам:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;NFS/SMB&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Virtual Transport Layer (VTL)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;iSCSI&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Сам &lt;strong&gt;Amazon Storage Gateway&lt;/strong&gt; подключается к AWS S3 через интернет с помощью &lt;strong&gt;IPSec VPN&lt;/strong&gt; или &lt;strong&gt;AWS Direct Connect&lt;/strong&gt;.
Сценарии использования:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;File Gateway&lt;/strong&gt; - позволяет обращаться к файлам по протоколу &lt;strong&gt;SMB/NFS&lt;/strong&gt;. Данные также кешируются локально. Хранятся либо в &lt;strong&gt;AWS S3&lt;/strong&gt;, либо - &lt;strong&gt;Amazon FSx&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Volume Gateway&lt;/strong&gt; - позволяет создавать тома, доступные по &lt;strong&gt;iSCSI&lt;/strong&gt;. Может работать в режимах &lt;strong&gt;Cache mode&lt;/strong&gt;, когда локально хранятся только “горячие данные” остальное ассинхронно реплицируется на S3. &lt;strong&gt;Stored Mode&lt;/strong&gt; - все данные тома хранятся локально и ассинхронно реплицируются на S3 для бекапа. &lt;strong&gt;Tape Gateway&lt;/strong&gt; - предоставляет интерфейс к виртуальным ленточным библиотекам для бекапов (которые лежат на S3).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Storage Gateway&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_storage_gateway&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:68,&amp;quot;range&amp;quot;:&amp;quot;52321-54086&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit69&quot; id=&quot;миграция_больших_объемов_данных&quot;&gt;Миграция больших объемов данных&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Иногда данных много и залить их через интернет в облако невозможно.&lt;br/&gt;

Тогда на помощь приходят продукты &lt;strong&gt;Snow Family&lt;/strong&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f_\u0431\u043e\u043b\u044c\u0448\u0438\u0445_\u043e\u0431\u044a\u0435\u043c\u043e\u0432_\u0434\u0430\u043d\u043d\u044b\u0445&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:69,&amp;quot;range&amp;quot;:&amp;quot;54087-54366&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit70&quot; id=&quot;amazon_snowball&quot;&gt;Amazon SnowBall&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Программно-аппаратные комплексы двух видов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;SnowBall Edge Computing Optimized&lt;/strong&gt; - для обработки данных перед миграцией. 52vCPU, 208Gb Ram, опционально Nvidia Tesla, 42Tb HDD, 7.68 SSD. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;SnowBall Edge Storage Optimized&lt;/strong&gt; - чисто для данных. 80Тб HDD, 1Tb SSD, 40vCPU, 80Gb RAM
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon SnowBall&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_snowball&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:70,&amp;quot;range&amp;quot;:&amp;quot;54367-54778&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit71&quot; id=&quot;amazon_snowcone&quot;&gt;Amazon SnowCone&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Малленький девайс. 2 кг. 8Тб диск, пара ядер CPU и 4 Gb RAM.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon SnowCone&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_snowcone&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:71,&amp;quot;range&amp;quot;:&amp;quot;54779-54899&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit72&quot; id=&quot;amazon_snowmobile&quot;&gt;Amazon SnowMobile&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для эксабайтных масштабов. &lt;br/&gt;

Приезжает 45-футовый защищенный контейнер. &lt;br/&gt;

До 100 Петабайт данных. С полной технической поддержкой миграции. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon SnowMobile&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_snowmobile&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:72,&amp;quot;range&amp;quot;:&amp;quot;54900-55183&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit73&quot; id=&quot;сетевые_сервисы_aws_-_vpc_route53_cloudfront&quot;&gt;6. Сетевые сервисы AWS - VPC, Route53, CloudFront&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;6. \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b AWS - VPC, Route53, CloudFront&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u0442\u0435\u0432\u044b\u0435_\u0441\u0435\u0440\u0432\u0438\u0441\u044b_aws_-_vpc_route53_cloudfront&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:73,&amp;quot;range&amp;quot;:&amp;quot;55184-55261&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit74&quot; id=&quot;vpc&quot;&gt;VPC&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
AWS VPC - это виртуальная облачная сеть. &lt;br/&gt;

Область действия VPC - в пределах Региона AWS. То есть ресурсы могут размещаться в любой AZ региона. &lt;br/&gt;

При создании VPC нужно задать один из диапазонов адресов для частных сетей. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;VPC&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;vpc&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:74,&amp;quot;range&amp;quot;:&amp;quot;55262-55664&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit75&quot; id=&quot;подсети_vpc_subnets&quot;&gt;Подсети VPC (Subnets)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Внутри VPC должны быть созданы подсети с непересекающимися диапазонами адресов. &lt;br/&gt;

То есть если VPC назначен CIDR 10.0.0.0/16, то подсети могут иметь CIDR - 10.0.1.0/24 и 10.0.2.0/24 . &lt;br/&gt;

Каждая подсеть существует в пределах одной зоны доступности (AZ). &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u0434\u0441\u0435\u0442\u0438 VPC (Subnets)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u0434\u0441\u0435\u0442\u0438_vpc_subnets&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:75,&amp;quot;range&amp;quot;:&amp;quot;55665-56117&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit76&quot; id=&quot;доступ_в_internet&quot;&gt;Доступ в Internet&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
У дефолтных VPC и подсетей доступ в интернеты есть. &lt;br/&gt;

Чтобы у кастомных VPC был доступ в интернет - должен быть задеплоен шлюз (&lt;strong&gt;internet gateway&lt;/strong&gt;) и соответствующие маршруты. &lt;br/&gt;

С публичными адресами история такая:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 автоматически назначаемые публичные адреса нестатичны и могут меняться после рестарта машины.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 если динамические публичные адреса не подходят, то нужно прописывать &lt;strong&gt;Elastic IP Address&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u0441\u0442\u0443\u043f \u0432 Internet&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u0441\u0442\u0443\u043f_\u0432_internet&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:76,&amp;quot;range&amp;quot;:&amp;quot;56118-56857&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit77&quot; id=&quot;elastic_ip_address&quot;&gt;Elastic IP Address&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Статичные. Существуют пока существует аккаунт.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Могут быть переданы от одного инстанса EC2 к другому. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Бесплатны, но только пока запущена машина EC2 с этим адресом. Если инстанс остановлен - за адрес взымается почасовая оплата.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Elastic IP Address&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;elastic_ip_address&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:77,&amp;quot;range&amp;quot;:&amp;quot;56858-57304&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit78&quot; id=&quot;vpc_security&quot;&gt;VPC Security&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Обеспечение безопасности - одна из основных функций VPC. &lt;br/&gt;

Достигается - правилами файерволов, отделяющих одни подсети от других. &lt;br/&gt;

Имеются два механизма реализации безопасности:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Security Groups
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Network Access Control Lists (NACLs)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;VPC Security&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;vpc_security&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:78,&amp;quot;range&amp;quot;:&amp;quot;57305-57714&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit79&quot; id=&quot;security_groups&quot;&gt;Security Groups&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Это наборы правил файервола для входящего и исходящего трафика, которые привязываются к инстансам EC2. &lt;br/&gt;

Работают именно на уровне инстансов, но не подсетей. &lt;br/&gt;

К каждому инстансу должна быть привязана хотя бы одна &lt;strong&gt;Security Group&lt;/strong&gt;. &lt;br/&gt;

Максимум можно привязать пять &lt;strong&gt;Security Group&lt;/strong&gt; к одному инстансу &lt;strong&gt;EC2&lt;/strong&gt;. &lt;br/&gt;

Дефолтные &lt;strong&gt;Security Group&lt;/strong&gt; разрешают любые исходящие подключения, а входящие подключения только от инстансов с такой же &lt;strong&gt;Security Group&lt;/strong&gt;. &lt;br/&gt;

Важно понимать, что &lt;strong&gt;Security Groups&lt;/strong&gt; являются &lt;strong&gt;statefull&lt;/strong&gt;, что означает что если разрешен входящий трафик к какому-то сервису, то автоматически разрешается и ответный (исходящий) трафик сервиса, независимо от явно заданных исходящих разрешений. &lt;br/&gt;

Несколько важных свойств &lt;strong&gt;Security Groups&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Конфигурируются только правила &lt;strong&gt;allow&lt;/strong&gt;. Правил &lt;strong&gt;deny&lt;/strong&gt; просто нету.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Отдельные правила для входящего и исходящего трафика.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Трафик фильтруется по протоколам и портам.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В правилах в качестве &lt;strong&gt;source&lt;/strong&gt;/&lt;strong&gt;destination&lt;/strong&gt; могут быть заданы как диапазоны IP-адресов, так и другие &lt;strong&gt;Security Groups&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Security Groups&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;security_groups&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:79,&amp;quot;range&amp;quot;:&amp;quot;57715-59502&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit80&quot; id=&quot;network_access_control_lists_nacls&quot;&gt;Network Access Control Lists (NACLs)&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Это другой тип правил файервола - ограничивает трафик к целым подсетям. &lt;br/&gt;

По-дефолту - разрешено всё, поскольку ограничения действуют на уровне &lt;strong&gt;Security Groups&lt;/strong&gt; &lt;br/&gt;

Не являются &lt;strong&gt;statefull&lt;/strong&gt;, что означает необходимость явно конфигурировать как правила для входящего трафика к сервисам, так и ответного исходящего от сервисов. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Network Access Control Lists (NACLs)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;network_access_control_lists_nacls&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:80,&amp;quot;range&amp;quot;:&amp;quot;59503-60121&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit81&quot; id=&quot;трансляция_адресов_-_nat&quot;&gt;Трансляция адресов - NAT&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для предоставления доступа в интернет для инстансов, работающих в непубличных (не имеющих прямой связи с интернетом) сетях используется NAT. &lt;br/&gt;

Сервис NAT должен быть помещен в публичную сеть и иметь &lt;strong&gt;Elastic IP&lt;/strong&gt;. &lt;br/&gt;

Должны быть сконфигурированы соответсвующие маршруты. &lt;br/&gt;

Если инстансы используют IPv6, то доступ в интернет для них настраивается с помощью &lt;strong&gt;egress-only internet gateway&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u0432 - NAT&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f_\u0430\u0434\u0440\u0435\u0441\u043e\u0432_-_nat&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:81,&amp;quot;range&amp;quot;:&amp;quot;60122-60840&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit82&quot; id=&quot;связь_между_разными_vpc_-_vpc_peering&quot;&gt;Связь между разными VPC - VPC peering&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для быстрого взаимодействия между сервисами из разных VPC можно настроить &lt;strong&gt;VPC peering&lt;/strong&gt;. &lt;br/&gt;

В этом случае - трафик не ходит через относительно медленный интернет, а ходит по быстрым и надежным внутренним каналам AWS. &lt;br/&gt;

Пиринг может быть настроен как между VPC в одном аккаунте, так для VPC из разных аккаунтов. Как в пределах одного региона, так и между регионами. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 VPC - VPC peering&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0432\u044f\u0437\u044c_\u043c\u0435\u0436\u0434\u0443_\u0440\u0430\u0437\u043d\u044b\u043c\u0438_vpc_-_vpc_peering&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:82,&amp;quot;range&amp;quot;:&amp;quot;60841-61548&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit83&quot; id=&quot;vpc_tansit_gateway&quot;&gt;VPC tansit gateway&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Если число взаимодейтсвующих VPC больше двух, то сетевая топология может быть довольно сложной. &lt;br/&gt;

Для ее упрощения существует &lt;strong&gt;VPC transit gateway&lt;/strong&gt;, реализующий топологию “звезда”. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;VPC tansit gateway&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;vpc_tansit_gateway&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:83,&amp;quot;range&amp;quot;:&amp;quot;61549-61891&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit84&quot; id=&quot;virtual_private_networks_-_vpn&quot;&gt;Virtual Private Networks - VPN&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
К инфраструктуре AWS можно подключить &lt;strong&gt;on-premise&lt;/strong&gt; ресурсы с помощью &lt;strong&gt;IPSec VPN&lt;/strong&gt;. &lt;br/&gt;

Для этого надо создать и настроить &lt;strong&gt;Virtual Private Gateway&lt;/strong&gt; и подключить его к &lt;strong&gt;VPC&lt;/strong&gt;. &lt;br/&gt;

На стороне on-premise поддерживаются различное оборудование - Cisco, Juniper, Check Point и прочие. &lt;br/&gt;

После настройки собственно канала - нужно настроить маршруты. &lt;br/&gt;

Существует аппаратное ограничение на скорость зашифрованного IPSec VPN - &lt;strong&gt;1.26 Gbps&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Virtual Private Networks - VPN&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;virtual_private_networks_-_vpn&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:84,&amp;quot;range&amp;quot;:&amp;quot;61892-62619&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit85&quot; id=&quot;aws_direct_connect&quot;&gt;AWS Direct Connect&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Способ подключения &lt;strong&gt;on-premise&lt;/strong&gt; инфраструктуры &lt;strong&gt;AWS&lt;/strong&gt; по выделенным каналам. &lt;br/&gt;

Это дорого и круто - прокладывается оптика до ближайшего узла партнеров &lt;strong&gt;Amazon Direct Connect&lt;/strong&gt;. &lt;br/&gt;

Доступны скорости подключения до 100 Gbps. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Direct Connect&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_direct_connect&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:85,&amp;quot;range&amp;quot;:&amp;quot;62620-63020&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit86&quot; id=&quot;aws_route53_-_глобальный_dns_и_роутинг&quot;&gt;AWS Route53 - глобальный DNS и роутинг&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Основные функции &lt;strong&gt;AWS Route53&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Регистрация доменных имен
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-роутинг
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Health-чеки
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Route53 - \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 DNS \u0438 \u0440\u043e\u0443\u0442\u0438\u043d\u0433&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_route53_-_\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439_dns_\u0438_\u0440\u043e\u0443\u0442\u0438\u043d\u0433&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:86,&amp;quot;range&amp;quot;:&amp;quot;63021-63235&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit87&quot; id=&quot;регистрация_доменных_имен&quot;&gt;Регистрация доменных имен&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
При регистраии приобретается временное право использования доменых имен. &lt;br/&gt;

После регистрации неоходимо создать записи, указывающие на ресурсы. &lt;br/&gt;

При создании записей необходимо выбрать файл зоны, куда бдут помещены записи. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u043d&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f_\u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445_\u0438\u043c\u0435\u043d&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:87,&amp;quot;range&amp;quot;:&amp;quot;63236-63710&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit88&quot; id=&quot;hosted_dns-зоны_route53&quot;&gt;Hosted DNS-зоны Route53&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для создания &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-записей, указывающих на ресурсы надо создать &lt;strong&gt;Hosted Zone&lt;/strong&gt;. &lt;br/&gt;

&lt;strong&gt;Hosted Zone&lt;/strong&gt; - это контейнер для хранения записей и управления ими. &lt;br/&gt;

Существует два типа зон &lt;strong&gt;AWS Route53&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Public hosted zone&lt;/strong&gt; - зоны доступные из интернета и предназначены для роутинга входящего трафика из интернета.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Private hosted zone&lt;/strong&gt; - частные зоны доступные только внутри VPC.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Hosted DNS-\u0437\u043e\u043d\u044b Route53&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;hosted_dns-\u0437\u043e\u043d\u044b_route53&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:88,&amp;quot;range&amp;quot;:&amp;quot;63711-64357&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit89&quot; id=&quot;dns-имена_ресурсов_aws&quot;&gt;DNS-имена ресурсов AWS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
При создании ресурса он получает &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-имя, которое доступно с помощью &lt;strong&gt;Amazon Route53 Resolver&lt;/strong&gt;. &lt;br/&gt;

Существуют два типа &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-записей ресурсов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Private &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; hostnames&lt;/strong&gt; - указывают на приватный IP-адрес ресурса внутри VPC. Имеют вид - &lt;strong&gt;ipv4-private-address.ec2.internal&lt;/strong&gt; (в &lt;strong&gt;us-east-1&lt;/strong&gt;) и &lt;strong&gt;ipv4-private-address.region.compute.internal&lt;/strong&gt; (в остальных регионах).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Public &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; hostnames&lt;/strong&gt; - указывают на публичный IP-адрес ресурса в интернете. Имеют вид - &lt;strong&gt;ipv4-public-address.compute-1.amazonaws.com&lt;/strong&gt; (в &lt;strong&gt;us-east-1&lt;/strong&gt;) и &lt;strong&gt;ipv4-public-address.region.compute.amazonaws.com&lt;/strong&gt; (в остальных регионах).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;DNS-\u0438\u043c\u0435\u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;dns-\u0438\u043c\u0435\u043d\u0430_\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:89,&amp;quot;range&amp;quot;:&amp;quot;64358-65237&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit90&quot; id=&quot;политики_маршрутизации_route53&quot;&gt;Политики маршрутизации Route53&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Simple routing policy&lt;/strong&gt; - один ресурс, одна запись. Состояние ресурсов не контролируется
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Failover routing policy&lt;/strong&gt; - Одна запись указывает на несколько (основной и резервные) экземпляры ресурсов, а их состояние контролируется health-чеками. Схема &lt;strong&gt;Active-Passive&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Geolocation Routing Policy&lt;/strong&gt; - При поступлении &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-запроса от клиента - по его IP определяется его географическое положение и он направляется на блжайший к нему ресурс. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Latency Routing Policy&lt;/strong&gt; - маршрутизация на основе сетевых задержек. Позволяет обеспечить доступ к ресурсам с минимальными задержками.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Weighted routing policy&lt;/strong&gt; - позволяет направить указанные доли запросов на заданные ресурсы. Используется для регулирования нагрузок при миграциях. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 Route53&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438_\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438_route53&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:90,&amp;quot;range&amp;quot;:&amp;quot;65238-66512&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit91&quot; id=&quot;health_checks&quot;&gt;Health Checks&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Проверки состояния ресурсов. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Проверки состояния эндпонитов&lt;/strong&gt;. Мониторят указанный эндпоинт (&lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-имя или ip-адрес)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Проверки состония других health-чеков&lt;/strong&gt;. Проверка общего состояния пула ресурсов. Позволяют задать пороговые значения доступности для группы эндпоинтов и выполнять действия, если количество работоспособных эндпоинтов ниже заданного. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Реакция на события CloudWatch&lt;/strong&gt; - Cloudwatch может мониторить метрики приложений (например - количество доступных инстансов за балансировщиком). В свою очередь - Route53 может мониторить тот же поток данных, что и CloudWatch и независимо от него реагировать (например - помечать ресурс как unhealthy в зависимости от количества доступных метрик). Для реакции даже не обязательно, чтобы CloudWatch переходил в состояние Alarm - Route53 анализирует данные и  автономно.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Health Checks&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;health_checks&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:91,&amp;quot;range&amp;quot;:&amp;quot;66513-67975&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit92&quot; id=&quot;политики_обработки_трафика_-_traffic_flow_policies&quot;&gt;Политики обработки трафика - Traffic flow policies&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Политики роутинга могут быть довольно сложными. &lt;br/&gt;

Например - можно по &lt;strong&gt;Latency&lt;/strong&gt; роутить трафик между несколькими регионами, затем - по &lt;strong&gt;Weighted&lt;/strong&gt; между инстансами. &lt;br/&gt;

Каждая такая конфигурация - является собственно &lt;strong&gt;политикой траффика&lt;/strong&gt;, которая создается с помощью визуального редактора &lt;strong&gt;Route53&lt;/strong&gt;. &lt;br/&gt;

Важно понимать, что политики трафика Route53 могут быть созданы только для публичных &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-зон. &lt;br/&gt;

Дополнительно к основным политикам доступны следующие:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Geoproximity routing policy&lt;/strong&gt; - роутинг трафика в зависимости от географического расположения ресурсов и клиентов.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Route53 Resolver&lt;/strong&gt; - позволяет создавать правила и форвардить запросы получаемые &lt;strong&gt;Route53 &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;&lt;/strong&gt; на &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-серверы &lt;strong&gt;on-premise&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 - Traffic flow policies&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438_\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438_\u0442\u0440\u0430\u0444\u0438\u043a\u0430_-_traffic_flow_policies&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:92,&amp;quot;range&amp;quot;:&amp;quot;67976-69246&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit93&quot; id=&quot;организация_cdn_с_помощью_amazon_cloudfront&quot;&gt;Организация CDN с помощью Amazon CloudFront&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon CloudFront&lt;/strong&gt; предоставляет инструменты для организации динамической сети распространения контента &lt;strong&gt;CDN&lt;/strong&gt;. &lt;br/&gt;

Запрашиваемые объекты доставляются с помощью &lt;strong&gt;Edge Locations&lt;/strong&gt; (и кешируются там), расположенных наиболее близко к клиенту. &lt;br/&gt;

Для включения этого функционала надо создать &lt;strong&gt;distribution endpoint&lt;/strong&gt; и задать источник (бакет S3, инстанс ec2, балансер) и тип контента. &lt;br/&gt;

В результате получится &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt; (HTTP или HTTPS), который можно отдавать пользователям. &lt;br/&gt;

Контент может быть:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 статика (&lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;, &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;, JS, картинки)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Видео в различных форматах
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Live-контент - видеоконференции и прочее.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f CDN \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Amazon CloudFront&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f_cdn_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_amazon_cloudfront&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:93,&amp;quot;range&amp;quot;:&amp;quot;69247-70324&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit94&quot; id=&quot;выбор_класса_для_cloudfront_distribution&quot;&gt;Выбор класса для CloudFront distribution&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Стоимость дистрибуци трафика зависит от качества инфраструктуры в регионе.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Дефолтный и самый дорогой класс дистрибуции - глобальный, когда контент может быть кеширован на любом из существующих EdgeLocation.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Второй по стоимости класс включает только регионы USA,Canada, Europe, Hong Kong, Philippines, South Korea, Taiwan, Singapore, Japan, India, South Africa, Middle East.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Самый недорогой класс включает только регионы - USA, Canada, Europe.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u044b\u0431\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f CloudFront distribution&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u044b\u0431\u043e\u0440_\u043a\u043b\u0430\u0441\u0441\u0430_\u0434\u043b\u044f_cloudfront_distribution&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:94,&amp;quot;range&amp;quot;:&amp;quot;70325-71092&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit95&quot; id=&quot;amazon_api_gateway&quot;&gt;Amazon API Gateway&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Managed&lt;/strong&gt;-сервис для создания быстрых и безопасных &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;, предоставляющих доступ к облачным ресурсам - базам данных, микросервисам, Lambda-функциям и прочим. &lt;br/&gt;

&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; создается путем описания высокроуровневых абстракций. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon API Gateway&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_api_gateway&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:95,&amp;quot;range&amp;quot;:&amp;quot;71093-71507&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit96&quot; id=&quot;aws_compute_services&quot;&gt;7. AWS Compute Services&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;7. AWS Compute Services&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_compute_services&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:96,&amp;quot;range&amp;quot;:&amp;quot;71508-71545&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit97&quot; id=&quot;инстансы_ec2&quot;&gt;Инстансы EC2&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Инстансы делятся на:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 семейства (&lt;strong&gt;family&lt;/strong&gt;) - по типу нагрузки. Например - &lt;strong&gt;general-purpose&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В пределах семейства существуют типы (&lt;strong&gt;types&lt;/strong&gt;) - определяющие конкретные свойства предоставляемого аппаратного обеспечения. Например - &lt;strong&gt;T2&lt;/strong&gt; или &lt;strong&gt;M5&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В пределах каждого типа доступны разные размеры (&lt;strong&gt;sizes&lt;/strong&gt;) - определяющие конкретные объемы предоставляемых ресурсов. Например - &lt;strong&gt;t2.micro&lt;/strong&gt; (1vCPU, 1GiB RAM) или &lt;strong&gt;t2.xlarge&lt;/strong&gt; (4vCPU, 16GiB).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Инстансы привязаны к конкретным зонам доступности (AZ). То есть при создании инстанса нужно указать подсеть VPC, которая как раз и привязана к AZ.  &lt;br/&gt;

Каждый инстан может иметь:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 один или несколько дисков (томов) &lt;strong&gt;EBS (Elastic Block Storage)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 один или несколько сетевых адаптеров (&lt;strong&gt;NICs&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
При создании инстанса используеся какой-то образ ОС - &lt;strong&gt;Amazon Machine Image&lt;/strong&gt; &lt;strong&gt;(AMI)&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u043d\u0441\u0442\u0430\u043d\u0441\u044b EC2&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b_ec2&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:97,&amp;quot;range&amp;quot;:&amp;quot;71546-72925&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit98&quot; id=&quot;семейства_инстансов&quot;&gt;Семейства инстансов&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;General Purpose&lt;/strong&gt; - сбалансированные конфигурации для различных нагрузок.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Compute Optimized&lt;/strong&gt; - для высокопроизводительных вычислений. HPC.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Memory Optimized&lt;/strong&gt; - оптимизированы для нагрузок, активно использующих оперативную память.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Accelerated Computing&lt;/strong&gt; - инстансы с аппаратными ускорителями (GPU и другие).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Storage Optimized&lt;/strong&gt; - оптимизированы для нагрузок, требующих больших объемов и постоянной высокой пропускной способности локального хранилища.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Также доступны выделенные виртуалки и хосты - &lt;strong&gt;Dedicated Instances&lt;/strong&gt; и &lt;strong&gt;Dedicated Hosts&lt;/strong&gt;. Они нужны для соответствя регулятивным нормам, когда недопустима работа ПО на разделямых аппаратных ресурсах.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Dedicated Instances&lt;/strong&gt; - виртуалки, работающие на хосте, который используется только одним заказчиком.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Dedicated Hosts&lt;/strong&gt; - хост, используемый только одник заказчиком. Может быть полезен, когда прикладное ПО лицензируется на каждый процессор или сокет.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430_\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:98,&amp;quot;range&amp;quot;:&amp;quot;72926-74527&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit99&quot; id=&quot;amazon_machine_images_amis&quot;&gt;Amazon Machine Images (AMIs)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AMIs&lt;/strong&gt; - образы дисков виртуальных машин. &lt;br/&gt;

Бывают двух типов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 снепшот диска &lt;strong&gt;EBS&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 целиком инстанс (Instance). Например AMI macOS будет в виде аппаратного Mac-mini. &lt;br/&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Если в составе &lt;strong&gt;AMI&lt;/strong&gt; есть лицензируемуе ПО, то стоимость лицензии входит в стоимость эксплуатации инстанса. &lt;br/&gt;

AMI существуют в пределах региона. То есть если нужно создать инстанс с заданным AMI - то этот AMI должен существовать в этом регионе. Однако - AMI можно копировать между регионами. &lt;br/&gt;

Источники AMI:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS Marketplace&lt;/strong&gt; - образы, поддерживаемые AWS. В том числе и от внешних вендоров - Citrix, F5, Oracle и других. Стоимость инстанса складывается из стоимости собственно аппаратуры инстанса EС2 и стоимости лиценции ПО.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Community AMIs&lt;/strong&gt; - образы, соданные сообществом. Поставляются as-is.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Можно создавать свои AMI для быстрого разворачивания и распространять их.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Machine Images (AMIs)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_machine_images_amis&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:99,&amp;quot;range&amp;quot;:&amp;quot;74528-76008&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit100&quot; id=&quot;amazon_elastic_block_storage&quot;&gt;Amazon Elastic Block Storage&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Тома подключаются к инстансам как правило по iSCSI. &lt;br/&gt;

Тома независят от инстансов и могут быть отсоединены и присоединены к другому инстансу. &lt;br/&gt;

Можно создавать снепшоты. Первый - полный, последующие - инкрементные. Снепшоты можно копировать между регионами и между аккаунтами. &lt;br/&gt;

&lt;br/&gt;

Есть две категории дисков EBS:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; SSD - ориентированы на высокие IOPS &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; HDD - могут дать высокую линейную скорость.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;br/&gt;

В свою очередь SSD также имеют типы:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;gp2&lt;/strong&gt; - дефолтный тип. Подходит для большинства нагрузок. Размеры - от 1GB до 16TB. До 16000 IOPS. Надежность 99.9%. Минимальный уровень производительности - 3 IOPS/&lt;abbr title=&quot;Gigabyte&quot;&gt;GB&lt;/abbr&gt;, минимум - 100IOPS, Масимум - 3000 IOPS для томов меньше 1TB. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;gp3&lt;/strong&gt; - более новая версия general-purpose томов. Обеспечивает 3000 IOPS и 125MB/s для томов любого размера. За дополнительную плату можно получить 16000 IOPS. Размеры - от 1GB до 16TB. Отлично подходит для SQL-баз данных. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;io1&lt;/strong&gt; - Быстрые SSD-диски. Размеры - от 4GB до 16TB. От 50 IOPS/&lt;abbr title=&quot;Gigabyte&quot;&gt;GB&lt;/abbr&gt;, до 64000 IOPS. До 1000 &lt;abbr title=&quot;Megabyte&quot;&gt;MB&lt;/abbr&gt;/s. Максимум производительности достижим для инстансов на базе &lt;strong&gt;AWS Nitro&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;io2&lt;/strong&gt; - последняя версия SSD EBS томов. 100X надежности (99.999%) и 10X производительноси - 500 IOPS/&lt;abbr title=&quot;Gigabyte&quot;&gt;GB&lt;/abbr&gt; Размеры - от 4GB до 16TB. Хорош для любых высоких нагрузок. До 64000 IOPS и 1000 &lt;abbr title=&quot;Megabyte&quot;&gt;MB&lt;/abbr&gt;/s для инстансов на базе &lt;strong&gt;AWS Nitro&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;io2 Block Express&lt;/strong&gt; - 4X относительно &lt;strong&gt;io2&lt;/strong&gt;. 4000 &lt;abbr title=&quot;Megabyte&quot;&gt;MB&lt;/abbr&gt;/s, 256000 IOPS, 1000 IOPS/&lt;abbr title=&quot;Gigabyte&quot;&gt;GB&lt;/abbr&gt;. Размеры - от 4GB до 16TB. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;br/&gt;

HDD представлены типами:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;st1&lt;/strong&gt; - low-cost HDD. При базовой производительности 40 &lt;abbr title=&quot;Megabyte&quot;&gt;MB&lt;/abbr&gt;/s на 1TB, могут выдавать до 250 &lt;abbr title=&quot;Megabyte&quot;&gt;MB&lt;/abbr&gt;/s на 1 TB объема. Максимальная скорость - до 500 Mb/s. Размеры - от 125GB до 16TB. Не могут быть  загрузочными томами. Типичные нагрузки - MapReduce, Kafka, логи и прочее.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;sc1&lt;/strong&gt; - Cold HDD. Самый медленные и дешевые тома. В базе выдают 12 МB/s на 1 TB объема. До 80 &lt;abbr title=&quot;Megabyte&quot;&gt;MB&lt;/abbr&gt;/s на 1 TB. Максимальная скорость - до 250 Mb/s. Размеры - от 125GB до 16TB. Не могут быть  загрузочными томами.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Elastic Block Storage&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_elastic_block_storage&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:100,&amp;quot;range&amp;quot;:&amp;quot;76009-79071&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit101&quot; id=&quot;тома_aws_ec2_instance_store_ephemeral_storage&quot;&gt;Тома AWS EC2 Instance store (Ephemeral storage)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Еще один тип хранилища - &lt;strong&gt;instance store&lt;/strong&gt; представляет собой &lt;strong&gt;временный&lt;/strong&gt; диск, размещенный на локальном диске фзического хоста, на котором работает инстанс EC2. &lt;br/&gt;

При выключении машины - этот том уничтожается, а при старте - снова создается (поскольку машина практически никогда повторно не стартует на том же хосте). &lt;br/&gt;

Такми образом - &lt;strong&gt;instance store&lt;/strong&gt; - это временное хранилище, обеспечивающее минимальные задержки, по сравнению с EBS (который всегда SAN). &lt;br/&gt;

Важно понимать, что перезагрузка инстанса не приводит к уничтожению ланных на &lt;strong&gt;instance store&lt;/strong&gt;, поскольку в этом случае машина остается запущенной на прежнем хосте и не переезжает на новый. &lt;br/&gt;

Надежность &lt;strong&gt;instance store&lt;/strong&gt; - не гарантируется. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u043e\u043c\u0430 AWS EC2 Instance store (Ephemeral storage)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u043e\u043c\u0430_aws_ec2_instance_store_ephemeral_storage&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:101,&amp;quot;range&amp;quot;:&amp;quot;79072-80351&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit102&quot; id=&quot;цены_на_инстансы_ec2&quot;&gt;Цены на инстансы EC2&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Принципы ценообразования:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;On-Demand&lt;/strong&gt; - дефолтная опция. Почасовая оплата за время работы инстанса. При прочих равных - самый дорогой вариант, в случае использования 24*7*365. &lt;br/&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Reserved Instance&lt;/strong&gt; - дает большие скидосы (до 72% по сравнению с &lt;strong&gt;On-Demand&lt;/strong&gt;). Фактически - это ценовое соглашение, которое дает право на запуск инстанса оговоренной конфигурации в заданном регионе течение оговоренного срока (1 или три года) по зафиксированной сниженной цене. Как только запускается инстанс подходящий под параметры соглашения - на него действует оговоренная в соглашении цена. Само заключние соглашения предполагает некоторую плату, независимо от того создаются ли подподающие под него инстансы или нет.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;br/&gt;

Для &lt;strong&gt;Reserved Instance&lt;/strong&gt; доступны две опции:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Standard Reserved Pricing&lt;/strong&gt; - самые крупные скидки (до 72%) на срок 1 или 3 года. Некоторые параметры инстансов можно менять - AZ, размер, тип сети.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Convertible Reserved Pricing&lt;/strong&gt; - скидки до 54%, по сравнению с On-Demand. Можно менять семейство машинок, ОС и другие параметры. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Также - для &lt;strong&gt;Reserved Instance&lt;/strong&gt; доступны скидки в зависимости от предоплаты:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;All Upfront&lt;/strong&gt; - оплата за весь срок соглашения вперед. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Partial Upfront&lt;/strong&gt; - частичная оплата вперед с последующей сниженной почасовой. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;No Upfront&lt;/strong&gt; - без оплаты вперед, с почасовой оплатой, но по-прежнему с некоторыми скидками относительно &lt;strong&gt;On-Demand&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Ненужные &lt;strong&gt;Reserved&lt;/strong&gt;-инстансы можно перепродать на &lt;strong&gt;Reserved Instance Marketplace&lt;/strong&gt; (только &lt;strong&gt;Standard Reserved&lt;/strong&gt;). Также, если нужен инстанс на срок меньше стандартный 1 или 3 года - можно подыскать его на маркете. Для продажи инстанса на маркете он должне быть оплачен быть во владении не менее 30 дней. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0426\u0435\u043d\u044b \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b EC2&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0446\u0435\u043d\u044b_\u043d\u0430_\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b_ec2&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:102,&amp;quot;range&amp;quot;:&amp;quot;80352-83211&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit103&quot; id=&quot;spot_instance_pricing&quot;&gt;Spot Instance Pricing&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
У AWS есть резервные EC2 инстансы, не задействованные в данный момент, которые можно использовать с большой (до 90%) скидкой. &lt;br/&gt;

Недостатком использования этих инстансов является то, что они могут быть остановлены в любой момент (по мере роста потребности в On-Demand инстансах). &lt;br/&gt;

При остановке инстанс раньше мог быть только удален, но теперь появились и другие опции - выключение или гибернация. &lt;br/&gt;

Цены устанавливаются фактически по правилам аукциона. То есть при создании такого инстанса есть текущая цена и задается максимальная цена, которую клиент готов платить за инстанс. Если потреность в инстансах растет и текущие цены превышают заданную максимальную - инстанс останавливается. &lt;br/&gt;

По мере падения спотовых цен - при достижении максимальной цены - инстанс снова запускается. &lt;br/&gt;

Таким образом - спотовые инстансы могут быть остановлены в трех случаях:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Масксимальная цена, предложенная клиентом, становится ниже актуальной спотовой.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Доступность инстансов - все инстансы могут быть востребованы On-demand.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Ограничения - недоступность инстансов в конкретной AZ.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Пред остановкой, за 2 минуты, &lt;strong&gt;Amazon CloudWatch&lt;/strong&gt; генерирует &lt;strong&gt;Event&lt;/strong&gt;, который может быть обработан &lt;strong&gt;Lambda&lt;/strong&gt;-функцией или &lt;strong&gt;Amazon SimpleNotifications (SNS)&lt;/strong&gt;. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Spot Instance Pricing&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;spot_instance_pricing&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:103,&amp;quot;range&amp;quot;:&amp;quot;83212-85414&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit104&quot; id=&quot;файловые_хранилища_aws_elastic_file_system_efs&quot;&gt;Файловые хранилища AWS Elastic File System (EFS)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS EFS&lt;/strong&gt; позволяет создавать файловые хранилища, подключаемые к инстансам по сети. Основные фичи:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Использование в качестве разделяемого централизованного файлохранилища для инстансов EC2 на базе Linux
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Доступны для On-Premise серверов через &lt;strong&gt;VPN&lt;/strong&gt; или &lt;strong&gt;AWS Direct Connect&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Могут быть увеличены или уменьшены по запросу без потери данных.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Тома EFS привязаны к региону. То есть доступны из любой AZ в регионе.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Не могут быть использованы в качестве загрузочных томов.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Н могут быть использованы инстансами EC2 на базе Windows
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0424\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 AWS Elastic File System (EFS)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435_\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430_aws_elastic_file_system_efs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:104,&amp;quot;range&amp;quot;:&amp;quot;85415-86420&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit105&quot; id=&quot;amazon_lightsail&quot;&gt;Amazon Lightsail&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Lightsail&lt;/strong&gt; - это полностью сконфигурированные VPS со всем необходимым на борту для какой-то задачи:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 WordPress
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Drupal
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 LAMP
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 etc…
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Деплоится легко и быстро, имеет фиксированную стоимость в месяц (от $3.5 за 1vCPU, 512MiB RAM, 20Gb SSD и 1TB трафика в месяц). Также доступны и дополнительные опции - статические IP, &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;, доступ по SSH/RDS и прочее. &lt;br/&gt;

Можно сделать снепшот и проапгрейдить Lightsail до стандартного EC2-инстанса. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Lightsail&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_lightsail&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:105,&amp;quot;range&amp;quot;:&amp;quot;86421-87162&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit106&quot; id=&quot;amazon_elastic_container_service_ecs&quot;&gt;Amazon Elastic Container Service (ECS)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
AWS ECS - сервис запуска Docker-контейнеров в облаке. &lt;br/&gt;

Терминология:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;ECS Cluster&lt;/strong&gt; - логическая группа EC2-инстансов на которых крутятся контейнеры. Существует в пределах региона на нескольких AZ.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;ECS Container Instances&lt;/strong&gt; - EC2-инстансы, на которых работает &lt;strong&gt;Docker&lt;/strong&gt; и &lt;strong&gt;Tasks&lt;/strong&gt; (контейнеры).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Task&lt;/strong&gt; - контейнер.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Task Definition&lt;/strong&gt; - описание параметров запуска контейнера. Образ, ресурсы, сеть, IAM-роли.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Elastic Container Registry (ECR)&lt;/strong&gt; - хранилище образов.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;ECS Service&lt;/strong&gt; - задает необходимое количество работающих экземпляров каждой &lt;strong&gt;Task&lt;/strong&gt; и перезапускает их по мере надобности.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Elastic Container Service (ECS)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_elastic_container_service_ecs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:106,&amp;quot;range&amp;quot;:&amp;quot;87163-88176&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit107&quot; id=&quot;опции_запуска_ecs&quot;&gt;Опции запуска ECS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Fargate&lt;/strong&gt; - позволет развернуть ECS-инсталляцию без необходимости настройки отдельных EC2-инстансов. То есть просто упаковыевется приложение, указываются необходимые ресурсы (CPU, память и прочее), а дальше &lt;strong&gt;Fargate&lt;/strong&gt; полностью берет на себя все заботы о запуске, масштабировании и дальнейшем управлении инстансами кластера и приложением.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;EC2&lt;/strong&gt; - Если надо управлять инстансами самостоятельно. Настраивать, апгрейдить и прочее. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u043f\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ECS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u043f\u0446\u0438\u0438_\u0437\u0430\u043f\u0443\u0441\u043a\u0430_ecs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:107,&amp;quot;range&amp;quot;:&amp;quot;88177-88995&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit108&quot; id=&quot;amazon_elastic_kubernetes_service_eks&quot;&gt;Amazon Elastic Kubernetes Service (EKS)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Managed-кластеры k8s. &lt;br/&gt;

При создани кластера выбирается тип EC2-инстансов для worker-нод. &lt;br/&gt;

После создания кластера нужно установить необходидмые addons - CNI (calico), &lt;strong&gt;LoadBalancer Controller&lt;/strong&gt; для публичных IP-адресов, возможно - Ingress (nginx). &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Elastic Kubernetes Service (EKS)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_elastic_kubernetes_service_eks&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:108,&amp;quot;range&amp;quot;:&amp;quot;88996-89433&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit109&quot; id=&quot;serverless_computing_-_aws_lambda&quot;&gt;Serverless computing - AWS Lambda&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Само понятие &lt;strong&gt;Serverless&lt;/strong&gt; для клиента означает отсутствие необходимости взаимодествия с серверами, и их ОС. Клиент просто предоставляет код для запуска, а AWS обеспечивает и настраивает всю инфраструктуру, необходимую для его исполнения. &lt;br/&gt;

&lt;strong&gt;AWS Lambda&lt;/strong&gt; - это &lt;strong&gt;Function as a Service&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 клиент создает код функции на одном из поддерживаемых языков (Python, Node.js и прочие) и загружает в AWS Lambda
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 создает триггер, который в ответ на событие или по расписанию будет запускать Lambda-функцию
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Например -  по событию загрузки изображения на S3 - триггер запускает Lambda-функцию, которая добавляет ватермарк и выгружает в другой бакет. &lt;br/&gt;

Или - по расписаню включать и выключать EC2-инстансы. &lt;br/&gt;

Оплата AWS Lambda - только за время фактической работы. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Serverless computing - AWS Lambda&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;serverless_computing_-_aws_lambda&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:109,&amp;quot;range&amp;quot;:&amp;quot;89434-90763&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit110&quot; id=&quot;aws_batch&quot;&gt;AWS Batch&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Используется для запуска большого (тысячи) количества вычислительных заданий. &lt;br/&gt;

Вся работа по инициализации вычислительных ресурсов (инстансы EC2 или ECS) выполняется автоматически. &lt;br/&gt;

Оплаа - за фактически использованные ресурсы.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Batch&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_batch&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:110,&amp;quot;range&amp;quot;:&amp;quot;90764-91204&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit111&quot; id=&quot;aws_outposts&quot;&gt;AWS Outposts&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Средства создания гибридных облаков. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Outposts&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_outposts&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:111,&amp;quot;range&amp;quot;:&amp;quot;91205-91302&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit112&quot; id=&quot;дополнительные_опции_хранилищ_aws&quot;&gt;Дополнительные опции хранилищ AWS&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435_\u043e\u043f\u0446\u0438\u0438_\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:112,&amp;quot;range&amp;quot;:&amp;quot;91303-91375&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit113&quot; id=&quot;amazon_fxs_for_lustre&quot;&gt;Amazon FXs for Lustre&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Предоставляет доступ к managed файловой системе &lt;strong&gt;Lustre&lt;/strong&gt;, которая способна обеспечить миллионы IOPS и пропускную способность в десятки гигабайт в секунду. &lt;br/&gt;

Интегрируется с Amazon S3 для организации долговременного хранения. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon FXs for Lustre&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_fxs_for_lustre&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:113,&amp;quot;range&amp;quot;:&amp;quot;91376-91802&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit114&quot; id=&quot;amazon_fsx_for_windows_file_server&quot;&gt;Amazon FSx for Windows File Server&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Managed файловые шары с поддержкой SMB для Windows-инфрастурктур. &lt;br/&gt;

Поддердивает AD и DFS. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon FSx for Windows File Server&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_fsx_for_windows_file_server&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:114,&amp;quot;range&amp;quot;:&amp;quot;91803-91995&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit115&quot; id=&quot;безопасный_доступ_к_vpc_-_bastion_hosts_и_session_manager&quot;&gt;Безопасный доступ к VPC - Bastion Hosts и Session Manager&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Для уменьшения поверхности атаки применяются &lt;strong&gt;Bastion Hosts&lt;/strong&gt; и &lt;strong&gt;Session Manager&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Bastion Hosts&lt;/strong&gt; - это специально настроенные EC2-инстансы, которые используются исключительно для доступа к инстансам в приватных сетях. Доступ к самим jump-хостам может ограничиваться по диапазону адресов или с помощью VPN.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Session Manager&lt;/strong&gt; - это консоль в браузере, для работы которой не надо открывать порты на &lt;strong&gt;Security Groups&lt;/strong&gt; и управлять SSH-ключами. Действия администраторов записываются для дальнейшего аудита.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a VPC - Bastion Hosts \u0438 Session Manager&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439_\u0434\u043e\u0441\u0442\u0443\u043f_\u043a_vpc_-_bastion_hosts_\u0438_session_manager&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:115,&amp;quot;range&amp;quot;:&amp;quot;91996-92944&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit116&quot; id=&quot;сервисы_aws_databases&quot;&gt;8. Сервисы AWS Databases&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Amazon дает возможность создавать managed-базы данных. традиционные реляционные (RDS) или неструктуриованные NoSQL. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;8. \u0421\u0435\u0440\u0432\u0438\u0441\u044b AWS Databases&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u0440\u0432\u0438\u0441\u044b_aws_databases&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:116,&amp;quot;range&amp;quot;:&amp;quot;92945-93188&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit117&quot; id=&quot;amazon_rds&quot;&gt;Amazon RDS&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Поддерживаются шесть движков БД:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 MySQL
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 PostgreSQL
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 MariaDB
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Microsoft SQL Server
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Oracle
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Amazon Aurora
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
При создании инстанса:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 выбирается тип EC2-инстансов кластера - это влияет на производительность 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 создается кластер (одно- или многонодовый), в котором можно создать одну или несколько БД
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Инстансы могут быть:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Стандартные (m-класса)&lt;/strong&gt;. Подходят для большинства нагрузок. От 2 до 96 CPU, до 384 GiB RAM
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Memory-optimized (r и x-классы)&lt;/strong&gt; - Подходят для нагруженных приложений. От 4 до 128 CPU. До 3904 GiB RAM.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Burstable (t-классы)&lt;/strong&gt; - Для непродукционных БД. Обеспечивают базовый уровень производительности с возможностью кратковременных всплесков нагрузки. От 1 до 8 CPU, до 32 GiB RAM
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
EBS-тома могут быть:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;General Purpose SSD&lt;/strong&gt; - подходит для большинства БД. От 20GiB до 64TiB (до 16TiB для MS SQL). IOPS зависят от объема. Минимум - 100 IOPS, дальше - по 3 IOPS на GiB. То есть 60GiB покажут 180 IOPS. Тома меньше 1TiB кратковременно дают повышенную производительность (burst) при необходимости. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Provisioned IOPS SSD&lt;/strong&gt; - Рекомендованный тип. Объем - до 64 TiB. Необходимый уровень IOPS задается вручную. Bust - нету. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Magnetic&lt;/strong&gt; - легаси. Не рекомендовано. До 1000 IOPS и до 3TiB объем.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Можно апгрейдить тип хранилища, но это может потребовать кратковременной остановки БД. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon RDS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_rds&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:117,&amp;quot;range&amp;quot;:&amp;quot;93189-95303&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit118&quot; id=&quot;особенности_деплоя_amazon_rds&quot;&gt;Особенности деплоя Amazon RDS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Инстанс &lt;strong&gt;Amazon RDS&lt;/strong&gt; существует в рамках региона. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Деплоится в существующий &lt;strong&gt;VPC&lt;/strong&gt;, в заданную подсеть в заданной &lt;strong&gt;AZ&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Кластеры RDS являются &lt;strong&gt;Active-Passive&lt;/strong&gt;. То есть &lt;strong&gt;Master&lt;/strong&gt;-нода, которая пишет данные - всегда одна.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Доступ к инстансу RDS регулируется с помощью &lt;strong&gt;Security Groups&lt;/strong&gt; и &lt;strong&gt;NACLs&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Сценарии поключения к инстансу &lt;strong&gt;Amazon RDS&lt;/strong&gt; могут включать:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Подключение в рамках &lt;strong&gt;VPC&lt;/strong&gt;. Настраивается &lt;strong&gt;Security Group&lt;/strong&gt; на порт инстанса.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Подключене из другого &lt;strong&gt;VPC&lt;/strong&gt; (другой регион, другой аккаунт). Настраивается &lt;strong&gt;VPC Peering&lt;/strong&gt; (&lt;strong&gt;VPC Transit Gateway&lt;/strong&gt;) и правила &lt;strong&gt;Secuity Groups&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Подключение через интернет. Инстанс RDS размещается в публичной подсети. Небезопасно.  
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Из частной &lt;strong&gt;on-premise&lt;/strong&gt; сети. Через &lt;strong&gt;VPN&lt;/strong&gt; или &lt;strong&gt;Direct Connect&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u043f\u043b\u043e\u044f Amazon RDS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438_\u0434\u0435\u043f\u043b\u043e\u044f_amazon_rds&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:118,&amp;quot;range&amp;quot;:&amp;quot;95304-96555&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit119&quot; id=&quot;резервирование_и_восстановление_amazon_rds&quot;&gt;Резервирование и восстановление Amazon RDS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для выбора оптимальной стратегии резервирования важно определить два параметра:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 RTO (Recovery Time Objective) - допустимое время восстановления после отказа.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 RPO (Recovery Point Objective) - допустимые потери данных в результате сбоя.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Например - нужно восстановиться за 1 час (&lt;strong&gt;RTO&lt;/strong&gt;) и потерять данные записанные в БД не более чем за 2 часа (&lt;strong&gt;RPO&lt;/strong&gt;). &lt;br/&gt;

Логично, что чтобы реализовать &lt;strong&gt;RPO&lt;/strong&gt; 2 часа нужно делать бекапы каждый 2 часа. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 Amazon RDS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0438_\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435_amazon_rds&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:119,&amp;quot;range&amp;quot;:&amp;quot;96556-97367&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit120&quot; id=&quot;реализация_отказоустойчивых_бд_-_multi_az&quot;&gt;Реализация отказоустойчивых БД - Multi AZ&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Классический кластер &lt;strong&gt;Active-Passive&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В двух AZ расположены &lt;strong&gt;master&lt;/strong&gt;-нода и &lt;strong&gt;standby&lt;/strong&gt;-реплика. Репликация - синхронная.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 При выходе из строя &lt;strong&gt;master&lt;/strong&gt;-ноды - происходит автоматический переход роли &lt;strong&gt;master&lt;/strong&gt; к реплике. Во время перехода - возможно отсутствие доступа к БД (до двух минут).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Старый &lt;strong&gt;master&lt;/strong&gt; уничтожается, вместо него поднимается новая нода - копия реплики. Запускается репликация.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Таким образом можно снизить &lt;strong&gt;RTO&lt;/strong&gt; и &lt;strong&gt;RPO&lt;/strong&gt; практически до нескольких минут. &lt;br/&gt;

Переключение между &lt;strong&gt;master&lt;/strong&gt; и &lt;strong&gt;standby&lt;/strong&gt; нодами может быть полезно и в случаях необходимости технических работ на &lt;strong&gt;master&lt;/strong&gt;-ноде (апгрейд, изменение конфигурации).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u0411\u0414 - Multi AZ&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f_\u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445_\u0431\u0434_-_multi_az&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:120,&amp;quot;range&amp;quot;:&amp;quot;97368-98542&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit121&quot; id=&quot;автоматическое_резервное_копирование&quot;&gt;Автоматическое резервное копирование&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon RDS&lt;/strong&gt; выполняет автоматическое регулярное резервное копирование через заданные интервалы времени в заданные для этого “окна”.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Механизм создания резервных копий - снепшоты. Первый - полный, последующие - инкрементные.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Retention&lt;/strong&gt; - определяет количество хранимых копий. от 1 до 35 дней. 0 - значит бекапы выключены.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS RDS&lt;/strong&gt; чрез заданный интервал (обычно 5 минут) сохраняет на S3 логи транзакций. Таким образом - с помщью бекапа и логов транзакций можно восстановить состояние БД на любой момент (в пределах &lt;strong&gt;retention&lt;/strong&gt;) с точностью до заданного интервала (&lt;strong&gt;LastRestorableTime&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435_\u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435_\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:121,&amp;quot;range&amp;quot;:&amp;quot;98543-99650&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit122&quot; id=&quot;резервное_копирование_вручную&quot;&gt;Резервное копирование вручную&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Полезно перед масштабными изменениями в БД. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435_\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0432\u0440\u0443\u0447\u043d\u0443\u044e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:122,&amp;quot;range&amp;quot;:&amp;quot;99651-99800&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit123&quot; id=&quot;межрегиональное_резервное_копирование&quot;&gt;Межрегиональное резервное копирование&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Можно включить репликацию бекапов в другой регион, на случай серьезного дизастера. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041c\u0435\u0436\u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u0435\u0436\u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435_\u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435_\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:123,&amp;quot;range&amp;quot;:&amp;quot;99801-100036&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit124&quot; id=&quot;кратковременный_отказ_в_обслуживаннии_при_начале_резервного_копирования&quot;&gt;Кратковременный отказ в обслуживаннии при начале резервного копирования&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
При создании снепшота БД в конфигурации, когда есть только одна &lt;strong&gt;master&lt;/strong&gt;-нода, может происходить “замирание” ввода-вывода на несколько секунд. &lt;br/&gt;

Это стоит учитывать при выборе “окна” для создания резервных копий. &lt;br/&gt;

В конфигурации &lt;strong&gt;Multi-AZ&lt;/strong&gt; такого не происходит, поскольку снепшот для бекапа снимается со &lt;strong&gt;standby&lt;/strong&gt;-ноды
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u0440\u0430\u0442\u043a\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u043a\u0430\u0437 \u0432 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u043d\u0438\u0438 \u043f\u0440\u0438 \u043d\u0430\u0447\u0430\u043b\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u0440\u0430\u0442\u043a\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439_\u043e\u0442\u043a\u0430\u0437_\u0432_\u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u043d\u0438\u0438_\u043f\u0440\u0438_\u043d\u0430\u0447\u0430\u043b\u0435_\u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e_\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:124,&amp;quot;range&amp;quot;:&amp;quot;100037-100745&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit125&quot; id=&quot;горизонтальное_aws_rds_масштабирование_с_репликами_только_для_чтения&quot;&gt;Горизонтальное AWS RDS масштабирование с репликами &amp;quot;только для чтения&amp;quot;&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
В кластере &lt;strong&gt;Active-Passive&lt;/strong&gt; запросы обрабатывает только &lt;strong&gt;master&lt;/strong&gt;-нода. Обратиться к &lt;strong&gt;standby&lt;/strong&gt;-ноде невозможно - она только реплицирует данные и ждет дизастера.  &lt;br/&gt;

Если необходимо - для повышения производительности можно настроить ноды-реплики “только для чтения”. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Они пригодны для приложений, которые не пишут в БД. Например - аналитика.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Репликация - Ассинхронная. То есть возможны задержки в обновлении данных, относительно боевого мастера.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Возможна репликация в другие регионы.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Для каждого инстанса &lt;strong&gt;AWS RDS&lt;/strong&gt; можно настроить до 5 &lt;strong&gt;read-only&lt;/strong&gt; реплик 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Read-only&lt;/strong&gt; реплику при необходимости можно промотировать до полноценной &lt;strong&gt;master&lt;/strong&gt;-ноды. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 AWS RDS \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u043c\u0438 \&amp;quot;\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435_aws_rds_\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0441_\u0440\u0435\u043f\u043b\u0438\u043a\u0430\u043c\u0438_\u0442\u043e\u043b\u044c\u043a\u043e_\u0434\u043b\u044f_\u0447\u0442\u0435\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:125,&amp;quot;range&amp;quot;:&amp;quot;100746-102022&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit126&quot; id=&quot;amazon_aurora&quot;&gt;Amazon Aurora&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Aurora&lt;/strong&gt; - проприетарная разработка &lt;strong&gt;Amazon&lt;/strong&gt;. &lt;br/&gt;

Эта БД совместима с &lt;strong&gt;MySQL&lt;/strong&gt; и &lt;strong&gt;PostgreSQL&lt;/strong&gt;, но в пять раз быстрее, чем &lt;strong&gt;MySQL&lt;/strong&gt; и в три раза быстрее, чем &lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;br/&gt;

отказоустойчивая конфигурация - минимум три ноды (в разных AZ). &lt;br/&gt;

Объемы БД - до 128TiB &lt;br/&gt;

Репликация - до 15 read-only реплик. &lt;br/&gt;

Деплоится в виде DB-кластеров, в котором используются два типа инстансов, а также общее хранилище - &lt;strong&gt;cluster volume&lt;/strong&gt; (размещенный на нескольких &lt;strong&gt;storage-nodes&lt;/strong&gt; в нескольких AZ):
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Primary DB instance&lt;/strong&gt; - операции чтения-записи. Только этот инстанс может писать в &lt;strong&gt;cluster volume&lt;/strong&gt;. Может быть только одна.  
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Aurora replica&lt;/strong&gt; - только для чтения, до 15 штук.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Доступна как в классическом серверном варианте, так и &lt;strong&gt;serverless&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Aurora&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_aurora&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:126,&amp;quot;range&amp;quot;:&amp;quot;102023-103212&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit127&quot; id=&quot;amazon_aurora_serverless&quot;&gt;Amazon Aurora Serverless&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Автоматическое масштабирование кластера в зависимости от нагрузки.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Данные всегда зашифрованы
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Идеально подходит для приложений с непредсказуемой нагрузкой
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Aurora Serverless&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_aurora_serverless&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:127,&amp;quot;range&amp;quot;:&amp;quot;103213-103548&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit128&quot; id=&quot;amazon_dynamodb_nosql&quot;&gt;Amazon DynamoDB (NoSQL)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Fully-Managed бессерверная NoSQL БД.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Существует в рамках региона. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Динамически подстраивается под нагрузку.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Расчитано на миллионы записей и тысячи запросов в секунду.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon DynamoDB (NoSQL)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_dynamodb_nosql&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:128,&amp;quot;range&amp;quot;:&amp;quot;103549-103890&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit129&quot; id=&quot;терминология_dynamodb&quot;&gt;Терминология DynamoDB&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Таблицы (Tables)&lt;/strong&gt; - Подобны таблицам в SQL-базах. Также есть &lt;strong&gt;Primary Key&lt;/strong&gt;, который должне быть уникальным в пределах таблицы.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Items&lt;/strong&gt; - аналогичны записям в SQL. В таблице может быть один или больше &lt;strong&gt;Items&lt;/strong&gt;, каждый состоит из какого-то количества &lt;strong&gt;аттрибутов (attributes)&lt;/strong&gt;. Размер Item - до 400KB.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Аттрибуты (attributes)&lt;/strong&gt; - Пары ключ-значение (key-value). Ключи - подобны названиям колонок в SQL. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В отличие от SQL - не нужно заранее определять схему и типы данных в колонках. &lt;br/&gt;

Ключи (за исключением Primary) можно добавлять/удалять в любой момент. &lt;br/&gt;

Значения ключей могут иметь следующие типы:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Scalar&lt;/strong&gt; - Просто значение. Строка, число, двоичная строка, булево значение или null.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Set&lt;/strong&gt; - Набор скалярных значений. Наборы строк, бинарных строк, набор чисел.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Document&lt;/strong&gt; - JSON-структура, которая может включать вложенные аттрибуты. Документы могут быть двух типов: &lt;strong&gt;JSON List&lt;/strong&gt; и &lt;strong&gt;JSON Map&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u044f DynamoDB&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u044f_dynamodb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:129,&amp;quot;range&amp;quot;:&amp;quot;103891-105445&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit130&quot; id=&quot;определение_требований_к_инстансу_dynamodb&quot;&gt;Определение требований к инстансу DynamoDB&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
При создании инстанса нужно указать параметры планируемой нагрузки:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;RCU (read capacity units)&lt;/strong&gt; - единицы производительности на чтение
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;WCU (write capacity units)&lt;/strong&gt; - единицы производительности на запись
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Дальше - в зависимости от значений Amazon определит необходимые параметры инстанса. &lt;br/&gt;

Доступны две опции:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;On-Demand&lt;/strong&gt; - динамическое выделение ресурсов в зависимости от нагрузки
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Provisioned&lt;/strong&gt; - для предсказуемых нагрузок. Задается предполагаемое количество операций чтения и записи в секунду. Всегда можно включить &lt;strong&gt;auto-scaling&lt;/strong&gt;, для адаптации к текущей нагрузке.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0443 DynamoDB&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435_\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439_\u043a_\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0443_dynamodb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:130,&amp;quot;range&amp;quot;:&amp;quot;105446-106517&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit131&quot; id=&quot;amazon_redshift_-_data_warehousing&quot;&gt;Amazon RedShift - Data Warehousing&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Предназначен для извлечения данных из других (реляционных) БД и построения аналитики по созданным датасетам - &lt;strong&gt;OLAP operations&lt;/strong&gt; (&lt;strong&gt;OnLine Analitical Processing&lt;/strong&gt;). &lt;br/&gt;

Клиентам Amazon такде доступно &lt;strong&gt;BI&lt;/strong&gt;-приложение (business intelligence). &lt;br/&gt;

Является колоночной (column storage) БД (в противовес реляционным, где каждая запись - ряд). Это позволяет при чтении снизить количество операций IO в три раза, по сравнению с реляционными БД. &lt;br/&gt;

Архитектура - кластер:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Leader node&lt;/strong&gt; - выделенная нода, через которую происходит взаимодйствие с БД &lt;strong&gt;RedShift&lt;/strong&gt;. Компилирует код запросов и распределяет задания по вычислительным нодам.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Compute node&lt;/strong&gt; - до 128 нод в кластере. Получают задачи, отправляют назад результаты. Бывают трех типов:
&lt;/div&gt;&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Dense compute nodes&lt;/strong&gt; - До 326TB данных на HDD
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Dense storage nodes&lt;/strong&gt; - до 2PB на SSD
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;RA3 instances&lt;/strong&gt; - новое поколение на базе Nitro. Используют managed storage (в отличие от предыдущих). Хранилища отделены от вычислителей, в свою очередь хранение горячих данных - на локальных SSD, холодных - на S3. Поата - только за фактически использованный объем.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon RedShift - Data Warehousing&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_redshift_-_data_warehousing&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:131,&amp;quot;range&amp;quot;:&amp;quot;106518-108348&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit132&quot; id=&quot;redshift_spectrum&quot;&gt;RedShift Spectrum&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервис реализующий SQL запросы к данным, хранимым в AWS S3. &lt;br/&gt;

Например - у вас много нечасто нужных данных в S3. &lt;br/&gt;

Вместо того, чобы импортировать их в дорогостоящие инстансы &lt;strong&gt;RedShift&lt;/strong&gt; и затем обращаться к ним - можно сразу обращаться к данным в S3.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;RedShift Spectrum&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;redshift_spectrum&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:132,&amp;quot;range&amp;quot;:&amp;quot;108349-108808&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit133&quot; id=&quot;amazon_elasticache&quot;&gt;Amazon Elasticache&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
сервис кеширования горячих данных в памяти. &lt;br/&gt;

Доступны два варианта:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Elasticache for Redis&lt;/strong&gt; - кластер из одной ил нескольких кеш-нод. Для кеширования сложных объектов. Умеет Multi-AZ, шифрование, отказоустойчивость   
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Elasticache for Memcached&lt;/strong&gt; - Для кеширования простых объктов (типов данных). 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Elasticache&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_elasticache&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:133,&amp;quot;range&amp;quot;:&amp;quot;108809-109354&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit134&quot; id=&quot;amazon_neptune&quot;&gt;Amazon Neptune&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Fully managed БД Графов &lt;br/&gt;

Хранит данные в виде нод, их аттрибутов и связей между ними. &lt;br/&gt;

Поддерживает многие широко применяемые модели:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Property Graph
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;abbr title=&quot;World Wide Web Consortium&quot;&gt;W3C&lt;/abbr&gt;&amp;#039;s RDF
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
И языки:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Apache TinkerPro
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Gremlin
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 SPARQL
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Применяется при анализе “больших данных”:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 фрод детекш
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 графы знаний
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 исследование лекарств
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 сетевая безопасность
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Neptune&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_neptune&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:134,&amp;quot;range&amp;quot;:&amp;quot;109355-109929&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit135&quot; id=&quot;amazon_quantum_ledger_database_qldb&quot;&gt;Amazon Quantum Ledger Database (QLDB)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Fully Managed Blockhain от Amazon. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Неизменный и прозрачный&lt;/strong&gt;. Непрерывный журнал транзакций. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Криптографически валидируемый.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Простой в использовании. Язык &lt;strong&gt;PartiQL&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Серверлесс - необхоимые для текущей нагрузки мощности выделяются автоматически.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Quantum Ledger Database (QLDB)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_quantum_ledger_database_qldb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:135,&amp;quot;range&amp;quot;:&amp;quot;109930-110420&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit136&quot; id=&quot;amazon_database_migration_service_dms&quot;&gt;Amazon Database Migration Service (DMS)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Сервис для миграции on-premise БД в облако.
Поддерживаются как гомогенные миграции - &lt;strong&gt;MySQL → MySQL&lt;/strong&gt;, так и гетерогенные - &lt;strong&gt;Oracle → MS SQL&lt;/strong&gt; или &lt;strong&gt;MS SQL → Amazon Aurora&lt;/strong&gt;. &lt;br/&gt;

Во время миграции БД остается работоспособной, уменьшая даунтайм. &lt;br/&gt;

Может использоваться для непрерывной репликации on-premise БД в облако для отказоустойчивости. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Database Migration Service (DMS)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_database_migration_service_dms&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:136,&amp;quot;range&amp;quot;:&amp;quot;110421-111034&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit137&quot; id=&quot;отказоустойчивость_и_эластичность_aws_-_ha_and_elasticity&quot;&gt;9. Отказоустойчивость и эластичность AWS - (HA and Elasticity)&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Вертикальная и горизонтальная масштабируемость
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Модель &lt;strong&gt;Open System Interconnection (OSI)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Балансировка трафика с помощью &lt;strong&gt;Amazon Elastic Load Balancing (ELB)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Реализация эластичности с помощью &lt;strong&gt;AWS Auto Scaling&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Проектирование мультирегиональных отказоустойчивых решений.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;9. \u041e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0438 \u044d\u043b\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c AWS - (HA and Elasticity)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c_\u0438_\u044d\u043b\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c_aws_-_ha_and_elasticity&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:137,&amp;quot;range&amp;quot;:&amp;quot;111035-111603&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit138&quot; id=&quot;вертикальная_и_горизонтальная_масштабируемость&quot;&gt;Вертикальная и горизонтальная масштабируемость&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Вертикальная - апгредим ресурсы инстансов. &lt;br/&gt;

Горизонтальная - увеличиваем количество инстансов &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f_\u0438_\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f_\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:138,&amp;quot;range&amp;quot;:&amp;quot;111604-111885&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit139&quot; id=&quot;вертикальаня_масштабируемость&quot;&gt;Вертикальаня масштабируемость&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 требует остановки инстанса
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 может занимать много (часы) времени
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 не обеспечвает отказоустойчивости
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u0430\u043d\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u0430\u043d\u044f_\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:139,&amp;quot;range&amp;quot;:&amp;quot;111886-112146&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit140&quot; id=&quot;горизонтальная_масштабируемость&quot;&gt;Горизонтальная масштабируемость&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 повышает отказоустойчивость
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 может быть реализована автоматически
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f_\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:140,&amp;quot;range&amp;quot;:&amp;quot;112147-112352&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit141&quot; id=&quot;модель_osi&quot;&gt;Модель OSI&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Ну что про нее сказать - она самая!!!
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041c\u043e\u0434\u0435\u043b\u044c OSI&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u043e\u0434\u0435\u043b\u044c_osi&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:141,&amp;quot;range&amp;quot;:&amp;quot;112353-112446&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit142&quot; id=&quot;распределение_балансировка_трафика_с_помощью_amazon_elastic_load_balancer_elb&quot;&gt;Распределение (балансировка) трафика с помощью Amazon Elastic Load Balancer ELB&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
ELB - работает в пределах региона и не может балансировать между регионами. &lt;br/&gt;

В качестве бекендов могут выступать:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 инстансы EC2
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 IP-адреса
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 контейнеры
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Lambda-функции
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 и прочие сущности…
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 (\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430) \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Amazon Elastic Load Balancer ELB&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435_\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430_\u0442\u0440\u0430\u0444\u0438\u043a\u0430_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_amazon_elastic_load_balancer_elb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:142,&amp;quot;range&amp;quot;:&amp;quot;112447-112921&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit143&quot; id=&quot;общие_правила_использования_elb&quot;&gt;Общие правила использования ELB&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Любой ELB рекомендуется размещать более чем в одной AZ. В таком случае - в каждой AZ будет нода балансировщика (&lt;strong&gt;load balancer node&lt;/strong&gt;), которая будет распределять трафик по инстансам в этой зоне.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Если есть ELB, то размещать инстансы в публичных сетях нет необходимости. Клиенты ходят только через ELB.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Балансировщики ELB бывают двух видов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Internet-facing load balancer&lt;/strong&gt; - доступен в internet, имеет &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-имя. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Internal load balancer&lt;/strong&gt; - балансируют ресурсы внутри приватных сетей VPC.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Для того, чтобы инстанс ELB мог принимать запросы - для него должна быть настроена соответствующая &lt;strong&gt;Security Group&lt;/strong&gt; с правилами для входящих подключений. &lt;br/&gt;

Для того, чтобы инстанс ELB мог обращаться к бекэнд-серверам - для них должна быть настроена соответствующая &lt;strong&gt;Security Group&lt;/strong&gt; с правилами для входящих подключений. &lt;br/&gt;

Типы балансировщиков:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Application Load Balancer (ALB)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Network Load Balancer (NLB)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Gateway Load Balancer (GWLB)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Classic Load Balancer (CLB)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0431\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f ELB&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u0449\u0438\u0435_\u043f\u0440\u0430\u0432\u0438\u043b\u0430_\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f_elb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:143,&amp;quot;range&amp;quot;:&amp;quot;112922-114542&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit144&quot; id=&quot;application_load_balancer_alb&quot;&gt;Application Load Balancer (ALB)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Это L7-балансировщик (application layer). &lt;br/&gt;

Работает с протоколами HTTP и HTTPS. &lt;br/&gt;

Поддерживает:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Path-based роутинг&lt;/strong&gt; - для распределения запросов в зависимости от &lt;abbr title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/abbr&gt; в запросе
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Host-Based роутинг&lt;/strong&gt; - для распределения в зависимости от содержимого заголовка HOST в запросе
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Множество приложений на одном EC2 инстансе
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В качестве бекэндов могут выступать Lambda-функции и контейнеры и многое другое
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Состоит из:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;listener&lt;/strong&gt; - сервис, который на иснове правил респределяет запросы. Правил может быть одно или более.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;target groups&lt;/strong&gt; - группы (одна или более) инстансов (или контейнеров, Lambda-функцй и т.д.), на которые &lt;strong&gt;listener&lt;/strong&gt; направляет запросы.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Application Load Balancer (ALB)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;application_load_balancer_alb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:144,&amp;quot;range&amp;quot;:&amp;quot;114543-115687&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit145&quot; id=&quot;health_checks1&quot;&gt;Health Checks&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Поддердивается проверка состояния бекэнд-инстнсов в &lt;strong&gt;target groups&lt;/strong&gt; &lt;br/&gt;

Неработоспособные инстансы удаляютяс из баланссировки до момента восстановления
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Health Checks&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;health_checks1&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:145,&amp;quot;range&amp;quot;:&amp;quot;115688-115981&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit146&quot; id=&quot;alb_и_web_application_firewall_waf&quot;&gt;ALB и Web Application Firewall (WAF)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;ALB&lt;/strong&gt; интегрируется с &lt;strong&gt;WAF&lt;/strong&gt;, который фильтрует поступающие запросы для защиты от типичных атак:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 SQL-инъекции
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 cross-site-scripting (XSS)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 и других
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;ALB \u0438 Web Application Firewall (WAF)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;alb_\u0438_web_application_firewall_waf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:146,&amp;quot;range&amp;quot;:&amp;quot;115982-116277&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit147&quot; id=&quot;nlb&quot;&gt;NLB&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Балансировщик L4 - балансирует как TCP, так и UDP протоколы. &lt;br/&gt;

Свойства:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обеспечивает очень низкие задержки.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Интересен тем, что может сохранять IP-адрес клиента во входящих запросах.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Поддерживает статические и &lt;strong&gt;elastic&lt;/strong&gt; IP-адреса (по одному на AZ).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В качестве target-ов выступают IP-адреса, а значит можно балансировать и ресурсы вне VPC, например - on-premise
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Одн инстанс NLB позволяет балансировать различные ресурсы/протоколы, принимая подключения на разных портах.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Поддерживаются приложения в контейнерах (Amazon ECS)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;NLB&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nlb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:147,&amp;quot;range&amp;quot;:&amp;quot;116278-117217&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit148&quot; id=&quot;gwlb_-_amazon_gateway_load_balancer&quot;&gt;GWLB - Amazon GateWay Load Balancer&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon GWLB&lt;/strong&gt; выступает в качестве единой точки входя для траффика, который должен быть проанализирован различными внешними инструментами (файерволы, &lt;strong&gt;IDSes/IPSec - intrusion detection/prevention&lt;/strong&gt;). Инструменты доступны на &lt;strong&gt;Amazon Marketplace&lt;/strong&gt; в виде &lt;strong&gt;virtual appliances&lt;/strong&gt;.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Работает на третьем (&lt;strong&gt;Layer 3&lt;/strong&gt;) модели &lt;strong&gt;OSI&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 С IPSec/IDSec-приложениями взаимодействует по протоколу &lt;strong&gt;GENEVE (Generic Network Virtualization Encapsulation)&lt;/strong&gt; на порту &lt;strong&gt;6081&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Является statefull-сервисом, то есть трафик ходит как к IPSec/IDSec-приложениям, так и от них.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;GWLB - Amazon GateWay Load Balancer&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;gwlb_-_amazon_gateway_load_balancer&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:148,&amp;quot;range&amp;quot;:&amp;quot;117218-118104&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit149&quot; id=&quot;clb_-_amazon_classic_load_balancer&quot;&gt;CLB - Amazon Classic Load Balancer&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;CLB&lt;/strong&gt; - первая реализация балансировщика в AWS. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Не подходит для продукционных задач, но пригоден для тестирования, либо - для приложений, использующих &lt;strong&gt;EC2-Classic network mode&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Работает на 4 и 7-уровнях OSI
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Не предоставляет всех функций ALB, либо производительностb NLB.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Балансирует трафик по EC2-нодам в предалх региона (на одну AZ либо на многие)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;CLB - Amazon Classic Load Balancer&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;clb_-_amazon_classic_load_balancer&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:149,&amp;quot;range&amp;quot;:&amp;quot;118105-118763&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit150&quot; id=&quot;эластичность_и_amazon_auto_scaling&quot;&gt;Эластичность и Amazon Auto Scaling&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Эластичность&lt;/strong&gt; - предполагает автоматическое  масштабирование облачных ресурсов по мере роста/уменьшения нагрузки. &lt;br/&gt;

Масштабирование происходит в ответ на события, например - это превышение/уменьшение значений каких-либо метрик (например - загрузка CPU), либо - таймер. &lt;br/&gt;

&lt;strong&gt;Auto Scaling&lt;/strong&gt; - это региональный сервис, который работает с метриками и EC2-инстансами в пределах региона AWS. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u042d\u043b\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0438 Amazon Auto Scaling&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u044d\u043b\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c_\u0438_amazon_auto_scaling&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:150,&amp;quot;range&amp;quot;:&amp;quot;118764-119508&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit151&quot; id=&quot;параметры_auto_scaling&quot;&gt;Параметры Auto Scaling&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для реализации автоматического масштабирования настраиваются &lt;strong&gt;Auto Scaling Groups&lt;/strong&gt; - они описывают коллекцию (&lt;strong&gt;fleet&lt;/strong&gt;) EC2-инстансов и параметров масштабирования:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Минимальное число EC2-инстансов в группе.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Желательное (desired) число инстансов в группе. Сервис будет всегда стремиться автоматически поддерживать это число EC2-инстансов.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Максимальное число EC2-инстансов в группе. Нужно для избежания ненужных расходов, например - в случае бага в ПО, который приводит к бесполезной высокой нагрузке на CPU.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Сервис &lt;strong&gt;Auto Scaling&lt;/strong&gt; выполняет автоматические &lt;strong&gt;health&lt;/strong&gt;-чеки (выполлянемые через &lt;strong&gt;ELB&lt;/strong&gt; или самим &lt;strong&gt;AutoScale&lt;/strong&gt;) и реагирует на их результаты действиями, прописанными в политиках масштабирования.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Auto Scaling&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b_auto_scaling&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:151,&amp;quot;range&amp;quot;:&amp;quot;119509-120779&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit152&quot; id=&quot;шаблоны_конфигураций&quot;&gt;Шаблоны конфигураций&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для настройки &lt;strong&gt;AWS Auto Scaling&lt;/strong&gt; создаются либо &lt;strong&gt;Launch Template&lt;/strong&gt;, либо - &lt;strong&gt;Launch Configuration&lt;/strong&gt; - спецификации EC2-инстансов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Образ &lt;strong&gt;Amazon Machine Image (AMI)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 тип инстанса (конфиг железа)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 SSH-ключи для доступа к инстансу
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Спецификации Block Storage
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Скрипты для провижининга EC2-инстансов (&lt;strong&gt;bootstrapping&lt;/strong&gt;). Это скрипты на &lt;strong&gt;Bash&lt;/strong&gt; либо &lt;strong&gt;PowerShell&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Чем отличаются &lt;strong&gt;Launch Configuration&lt;/strong&gt; и &lt;strong&gt;Launch Template&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Launch Configuration&lt;/strong&gt; - это первая реализация шаблонов с параметрами инстансов. В настоящий момент не рекомендованы к использованию. Шаблон может быть использован в нескольких &lt;strong&gt;AutoScale Groups&lt;/strong&gt;, но в пределах одной &lt;strong&gt;AutoScale Group&lt;/strong&gt; может испрльзоваться только одна &lt;strong&gt;Launch Configuration&lt;/strong&gt;. После создания &lt;strong&gt;Launch Configuration&lt;/strong&gt; изменить ее параметры нельзя, а можно только пересоздать её.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Launch Template&lt;/strong&gt; - актуальная реализация шиблонов для &lt;strong&gt;AWS Auto Scale&lt;/strong&gt;. Аналогичен &lt;strong&gt;Launch Configuration&lt;/strong&gt;, однако может иметь несколько различных версий, содержать базовый шаблон и несколько дополнительных на разные случаи, запускать как On-Demand, так и спотовые инстансы, запускать различные конфигурации инстансов. Также - поддерживает новые фичи типа &lt;strong&gt;ESB volumes gp3 и io2&lt;/strong&gt;, &lt;strong&gt;ESB volume tagging&lt;/strong&gt;, &lt;strong&gt;elastic inference&lt;/strong&gt;, &lt;strong&gt;Dedicated Hosts&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0448\u0430\u0431\u043b\u043e\u043d\u044b_\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:152,&amp;quot;range&amp;quot;:&amp;quot;120780-122798&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit153&quot; id=&quot;политики_масштабирования&quot;&gt;Политики Масштабирования&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Масштабирование триггерится в ответ на события. Это все настраивается в политиках масштабирования (&lt;strong&gt;scale policy&lt;/strong&gt;):
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Поддержание заданного числа инстансов. Вышедшие из строя инстансы удаляются и заменяются на свежие.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Масштабирование вручную
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Масштабирование по расписанию.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Динамическое масштабирование (по требованию). В ответ на значения метрик. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В свою очередь динамическое масштабирование может быть таким:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Слежение за целевыми показателями - &lt;strong&gt;Target Tracking Scale policy&lt;/strong&gt;. Пытается поддерживать значение заданной метрики на заданном уровне.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Пошаговое (не плавное) масштабирование (&lt;strong&gt;Step scaling&lt;/strong&gt;) - количество подключаемых дополнительно EC2-инстансов зависит от фактического превышения значения метрики над заданным. Чем больше превышение, тем больше шаг масштабирования.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Простое масштабирование (&lt;strong&gt;simple scaling&lt;/strong&gt;)  - масштабируемся до заданного размера в зависимости от значения одной метрики.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Масштабирование с предсказанием (&lt;strong&gt;Predictive Scaling&lt;/strong&gt;) - масштабирование на основании предсказания уровня нагрузки, запланированных (scheduled) действий, превышения максимальной емкости - когда можно настроить автоматичсекое увеличение максимального разрешенного количества инстансов, в зависимости от условий.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438_\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:153,&amp;quot;range&amp;quot;:&amp;quot;122799-125040&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit154&quot; id=&quot;проектирование_мульти-региональных_отказоустойчивых_решений_aws&quot;&gt;Проектирование мульти-региональных отказоустойчивых решений AWS&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Эффективные механизмы обеспечения высокодоступных решений - &lt;strong&gt;Amazon ELB&lt;/strong&gt; и &lt;strong&gt;Amazon Auto Scaling&lt;/strong&gt; - работают только в пределах региона AWS. &lt;br/&gt;

Однако, обеспечить высокую доступность на случай выхода из строя целого региона можно с помощью &lt;strong&gt;Amazon Route 53&lt;/strong&gt; и &lt;strong&gt;Amazon Cloud Front&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Route 53&lt;/strong&gt; позволяет настроить мультирегиональную &lt;strong&gt;active/passive&lt;/strong&gt;-конфигурацию с помощью &lt;strong&gt;failover&lt;/strong&gt;-роутинга
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В запасном регионе может работать минимум EC2-инстансов, обеспечивая подхват нагрузки, если &lt;strong&gt;health&lt;/strong&gt;-чеки основного региона на &lt;strong&gt;Amazon Route 53&lt;/strong&gt; покажут, что он сдох. А также - политики &lt;strong&gt;AWS Auto Scale&lt;/strong&gt;, которые промасштабируют инфраструктуру при возрастании нагрузки.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0443\u043b\u044c\u0442\u0438-\u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u043c\u0443\u043b\u044c\u0442\u0438-\u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445_\u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445_\u0440\u0435\u0448\u0435\u043d\u0438\u0439_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:154,&amp;quot;range&amp;quot;:&amp;quot;125041-126284&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit155&quot; id=&quot;сервисы_aws_для_интеграции_приложений&quot;&gt;10. Сервисы AWS для интеграции приложений&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Для интеграции приложений AWS предлагает ряд сервисов для построения распределенных приложений, которые обмениваются сообщениями через брокеры и очереди сообщений. &lt;br/&gt;

Сервисы AWS могут использоваться для:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;app-to-app (A2A) messaging&lt;/strong&gt; - передачи сообщений между приложениями
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;app-to-person (A2P) messaging&lt;/strong&gt; - передачи сообщений от приложений к пользователям
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 проектирования event-driven приложений
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 связи сервисов в бессерверных инфраструктурах
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Сервисы AWS для интеграции приложений включают в себя:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Simple Notification Services (SNS)&lt;/strong&gt; - сервис простых &lt;strong&gt;push&lt;/strong&gt;-сообщений сервисам или непосредственно пользователям
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Simple Queue Services (SQS)&lt;/strong&gt; и &lt;strong&gt;Amazon MQ&lt;/strong&gt; - сервисы очередей сообщений
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon EventBridge&lt;/strong&gt; - сервис для построения event-driven приложений
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Step-Functions&lt;/strong&gt; и &lt;strong&gt;Amazon Simple Workflow Service (SWF)&lt;/strong&gt; - для организации приложений на основе бессерверной инфраструктуры
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;10. \u0421\u0435\u0440\u0432\u0438\u0441\u044b AWS \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u0440\u0432\u0438\u0441\u044b_aws_\u0434\u043b\u044f_\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:155,&amp;quot;range&amp;quot;:&amp;quot;126285-127848&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit156&quot; id=&quot;amazon_simple_notification_services_sns&quot;&gt;Amazon Simple Notification Services (SNS)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Это сервис для &lt;strong&gt;push&lt;/strong&gt;-сообщений сервисам или непосредственно пользователям. &lt;br/&gt;

Работает по принципу издатель/подписчик (publisher/subscriber). Каждый издатель может отправить сообщение одному или нескольким подписчикам. &lt;br/&gt;

Пример использования - необходимо получать оповещения о загрузке объектов в S3.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 настраиваются оповещения &lt;strong&gt;S3 event notifications&lt;/strong&gt; на событие &lt;strong&gt;s3:ObjectCreated:&lt;/strong&gt;*
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создается &lt;strong&gt;SNS topic&lt;/strong&gt;, в который отправляются эти оповещения
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 На даный топик создается подписка, с e-mail адресом 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В результате - при заливке объектов в S3 на почту приходит сообщение. Это &lt;strong&gt;A2P&lt;/strong&gt;. &lt;br/&gt;

В качестве подписчика пожет выступать Lambda-функция, которая может что-то делать с загруженным объектом. Это &lt;strong&gt;A2A&lt;/strong&gt;.&lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Simple Notification Services (SNS)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_simple_notification_services_sns&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:156,&amp;quot;range&amp;quot;:&amp;quot;127849-129110&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit157&quot; id=&quot;amazon_sns_endpoints&quot;&gt;Amazon SNS Endpoints&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Для получения сообщений подписчики должны предоставлять один из заданных типов эндпоинтов. &lt;br/&gt;

&lt;strong&gt;A2A Endpoints&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon SQS&lt;/strong&gt; - сообщение в очередь сообщений.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 HTTP(S) - сообщение в какой-то REST &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS Lambda&lt;/strong&gt; - сообщение Lamda-функции
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt; - сообщения могут быть переданы в S3, Elasticsearch, RedShift или куда-то еще
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;strong&gt;A2P  Endpoints&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;e-mail&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;SMS&lt;/strong&gt; на мобилку
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 мобильные &lt;strong&gt;push&lt;/strong&gt;-сообщения
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon SNS Endpoints&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_sns_endpoints&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:157,&amp;quot;range&amp;quot;:&amp;quot;129111-129806&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit158&quot; id=&quot;amazon_sns_topics&quot;&gt;Amazon SNS Topics&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Чтобы сообщение было доставлено - нужно создать &lt;strong&gt;topic&lt;/strong&gt;, куда издатель (publisher) его отправит и на который подпишутся подписчики (subscribers). &lt;br/&gt;

Для издателей настраиваются политики доступа к топикам - то есть в примере в S3 - бакету нужно дать права с помощью IAM-политики на публикацию сообщений в топике. Политика назначается на топик. &lt;br/&gt;

Правила наименования топиков:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 до 256 символов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 могут содержать дефисы и подчеркивания
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
ARN выглядит так: &lt;strong&gt;arn:aws:sns:eu-west-2:123456789789:new-object-upload-alert&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon SNS Topics&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_sns_topics&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:158,&amp;quot;range&amp;quot;:&amp;quot;129807-130686&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit159&quot; id=&quot;типы_топиков_sns&quot;&gt;Типы топиков SNS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Standard&lt;/strong&gt; - дефолтный тип. Используется, когда порядок доставки сообщений и возможные дубли - не важны. Поддерживаются все протоколы. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;FIFO&lt;/strong&gt; - Обеспечивают строгий порядок доставки сообщений без дублей. Поддерживается только эндпоинтами &lt;strong&gt;Amazon SQS&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0438\u043f\u044b \u0442\u043e\u043f\u0438\u043a\u043e\u0432 SNS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0438\u043f\u044b_\u0442\u043e\u043f\u0438\u043a\u043e\u0432_sns&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:159,&amp;quot;range&amp;quot;:&amp;quot;130687-131176&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit160&quot; id=&quot;amazon_sns_fanout&quot;&gt;Amazon SNS Fanout&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon SNS Fanout&lt;/strong&gt; - это механизм репликации сообщений множеству подписчиков. &lt;br/&gt;

Работает - параллельно и ассинхронно. &lt;br/&gt;

Реализуется с помощью &lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt; &lt;br/&gt;

Пример - нужно чтобы сообщения от Lambda-функции, которая обрабатывает заказ билета передавались Lambda-функции, которая обрабатывает платеж и далее - в &lt;strong&gt;Amazon Redshift&lt;/strong&gt; для истории.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Lambda-функция продажи билета отправляет сообщение в &lt;strong&gt;SNS topic&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Сообщение реплицируется в две точки - очередь &lt;strong&gt;SNS&lt;/strong&gt; и &lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Из очереди сообщений - его забирает Labmda-функция обработки платежей.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt; передает сообщение в кластер &lt;strong&gt;RedShift&lt;/strong&gt;. Путь такой - сначала данные копируются в бакет &lt;strong&gt;S3&lt;/strong&gt;, а затем - выполняется команда &lt;strong&gt;Amazon RedShift COPY&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon SNS Fanout&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_sns_fanout&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:160,&amp;quot;range&amp;quot;:&amp;quot;131177-132450&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit161&quot; id=&quot;стоимость_использования_amazon_sns&quot;&gt;Стоимость использования Amazon SNS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Платим только за сообщения. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Standard topics&lt;/strong&gt; - платим за вызовы &lt;strong&gt;&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt; в месяц. Например - мобильные &lt;strong&gt;push&lt;/strong&gt;-сообщения - $0.5 за миллион сообщений в месяц. Объем сообщений - до &lt;strong&gt;256KB&lt;/strong&gt;, для мобильных SMS - &lt;strong&gt;64KB&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;FIFO topics&lt;/strong&gt; - платим за всё - за опубликованные сообщения, за доставленные сообщения и за объем переданных данных.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Amazon SNS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c_\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f_amazon_sns&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:161,&amp;quot;range&amp;quot;:&amp;quot;132451-133075&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit162&quot; id=&quot;amazon_sqs_и_amazon_mq_для_реализации_микросервисной_архитектуры&quot;&gt;Amazon SQS и Amazon MQ для реализации микросервисной архитектуры&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Брокеры очередей сообщений &lt;strong&gt;Amazon SQS&lt;/strong&gt; и &lt;strong&gt;Amazon MQ&lt;/strong&gt; - позволяют перейти от монолитных приложений к микросервисам.
&lt;strong&gt;Amazon SQS&lt;/strong&gt; и &lt;strong&gt;Amazon MQ&lt;/strong&gt; представляют дополнительный высоконадежный слой взаимодействия между элементами приложений, что в итоге позволяет:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 посылать и обрабатывать сообщения в/из очереди независимо
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 ассинхронно
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 масштабировать разные элементы приложения независимо
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Пример сценария, использующего &lt;strong&gt;Amazon SQS&lt;/strong&gt; - приложение конвертирующее видео-файлы в разные разрешения и форматы:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Пользователи заливают файлики на web-серврах, количество которых автоматичсеки масштабируется в зависимости от нагрузки
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Файлы попадают в бакет S3
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 При появлении нового файла сообщение с помощью &lt;strong&gt;Amazon SNS&lt;/strong&gt; отправляется в несколько очередей &lt;strong&gt;Amazon SQS&lt;/strong&gt; в режиме &lt;strong&gt;Fanout&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Очереди SQS хранят сообщения до момента, когда они будут прочитаны одним из серверов приложений
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сервера приложений читают сообщения, в которых указано какой файл и в какой формат нужно сконвертировать
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Файлики конвертируются и складываются куда надо
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В то время,как &lt;strong&gt;Amazon SNS&lt;/strong&gt; является источником push-событий, &lt;strong&gt;Amazon SQS&lt;/strong&gt; - это pull-based платформа, где чтение сообщений инициируется серверами приложений. &lt;br/&gt;

Сообщения в amazon SQS могут храниться некоторое время (дефолт 4 дня, до 14 дней).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon SQS \u0438 Amazon MQ \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_sqs_\u0438_amazon_mq_\u0434\u043b\u044f_\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438_\u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439_\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:162,&amp;quot;range&amp;quot;:&amp;quot;133076-135440&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit163&quot; id=&quot;типы_очередей_amazon_sqs&quot;&gt;Типы очередей Amazon SQS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Standard queue&lt;/strong&gt; - поддерживают практически неограниченное количество &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;-запросов в секунду (SendMessage, ReceiveMessage, DeleteMessage) и предназначены для сообщений, которые должны быть доставлены хотя бы один раз. Не исключены дубли. Порядок доставки сообщений - не гарантируется. Глубина очереди не может превышать 120 000 записей.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;FIFO queue&lt;/strong&gt; - исключают дубли и порядок доставки. Скорость - до 300 сообщений в секунду. Более высокие скорости достиживмы в пакетом режиме - до 3000 сообщзщений в секунду (пачками по 10 сообщений).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0438\u043f\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 Amazon SQS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0438\u043f\u044b_\u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439_amazon_sqs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:163,&amp;quot;range&amp;quot;:&amp;quot;135441-136398&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit164&quot; id=&quot;шифрование_сообщений&quot;&gt;Шифрование сообщений&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сообщения в Amazon SQS могут быть зашифрованы с помощью ключей &lt;strong&gt;Amazon KMS (Key management Service)&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:164,&amp;quot;range&amp;quot;:&amp;quot;136399-136597&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit165&quot; id=&quot;оплата_sqs&quot;&gt;Оплата SQS&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Платим только за сообщения и взаимодействия с S3 и KMS.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u043f\u043b\u0430\u0442\u0430 SQS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u043f\u043b\u0430\u0442\u0430_sqs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:165,&amp;quot;range&amp;quot;:&amp;quot;136598-136721&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit166&quot; id=&quot;amazon_mq&quot;&gt;Amazon MQ&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;RabbitMQ&lt;/strong&gt;-совместимый брокер сообщений. &lt;br/&gt;

Ориентирован на клиентов, мигрирующих в облако. Не имеет других преимуществ перед &lt;strong&gt;Amazon SNS&lt;/strong&gt; и &lt;strong&gt;Amazon SQS&lt;/strong&gt;, которые предпочтительны для новых приложений. &lt;br/&gt;

Поддерживает &lt;strong&gt;&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; JMS&lt;/strong&gt; и протоколы:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AMPQ 0-9-1&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AMPQ 1.0&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;MQTT&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;OpenWire&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;STOMP&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon MQ&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_mq&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:166,&amp;quot;range&amp;quot;:&amp;quot;136722-137230&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit167&quot; id=&quot;проектирование_event-driven_приложений_на_базе_aws_eventbridge&quot;&gt;Проектирование event-driven приложений на базе AWS EventBridge&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon EventBridge&lt;/strong&gt; - это шина событий, для обработки сообщений поступающих в реальном времени и реакции на них. &lt;br/&gt;

&lt;strong&gt;Amazon EventBridge&lt;/strong&gt; - это новая версия инструмента, ранее называвшегося &lt;strong&gt;Amazon CloudWatch Events&lt;/strong&gt;. &lt;br/&gt;

В качестве обработчиков могут выступать:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 AWS Lambda
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Kinesis
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 HTTP(S) эндпоинты
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 шины событий в других аккаунтах
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 SNS топики
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 таски ECS
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 SQS-очереди
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
События генерируются в ответ на изменение состояния ресурса (например - EC2-инстанса, события AutoScale). &lt;br/&gt;

&lt;strong&gt;Amazon EventBridge&lt;/strong&gt; путем создания правил, описывающих шаблоны событий и таргеты, куда будет отправлено оповещение. &lt;br/&gt;

&lt;strong&gt;Amazon EventBridge&lt;/strong&gt; может запускать действия по таймеру. &lt;br/&gt;

В отличие от &lt;strong&gt;Amazon CloudWatch Events&lt;/strong&gt;, который имел только одну дефолтную шину событий (для событий AWS и кастомных), &lt;strong&gt;Amazon EventBridge&lt;/strong&gt; позволяет создавать кастомные шины, который могут быть выделены для обработки катомных событий от приложений. Также &lt;strong&gt;Amazon EventBridge&lt;/strong&gt; поддерживает интеграцию с внешними приложениямитакими как &lt;strong&gt;ZenDesk&lt;/strong&gt;, &lt;strong&gt;PagerDuty&lt;/strong&gt;, &lt;strong&gt;Datadog&lt;/strong&gt;. &lt;br/&gt;

Терминология &lt;strong&gt;Amazon EventBridge&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 События (Events) - изменения состояния ресурсов (приложений, AWS-ресурсов, внешних приложений).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Правила (Rules) - шаблоны событий, которые подлежат обработке. Содержат также шаблоны JSON-данных, отправляемых в обработчик (&lt;strong&gt;target&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обработчики (targets) - Реагируют на события и выполняют действия.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Шины событий (Event Buses) - они (дефолтная и кастомные) получают события от источников и содержат правила и обработчики. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 event-driven \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u0430\u0437\u0435 AWS EventBridge&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_event-driven_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439_\u043d\u0430_\u0431\u0430\u0437\u0435_aws_eventbridge&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:167,&amp;quot;range&amp;quot;:&amp;quot;137231-139816&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit168&quot; id=&quot;amazon_step_functions_и_amazon_swf&quot;&gt;Amazon Step Functions и Amazon SWF&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Это еще два сервиса, реализующие взаимодействие между компонентами приложений, позволяющие создавать бессерверные решения. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Step Functions \u0438 Amazon SWF&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_step_functions_\u0438_amazon_swf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:168,&amp;quot;range&amp;quot;:&amp;quot;139817-140095&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit169&quot; id=&quot;amazon_step_functions&quot;&gt;Amazon Step Functions&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Step Functions&lt;/strong&gt; - связывают различные элементарные обработчики данных (&lt;strong&gt;Lambda&lt;/strong&gt;-функции, контейнеры &lt;strong&gt;ECS&lt;/strong&gt;) в единый &lt;strong&gt;WorkFlow&lt;/strong&gt;. &lt;br/&gt;

&lt;strong&gt;Amazon Step Functions&lt;/strong&gt; - позволяют описывать и визуализировать &lt;strong&gt;workflow&lt;/strong&gt; прикладных задач в виде отдельных блоков - &lt;strong&gt;конечных автоматов&lt;/strong&gt;, называемых &lt;strong&gt;states&lt;/strong&gt;,  каждый из которых на входе получает даные, в том числе и интерактивно от пользователя, а затем принимает решение на их основе и передаёт дальше по цепочке следующему &lt;strong&gt;state&lt;/strong&gt; или внешнему обработчику типа &lt;strong&gt;Lambda&lt;/strong&gt;-функции.&lt;br/&gt;

&lt;strong&gt;State&lt;/strong&gt; бывают следующих видов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Success or Fail state&lt;/strong&gt; - остановка/продолжение обработки в зависимости от входных данных
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Wait State&lt;/strong&gt; - ожидание в течение заданного времени
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Parallel State&lt;/strong&gt; - создание параллельных ветвей исполнения
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Map State&lt;/strong&gt; - осуществляется обработка списка входящих параметров
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Choise state&lt;/strong&gt; - выбор ветки исполнения на основе входящих данных
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Task state&lt;/strong&gt; - выполнение обработки анных с помощью других сервисов AWS, например - &lt;strong&gt;Lambda&lt;/strong&gt;-функций
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;strong&gt;Amazon Step Functions&lt;/strong&gt; используют &lt;strong&gt;JSON&lt;/strong&gt;-объекты &lt;strong&gt;Amazon State Language (ASL)&lt;/strong&gt; для описания конечных автоматов. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Step Functions&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_step_functions&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:169,&amp;quot;range&amp;quot;:&amp;quot;140096-141976&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit170&quot; id=&quot;типы_workflow&quot;&gt;Типы Workflow&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Standard workflow&lt;/strong&gt; - предполагает однократное исполнение, подходит для интерактивных задач, может длиться до 1 года. Оплата - за каждый переход от одного &lt;strong&gt;state&lt;/strong&gt; к следующему. Предоставляют доступ к истории исполнения и визуальный отладчик.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  &lt;strong&gt;Express Workflow&lt;/strong&gt; - Подходят для автоматических задач. Исполнение в течение максимум 5 минут. Оплата - за количество и длительность исполнения. История исполнений передается в &lt;strong&gt;Amazon CloudWatch&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0438\u043f\u044b Workflow&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0438\u043f\u044b_workflow&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:170,&amp;quot;range&amp;quot;:&amp;quot;141977-142765&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit171&quot; id=&quot;amazon_simple_workflow_service_swf&quot;&gt;Amazon Simple Workflow Service (SWF)&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon SWF&lt;/strong&gt; - еще один, наряду с &lt;strong&gt;Amazon Step Functions&lt;/strong&gt; сервис компоновки сложных задач из элементарных обработчиков (&lt;strong&gt;workers&lt;/strong&gt;), работащих на инстансах &lt;strong&gt;EC2&lt;/strong&gt; или &lt;strong&gt;on-premise&lt;/strong&gt;. &lt;br/&gt;

Основное отличие &lt;strong&gt;Amazon SWF&lt;/strong&gt; от &lt;strong&gt;Amazon Step Functions&lt;/strong&gt; - это способ описания workflow. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Step Functions&lt;/strong&gt; - это простое декларативное JSON-описание взаимодействия между обработчиками внутри AWS.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon SWF&lt;/strong&gt; - предполагает написание программы на любом языке, которая получит состояние предыдущего обработчика и передаст следующему. Позволяет использовать внешние, сервисы.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Simple Workflow Service (SWF)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_simple_workflow_service_swf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:171,&amp;quot;range&amp;quot;:&amp;quot;142766-143740&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit172&quot; id=&quot;сервисы_aws_для_анализа_информации&quot;&gt;11. Сервисы AWS для анализа информации&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;11. \u0421\u0435\u0440\u0432\u0438\u0441\u044b AWS \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u0440\u0432\u0438\u0441\u044b_aws_\u0434\u043b\u044f_\u0430\u043d\u0430\u043b\u0438\u0437\u0430_\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:172,&amp;quot;range&amp;quot;:&amp;quot;143741-143820&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit173&quot; id=&quot;amazon_kinesis_-_стриминг_данных&quot;&gt;Amazon Kinesis - стриминг данных&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Kinesis&lt;/strong&gt; - &lt;strong&gt;fully-managed&lt;/strong&gt; сервис для немедленной обработки данных по мере их поступления. &lt;br/&gt;

Включает в себя 4 основых сервиса:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Kinesis Data Streams&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Kinesis Data Analytics&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Kinesis Video Streams&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Kinesis - \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_kinesis_-_\u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433_\u0434\u0430\u043d\u043d\u044b\u0445&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:173,&amp;quot;range&amp;quot;:&amp;quot;143821-144250&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit174&quot; id=&quot;amazon_kinesis_data_firehose&quot;&gt;Amazon Kinesis Data Firehose&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt; - по функционалу напоминает &lt;strong&gt;Logstash&lt;/strong&gt; от &lt;strong&gt;Elastic&lt;/strong&gt;, но не обеспечивает кеширования. &lt;br/&gt;

&lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt; - сервис для приема данных и передачи их в:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сервисы Amazon - &lt;strong&gt;S3&lt;/strong&gt;, &lt;strong&gt;RedShift&lt;/strong&gt;, &lt;strong&gt;Elasticsearch&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Внешние сервисы - &lt;strong&gt;DataDog&lt;/strong&gt;, &lt;strong&gt;New Relic&lt;/strong&gt;, &lt;strong&gt;MongoDB&lt;/strong&gt;, &lt;strong&gt;Splunk&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt; позволяет:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 выполнять пакетные операции над поступающими данными - сжатие, преобразование, шифрование. Это снижает общую стоимость обработки и хранения. &lt;br/&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 преобразовывать в открытые форматы - &lt;strong&gt;Apache Parquet&lt;/strong&gt;, &lt;strong&gt;Apache ORC&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Оплата - только за количество обработанных данных. Без резервирования и предоплат.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Kinesis Data Firehose&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_kinesis_data_firehose&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:174,&amp;quot;range&amp;quot;:&amp;quot;144251-145312&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit175&quot; id=&quot;amazon_kinesis_data_streams&quot;&gt;Amazon Kinesis Data Streams&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Kinesis Data Streams&lt;/strong&gt; - &lt;strong&gt;real-time&lt;/strong&gt; сервис для получения и стриминга данных в кастомные приложения (Lambda-функции или AWS S3). В отличие от &lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt;, который ориентирован на стриминг данных в хранилища. &lt;br/&gt;

Свойства &lt;strong&gt;Amazon Kinesis Data Streams&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Типичное время обработки сообщения - 70ms
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 высокая доступность - собираемые данные реплицируются в три AZ.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 в отличие от &lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt;, &lt;strong&gt;Kinesis Data Streams&lt;/strong&gt; может хранить собранные данные от дефолтных 24 часов, до 7 (retention) или даже 365 (long term retention) дней.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 предназначен для - real-time дашбордов, детектинга аномалий, анализа цен в реальном времени
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 транзакции обрабатываются в шардами, количество которых опредеяет доступную скорость обработки. Производительность каждой шарды - на чтение до 5 транзакций, до 2 &lt;abbr title=&quot;Megabyte&quot;&gt;MB&lt;/abbr&gt; данных на шарду в секунду. На запись - до 1000 сообщений, до 1MB данных в секунду.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Оплата - почасовая за зарезервированные шарды (пропускную способность), независимо от того, используются ли все зарезервированные шарды или нет
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
На первый взгляд может показаться, что &lt;strong&gt;Amazon SQS&lt;/strong&gt; и &lt;strong&gt;Kinesis Data Streams&lt;/strong&gt; абсолютно одинаковые, однако это не так. &lt;strong&gt;Amazon SQS&lt;/strong&gt; - это слой взаимодействия между компонентами приложений, очередь сообщений, с издателями и подписчиками. А &lt;strong&gt;Kinesis Data Streams&lt;/strong&gt; - это просто стриминг сообщений, аналог &lt;strong&gt;logstash&lt;/strong&gt; с резервируемой и гарантированной пропускной способностью, а также хранением при необходимости.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Kinesis Data Streams&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_kinesis_data_streams&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:175,&amp;quot;range&amp;quot;:&amp;quot;145313-147777&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit176&quot; id=&quot;amazon_kinesis_data_analytics&quot;&gt;Amazon Kinesis Data Analytics&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервис построения приложений для анализа данных, собираемых &lt;strong&gt;Amazon Kinesis Data Streams&lt;/strong&gt; или &lt;strong&gt;Managed Streaming for Kafka (MSK)&lt;/strong&gt;. &lt;br/&gt;

Позволяет использовать стандартные способы обращения к БД - с помощью языков &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;Scala&lt;/strong&gt;, &lt;strong&gt;SQL&lt;/strong&gt;, а также отрытого фреймворка дял потокой обработки данных - &lt;strong&gt;Apache Flink&lt;/strong&gt;. &lt;br/&gt;

Для разработки приложений потоковой обработки доступна среда &lt;strong&gt;Kinesis Data Analytics Studio&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Kinesis Data Analytics&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_kinesis_data_analytics&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:176,&amp;quot;range&amp;quot;:&amp;quot;147778-148474&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit177&quot; id=&quot;amazon_kinesis_video_streams&quot;&gt;Amazon Kinesis Video Streams&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Kinesis Video Streams&lt;/strong&gt; - сервис хранения, каталогизации, воспроизведения и анализа видеопотоков. &lt;br/&gt;

В качестве хранилища использует S3. &lt;br/&gt;

&lt;strong&gt;Amazon Rekognition&lt;/strong&gt; - сервис анализа видеопотоков для выявления объектов, лиц, сцен, текста, изображений. &lt;br/&gt;

Например - можно организовать стриминг с камер возле дверей домов, распознавать людей, которые стучатся в дверь и уведомлять пользователей.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Kinesis Video Streams&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_kinesis_video_streams&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:177,&amp;quot;range&amp;quot;:&amp;quot;148475-149191&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit178&quot; id=&quot;обработка_данных_из_amazon_s3_с_помощью_amazon_athena&quot;&gt;Обработка данных из Amazon S3 с помощью Amazon Athena&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Часто, данные выгружаются на &lt;strong&gt;S3&lt;/strong&gt; потому что они нужны нечасто и держать их в одной из баз &lt;strong&gt;Amazon RDS&lt;/strong&gt; или &lt;strong&gt;NoSQL&lt;/strong&gt; нецелесообранзно. &lt;br/&gt;

Для быстрого и удобного доступа к таким данным используется &lt;strong&gt;fully-mnaged&lt;/strong&gt; бессерверный сервис &lt;strong&gt;Amazon Athena&lt;/strong&gt;, который позволяет выполнять SQL-запросы к данным хранящимся на S3. &lt;br/&gt;

Формат хранения данны на S3 может быть как структурированным, так и неструктурированным - CSV, JSON, ORC, Apache Parquet. &lt;br/&gt;

Кроме того, &lt;strong&gt;Amazon Athena&lt;/strong&gt; предоставляет драйвер JDBC для взаимодейтсия с популярными BI-приложениями. &lt;br/&gt;

Процесс доступа предполагает создание (автоматически или вручную) базы данных и таблиц с даными на основе метаданных, которые указывают &lt;strong&gt;Amazon Athena&lt;/strong&gt; формат данных на S3. &lt;br/&gt;

Результаты запросов могут быть выгружены на S3. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Amazon S3 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Amazon Athena&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430_\u0434\u0430\u043d\u043d\u044b\u0445_\u0438\u0437_amazon_s3_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_amazon_athena&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:178,&amp;quot;range&amp;quot;:&amp;quot;149192-150592&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit179&quot; id=&quot;amazon_elasticsearch_aws_opensearch&quot;&gt;Amazon Elasticsearch (AWS OpenSearch)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;OpenSearch&lt;/strong&gt; - это &lt;strong&gt;Managed&lt;/strong&gt;-сервис от Amazon реализующий все прелести &lt;strong&gt;Elasticsearch&lt;/strong&gt;. Используется свой дистрибутив - &lt;strong&gt;OpenDistro&lt;/strong&gt; &lt;br/&gt;

Доступны &lt;strong&gt;Kibana&lt;/strong&gt; и &lt;strong&gt;Logstash&lt;/strong&gt;. &lt;br/&gt;

&lt;strong&gt;OpenSearch&lt;/strong&gt; может получать данные из &lt;strong&gt;Amazon Kinesis Data Firehose&lt;/strong&gt;, &lt;strong&gt;Amazon CloudWatch Logs&lt;/strong&gt;, и &lt;strong&gt;AWS IoT&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Elasticsearch (AWS OpenSearch)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_elasticsearch_aws_opensearch&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:179,&amp;quot;range&amp;quot;:&amp;quot;150593-151033&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit180&quot; id=&quot;amazon_glue_и_amazon_quicksight&quot;&gt;Amazon Glue и Amazon QuickSight&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Сервисы для объединения данных из различных источников - БД, стримингов, S3 и прочих. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Glue \u0438 Amazon QuickSight&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_glue_\u0438_amazon_quicksight&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:180,&amp;quot;range&amp;quot;:&amp;quot;151034-151233&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit181&quot; id=&quot;amazon_glue&quot;&gt;Amazon Glue&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Glue&lt;/strong&gt; - это &lt;strong&gt;serverless managed&lt;/strong&gt; &lt;strong&gt;ETL&lt;/strong&gt;-сервис (&lt;strong&gt;Extract, Transform, Load&lt;/strong&gt;). &lt;br/&gt;

Он позволяет извлекать, преобразовывать и загружать данные из обних хранилищ в другие, тем самым объединяя и обогащая данные. &lt;br/&gt;

&lt;strong&gt;Amazon Glue&lt;/strong&gt; содержит &lt;strong&gt;Data Catalog&lt;/strong&gt; - центральное хранилище метаданных, которое хранит сведения о данных (например - опредения таблиц).&lt;br/&gt;

Для обнаружения данных и сбора сведений об их структуре и типах используется &lt;strong&gt;crawler&lt;/strong&gt;. &lt;br/&gt;

&lt;strong&gt;Crawler&lt;/strong&gt; сканирует источники, обнаруживает данные и сохраняет информацию о них в &lt;strong&gt;Data Catalog&lt;/strong&gt;. &lt;br/&gt;

Затем - собранные метаданные используются для построения ETL-скриптов, преобразующих данные в нужные форматы. &lt;br/&gt;

Для работы с &lt;strong&gt;Amazon Glue&lt;/strong&gt; используется &lt;strong&gt;AWS Glue console&lt;/strong&gt; которая может:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создавать определения &lt;strong&gt;Glue&lt;/strong&gt;-объектов (jobs, crawlers, tables и прочих)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Планировать запуски crawler&amp;#039;ов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Определять тригеры для запуска job&amp;#039;ов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Искать и фильровать объекты в Glue
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Редактировать ETL-скрипты
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Биллинг - на основании ресурсов и времени их использования, почасовой (с посекундным разрешением), а также на основании количества использованного места для хранения метаданных в &lt;strong&gt;AWS Glue Data Catalog&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Glue&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_glue&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:181,&amp;quot;range&amp;quot;:&amp;quot;151234-153180&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit182&quot; id=&quot;amazon_quicksight&quot;&gt;Amazon QuickSight&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Fully Managed, serverless&lt;/strong&gt; BI-сервис для формирования и публикации интерактивных BI-дашбордов. &lt;br/&gt;

Может использовать данные из сервисов AWS, БД on-premises, из сервисов SaaS и B2B-данные. &lt;br/&gt;

Дашборды могут быть использоваться как на PC, так и на мобильных девайсах. &lt;br/&gt;

&lt;strong&gt;QuickSight&lt;/strong&gt; интегрируется с ML-сервисами (&lt;strong&gt;ML Insights&lt;/strong&gt;) для глубокого анализа, выявления отклонений и аномалий в данных. &lt;br/&gt;

Также - итоги анализа могут быть сформулированы обобщены в виде описания на естественном языке. &lt;br/&gt;

Биллинг - по числу пользователей этих дашбордов. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon QuickSight&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_quicksight&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:182,&amp;quot;range&amp;quot;:&amp;quot;153181-154125&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit183&quot; id=&quot;другие_сервисы_анализа_данных_от_amazon&quot;&gt;Другие сервисы анализа данных от Amazon&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 Amazon&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0440\u0443\u0433\u0438\u0435_\u0441\u0435\u0440\u0432\u0438\u0441\u044b_\u0430\u043d\u0430\u043b\u0438\u0437\u0430_\u0434\u0430\u043d\u043d\u044b\u0445_\u043e\u0442_amazon&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:183,&amp;quot;range&amp;quot;:&amp;quot;154126-154203&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit184&quot; id=&quot;elastic_map_reduce_emr&quot;&gt;Elastic Map Reduce (EMR)&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS EMR&lt;/strong&gt; - это &lt;strong&gt;managed Hadoop framework&lt;/strong&gt;. &lt;br/&gt;

Может использоватьс с инструментами &lt;strong&gt;Apache Spark&lt;/strong&gt;, &lt;strong&gt;Apache Hive&lt;/strong&gt;, &lt;strong&gt;Apache HBase&lt;/strong&gt;, &lt;strong&gt;Apache Flink&lt;/strong&gt;, &lt;strong&gt;Apache Hudi&lt;/strong&gt; и &lt;strong&gt;Presto&lt;/strong&gt;. &lt;br/&gt;

Включает в себя свою IDE - &lt;strong&gt;EMR Studio&lt;/strong&gt;., которая поддерживает разработку на &lt;strong&gt;R&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;Scala&lt;/strong&gt; и &lt;strong&gt;PySpark&lt;/strong&gt;. &lt;br/&gt;

Рабочие нагрузки можно запускать на &lt;strong&gt;EC2&lt;/strong&gt;-инстансах и в кластерах &lt;strong&gt;k8s&lt;/strong&gt; - &lt;strong&gt;AWS EKS&lt;/strong&gt;, а также on-premises с помощью &lt;strong&gt;AWS Outpost&lt;/strong&gt;. &lt;br/&gt;

Биллинг - за каждый инстанс, посекундный с минимальным интервалом использования 1 минута. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Elastic Map Reduce (EMR)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;elastic_map_reduce_emr&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:184,&amp;quot;range&amp;quot;:&amp;quot;154204-155012&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit185&quot; id=&quot;aws_data_pipeline&quot;&gt;AWS Data Pipeline&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
web-сервис для автоматизации переноса и преобразования данных из различных источников (&lt;strong&gt;on-premise&lt;/strong&gt; и других) в сервисы &lt;strong&gt;AWS&lt;/strong&gt; (&lt;strong&gt;S3&lt;/strong&gt;, &lt;strong&gt;RDS&lt;/strong&gt;, &lt;strong&gt;DynamoDB&lt;/strong&gt;, &lt;strong&gt;EMR&lt;/strong&gt;). &lt;br/&gt;

Например - настроить автоматическую архивацию логов web-сервера в &lt;strong&gt;S3&lt;/strong&gt; и затем - запускать &lt;strong&gt;EMR&lt;/strong&gt;-job для анализа и генерации репортов. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Data Pipeline&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_data_pipeline&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:185,&amp;quot;range&amp;quot;:&amp;quot;155013-155539&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit186&quot; id=&quot;aws_cloudsearch&quot;&gt;AWS CloudSearch&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Managed-сервис для организации поиска в web-приложениях. &lt;br/&gt;

Поддерживает 34 языка и разные сложные поисковые запросы для поиска по сайтам. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS CloudSearch&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_cloudsearch&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:186,&amp;quot;range&amp;quot;:&amp;quot;155540-155809&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit187&quot; id=&quot;автоматизация_и_развертывание_приложений_в_aws&quot;&gt;12. Автоматизация и развертывание приложений в AWS&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
В даном разделе рассматриваются:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Деплоймент приложений с помощью &lt;strong&gt;Amazon Elastic Beanstalk&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Infratructure As A code&lt;/strong&gt; с помощью &lt;strong&gt;Amazon CloudFormation&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Оркестрация конфигураций с помощью &lt;strong&gt;Chef&lt;/strong&gt; и &lt;strong&gt;Puppet&lt;/strong&gt; на базе &lt;strong&gt;AWS OpsWorks&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Автоматизация с помощью &lt;strong&gt;AWS Lambda&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;12. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f_\u0438_\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439_\u0432_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:187,&amp;quot;range&amp;quot;:&amp;quot;155810-156329&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit188&quot; id=&quot;деплоймент_приложений_с_помощью_amazon_elastic_beanstalk&quot;&gt;Деплоймент приложений с помощью Amazon Elastic Beanstalk&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервис &lt;strong&gt;Amazon Elastic Beanstalk&lt;/strong&gt; позволяет полностью автоматически выполнять:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 создание и конфигурацию инфраструктуры для приложений
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Масшатбирование
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 настройку балансировщиков
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 настройку мониторинга
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Подерживаются приложения на следующих языках:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Go&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Java&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;.NET&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Node.js&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;PHP&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Python&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 и некоторые другие
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;strong&gt;Amazon Elastic Beanstalk&lt;/strong&gt; полностью обеспечивает создание и настройку инфраструктуры, также поддердиваются контейнеризированные прилжения. &lt;br/&gt;

В процессе разворачивания инфраструктуры можно задавать ее параметры - типы инстансов EC2, их количество, а также параметры автоскейлинга, а после разворачивания - можно менять параметры и апдейтить приложение. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Amazon Elastic Beanstalk&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_amazon_elastic_beanstalk&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:188,&amp;quot;range&amp;quot;:&amp;quot;156330-157632&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit189&quot; id=&quot;базовые_концепции_elastic_beanstalk&quot;&gt;Базовые концепции Elastic Beanstalk&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Environment&lt;/strong&gt; - это все инфраструктурные компоненты, которые создает &lt;strong&gt;Elastic Beanstalk&lt;/strong&gt; во время деплоймента. Каждый &lt;strong&gt;environment&lt;/strong&gt; может исполнять только одну версию приложения, а для работы нескольких версий одновременно -  можно создать несколько &lt;strong&gt;environment&lt;/strong&gt;. Параметры каждого можно менять, например - для апгрейда приложения. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Environment tier&lt;/strong&gt; - тип окружения, который определяется свойствами публикуемого приложения. Их два - &lt;strong&gt;web server environment&lt;/strong&gt; и &lt;strong&gt;worker environment&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 Elastic Beanstalk&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0430\u0437\u043e\u0432\u044b\u0435_\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438_elastic_beanstalk&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:189,&amp;quot;range&amp;quot;:&amp;quot;157633-158495&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit190&quot; id=&quot;web_server_environment_tier&quot;&gt;Web Server environment tier&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Позволяет автоматизировать публикацию web-фронтендов. &lt;br/&gt;

Настраивает ec2-инстансы в нейскольких AZ, автоскейлинг для них, балансировщики нагрузки, а также - весь стек, необходимый для работы приложения. &lt;br/&gt;

Например  публикация &lt;strong&gt;.NET&lt;/strong&gt; приложения для Windows подразумевает настройку Windows-based инстансов EC2 и заданую версию IIS. &lt;br/&gt;

Также - приложение автоматически публикуется, для чего создается &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-запись вида &lt;strong&gt;app-name.region.elasticbeanstalk.com&lt;/strong&gt;, на которую можно ссылаться с помощью &lt;strong&gt;CNAME&lt;/strong&gt;-записей. &lt;br/&gt;

На созданных EC2-инстансах деплоится &lt;strong&gt;host manager (HM)&lt;/strong&gt;, который:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Деплоит приложение
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Собирает метрики с серверов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Генерирует события
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Мониторит лог-файлы приложения на предмет критических ошибок
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Мониторит состояние сервера приложений
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Накатывает патчи на EC2-инстансы
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Ротрует логи приложения и вываливает их на S3.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Web Server environment tier&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;web_server_environment_tier&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:190,&amp;quot;range&amp;quot;:&amp;quot;158496-159975&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit191&quot; id=&quot;worker_environment_tier&quot;&gt;Worker environment tier&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Этот тип окружений предназначен для деплоя backend-слоя. &lt;br/&gt;

Elastic Beanstalk деплоит:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 один или несколько инстансов &lt;strong&gt;EC2&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AutoScaling Group&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 IAM-роль
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Балансировщик
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 При необходимости - разворачивается очередь &lt;strong&gt;Amazon SQS&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
На каждый EC2-инстанс деплоится демон, который читает сообщения из очереди SQS и отправляет прочитанные данные в приложение.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Worker environment tier&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;worker_environment_tier&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:191,&amp;quot;range&amp;quot;:&amp;quot;159976-160608&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit192&quot; id=&quot;iac_с_помощью_amazon_cloudformation&quot;&gt;IaC с помощью Amazon CloudFormation&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon CloudFormation&lt;/strong&gt; - использует JSON-темплейты (можно YAML) для описания инфраструктуры, в коорые можно подставлять некоторые значения для изменения параметров. &lt;br/&gt;

Темплейты используются для разворачивания &lt;em&gt;стеков&lt;/em&gt; - &lt;strong&gt;CloudFormation stacks&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;IaC \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Amazon CloudFormation&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;iac_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_amazon_cloudformation&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:192,&amp;quot;range&amp;quot;:&amp;quot;160609-161072&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit193&quot; id=&quot;cloudformation_stacks&quot;&gt;CloudFormation stacks&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;CloudFormation stack&lt;/strong&gt; - это контейнер, который группирует создаваемые ресурсы и позволяет обращаться с ними как с единым целым. &lt;br/&gt;

Стеков в рамках инсталляции может быть много и они могут взаимодействовать между собой. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;CloudFormation stacks&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cloudformation_stacks&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:193,&amp;quot;range&amp;quot;:&amp;quot;161073-161491&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit194&quot; id=&quot;change_sets&quot;&gt;Change sets&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
При внесении изменений в ресурсы, задеплоенные с помощью &lt;strong&gt;CloudFormation&lt;/strong&gt; формируются &lt;strong&gt;change set&lt;/strong&gt;&amp;#039;ы, которые позволяют оценить изменения вносимые в конфигурацию и принять решение о файтическом изменении. &lt;br/&gt;

Это полезно, для избежания катастрофических последствий для инфраструктуры. &lt;br/&gt;

Например, если в темплейте поменять имя базы данных, то применение темплейта будет подразумевать удаление базы со старым именем и создание новой базы с новым именем. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Change sets&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;change_sets&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:194,&amp;quot;range&amp;quot;:&amp;quot;161492-162327&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit195&quot; id=&quot;выявление_отклонений_-_drift_detection&quot;&gt;Выявление отклонений - drift detection&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Если в инфраструктуру вносятся изменения НЕ с помощью &lt;strong&gt;CloudFormation&lt;/strong&gt;, то может возникать разница между тем, что описано в темплейтах и тем, что есть на самом деле. &lt;br/&gt;

Это может приводить к тому, что дальнейшее применение изменений с помощью &lt;strong&gt;CloudFormation&lt;/strong&gt; может оказаться невозможным. &lt;br/&gt;

Для исправления этой ситуации существует механизм &lt;strong&gt;drift detection&lt;/strong&gt;, который демонстрирует расхождения между фактической конфигурацией и тем что описано в темплейтах. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 - drift detection&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435_\u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439_-_drift_detection&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:195,&amp;quot;range&amp;quot;:&amp;quot;162328-163198&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit196&quot; id=&quot;управление_конфигурацими_с_помощью_chef_и_puppet_на_базе_aws_opsworks&quot;&gt;Управление конфигурацими с помощью Chef и Puppet на базе AWS OpsWorks&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS OpsWorks for Puppet Enterprise&lt;/strong&gt; и &lt;strong&gt;AWS OpsWorks for Chef Automate&lt;/strong&gt; - это &lt;strong&gt;managed&lt;/strong&gt;-сервисы, которые позволяют управлять конфигурациями инстансов EC2. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Chef \u0438 Puppet \u043d\u0430 \u0431\u0430\u0437\u0435 AWS OpsWorks&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435_\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043c\u0438_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_chef_\u0438_puppet_\u043d\u0430_\u0431\u0430\u0437\u0435_aws_opsworks&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:196,&amp;quot;range&amp;quot;:&amp;quot;163199-163542&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit197&quot; id=&quot;aws_opsworks_stacks&quot;&gt;AWS OpsWorks Stacks&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
В рамках AWS стеком (stack) называется некоторый набор разнообразных ресурсов, управляемый как единое целое. &lt;br/&gt;

&lt;strong&gt;AWS OpsWorks Stack&lt;/strong&gt; позволяет не толко создать и настроить ресурсы, но и мониторить их, при этом нет необходимости поддерживать инфраструктуру &lt;strong&gt;Chef&lt;/strong&gt; для управления конфигурацией. &lt;br/&gt;

&lt;strong&gt;AWS OpsWorks Stack&lt;/strong&gt; представлен двумя слоями (layers):
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;application layer&lt;/strong&gt; - ресурсы необходимые собственно для работы приложения - инстансы EC2 и изх настройки - security groups и прочее
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;load balancing layer&lt;/strong&gt; - балансировщики нарузки, которые распределяют трафик по инстансам EC2
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Кроме того, стек &lt;strong&gt;AWS OpsWorks&lt;/strong&gt; может быть расширен сервисыми слоями (&lt;strong&gt;service layers&lt;/strong&gt;):
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon RDS layer&lt;/strong&gt; - базы данных
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Elastic Load Balancing layer&lt;/strong&gt; - слой балансировщиков для организации отказоустойчивости и распределения нагрузки по нескольким AZ
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon ECS layer&lt;/strong&gt; - слой для организации кластера и запуска в нем контейнеризированных приложений
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS OpsWorks Stacks&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_opsworks_stacks&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:197,&amp;quot;range&amp;quot;:&amp;quot;163543-165119&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit198&quot; id=&quot;мониторинг_и_управление_ресурсами_aws_-_amazon_cloudwatch&quot;&gt;13. Мониторинг и управление ресурсами AWS - Amazon CloudWatch&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;13. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 AWS - Amazon CloudWatch&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433_\u0438_\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435_\u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438_aws_-_amazon_cloudwatch&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:198,&amp;quot;range&amp;quot;:&amp;quot;165120-165225&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit199&quot; id=&quot;базовые_концепции_amazon_cloudwatch&quot;&gt;Базовые концепции Amazon CloudWatch&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon CloudWatch&lt;/strong&gt; - предназначн для мониторинга, сбора, хранения и анализа метрик с ресурсов &lt;strong&gt;AWS&lt;/strong&gt;, а также &lt;strong&gt;on-premises&lt;/strong&gt;. &lt;br/&gt;

Все ресурсы &lt;strong&gt;AWS&lt;/strong&gt; отдают метрики в &lt;strong&gt;CloudWatch&lt;/strong&gt;. Базовый набор метрик - бесплатен, сложные метрики - за деньги. &lt;br/&gt;

Типичные задачи решаемые с помощью &lt;strong&gt;CloudWatch&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Мониторинг состояния инфрастурктуры - метрик и логов. Визуализация, собранных данных.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Проактивные реакции - настройка оповещений и действий в ответ на достижения метриками заданных значений.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Анализ логов
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 Amazon CloudWatch&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0430\u0437\u043e\u0432\u044b\u0435_\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438_amazon_cloudwatch&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:199,&amp;quot;range&amp;quot;:&amp;quot;165226-166152&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit200&quot; id=&quot;метрики_cloudwatch&quot;&gt;Метрики CloudWatch&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Некоторые регулярно собираемые значения. &lt;br/&gt;

Каждая запись значения имеет таймстамп, а если его нет, то &lt;strong&gt;CloudWatch&lt;/strong&gt; поставит ее сам.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Встроенные метрики&lt;/strong&gt; - доступны “из коробки”. Например CPU, ввод-вывод и прочие.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Кастомные метрики&lt;/strong&gt; - например время загрузки страниц веб-приложения или потребление памяти. Метрики могут собираться с помощью &lt;strong&gt;CloudWatch Agent&lt;/strong&gt; (устанавливается на инстанс), либо пушиться c помощью метода &lt;strong&gt;CloudWatch &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt;  &lt;strong&gt;PutMetricData&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Записи метрики существуют в пределах региона AWS, но могут быть доступны в &lt;strong&gt;cross-account&lt;/strong&gt; и &lt;strong&gt;cross-region&lt;/strong&gt; дашбоардах. &lt;br/&gt;

Срок хранения - 15 месяцев. Старые записи автоматически уничтожаются. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041c\u0435\u0442\u0440\u0438\u043a\u0438 CloudWatch&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u0435\u0442\u0440\u0438\u043a\u0438_cloudwatch&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:200,&amp;quot;range&amp;quot;:&amp;quot;166153-167305&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit201&quot; id=&quot;cloudwatch_dashboards&quot;&gt;CloudWatch Dashboards&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Средства визуализации собранных данных метрик. &lt;br/&gt;

Функционал &lt;strong&gt;CloudWatch Dashboards&lt;/strong&gt; интегрирован с &lt;strong&gt;AWS Organizations&lt;/strong&gt; и таким образом является глобальным - межрегиональным и межаккаунтным. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;CloudWatch Dashboards&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cloudwatch_dashboards&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:201,&amp;quot;range&amp;quot;:&amp;quot;167306-167662&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit202&quot; id=&quot;cloudwatch_alarms&quot;&gt;CloudWatch Alarms&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Средства реагирования на достижение мертиками заданных значений. &lt;br/&gt;

&lt;strong&gt;Alarm&lt;/strong&gt; может иметь одно из трех состояний:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;OK&lt;/strong&gt; - значение метрики в пределах нормальных значений.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Alarm&lt;/strong&gt; - достигнут заданный предел. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Insufficient Data&lt;/strong&gt; - возвращается когда значений метрики недостаточно для принятия решения.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Возможные реакции на &lt;strong&gt;alarm&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Отправка сообщения через &lt;strong&gt;Simple Notification Service (SNS)&lt;/strong&gt; - &lt;strong&gt;application-to-person - A2P&lt;/strong&gt; (человеку) или &lt;strong&gt;application-to-application A2A&lt;/strong&gt; (приложению)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Auto Scaling Action&lt;/strong&gt; - сообщение для увеличения(уменьшения) числа EC2-инстансов.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;EC2 action&lt;/strong&gt; - действие с инстансом EC2, именно - запуск, остановка, рестарт, уничтожение, recovery (миграция на другой хост).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Публикация отметки на дашборд
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;CloudWatch Alarms&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cloudwatch_alarms&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:202,&amp;quot;range&amp;quot;:&amp;quot;167663-168886&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit203&quot; id=&quot;cloudwatch_logs&quot;&gt;CloudWatch Logs&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Средство аггрегации логов, с ресурсов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;EC2&lt;/strong&gt;-инстансы
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;CloudTrail&lt;/strong&gt; logs
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Route53 &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;VPC flow&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 внешние ресурсы (логи приложений, логи ОС и прочие)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Время хранения логов настраивается (от 1 дня до 10 лет), но может быть и не ограниченным. &lt;br/&gt;

Логи могут архивироваться на &lt;strong&gt;S3 Glacier&lt;/strong&gt;. &lt;br/&gt;

В подсистеме логирования можно выделить сущности:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;События (Log Events)&lt;/strong&gt; - запись о каком-то событии с меткой времени.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Потоки журналов (Log Streams)&lt;/strong&gt; - &lt;strong&gt;Cloudwatch&lt;/strong&gt; группирует последовательности записей логов от одного источника в потоки.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Группы журналов (Log Groups)&lt;/strong&gt; - это несколько &lt;strong&gt;log streams&lt;/strong&gt; с одинаковыи настройками (retention, access control).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Фильтры метрик (Metric Filters)&lt;/strong&gt; - инструмент для извлечения метрик из логов, которые в дальнейшем могут использоваться в качестве кастомных метрик &lt;strong&gt;CloudWatch&lt;/strong&gt;. Таким образом можно визуализировать определенные события и настроить реакцию на на них с помощью &lt;strong&gt;Alarms&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;CloudWatch Logs&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cloudwatch_logs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:203,&amp;quot;range&amp;quot;:&amp;quot;168887-170463&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit204&quot; id=&quot;cloudwatch_events&quot;&gt;CloudWatch Events&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;CloudWatch Events&lt;/strong&gt; - это устаревающий инструмент, который в настоящее время заменяется &lt;strong&gt;Amazon EventBridge&lt;/strong&gt;.  &lt;br/&gt;

Это инструмент, который позволяет создать правила, описывающие событие (запись в логах, время и т.д.), на которое можно настроить реакцию. &lt;br/&gt;

Реакция на возникновение события - практичесски в реальном времени, без задерджек. &lt;br/&gt;

Реакцию можно настроить на любую операцию &lt;strong&gt;&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; write&lt;/strong&gt;. Примерами событий могут являться - выключение инстанса EC2, логин пользователя через IAM и прочее. &lt;br/&gt;

В качестве реакции могут выступать:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Lambda-функция
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 действие с инстансом EC2
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 сообщение в очередь SQS или SNS
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 ECS task 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 и другое.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Например - можно настроить выполнение Lambda-функции в ответ на событие загрузки файла на S3.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;CloudWatch Events&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cloudwatch_events&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:204,&amp;quot;range&amp;quot;:&amp;quot;170464-171742&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit205&quot; id=&quot;amazon_cloudtrail&quot;&gt;Amazon CloudTrail&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon CloudTrail&lt;/strong&gt; - это средство аудита, которое может логировать все обращения к AWS &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;, таким образом фиксируя все действия пользователей и алгоритмов. &lt;br/&gt;

По-дефолту - включен. Время хранения записей - 90 дней. &lt;br/&gt;

Для просмотра собранного доступен &lt;strong&gt;CloudTrail Dashboard&lt;/strong&gt;. &lt;br/&gt;

Логируются следующие разновидности событий:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Management Events&lt;/strong&gt; (control plane events) - события записи/чтения AWS &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Data Events&lt;/strong&gt; - операции над данными (напрмиер - в S3 или таблицах DynamoDB). Слежение за данными нужно включать специально.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Insight events&lt;/strong&gt; - события связанные с необычными всплескми активности. Например - неожиданно возросшее число удалений из S3.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon CloudTrail&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_cloudtrail&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:205,&amp;quot;range&amp;quot;:&amp;quot;171743-172846&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit206&quot; id=&quot;trails&quot;&gt;Trails&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Trail&lt;/strong&gt; - это специальный (отличный от дефолтного) конфиг &lt;strong&gt;CloudTrail&lt;/strong&gt;, который фиксирует указанные события и хранит их заданный срок. &lt;br/&gt;

События пишутся в &lt;strong&gt;AWS S3&lt;/strong&gt;, &lt;strong&gt;CloudWatch Logs&lt;/strong&gt; и &lt;strong&gt;CloudWatch Events&lt;/strong&gt; . Можно писать в один бакет, либо - в несколько. &lt;br/&gt;

В рамках одного &lt;strong&gt;Trail&lt;/strong&gt; можно настроить хранение событий либо из одного региона, либо - из всех регионов (дефолтный вариант). При добавлении нового региона - его события автоматически добавляются в &lt;strong&gt;All Regions Trail&lt;/strong&gt;. &lt;br/&gt;

Большинство событий - региональные и пишутся в том регионе, где произошли, а события глобальных сервисов (например - &lt;strong&gt;IAM&lt;/strong&gt;) пишутся в дефолтный регион &lt;strong&gt;US East N.Virginia&lt;/strong&gt; &lt;br/&gt;

Может быть настроен глобальный аудит в рамках корневого аккаунта организации - &lt;strong&gt;AWS Organization Trail&lt;/strong&gt;, который будет фиксировать действия всех аккаунтов. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Trails&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;trails&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:206,&amp;quot;range&amp;quot;:&amp;quot;172847-174227&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit207&quot; id=&quot;aws_config&quot;&gt;AWS Config&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Config&lt;/strong&gt; - инструмент &lt;strong&gt;change management&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 конфиг ресурсов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 история конфига
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 взаимосвязи между ресурсами
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Сущности, существующие в рамках &lt;strong&gt;AWS Config&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Configuration Item&lt;/strong&gt; - это снепшот состояния конфигурации в заданный момент времени для одного заданного ресурса. Создается в момент внесения изменений и представляет собой файл &lt;strong&gt;JSON-diff&lt;/strong&gt; между старым и новым состояниями.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Configuration History&lt;/strong&gt; - это набор &lt;strong&gt;Configuration Item&lt;/strong&gt; за заданный период времени - отражает историю изменений ресурса за указанный период.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Configuration Recorder&lt;/strong&gt; - собственно сущность, которая фиксирует изменения. Должен быть включен в заданном регионе для всех или только для заданных типов ресурсов.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Configuration Snapshot&lt;/strong&gt; - это набор &lt;strong&gt;Configuration Item&lt;/strong&gt; для всех ресурсов. Отражает состояние всех ресурсов инфрастурктуры AWS.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Configuration Stream&lt;/strong&gt; - набор &lt;strong&gt;Configuration Item&lt;/strong&gt;, которые возникают по мере создания/изменения/удаления ресурсов и отправляются в топик &lt;strong&gt;Amazon SNS&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Config&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_config&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:207,&amp;quot;range&amp;quot;:&amp;quot;174228-175867&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit208&quot; id=&quot;aws_system_manager&quot;&gt;AWS System Manager&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Инструмент для централизованного управления &lt;strong&gt;AWS&lt;/strong&gt;. Ранее известен как &lt;strong&gt;SSM&lt;/strong&gt;. &lt;br/&gt;

Позволяет декаларативно с помощью JSON-документов (есть много готовых темплейтов, но можно создавать и свои) приводить русурсы AWS к описанному в них сосотоянию. &lt;br/&gt;

Например - документ &lt;strong&gt;AWS-CreateRdsSnapshot&lt;/strong&gt; позволяет быстро и просто создать снепшот базы данных. &lt;br/&gt;

Вот некоторые доступные операции:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Run Command&lt;/strong&gt; - запуск shell-скриптов на EC2-инстансах под linux. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;State Management&lt;/strong&gt; - позволяет поддерживать конфиг инстансов в заданном сосотоянии. Например - состояние антивируса или файервола.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Inventory&lt;/strong&gt; - позволяет собирать (инвентаризировать) информацию  о софте на инстансах.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Maintenance Window&lt;/strong&gt; - позволяет планировать обслуживание инстансов. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Patch Manager&lt;/strong&gt; - автоматический деплой патчей.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Automation&lt;/strong&gt; - автоматизация различных задач - обновление &lt;strong&gt;AMI&lt;/strong&gt;s, создание снепшотов дисков, сброс паролей. запуск и уничтожение EC2-инстансов и всякое другое
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Parameter Store&lt;/strong&gt; - способ хранеия и доставки секретов (паролей и прочего).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Distributor&lt;/strong&gt; - инструмент для создания и распространения дистрибутивов приложений.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Session Manager&lt;/strong&gt; - способ доступа к &lt;strong&gt;shell&lt;/strong&gt; инстансов, без необходимости открывать порты, SSH-ключи или настраивать бастионы.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Incident Manager&lt;/strong&gt; - инструмент для расследования инцидентов и оповещения заинтересантов.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS System Manager&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_system_manager&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:208,&amp;quot;range&amp;quot;:&amp;quot;175868-178172&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit209&quot; id=&quot;aws_trusted_advisor&quot;&gt;AWS Trusted Advisor&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Сервис анализа конфигураций на соответствие &lt;strong&gt;best practice&lt;/strong&gt;. &lt;br/&gt;

Модет выдавать репорты следующих категорий:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Cost Optimization&lt;/strong&gt; - поиск неиспользуемых, но оплачиваемых ресурсов.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Performance&lt;/strong&gt; - Поиск узких мест в плане производительности. Например - инстанс с высокимим запросами к диску имеет медленный gp2 диск.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Security&lt;/strong&gt; - анализ настроек безопасности. Например - не включен MFA. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Fault Tolerance&lt;/strong&gt; - анализ конфигурации на отказоустойчивость. Например - не включен &lt;strong&gt;Multi-AZ&lt;/strong&gt; там где должен быть.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Service Limits&lt;/strong&gt; - укащывает на скорое достижение лимитов. Например - при включенном &lt;strong&gt;AutoScaling&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Trusted Advisor&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_trusted_advisor&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:209,&amp;quot;range&amp;quot;:&amp;quot;178173-179226&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit210&quot; id=&quot;как_должна_выглядеть_хорошо_спроектированна_инфрастуктура&quot;&gt;Как должна выглядеть хорошо спроектированна инфрастуктура&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Инфраструктуру принято оценивать по пяти критериям
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0443\u043a\u0442\u0443\u0440\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u0430\u043a_\u0434\u043e\u043b\u0436\u043d\u0430_\u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c_\u0445\u043e\u0440\u043e\u0448\u043e_\u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430_\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0443\u043a\u0442\u0443\u0440\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:210,&amp;quot;range&amp;quot;:&amp;quot;179227-179445&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit211&quot; id=&quot;надежность&quot;&gt;Надежность&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Приложения должны быть устойчивы к отказам отдельных элементов инфраструктуры. &lt;br/&gt;

Также - важно время восстановления после отказа. &lt;br/&gt;

В рамках облачной инфраструктуры все компоненты рассматриваются как бастрозаменяемые. То есть архитектура должна это учитывать и вместо починки вышедшего из строя инстанса нужно стремиться просто поднимать новый. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:211,&amp;quot;range&amp;quot;:&amp;quot;179446-180120&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit212&quot; id=&quot;производительность_и_эффективность&quot;&gt;Производительность и эффективность&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
При проектировани инфраструктуры важно стремиться к заданому уровню производительности при оптимальной цене. &lt;br/&gt;

Также следует закладывать возможность расширения ресурсов при возрастающей нагрузке. &lt;br/&gt;

Следует планировать распределение ресурсов с учетом особенностей досиупа к приложениям - например - с учетом географии пользователей.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c_\u0438_\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:212,&amp;quot;range&amp;quot;:&amp;quot;180121-180817&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit213&quot; id=&quot;безопасность&quot;&gt;Безопасность&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
При проектировани облачных решений важно уделять внимание безопасности. &lt;br/&gt;

То есть - обеспечивать аутентификацию и авторизацию, проверку целостности данных и кода. &lt;br/&gt;

Назначение привилегий всегда должно быть основано на принципе минимально необходимых привилегий. &lt;br/&gt;

Решения должны включать в себя планы создания резервных копий и восстановления после сбоев. &lt;br/&gt;

Важно уделять внимание аудиту событий в инфрастурктуре. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:213,&amp;quot;range&amp;quot;:&amp;quot;180818-181622&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit214&quot; id=&quot;операционное_совершенство_-_operational_excellence&quot;&gt;Операционное совершенство - Operational Excellence&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Способность быстро и эффективно вносить обратимые изменения в конфигурацию в любой момент времени с помощью &lt;strong&gt;IaC&lt;/strong&gt;. &lt;br/&gt;

Проведение тестов отказа элементов инфраструктуры и отработка реакции на их. &lt;br/&gt;

Выявление и устранение рисков.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e - Operational Excellence&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435_\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e_-_operational_excellence&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:214,&amp;quot;range&amp;quot;:&amp;quot;181623-182124&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit215&quot; id=&quot;оптимизация_расходов&quot;&gt;Оптимизация расходов&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Анализ структуры расходов на облачную инфраструктуру и автоматическая оптимизация потребления в зависимости от текущих условий. &lt;br/&gt;

Использование &lt;strong&gt;managed&lt;/strong&gt;-решений. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f_\u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:215,&amp;quot;range&amp;quot;:&amp;quot;182125-182476&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit216&quot; id=&quot;обеспечение_безопасности_инфрастурктуры_aws&quot;&gt;14. Обеспечение безопасности инфрастурктуры AWS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Базовый принцип обеспечения безопасности &lt;strong&gt;AWS - Shared Responsibility Model&lt;/strong&gt;. Она формулируется так:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 AWS обеспечивает безопасность самого “облака”, а клиент обеспечивает безопасность ресурсов в облаке (путем корректной настройки).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;14. \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0443\u0440\u043a\u0442\u0443\u0440\u044b AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435_\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438_\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0443\u0440\u043a\u0442\u0443\u0440\u044b_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:216,&amp;quot;range&amp;quot;:&amp;quot;182477-182975&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit217&quot; id=&quot;ответственность_aws_-_безопасность_облака&quot;&gt;Ответственность AWS - безопасность облака&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Ответственность за:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Физическую безопасность инфраструктуры
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Безопасность используемых протоколов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Обеспечение отказоустойчивости путем резервирования физических компонентов инфрастурктуры
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Безопасность ПО, используемого для организации работы облака
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c AWS - \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c_aws_-_\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c_\u043e\u0431\u043b\u0430\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:217,&amp;quot;range&amp;quot;:&amp;quot;182976-183549&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit218&quot; id=&quot;ответственность_клиента_-_безопасность_в_облаке&quot;&gt;Ответственность клиента - безопасность в облаке&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Клиент несет ответственность за:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Конфигурирование приложений
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Конфигурирование облачных ресурсов, которыми управляет клиент
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Безопасность данных путем ограничения доступа к ним
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сохранность данных через резервного копирования
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В зависимости от модели (IaaS, PaaS, SaaS) - объем ответственности клиента меняется.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 - \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u043a\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c_\u043a\u043b\u0438\u0435\u043d\u0442\u0430_-_\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c_\u0432_\u043e\u0431\u043b\u0430\u043a\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:218,&amp;quot;range&amp;quot;:&amp;quot;183550-184227&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit219&quot; id=&quot;обеспечение_соотвествия_регулятивным_требованиям_-_aws_artifact&quot;&gt;Обеспечение соотвествия регулятивным требованиям - AWS Artifact&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Artifact&lt;/strong&gt; - это портал, содержащий отчеты о соответствии сервисов AWS требованиям регуляторов, а также сертификаты соответствия этим требованиям. &lt;br/&gt;

Документы, представленные на этом портале предназначены для предоставления аудиторам, проверяющим соответствие инфрастурктуры на базе AWS требованиям, предъявляемым к тем или иным приложениям. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0438\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c - AWS Artifact&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435_\u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0438\u044f_\u0440\u0435\u0433\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u044b\u043c_\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c_-_aws_artifact&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:219,&amp;quot;range&amp;quot;:&amp;quot;184228-184977&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit220&quot; id=&quot;сканирование_на_наличие_уязвимостей&quot;&gt;Сканирование на наличие уязвимостей&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon&lt;/strong&gt; разрешает клиентам проводить pen-testing приложений, развернутых в среде &lt;strong&gt;AWS&lt;/strong&gt;. &lt;br/&gt;

Есть некоторые типы проверок, которые могут проводить только организации со специальными полномочиями. Например - имитация атак &lt;strong&gt;Distributed Denial of Service (DDoS)&lt;/strong&gt; разрешена только партнерам &lt;strong&gt;AWS Partner Network (APN)&lt;/strong&gt;. &lt;br/&gt;

&lt;strong&gt;Network Stress testing&lt;/strong&gt; может осуществляться силами клиента, но с запросом соответствующего разрешения от AWS.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u043d\u0430_\u043d\u0430\u043b\u0438\u0447\u0438\u0435_\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:220,&amp;quot;range&amp;quot;:&amp;quot;184978-185755&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit221&quot; id=&quot;обзор_средств_шифрования_aws&quot;&gt;Обзор средств шифрования AWS&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Передача данных по сети - должна проходить в зашифрованном виде по протоколам &lt;strong&gt;Secure Socket Layer/Transport Layer Security SSL/TLS&lt;/strong&gt;. &lt;br/&gt;

Хранимые данные могут быть зашифрованы с помощью ключей и одного из признанных алгоритмов шифрования - &lt;strong&gt;Tripple DES&lt;/strong&gt; или &lt;strong&gt;AES-256&lt;/strong&gt;. &lt;br/&gt;

AWS может брать на себя задачи управления ключами шифрования - с помощью сервиса &lt;strong&gt;Key Management Service (KMS)&lt;/strong&gt;. С помощью KMS клиент создает &lt;strong&gt;Customer Master Keys (CMKs)&lt;/strong&gt;, которые зранятся в KMS и используются для шифрования. &lt;br/&gt;

Ключи могут быть мультирегиональными - то есть данные. зашифрованные в одном регионе, могут быть переданы и расшифрованы в другом.  &lt;br/&gt;

Есть два типа ключей:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Customer-managed CMKs&lt;/strong&gt; - клиент создает их и управляет ими (ротирует, назначает политики использования, тегирует, назначает алиасы). 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS managed CMKs&lt;/strong&gt; - ключами полностью управляет AWS. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;strong&gt;AWS KMS&lt;/strong&gt; интегрирован с &lt;strong&gt;CloudTrail&lt;/strong&gt; и обеспечивает аудит использования ключей. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0431\u0437\u043e\u0440 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f AWS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u0437\u043e\u0440_\u0441\u0440\u0435\u0434\u0441\u0442\u0432_\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f_aws&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:221,&amp;quot;range&amp;quot;:&amp;quot;185756-187349&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit222&quot; id=&quot;шифрование_amazon_s3&quot;&gt;Шифрование Amazon S3&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
безопасность хранящихся на S3 данных может быть обеспечена следующими способами:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Server-Side Encryption&lt;/strong&gt; - шифрование выполняет AWS при сохранении данных на диски и расшифровывает при считывании.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Client-Side Encryption&lt;/strong&gt; - шифрование выполняется клиентом перед выгрузкой данных в S3 и клиент полностью контролирует ключи и средства шифрования. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Server-Side Encryption with Amazon S3-Managed Keys (SSE-S3)&lt;/strong&gt; - каждый объект шифруется уникальным ключем, а затем этот ключ шифруется мастер-ключем. AWS полностью берет на себя ротацию и обслуживание этих ключей. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Server-Side Encryption with CMKs Stored in AWS KMS (SSE-KMS)&lt;/strong&gt; - аналогично SSE-S3, но ключи хранятся в KMS, что позволяет контролировать их использвание (кто и как использовал). Ключи уникальны для аккаунта, сервиса и региона.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Server-Side Encryption with Customer-Provided Keys (SSE-C)&lt;/strong&gt; - ключами управляет клиент, а AWS шифрует данные на S3.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
AWS KMS исползует дял шифрования аппаратные модули &lt;strong&gt;hardware security modules (HSMs)&lt;/strong&gt;, соответствующие стандарту &lt;strong&gt;FIPS 140-2&lt;/strong&gt;. Модули HSM - используются многими клиентами AWS одновременно, но если нужно иметь выделенный модуль шифрования, то достун сервис &lt;strong&gt;AWS Cloud HSM&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Amazon S3&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435_amazon_s3&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:222,&amp;quot;range&amp;quot;:&amp;quot;187350-189297&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit223&quot; id=&quot;aws_cloudhsm&quot;&gt;AWS CloudHSM&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервис &lt;strong&gt;AWS CloudHSM&lt;/strong&gt; предоставляет досиуп к выделеному аппаратному модулю шифрования. который доступен в &lt;strong&gt;VPC&lt;/strong&gt;. В этому случае - все операции к ключами (генерация, хранение, импорт, экспорт, ротация) выполняются клиентом. &lt;br/&gt;

Поддерживаются как симметрчное, так и ассимметричное шифрование. &lt;br/&gt;

&lt;strong&gt;AWS CloudHSM&lt;/strong&gt; совместим с популярными &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; и библиотеками - &lt;strong&gt;PKCS#11&lt;/strong&gt;, &lt;strong&gt;Java Cryptography Extension (JCE)&lt;/strong&gt;, &lt;strong&gt;Microsoft CryptoNG (CNG)&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS CloudHSM&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_cloudhsm&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:223,&amp;quot;range&amp;quot;:&amp;quot;189298-190019&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit224&quot; id=&quot;защита_облачных_приложений_с_помощью_aws_waf_и_aws_shield&quot;&gt;Защита облачных приложений с помощью AWS WAF и AWS Shield&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e AWS WAF \u0438 AWS Shield&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0449\u0438\u0442\u0430_\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_aws_waf_\u0438_aws_shield&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:224,&amp;quot;range&amp;quot;:&amp;quot;190020-190122&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit225&quot; id=&quot;amazon_waf&quot;&gt;Amazon WAF&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon WAF&lt;/strong&gt; - это файервол приложений, который защищает приложения опубликованние через:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon CloudFront&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; Gateway&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Application Load Balancers (ALB)&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS AppSync GraphQL &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;strong&gt;AWS WAF&lt;/strong&gt; работает на &lt;strong&gt;Layer7 OSI&lt;/strong&gt;, мониторит трафик HTTP/HTTPS и защищает от распространенных эксплоитов, а также от &lt;strong&gt;SQL&lt;/strong&gt;-инъекций и &lt;strong&gt;XSS (cross-site scripting)&lt;/strong&gt;. &lt;br/&gt;

Настраивается с помощью &lt;strong&gt;web ACLs&lt;/strong&gt;, которые задают правила проверок и реакции на результаты. &lt;br/&gt;

Биллинг - по числу правил &lt;strong&gt;web ACLs&lt;/strong&gt; и HTTP(S)-запросов. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon WAF&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_waf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:225,&amp;quot;range&amp;quot;:&amp;quot;190123-190947&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit226&quot; id=&quot;aws_shield&quot;&gt;AWS Shield&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Shield&lt;/strong&gt; - защита от &lt;strong&gt;DDoS&lt;/strong&gt;. &lt;br/&gt;

Доступна в двух вариантах:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS Shield Stanard&lt;/strong&gt; - бесплатная стандартная защита от наиболее распространенных атак. Может использоваться совместно с &lt;strong&gt;Amazon CloudFront&lt;/strong&gt; и &lt;strong&gt;Route53&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;AWS Shield Advanced&lt;/strong&gt; - обеспечивает дополнительную защиту от атак на инстансы EC2, балансировщики ELB, CloudFront, Global Accelerator, Route53. Поддерживается автоматическое обнаружение атак и попвещение. Предоставляется круглосуточная поддержка со стороны &lt;strong&gt;AWS Shield Response Team (SRT)&lt;/strong&gt;. СТоимость - от $3000 за &lt;strong&gt;AWS Organization&lt;/strong&gt;, а также - в зависимости от объема исходящих данных и используемых сервисов. В стоимость входят услуги &lt;strong&gt;AWS WAF&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Shield&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_shield&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:226,&amp;quot;range&amp;quot;:&amp;quot;190948-192039&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit227&quot; id=&quot;защита_инстансов_ec2_с_помощью_aws_inspector&quot;&gt;Защита инстансов EC2 с помощью AWS Inspector&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Inspector&lt;/strong&gt; - проверяет инстансы EC2 с помощью двух наборов правил:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Network reachability rules package&lt;/strong&gt; - проверят доступность хоста ин Internet и открытые порты. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Host Assessmentsrules package&lt;/strong&gt; - проверка на опубликование уязвимости (&lt;strong&gt;CVE&lt;/strong&gt; и &lt;strong&gt;CIS&lt;/strong&gt;), и другие бест-практисы в части безопасности. Пароли рута и прочее.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Если нужна более развернутая информация о безопасности инстансов EC2 - на них предлагается установить &lt;strong&gt;AWS Inspector Agent&lt;/strong&gt;. Он будет собирать информацию о ОС, приложениях, операциях на файловой системе и прочую телеметрию и выгружать ее на S3 в виде JSON-документов. Затем - на основании этих документов могут быть сформулированы рекомендации. &lt;br/&gt;

Установить  &lt;strong&gt;AWS Inspector Agent&lt;/strong&gt; удобно с помощью &lt;strong&gt;AWS System Manager Run Command&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0449\u0438\u0442\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 EC2 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e AWS Inspector&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0449\u0438\u0442\u0430_\u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432_ec2_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_aws_inspector&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:227,&amp;quot;range&amp;quot;:&amp;quot;192040-193355&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit228&quot; id=&quot;другие_сервисы_aws_обеспечивающие_безопасность&quot;&gt;Другие сервисы AWS, обеспечивающие безопасность&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b AWS, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0440\u0443\u0433\u0438\u0435_\u0441\u0435\u0440\u0432\u0438\u0441\u044b_aws_\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435_\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:228,&amp;quot;range&amp;quot;:&amp;quot;193356-193454&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit229&quot; id=&quot;aws_macie&quot;&gt;AWS Macie&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервис проверки данных на наличие сенситивной информации. Например - персональных данных. &lt;br/&gt;

Сканирует данные на S3 и определет подозрительные паттерны, а также - мониторит доступ к данным на S3 и выявляет аномалии или неавторизованный доступ. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Macie&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_macie&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:229,&amp;quot;range&amp;quot;:&amp;quot;193455-193917&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit230&quot; id=&quot;aws_guardduty&quot;&gt;AWS GuardDuty&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS GuardDuty&lt;/strong&gt; - серсив обнаружения угроз с помощью анализа подозрительной активности аккаунтов AWS и приложений. Анализирует данные из логов - &lt;strong&gt;CloudTrail Logs&lt;/strong&gt;, &lt;strong&gt;VPC Flow Logs&lt;/strong&gt;, &lt;strong&gt;&lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;&lt;/strong&gt;. &lt;br/&gt;

Обнаруживает использование скомпроментированных учетных данных, взаимодейтстсвие с подозрительными IP и доменами, необычную активность учеток AWS. &lt;br/&gt;

Например - запуск EC2-инстансов в регионах, где обычно комапния не работает. &lt;br/&gt;

Обнаруживает криптовалютные майнеры, компроментацию бакетов S3 и прочее. &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Биллинг - в зависимости от числа событий логов CloudTrail, VPC Flow, &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS GuardDuty&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_guardduty&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:230,&amp;quot;range&amp;quot;:&amp;quot;193918-194910&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit231&quot; id=&quot;amazon_detective&quot;&gt;Amazon Detective&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервис помогает в расследовании инцидентов и поиске первопричин инцидентов - позволяет визуализировать, анализировать и сопоставлять логи &lt;strong&gt;CloudTrail&lt;/strong&gt;, &lt;strong&gt;VPC Flow&lt;/strong&gt;, результаты работы &lt;strong&gt;GuardDuty&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Detective&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_detective&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:231,&amp;quot;range&amp;quot;:&amp;quot;194911-195278&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit232&quot; id=&quot;aws_certification_manager&quot;&gt;AWS Certification Manager&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервис управления (получение, обновление) сертификатами. Интегрирован с балансировщиками и CloudFront.  &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Certification Manager&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_certification_manager&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:232,&amp;quot;range&amp;quot;:&amp;quot;195279-195500&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit233&quot; id=&quot;aws_secrets_manager&quot;&gt;AWS Secrets Manager&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Сервис &lt;strong&gt;AWS Secrets Manager&lt;/strong&gt; немного напоминает &lt;strong&gt;AWS System Manager Parameter Store&lt;/strong&gt;, однако не только модет хранить сенситивные данные, но и автоматически ротировать. например - пароли от баз &lt;strong&gt;Amazon RDS&lt;/strong&gt;. &lt;br/&gt;

Или - токены для взаимной аутентификации приложений. &lt;br/&gt;

Кроме того - &lt;strong&gt;AWS Secrets Manager&lt;/strong&gt; шифрует хранимые данные с помощью ключей &lt;strong&gt;Amazon KMS&lt;/strong&gt; и обеспечивает репликацию секретов между регионами. &lt;br/&gt;

Биллинг - в зависимости от числа ключей и вызовов  &lt;strong&gt;Secrets Manager &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Secrets Manager&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_secrets_manager&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:233,&amp;quot;range&amp;quot;:&amp;quot;195501-196311&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit234&quot; id=&quot;amazon_cognito&quot;&gt;Amazon Cognito&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Amazon Cognito&lt;/strong&gt; - сервис аутентификации пользователей опубликованных приложений по протоколам OAuth, SAML, OpenID и прочие. &lt;br/&gt;

Внутри &lt;strong&gt;Amazon Cognito&lt;/strong&gt; есть две сущности отвечающие за аутентификацию и авторизацию соотвественно:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Cognito User pools&lt;/strong&gt; - Это источник учеток. &lt;strong&gt;Congnito&lt;/strong&gt; может сам хостить и аутентифицировать учетки или брать их из присоединенных источников (Apple, Google, Facebook, MS AD LDAP и прочие) и аутентифицировать там.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Amazon Cognito Identity Pools&lt;/strong&gt; - средство создания &lt;strong&gt;identity&lt;/strong&gt; и раздачи прав на ресурсы AWS для пользователей, подлинность учетных данных которых были подтверждены в &lt;strong&gt;Cognito User Pool&lt;/strong&gt;. Кроме того - может создавать временные &lt;strong&gt;identity&lt;/strong&gt; для анонимных пользователей.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Amazon Cognito&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;amazon_cognito&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:234,&amp;quot;range&amp;quot;:&amp;quot;196312-197503&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit235&quot; id=&quot;aws_directory_service&quot;&gt;AWS Directory Service&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Directory Service for Microsoft Active Directory&lt;/strong&gt; (также известен как &lt;strong&gt;AWS Managed Microsoft AD&lt;/strong&gt;) - это &lt;strong&gt;fully-managed Active Drectory&lt;/strong&gt; на платформе &lt;strong&gt;AWS&lt;/strong&gt;. &lt;br/&gt;

Позволяет использовать MS AD аутентификацию на всех сервисах AWS, которые это умеют. &lt;br/&gt;

В том числе &lt;strong&gt;Amazon Workspaces&lt;/strong&gt; - VDI на базе linux и windows, также &lt;strong&gt;Amazon Worksdocs&lt;/strong&gt; - облачный офисный пакет от Amazon, совместимый с продуктами &lt;strong&gt;Microsoft&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Directory Service&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_directory_service&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:235,&amp;quot;range&amp;quot;:&amp;quot;197504-198127&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit236&quot; id=&quot;биллинг_и_ценообразование&quot;&gt;15. Биллинг и ценообразование&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Пользователь платит за:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 вычислительные мощности
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 хранение информации
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 исходящий сетевой трафик
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
При проектировании решений следует принимать ко вниманию:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Выбор модели ценообразования на вычислительные ресурсы - то есть определиться с тем нужны ли гарантированные инстансы &lt;strong&gt;On-Demand&lt;/strong&gt;, или можно выбрать негарантированные &lt;strong&gt;Spot&lt;/strong&gt;, которые позволят сэкономить до 72% стоимости. Либо - при заключении соглашения на обязательное минимальное количество потребляемых ресурсов можно ориентироваться на &lt;strong&gt;compute savings plans&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Выбор правильного количества заказываемых ресурсов. Чтобы не переплачиваь нужно правильно понимать сколько чего нужно, Для этого AWS предоставляет специальные инструменты - &lt;strong&gt;AWS Cost Explorer&lt;/strong&gt;, который позволяет выявить ресурсы с низкой утилизацией. Также с помощью &lt;strong&gt;AWS CloudFormation&lt;/strong&gt; планировать включение/выключение инстансов по расписанию. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Мониторинг и выявление фактического потребления на основе метрик CPU, ввода-вывода, памяти. В этом помогут &lt;strong&gt;CloudWatch&lt;/strong&gt; для большинстава ресурсов и &lt;strong&gt;Amazon S3 analytics&lt;/strong&gt; для выявлния паттернов обращения к ресурсам на S3.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;15. \u0411\u0438\u043b\u043b\u0438\u043d\u0433 \u0438 \u0446\u0435\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0438\u043b\u043b\u0438\u043d\u0433_\u0438_\u0446\u0435\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:236,&amp;quot;range&amp;quot;:&amp;quot;198128-200130&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit237&quot; id=&quot;aws_cost_explorer&quot;&gt;AWS Cost Explorer&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Средство мониторинга и визуализации затрат. Позволяет увидеть на что тратятся деньги и спрогнозировать траты на год вперед. &lt;br/&gt;

Можно видеть затраты по часам и по разным типам ресурсов. &lt;br/&gt;

&lt;strong&gt;AWS Cost Explorer&lt;/strong&gt; выдет рекомендации на основе которых можно резервировать ресурсы и таким образом экономить. &lt;br/&gt;

Также - позволяет выявлять аномалии в затратах и оповещать о них 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Cost Explorer&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_cost_explorer&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:237,&amp;quot;range&amp;quot;:&amp;quot;200131-200816&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit238&quot; id=&quot;тегирование_ресурсов&quot;&gt;Тегирование ресурсов&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Для выделения среди ресурсов групп и определения того какие из этих групп сколько стоят применяются теги. Теги бывают встроенные и пользовательские. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:238,&amp;quot;range&amp;quot;:&amp;quot;200817-201148&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit239&quot; id=&quot;aws_budgets&quot;&gt;AWS Budgets&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Позволяют мониторить затраты и предпренимать действия при превышении заданных поргов:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Применять IAM-политики
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Service Control Policies
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Что-то делать непосредственно с инстансами (EC2 или RDS)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
То есть, например при превышении бюджета можно запретить создание новых EC2-инстансов с помощью IAM-политики. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;AWS Budgets&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;aws_budgets&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:239,&amp;quot;range&amp;quot;:&amp;quot;201149-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 18 Nov 2022 11:51:25 +0000</pubDate>
        </item>
        <item>
            <title>aws_certified_devops_engineer_professional</title>
            <link>https://wiki.autosys.tk/devops/aws_certified_devops_engineer_professional</link>
            <description>
&lt;p&gt;
Тут я оставляю заметки при подготовке к экзамену &lt;strong&gt;AWS Certified DevOps Engineer Professional - DOP-C01&lt;/strong&gt;
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;пять_критериев_качественной_инфрастуктуры&quot;&gt;Пять критериев качественной инфрастуктуры&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u044f\u0442\u044c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0443\u043a\u0442\u0443\u0440\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u044f\u0442\u044c_\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432_\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439_\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0443\u043a\u0442\u0443\u0440\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;149-243&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;операционное_совершенство_-_operational_excellence&quot;&gt;Операционное совершенство - Operational Excellence&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Наиболее важный критерий в повседневной работе. &lt;br/&gt;

Включает в себя пять основных принципов работы с инфрастурктурой:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Использование &lt;strong&gt;Infrastructure As Code&lt;/strong&gt;. Способствует распространению знаний об инфрастурктуре, оценке её качества и позволяют быстро тестировать изменения. AWS предлагает несколько инструментов: &lt;strong&gt;CloudFormation&lt;/strong&gt;, &lt;strong&gt;Cloud Development Kit (CDK)&lt;/strong&gt;, различные &lt;strong&gt;SDK&lt;/strong&gt; и интерфейс &lt;strong&gt;CLI&lt;/strong&gt;.  
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Быстрая реакция на события и инциденты. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Внесение частых, небольших и обратимых изменений в инфраструктуру.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Предсказание проблем и отказов и действия на опережение.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Извлечение знаний из инциденнтов и ииспользование их в дальнейшем
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e - Operational Excellence&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435_\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e_-_operational_excellence&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;244-1446&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;пример_реализации_операционного_совершенства&quot;&gt;Пример реализации операционного совершенства&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Например - есть набор ec2-инстансов, которые требуют обновлений. &lt;br/&gt;

Для установки патчей можно использовать &lt;strong&gt;Patch Manager&lt;/strong&gt; из состава &lt;strong&gt;System Manager&lt;/strong&gt;. Регулярные обновления реализуются с помощью &lt;strong&gt;System Manager Maintenance Task&lt;/strong&gt;. &lt;br/&gt;

Вот что нужно сделать для реализации этой задачи:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 убедиться, что на всех инстансах развернут &lt;strong&gt;SSM Agent&lt;/strong&gt; (бывший &lt;strong&gt;Simple System Manager&lt;/strong&gt;).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создать алгоритм обновления (patching baseline), содержащий правила для аппрува/отказа списков патчей
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 измениь IAM-role инстансов, чтобы SSM на них имел нужные привилегии
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 опционально создать группы серверов (patch managenment groups), на которые устанавливаются разные наборы обновлений.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0438\u043c\u0435\u0440_\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438_\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e_\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1447-2641&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;безопасность&quot;&gt;Безопасность&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Обеспечение безопасности включает в себя четыре области:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 защита данных
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Управление привилегиями
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Реакция на инциденты
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Расследование инцидентов
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В свою очередь хорошо српоектированная сисьема должна следовать семи принципам безопасности:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Строгая идентификация (strong identity foundation) и следование принципу наименьших необходимых привилегий (&lt;strong&gt;AWS IAM&lt;/strong&gt;, &lt;strong&gt;AWS Single Sign-On&lt;/strong&gt;, &lt;strong&gt;Active Directory&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Возможность проследить взаимосвязанные события (traceability) (&lt;strong&gt;AWS CloudWatch Logs&lt;/strong&gt;, &lt;strong&gt;AWS VPC Flow Logs&lt;/strong&gt;, &lt;strong&gt;AWS CloudTrail&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 безопасность на всех уровнях взаимодействия (&lt;strong&gt;Security Groups&lt;/strong&gt;, &lt;strong&gt;Network ACLs&lt;/strong&gt;, etc…)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 автоматизация процедур, обеспечивающих безопасность (&lt;strong&gt;GuardDuty&lt;/strong&gt;, &lt;strong&gt;CloudWatch&lt;/strong&gt;, &lt;strong&gt;EventHub&lt;/strong&gt;, &lt;strong&gt;AWS Config&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 защита данных в процессе передачи и хранения (&lt;strong&gt;Certificate Manager&lt;/strong&gt;, &lt;strong&gt;AWS Shield&lt;/strong&gt;, &lt;strong&gt;AWS Web Application Firewall&lt;/strong&gt;, &lt;strong&gt;Amazon CloudFront&lt;/strong&gt;, &lt;strong&gt;Key Management Service&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 отсутствие прямого доступа людей к данным
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 готовность к событиям безопасности - создание и поддержание в актуальном состоянии планов на случай нежелательных событий 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
При проектировани облачных решений важно уделять внимание безопасности. &lt;br/&gt;

То есть - обеспечивать аутентификацию и авторизацию, проверку целостности данных и кода. &lt;br/&gt;

Назначение привилегий всегда должно быть основано на принципе минимально необходимых привилегий. &lt;br/&gt;

Решения должны включать в себя планы создания резервных копий и восстановления после сбоев. &lt;br/&gt;

Важно уделять внимание аудиту событий в инфрастурктуре. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2642-5150&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;надежность&quot;&gt;Надежность&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Пять основных принципов обеспечения надежности:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Автоматизация процедур восстановления после сбоев
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Регулярное тестирование процедур восстановления
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Горизонтальное масштабирование для повышения общей доступности сервисов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Правильное планирование ресурсов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Автоматизация рутинных процедур
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Приложения должны быть устойчивы к отказам отдельных элементов инфраструктуры. &lt;br/&gt;

Также - важно время восстановления после отказа. &lt;br/&gt;

В рамках облачной инфраструктуры все компоненты рассматриваются как быстрозаменяемые. То есть архитектура должна это учитывать и вместо починки вышедшего из строя инстанса нужно стремиться просто поднимать новый. &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Производительность и эффективность
&lt;/p&gt;

&lt;p&gt;
При проектировани инфраструктуры важно стремиться к заданому уровню производительности при оптимальной цене.
Также следует закладывать возможность расширения ресурсов при возрастающей нагрузке.
Следует планировать распределение ресурсов с учетом особенностей досиупа к приложениям - например - с учетом географии пользователей.
&lt;/p&gt;

&lt;p&gt;
Оптимизация расходов
&lt;/p&gt;

&lt;p&gt;
Анализ структуры расходов на облачную инфраструктуру и автоматическая оптимизация потребления в зависимости от текущих условий.
Использование managed-решений.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;5151-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 07 Jul 2022 06:05:51 +0000</pubDate>
        </item>
        <item>
            <title>aws_end_to_end_pipeline</title>
            <link>https://wiki.autosys.tk/devops/aws_end_to_end_pipeline</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://aws.amazon.com/blogs/devops/building-end-to-end-aws-devsecops-ci-cd-pipeline-with-open-source-sca-sast-and-dast-tools/&quot; class=&quot;urlextern&quot; title=&quot;https://aws.amazon.com/blogs/devops/building-end-to-end-aws-devsecops-ci-cd-pipeline-with-open-source-sca-sast-and-dast-tools/&quot; rel=&quot;ugc nofollow&quot;&gt;https://aws.amazon.com/blogs/devops/building-end-to-end-aws-devsecops-ci-cd-pipeline-with-open-source-sca-sast-and-dast-tools/&lt;/a&gt;
&lt;/p&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Sun, 04 Sep 2022 09:26:55 +0000</pubDate>
        </item>
        <item>
            <title>aws_k8s_eks_lb_conroller</title>
            <link>https://wiki.autosys.tk/devops/aws_k8s_eks_lb_conroller</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html&quot; class=&quot;urlextern&quot; title=&quot;https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html&lt;/a&gt;
&lt;/p&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 08 Nov 2022 14:28:13 +0000</pubDate>
        </item>
        <item>
            <title>aws_rds_performance</title>
            <link>https://wiki.autosys.tk/devops/aws_rds_performance</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://aws.amazon.com/blogs/database/resources-consumed-by-idle-postgresql-connections/&quot; class=&quot;urlextern&quot; title=&quot;https://aws.amazon.com/blogs/database/resources-consumed-by-idle-postgresql-connections/&quot; rel=&quot;ugc nofollow&quot;&gt;https://aws.amazon.com/blogs/database/resources-consumed-by-idle-postgresql-connections/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 05 Feb 2025 09:01:56 +0000</pubDate>
        </item>
        <item>
            <title>aws_s3_upload_using_bash</title>
            <link>https://wiki.autosys.tk/devops/aws_s3_upload_using_bash</link>
            <description>&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
set -e
set -u

S3_BUCKET=&amp;#039;super-bucket&amp;#039;
S3_URL=&amp;#039;storage.yandexcloud.net&amp;#039;
S3_KEY=&amp;#039;SUPERSECRET&amp;#039;
S3_SECRET=&amp;#039;SUPERSECRET&amp;#039;
LOG_FILE_PATH=$1
LOG_FILE=`basename $LOG_FILE_PATH`

S3_RESOURCE=&amp;quot;/${S3_BUCKET}/${LOG_FILE}&amp;quot;
S3_CONTENT_TYPE=&amp;quot;application/json&amp;quot;
S3_DATE_VALUE=`date -R`
S3_STRING_TO_SIGN=&amp;quot;PUT\n\n${S3_CONTENT_TYPE}\n${S3_DATE_VALUE}\n${S3_RESOURCE}&amp;quot;
S3_SIGNATURE=`echo -en ${S3_STRING_TO_SIGN} | openssl sha1 -hmac ${S3_SECRET} -binary | base64`
echo &amp;quot;Uploading ${LOG_FILE_PATH} to https://${S3_BUCKET}.${S3_URL}/${LOG_FILE}&amp;quot;
curl -s -L -X PUT -T &amp;quot;${LOG_FILE_PATH}&amp;quot; \
  -H &amp;quot;Host: ${S3_BUCKET}.${S3_URL}&amp;quot; \
  -H &amp;quot;Date: ${S3_DATE_VALUE}&amp;quot; \
  -H &amp;quot;Content-Type: ${S3_CONTENT_TYPE}&amp;quot; \
  -H &amp;quot;Authorization: AWS ${S3_KEY}:${S3_SIGNATURE}&amp;quot; \
  https://${S3_BUCKET}.${S3_URL}/${LOG_FILE} &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 || echo &amp;quot;Upload Failed !!!&amp;quot;&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 21 Jun 2022 13:17:06 +0000</pubDate>
        </item>
        <item>
            <title>aws_using_nat_gateways</title>
            <link>https://wiki.autosys.tk/devops/aws_using_nat_gateways</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;задача&quot;&gt;Задача&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Для обеспечения безопасности нужно, чтобы запросы от сервисов, работащих в AWS EKS приходили с фиксированных адресов. &lt;br/&gt;

Дефолтный вариант доступа в интернет - это через Internet Gateway, а он не обспечивает стабильность IP-адреса для исходящих запросов. &lt;br/&gt;

Ноды моего k8s-кластера размещены в трех AZ.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-549&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;как_это_должно_быть_сделано&quot;&gt;Как это должно быть сделано&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Это делается с помощью &lt;strong&gt;NAT Gateways&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u0430\u043a \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u043d\u043e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u0430\u043a_\u044d\u0442\u043e_\u0434\u043e\u043b\u0436\u043d\u043e_\u0431\u044b\u0442\u044c_\u0441\u0434\u0435\u043b\u0430\u043d\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;550-678&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;порядок_действий&quot;&gt;Порядок действий&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сделать каждой AZ по приватной сети. В дополнение к имеющимся дефолтным публичным сетям. Приватной сеть становится, кгда лишается записи дефолтного маршрута (0.0.0.0/0) через &lt;strong&gt;Internet Gateway&lt;/strong&gt; в &lt;strong&gt;Routing Table&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Чтобы сделать сети приватными - идем в &lt;strong&gt;VPC&lt;/strong&gt; → &lt;strong&gt;Routing Tables&lt;/strong&gt; и создаем три таблицы (по одной на каждую подсеть). В каждой из таблиц - есть только один маршрут - &lt;strong&gt;local&lt;/strong&gt;. Жмем &lt;strong&gt;Edit Subnet Associations&lt;/strong&gt; и ставим галочку на соотвествующей только что созданной подсети. В итоге - у нас есть три новых подсети и таблицы маршрутизации для них, в которых есть только маршрут local - то есть они приватные.  
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Теперь нужно создать три &lt;strong&gt;NAT Gateway&lt;/strong&gt; типа &lt;strong&gt;Public&lt;/strong&gt;. При создании - указываем для них ПУБЛИЧНЫЕ сети (не те, которые были созданы на первом этапе), а также им нужны - &lt;strong&gt;Elastic IP&lt;/strong&gt; (поле &lt;strong&gt;Elastic IP allocation ID&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Теперь нужно добавить в созданные &lt;strong&gt;Routing Tables&lt;/strong&gt; маршрут для &lt;strong&gt;Destination 0.0.0.0/0&lt;/strong&gt;, указывающий на соотвествующий &lt;strong&gt;NAT Gateway&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u0440\u044f\u0434\u043e\u043a_\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;679-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 08 Aug 2022 13:57:50 +0000</pubDate>
        </item>
        <item>
            <title>awx_программное_обновление_опросов_progammatic_survey</title>
            <link>https://wiki.autosys.tk/devops/awx_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_progammatic_survey</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;программируемые_опросы_awx&quot;&gt;Программируемые опросы AWX&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Программируемые опросы используются для удобного заполнения значений переменных для плейбуков &lt;strong&gt;ansible&lt;/strong&gt;. &lt;br/&gt;

В данный момент - опросы могут быть заполнены только с помощью &lt;strong&gt;tower-cli&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Все запросы на эту фичу стекаются сюда: &lt;a href=&quot;https://github.com/ansible/awx/issues/20&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/ansible/awx/issues/20&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/ansible/awx/issues/20&lt;/a&gt; &lt;br/&gt;

Для того, чтобы динамически формировать выпадающий список опроса (dynamic entries in multi-choice survey drop-down menu) умный человек запилил хак: &lt;a href=&quot;https://github.com/ansible/awx/pull/1408&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/ansible/awx/pull/1408&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/ansible/awx/pull/1408&lt;/a&gt; , но этот вариант применим не ко всем версиям &lt;strong&gt;AWX&lt;/strong&gt; &lt;br/&gt;

Вот тут есть немного полезного: &lt;a href=&quot;https://groups.google.com/forum/#!topic/awx-project/cuDsbk3lFA4&quot; class=&quot;urlextern&quot; title=&quot;https://groups.google.com/forum/#!topic/awx-project/cuDsbk3lFA4&quot; rel=&quot;ugc nofollow&quot;&gt;https://groups.google.com/forum/#!topic/awx-project/cuDsbk3lFA4&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043e\u043f\u0440\u043e\u0441\u044b AWX&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0435_\u043e\u043f\u0440\u043e\u0441\u044b_awx&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-990&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;псевдо_динамический_вариант_опроса&quot;&gt;Псевдо динамический вариант опроса&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Управлять спецификацией опроса можно через &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;. &lt;br/&gt;

Вот по такому пути &lt;a href=&quot;https://awx.domain_local/api/v2/job_templates/12/survey_spec/&quot; class=&quot;urlextern&quot; title=&quot;https://awx.domain_local/api/v2/job_templates/12/survey_spec/&quot; rel=&quot;ugc nofollow&quot;&gt;https://awx.domain_local/api/v2/job_templates/12/survey_spec/&lt;/a&gt; можно получить доступ к спецификации опроса, прочитать ее, изменить и записать с помощью &lt;strong&gt;POST&lt;/strong&gt; &lt;strong&gt;HTTP&lt;/strong&gt;-реквеста. Теоретически. В веб-интерфейсе есть для этого всё. &lt;br/&gt;

Также, можно воспользоваться &lt;strong&gt;tower-cli&lt;/strong&gt;. &lt;br/&gt;

Мне нужно автоматически заполнять список файлов бекапа, из которых пользователь выберет нужный и восстановит базу, запустив плейбук. &lt;br/&gt;

Так как список файлов обновляется не часто, то я могу написать скрипт, который будет исполняться по таймеру, опрашивать папку и при обновлении списка файлов - вносить изменения в спецификацию опроса. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0441\u0435\u0432\u0434\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u043f\u0440\u043e\u0441\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0441\u0435\u0432\u0434\u043e_\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439_\u0432\u0430\u0440\u0438\u0430\u043d\u0442_\u043e\u043f\u0440\u043e\u0441\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;991-2236&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;настройка_tower-cli&quot;&gt;настройка tower-cli&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://docs.ansible.com/ansible-tower/latest/html/towerapi/tower_cli.html&quot; class=&quot;urlextern&quot; title=&quot;https://docs.ansible.com/ansible-tower/latest/html/towerapi/tower_cli.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://docs.ansible.com/ansible-tower/latest/html/towerapi/tower_cli.html&lt;/a&gt; &lt;br/&gt;

Устанавливаем:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo pip3 --proxy=http://192.168.104.94:3130 install ansible-tower-cli&lt;/pre&gt;

&lt;p&gt;
Настраиваем &lt;strong&gt;tower-cli&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo mkdir /etc/tower/
sudo tower-cli config --global host https://awx.rdleas.ru
sudo tower-cli config --global username admin
sudo tower-cli config --global password __passwd__
sudo tower-cli config --global verify_ssl false&lt;/pre&gt;

&lt;p&gt;
В результате, параметры доступа к &lt;strong&gt;AWX&lt;/strong&gt; попадут в файл &lt;strong&gt;/etc/tower/tower_cli.cfg&lt;/strong&gt;, доступный только для чтения &lt;strong&gt;root&lt;/strong&gt;. &lt;br/&gt;

Проверяем:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo tower-cli user list&lt;/pre&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/ansible/tower-cli/blob/master/docs/source/cli_ref/usage/SURVEYS.rst&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/ansible/tower-cli/blob/master/docs/source/cli_ref/usage/SURVEYS.rst&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/ansible/tower-cli/blob/master/docs/source/cli_ref/usage/SURVEYS.rst&lt;/a&gt; &lt;br/&gt;

Смотрим текущее состояние &lt;strong&gt;survey&lt;/strong&gt; для данного &lt;strong&gt;job_template&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;tower-cli job_template survey -n &amp;#039;job template name&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Сохранение спецификации &lt;strong&gt;survey&lt;/strong&gt; в файл:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;tower-cli job_template survey --name=&amp;quot;survey jt&amp;quot; &amp;gt; s.json&lt;/pre&gt;

&lt;p&gt;
Загрузка &lt;strong&gt;job survey&lt;/strong&gt; из файла:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;tower-cli job_template modify --name=&amp;quot;another jt&amp;quot; --survey-spec=@s.json --survey-enabled=true&lt;/pre&gt;

&lt;p&gt;
Вот скрипт на питоне, который заполняет поля мультичойса для заданного вопроса:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#!/usr/bin/python

import json
import os    
import random
import string

######################
smb_creds=&amp;#039;/etc/tower/smbcredentials.conf&amp;#039; 
backup_share_path=&amp;#039;\\\\\\\\backup01\\\\sql&amp;#039; 
backup_folder=&amp;#039;\\\\SRV-NAV18-SQL\\\\ASR_PROD\\\\&amp;#039;
survey_name=&amp;#039;SBL Deploy ASOR Test Environment&amp;#039;
survey_question=&amp;#039;DataBase backup file path&amp;#039;
#####################

cmd = &amp;#039;smbclient &amp;#039; + backup_share_path + &amp;#039; -D &amp;#039; + backup_folder + &amp;#039; -A &amp;#039; + smb_creds + &amp;#039; -c ls 2&amp;gt;/dev/null | awk \&amp;#039;{print $1}\&amp;#039; | grep -e \&amp;#039;^\..*$\&amp;#039; -v | grep \&amp;#039;.bak\&amp;#039;&amp;#039;
choices = &amp;quot;&amp;quot;

for file in os.popen(cmd).readlines():
    choices = choices + &amp;#039;\n&amp;#039; + backup_share_path + backup_folder + file.rstrip()
choices = choices[2:]
choices = choices.replace(&amp;#039;\\\\&amp;#039;,&amp;#039;\\&amp;#039;)

cmd = &amp;#039;tower-cli job_template survey -n &amp;quot;&amp;#039; + survey_name + &amp;#039;&amp;quot;&amp;#039;
survey_content = os.popen(cmd).read()

survey_obj = json.loads(survey_content)

for question in survey_obj[&amp;#039;spec&amp;#039;]:
    if question[&amp;quot;question_name&amp;quot;] == survey_question:
       question[&amp;quot;choices&amp;quot;] = choices

filename=&amp;#039;/tmp/&amp;#039; + &amp;#039;&amp;#039;.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(5)) + &amp;#039;.json&amp;#039;
f = open(filename, &amp;quot;w&amp;quot;)
f.write(json.dumps(survey_obj, sort_keys=True, indent=4))
f.close()

cmd = &amp;#039;tower-cli job_template modify -n &amp;quot;&amp;#039; + survey_name + &amp;#039;&amp;quot; --survey-spec=@&amp;#039; + filename + &amp;#039; --survey-enabled=true&amp;#039;

survey_mod = os.popen(cmd).read()
os.remove(filename)&lt;/pre&gt;

&lt;p&gt;
Вот скрипт, который берет данные с &lt;strong&gt;Windows&lt;/strong&gt;-хоста, используя &lt;strong&gt;PowerShell&lt;/strong&gt; и помещает результат в поля &lt;strong&gt;AWX Survey&lt;/strong&gt;.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#!/usr/bin/python2

from __future__ import print_function
import winrm
import json
import os
import random
import string

survey_name=&amp;#039;SBL Navision Instance Automation&amp;#039;
survey_question=&amp;#039;Select Navision Instance&amp;#039;

nav_server_list = [
&amp;#039;srv-nav2017-dev&amp;#039;,
&amp;#039;srv-nav2017-tst&amp;#039;
]
win_user = &amp;#039;web_nav_develop@RDLEAS.RU&amp;#039;
win_pass = &amp;#039;n2n?yJ76cn!CvLMX&amp;#039;
winrm_transport=&amp;#039;ntlm&amp;#039;

ps_script = &amp;quot;&amp;quot;&amp;quot;
    Import-Module &amp;quot;C:\Program Files\Microsoft Dynamics NAV\\110\Service\NavAdminTool.ps1&amp;quot; *&amp;gt;&amp;amp;1 | out-null
    foreach ($instance in $(Get-NAVServerInstance))
    {
        Write-Host &amp;quot;$env:computername - $(($instance.ServerInstance).ToString().Split(&amp;#039;$&amp;#039;)[1]) - $($instance.State.ToString())&amp;quot;
    }
&amp;quot;&amp;quot;&amp;quot;
choices = &amp;quot;&amp;quot;
for nav_server in nav_server_list:
        win_host = &amp;#039;http://&amp;#039;+ nav_server + &amp;#039;:5985/wsman&amp;#039;
        s = winrm.Session(win_host, auth=(win_user, win_pass), transport=winrm_transport)
        r=s.run_ps(ps_script)
        #print (r.status_code)
        #print (r.std_err)
        if r.status_code == 0:
           for instance in r.std_out.splitlines():
                choices = choices + &amp;#039;\n&amp;#039; + instance
choices = choices[1:]

cmd = &amp;#039;tower-cli job_template survey -n &amp;quot;&amp;#039; + survey_name + &amp;#039;&amp;quot;&amp;#039;
survey_content = os.popen(cmd).read()

survey_obj = json.loads(survey_content)

for question in survey_obj[&amp;#039;spec&amp;#039;]:
    if question[&amp;quot;question_name&amp;quot;] == survey_question:
       question[&amp;quot;choices&amp;quot;] = choices

filename=&amp;#039;/tmp/&amp;#039; + &amp;#039;&amp;#039;.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(5)) + &amp;#039;.json&amp;#039;
f = open(filename, &amp;quot;w&amp;quot;)
f.write(json.dumps(survey_obj, sort_keys=True, indent=4))
f.close()

cmd = &amp;#039;tower-cli job_template modify -n &amp;quot;&amp;#039; + survey_name + &amp;#039;&amp;quot; --survey-spec=@&amp;#039; + filename + &amp;#039; --survey-enabled=true&amp;#039;

survey_mod = os.popen(cmd).read()
os.remove(filename)&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 tower-cli&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_tower-cli&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;2237-6980&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;подготовка_хоста_для_исполнения_текущих_скриптов_для_динамических_опросов_awx&quot;&gt;Подготовка хоста для исполнения текущих скриптов для динамических опросов AWX&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt-get install gcc python3-dev python-dev libkrb5-dev&lt;/pre&gt;

&lt;p&gt;
Проверить, что в файлике &lt;strong&gt;/usr/bin/pip2&lt;/strong&gt; используется в качестве интерпретатора указан &lt;strong&gt;python2&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo pip3 --proxy=http://192.168.104.94:3130 install pywinrm pyjson pyrandom
sudo pip2 --proxy=http://192.168.104.94:3130 install pywinrm pyjson pyrandom
sudo pip2 --proxy=http://192.168.104.94:3130 install pywinrm[kerberos]
sudo pip3 --proxy=http://192.168.104.94:3130 install pywinrm[kerberos]&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0445\u043e\u0441\u0442\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0440\u043e\u0441\u043e\u0432 AWX&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430_\u0445\u043e\u0441\u0442\u0430_\u0434\u043b\u044f_\u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f_\u0442\u0435\u043a\u0443\u0449\u0438\u0445_\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432_\u0434\u043b\u044f_\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445_\u043e\u043f\u0440\u043e\u0441\u043e\u0432_awx&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;6981-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 10 Jun 2022 11:48:54 +0000</pubDate>
        </item>
        <item>
            <title>bare_metal_kubernetes_persistent_volume_dynamic_provisioning</title>
            <link>https://wiki.autosys.tk/devops/bare_metal_kubernetes_persistent_volume_dynamic_provisioning</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;динамический_провижининг_persistent_volumes_в_bare-metal_инсталляциях_kubernetes&quot;&gt;Динамический провижининг Persistent Volumes в bare-metal инсталляциях kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0432\u0438\u0436\u0438\u043d\u0438\u043d\u0433 Persistent Volumes \u0432 bare-metal \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u044f\u0445 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439_\u043f\u0440\u043e\u0432\u0438\u0436\u0438\u043d\u0438\u043d\u0433_persistent_volumes_\u0432_bare-metal_\u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u044f\u0445_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-131&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;openebs&quot;&gt;OpenEBS&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Имеет под капотом несколько различных движков, которые обеспечивают различный уровень производительности/отказоустойчивости. Некоторые движки умеют репликацию, но также есть простой DynamicLocal PV. 
&lt;a href=&quot;https://docs.openebs.io/docs/next/conceptscas.html&quot; class=&quot;urlextern&quot; title=&quot;https://docs.openebs.io/docs/next/conceptscas.html&quot; rel=&quot;ugc nofollow&quot;&gt;OpenEBS&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://habr.com/ru/company/flant/blog/503712/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/company/flant/blog/503712/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/company/flant/blog/503712/&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;OpenEBS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;openebs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;132-625&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;local_persistence_volume_static_provisioner&quot;&gt;Local Persistence Volume Static Provisioner&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner&lt;/a&gt;
&lt;a href=&quot;https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone --depth=1 https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.git
kubectl create ns pv-provisioner
helm upgrade --install -n pv-provisioner local ./sig-storage-local-static-provisioner/helm/provisioner \
 --set common.mountDevVolume=&amp;quot;false&amp;quot; \
 --set classes[0].name=&amp;quot;rmq&amp;quot; \
 --set classes[0].hostDir=&amp;quot;/var/lib/rmq&amp;quot; \
 --set classes[0].volumeMode=&amp;quot;Filesystem&amp;quot; \
 --set classes[0].storageClass=&amp;quot;true&amp;quot; \
 --set classes[1].name=&amp;quot;default&amp;quot; \
 --set classes[1].hostDir=&amp;quot;/var/lib/kubernetes_volumes&amp;quot; \
 --set classes[1].volumeMode=&amp;quot;Filesystem&amp;quot; \
 --set classes[1].storageClass.isDefaultClass=&amp;quot;true&amp;quot; \
 --set classes[2].name=&amp;quot;redis&amp;quot; \
 --set classes[2].hostDir=&amp;quot;/var/lib/redis&amp;quot; \
 --set classes[2].volumeMode=&amp;quot;Filesystem&amp;quot; \
 --set classes[2].storageClass=&amp;quot;true&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Local Persistence Volume Static Provisioner&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;local_persistence_volume_static_provisioner&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;626-1624&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;как_local_static_volumes_provisioner_работает&quot;&gt;Как Local Static Volumes Provisioner работает&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Local Static Volumes Provisioner&lt;/strong&gt; следит за указанной в конфиге директорией на хостах кластера и все смонтированные в эти дииректории блочные устройства представляет в кубере как PV. &lt;br/&gt;

То есть, чтобы сделать PV нужно:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создать на ноде LogicalVolume
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Отформатировать его в ext4
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Смонтировать в заданной директории
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Для данных на нодах есть пустой диск &lt;strong&gt;/dev/sdb&lt;/strong&gt;. &lt;br/&gt;

Подотовим его:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo yum install gdisk
sudo sgdisk -p /dev/sdb
sudo sgdisk -n 1:2048:0 /dev/sdb
sudo sgdisk -t 1:8E00 /dev/sdb
sudo pvcreate /dev/sdb1&lt;/pre&gt;

&lt;p&gt;
И создадим &lt;strong&gt;VolumeGroup&lt;/strong&gt; - &lt;strong&gt;data&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo vgcreate data /dev/sdb1&lt;/pre&gt;

&lt;p&gt;
Теперь можно создавать &lt;strong&gt;LogicalVolumes&lt;/strong&gt; и монтировать их:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo lvcreate -L6.3G -nelk-master-0 data
sudo mkfs.ext4 /dev/data/elk-master-0
sudo mkdir /var/lib/kubernetes_volumes/elk-master-0
sudo mount /dev/data/elk-master-0 /var/lib/kubernetes_volumes/elk-master-0&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u0430\u043a Local Static Volumes Provisioner \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u0430\u043a_local_static_volumes_provisioner_\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1625-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 28 Apr 2022 13:30:31 +0000</pubDate>
        </item>
        <item>
            <title>building_and_publishing_deb_package_on_launchpad_using_github_actions</title>
            <link>https://wiki.autosys.tk/devops/building_and_publishing_deb_package_on_launchpad_using_github_actions</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;регистрируемся_на_launchpadnet_и_создаем_ppa&quot;&gt;Регистрируемся на launchpad.net и создаем ppa&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Если еще нет учетки на &lt;a href=&quot;https://login.ubuntu.com/&quot; class=&quot;urlextern&quot; title=&quot;https://login.ubuntu.com/&quot; rel=&quot;ugc nofollow&quot;&gt;Ubuntu One&lt;/a&gt; или &lt;a href=&quot;https://launchpad.net/&quot; class=&quot;urlextern&quot; title=&quot;https://launchpad.net/&quot; rel=&quot;ugc nofollow&quot;&gt;Launchpad.net&lt;/a&gt;, то идем на &lt;a href=&quot;https://login.launchpad.net&quot; class=&quot;urlextern&quot; title=&quot;https://login.launchpad.net&quot; rel=&quot;ugc nofollow&quot;&gt;https://login.launchpad.net&lt;/a&gt; и регистрируемся и логинимся. &lt;br/&gt;

Теперь Создаем новый проект на launchpad - &lt;a href=&quot;https://launchpad.net/projects/+new&quot; class=&quot;urlextern&quot; title=&quot;https://launchpad.net/projects/+new&quot; rel=&quot;ugc nofollow&quot;&gt;https://launchpad.net/projects/+new&lt;/a&gt; .&lt;br/&gt;

На первом этапе - вводим Имя проекта и краткое описание. &lt;br/&gt;

Затем - Launchpad услужливо спросит, нет ли подобного проекта среди уже существующих - отвечаем &lt;strong&gt;No, this is a new project&lt;/strong&gt;. &lt;br/&gt;

Ну и заполняем то что он спросит - там не сложно.&lt;br/&gt;

Дальше - на своей страничке (&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt; - &lt;a href=&quot;https://launchpad.net/~{USERNAME}&quot; class=&quot;urlextern&quot; title=&quot;https://launchpad.net/~{USERNAME}&quot; rel=&quot;ugc nofollow&quot;&gt;https://launchpad.net/~{USERNAME}&lt;/a&gt;) жмем &lt;strong&gt;Create a new PPA&lt;/strong&gt; (или идем по ссылке типа &lt;a href=&quot;https://launchpad.net/~{USERNAME}/+activate-ppa&quot; class=&quot;urlextern&quot; title=&quot;https://launchpad.net/~{USERNAME}/+activate-ppa&quot; rel=&quot;ugc nofollow&quot;&gt;https://launchpad.net/~{USERNAME}/+activate-ppa&lt;/a&gt;)
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 launchpad.net \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c ppa&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f_\u043d\u0430_launchpadnet_\u0438_\u0441\u043e\u0437\u0434\u0430\u0435\u043c_ppa&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-1128&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;генерация_ключа_pgp&quot;&gt;Генерация ключа pgp&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Делаем как написано тут:  &lt;a href=&quot;https://help.ubuntu.com/community/GnuPrivacyGuardHowto&quot; class=&quot;urlextern&quot; title=&quot;https://help.ubuntu.com/community/GnuPrivacyGuardHowto&quot; rel=&quot;ugc nofollow&quot;&gt;https://help.ubuntu.com/community/GnuPrivacyGuardHowto&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gpg --gen-key&lt;/pre&gt;

&lt;p&gt;
Вводим имя и e-mail, затем - пароль и получаем ключ. &lt;br/&gt;

В выводе будет что-то такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;pub   rsa3072 2021-06-19 [SC] [expires: 2023-06-19]
    B7569B57852DF8B47BFE5D7D3DC913AE67653CD3&lt;/pre&gt;

&lt;p&gt;
А именно - &lt;strong&gt;fingreprint&lt;/strong&gt; ключа - &lt;strong&gt;B7569B57852DF8B47BFE5D7D3DC913AE67653CD3&lt;/strong&gt;. У вас он будет другой. &lt;br/&gt;

Теперь делаем его ключем по-умолчанию. Для этого редактируем &lt;strong&gt;~/.bash_profile&lt;/strong&gt; и прописываем там &lt;strong&gt;fingreprint&lt;/strong&gt; ключа:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export GPGKEY=B7569B57852DF8B47BFE5D7D3DC913AE67653CD3&lt;/pre&gt;

&lt;p&gt;
Ну и для работы в текущей локальной сессии выполним:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export GPGKEY=B7569B57852DF8B47BFE5D7D3DC913AE67653CD3&lt;/pre&gt;

&lt;p&gt;
Загрузим ключ на сервер:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gpg --send-keys --keyserver keyserver.ubuntu.com $GPGKEY&lt;/pre&gt;

&lt;p&gt;
Добавим ключ в &lt;strong&gt;PPA&lt;/strong&gt;: &lt;a href=&quot;https://launchpad.net/~~{USERNAME}/+editpgpkeys&quot; class=&quot;urlextern&quot; title=&quot;https://launchpad.net/~~{USERNAME}/+editpgpkeys&quot; rel=&quot;ugc nofollow&quot;&gt;https://launchpad.net/~~{USERNAME}/+editpgpkeys&lt;/a&gt; и там то самое &lt;strong&gt;$GPGKEY&lt;/strong&gt;. &lt;br/&gt;

В результате - на почту придет сообщение зашифрованное данным ключем, которое нужно расшифровать и перейти поссылке. &lt;br/&gt;

Для этого - открывам письмо, ищем текст, который начинается примерно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;-----BEGIN PGP MESSAGE-----
Version: GnuPG v1

hQGMAwlc3LxvNLEXAQwAnPnvIBNfGsY6cOkbc+MIHYFoMJknmRRICXEkwMbdmwoC
FFpq7LTzMmDWzleelg/XGJBEfnLs8aVsSgfDPqg2LCBEXRxOjCG7+COohDBHq1cN
....&lt;/pre&gt;

&lt;p&gt;
И подствляем его в команду:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;echo &amp;#039;-----BEGIN PGP MESSAGE-----
Version: GnuPG v1

hQGMAwlc3LxvNLEXAQwAnPnvIBNfGsY6cOkbc+MIHYFoMJknmRRICXEkwMbdmwoC
FFpq7LTzMmDWzleelg/XGJBEfnLs8aVsSgfDPqg2LCBEXRxOjCG7+COohDBHq1cN
...
wfa+c9quFl6ZBBFfAlteXi4ZqeVTLkuZdCqRcmlAxANyu4hpKytwMk0TnYXpdCZ8
TKrP/pWEVB/wrRt60ZKPNv/dShoHiyiuCgQxapWIKOfNS5Vh1tnoQJmfCD4xUn0a
KfXT8528u6o=
=5CDZ
-----END PGP MESSAGE-----&amp;#039; | gpg --decrypt&lt;/pre&gt;

&lt;p&gt;
Вводим пароль от ключа и получаем текст письма, в котором - ссылка вида: &lt;a href=&quot;https://launchpad.net/token/H4Mvs...&quot; class=&quot;urlextern&quot; title=&quot;https://launchpad.net/token/H4Mvs...&quot; rel=&quot;ugc nofollow&quot;&gt;https://launchpad.net/token/H4Mvs...&lt;/a&gt;. Переходим по ней изавершаем добавление ключа - жмем &lt;strong&gt;Continue&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0430 pgp&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f_\u043a\u043b\u044e\u0447\u0430_pgp&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1129-3661&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;добавление_ключа_в_github_actions&quot;&gt;Добавление ключа в GitHub Actions&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/marketplace/actions/import-gpg&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/marketplace/actions/import-gpg&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/marketplace/actions/import-gpg&lt;/a&gt; &lt;br/&gt;

Извлечем закрытый ключ:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gpg --armor --export-secret-key kind.devops@gmail.com -w0&lt;/pre&gt;

&lt;p&gt;
Чтобы добавить ключ GPG в проект и использовать его при публикации - идем в проект на &lt;strong&gt;GitHub&lt;/strong&gt; → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Secrets&lt;/strong&gt; → &lt;strong&gt;New Repository Secret&lt;/strong&gt; и создаем пару секретов - &lt;strong&gt;GPG_PRIVATE_KEY&lt;/strong&gt; и &lt;strong&gt;GPG_PASSPHRASE&lt;/strong&gt; соответственно с приватным ключем и паролем.
&lt;br/&gt;

&lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 \u0432 GitHub Actions&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435_\u043a\u043b\u044e\u0447\u0430_\u0432_github_actions&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;3662-4280&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;сборка_deb-пакета_и_загрузка_его_на_launchpad_ppa&quot;&gt;Сборка deb-пакета и загрузка его на launchpad ppa&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.hackgnar.com/2016/01/simple-deb-package-creation.html&quot; class=&quot;urlextern&quot; title=&quot;http://www.hackgnar.com/2016/01/simple-deb-package-creation.html&quot; rel=&quot;ugc nofollow&quot;&gt;http://www.hackgnar.com/2016/01/simple-deb-package-creation.html&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://blog.packagecloud.io/debian/debuild/packaging/2015/06/08/buildling-deb-packages-with-debuild/&quot; class=&quot;urlextern&quot; title=&quot;https://blog.packagecloud.io/debian/debuild/packaging/2015/06/08/buildling-deb-packages-with-debuild/&quot; rel=&quot;ugc nofollow&quot;&gt;https://blog.packagecloud.io/debian/debuild/packaging/2015/06/08/buildling-deb-packages-with-debuild/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0431\u043e\u0440\u043a\u0430 deb-\u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0435\u0433\u043e \u043d\u0430 launchpad ppa&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0431\u043e\u0440\u043a\u0430_deb-\u043f\u0430\u043a\u0435\u0442\u0430_\u0438_\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430_\u0435\u0433\u043e_\u043d\u0430_launchpad_ppa&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;4281-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 21 Jun 2021 07:21:18 +0000</pubDate>
        </item>
        <item>
            <title>build_docker_images_in_k8s_cluster</title>
            <link>https://wiki.autosys.tk/devops/build_docker_images_in_k8s_cluster</link>
            <description>
&lt;p&gt;
Задача - сбилдить образ docker имея только доступ к k8s-api. &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Запускаем контейнер с Docker-in-Docker:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl run -it --rm --privileged --image docker:dind dind -- /bin/sh -c &amp;#039;unset DOCKER_TLS_CERTDIR &amp;amp;&amp;amp; dockerd-entrypoint.sh &amp;amp; echo &amp;quot;127.0.0.1 docker&amp;quot; &amp;gt;&amp;gt; /etc/hosts &amp;amp; /bin/sh&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Забираем из git репу с докерфайлом:  
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apk add git
git clone ...&lt;/pre&gt;

&lt;p&gt;
билдим
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;docker build .&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 15 Feb 2022 12:57:55 +0000</pubDate>
        </item>
        <item>
            <title>build_rpm_from_python_script</title>
            <link>https://wiki.autosys.tk/devops/build_rpm_from_python_script</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;полезные_url&quot;&gt;Полезные URL&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://github.com/vinta/awesome-python#distribution&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/vinta/awesome-python#distribution&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/vinta/awesome-python#distribution&lt;/a&gt; - список тулзов, которые используются для упаковки скриптов &lt;strong&gt;python&lt;/strong&gt; в устанавливаемые пакеты.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 URL&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435_url&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-262&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;задача&quot;&gt;Задача&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Упаковать скрипт в rpm-пакет со всеми зависимостями, чтобы установка этого скрипта не влияла на python-пкеты на целевой системе.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;263-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 02 Mar 2022 09:15:06 +0000</pubDate>
        </item>
        <item>
            <title>cadvisor</title>
            <link>https://wiki.autosys.tk/devops/cadvisor</link>
            <description>
&lt;p&gt;
Метрики cadvisor
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -k --key /var/lib/kubelet/pki/kubelet-client-current.pem --cert /var/lib/kubelet/pki/kubelet-client-current.pem --cacert /etc/kubernetes/pki/ca.crt https://0.0.0.0:10250/metrics/cadvisor&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 15 Mar 2022 12:41:31 +0000</pubDate>
        </item>
        <item>
            <title>cka_preparation</title>
            <link>https://wiki.autosys.tk/devops/cka_preparation</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;примеры_вопросов&quot;&gt;Примеры вопросов&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://wiki.autosys.tk/_media/devops/kubernetes_sample_exam_questions_ed2.pdf&quot; class=&quot;media mediafile mf_pdf&quot; title=&quot;devops:kubernetes_sample_exam_questions_ed2.pdf (1.9 MB)&quot;&gt; Примеры вопросов от k21academy.com &lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://github.com/cncf/curriculum&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/cncf/curriculum&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/cncf/curriculum&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://wiki.autosys.tk/_media/devops/cka_exam_-_free_questions_and_answers_-_itexams.com.pdf&quot; class=&quot;media mediafile mf_pdf&quot; title=&quot;devops:cka_exam_-_free_questions_and_answers_-_itexams.com.pdf (19.8 MB)&quot;&gt; Примеры вопросов от itexams.com &lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 01 Mar 2023 10:31:11 +0000</pubDate>
        </item>
        <item>
            <title>cyber_security</title>
            <link>https://wiki.autosys.tk/devops/cyber_security</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;разведка&quot;&gt;Разведка&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Собираем информацию о:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  Обнаружение доменных имен, принадлежащих организации
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  Обнаружение “живых” хостов в сети и составления списка их IP-адресов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  Определение актуального статуса сетевых портов узлов из списка
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  Определение типа и версии операционной системы на исследованных машинах
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  Определение версий ПО или служб, которые находятся на сетевых портах
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  Сбор информации об используемых технологиях на веб-сайте
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0437\u0432\u0435\u0434\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u0432\u0435\u0434\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-815&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;dns-имена&quot;&gt;DNS-имена&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 команда &lt;strong&gt;host&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://dnsdumpster.com&quot; class=&quot;urlextern&quot; title=&quot;https://dnsdumpster.com&quot; rel=&quot;ugc nofollow&quot;&gt;https://dnsdumpster.com&lt;/a&gt; - информация о &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-именах
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 сайт &lt;a href=&quot;https://crt.sh&quot; class=&quot;urlextern&quot; title=&quot;https://crt.sh&quot; rel=&quot;ugc nofollow&quot;&gt;https://crt.sh&lt;/a&gt; - информация о сертификатах
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 инструмент &lt;strong&gt;amass&lt;/strong&gt; - опрашивает разные базы и получает сведения о домене и связанных с ним именах, сертификатах и прочем. Также умеет генерить запросы к &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; для обнаружения доменных имен в заданной зоне.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 сканеры поддоменов &lt;a href=&quot;https://github.com/aboul3la/Sublist3r&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/aboul3la/Sublist3r&quot; rel=&quot;ugc nofollow&quot;&gt;Sublist3r&lt;/a&gt; и &lt;a href=&quot;https://github.com/tomnomnom/assetfinder&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/tomnomnom/assetfinder&quot; rel=&quot;ugc nofollow&quot;&gt;assetfinder&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://spark-interfax.ru/&quot; class=&quot;urlextern&quot; title=&quot;https://spark-interfax.ru/&quot; rel=&quot;ugc nofollow&quot;&gt;https://spark-interfax.ru/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://apps.db.ripe.net/db-web-ui/fulltextsearch&quot; class=&quot;urlextern&quot; title=&quot;https://apps.db.ripe.net/db-web-ui/fulltextsearch&quot; rel=&quot;ugc nofollow&quot;&gt;https://apps.db.ripe.net/db-web-ui/fulltextsearch&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 shodan.io
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 censys.io
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 pentest-tools.com
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://osintframework.com/&quot; class=&quot;urlextern&quot; title=&quot;https://osintframework.com/&quot; rel=&quot;ugc nofollow&quot;&gt;https://osintframework.com/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сисок инструментов: &lt;a href=&quot;https://github.com/jivoi/awesome-osint&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/jivoi/awesome-osint&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/jivoi/awesome-osint&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;DNS-\u0438\u043c\u0435\u043d\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;dns-\u0438\u043c\u0435\u043d\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;816-1788&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;сканеры_портов&quot;&gt;Сканеры портов&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 nmap (&lt;a href=&quot;https://nmap.org/zenmap/&quot; class=&quot;urlextern&quot; title=&quot;https://nmap.org/zenmap/&quot; rel=&quot;ugc nofollow&quot;&gt;Zenmap&lt;/a&gt;) Материалы: &lt;a href=&quot;https://nmap.org/presentations/BHDC10/Fyodor-David-BlackHatUSA-2010-Slides.pdf&quot; class=&quot;urlextern&quot; title=&quot;https://nmap.org/presentations/BHDC10/Fyodor-David-BlackHatUSA-2010-Slides.pdf&quot; rel=&quot;ugc nofollow&quot;&gt;Mastering Nmap Scripting Engine&lt;/a&gt;, &lt;a href=&quot;https://nmap.org/book/&quot; class=&quot;urlextern&quot; title=&quot;https://nmap.org/book/&quot; rel=&quot;ugc nofollow&quot;&gt;Nmap Network Scanning&lt;/a&gt;, &lt;a href=&quot;https://github.com/chacka0101/Hacking_Books/raw/master/2017%20-%20NMAP%20-%20Network%20Exploration%20and%20Security%20Auditing%20Cookbook%20-%20Second%20Edition.pdf&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/chacka0101/Hacking_Books/raw/master/2017%20-%20NMAP%20-%20Network%20Exploration%20and%20Security%20Auditing%20Cookbook%20-%20Second%20Edition.pdf&quot; rel=&quot;ugc nofollow&quot;&gt;Nmap 6: Network Exploration and Security Auditing Cookbook&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://github.com/robertdavidgraham/masscan&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/robertdavidgraham/masscan&quot; rel=&quot;ugc nofollow&quot;&gt;massscan&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043a\u0430\u043d\u0435\u0440\u044b \u043f\u043e\u0440\u0442\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043a\u0430\u043d\u0435\u0440\u044b_\u043f\u043e\u0440\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1789-2353&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;статусы_открытости_портов&quot;&gt;Статусы открытости портов&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Важно понимать, что любые инструменты будут описывать сетевые порты определенными статусами. В соответствии с утилитой Nmap существует шесть состояний сетевых портов :
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 открыт (open) - Приложение принимает запросы на TCP соединение или UDP пакеты на этот порт. Обнаружение этого состояния обычно является основной целью сканирования. Люди, разбирающиеся в безопасности, знают, что каждый открытый порт — это прямой путь к возможному взаимодействию. Атакующие хотят использовать открытые порты, а администраторы пытаются закрыть их или защитить с помощью брандмауэров так, чтобы не мешать работе обычных пользователей. Открытые порты также интересны с точки зрения сканирования, не связанного с безопасностью, т.к. они позволяют определить службы, доступные в сети.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 закрыт (closed) - Закрытый порт доступен, но не используется каким-либо приложением. Этот статус может означать, что по заданному IP адресу есть существующий узел, или помогать определять ОС. Т.к. эти порты достижимы, может быть полезным произвести сканирование позже, т.к. некоторые из них могут открыться. Администраторы могут заблокировать такие порты с помощью брандмауэров, тогда их состояние будет определено как “фильтруется”.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 фильтруется (filtered) - Нельзя определить, открыт ли порт, т.к. фильтрация пакетов не позволяет достичь запросам Nmap этого порта. Фильтрация может осуществляться выделенным брандмауэром, правилами роутера или брандмауэром на целевой машине. Эти порты бесполезны для атакующих, т.к. предоставляют очень мало информации. Иногда они отвечаютICMPсообщениями об ошибке, такими, как тип 3 код 13 (destination unreachable: communication administratively prohibited (англ.: цель назначения недоступна: связь запрещена администратором), но чаще встречаются фильтры, которые отбрасывают запросы без предоставления какой-либо информации. Для этого нужно сделать еще несколько запросов, чтобы убедиться, что запрос был отброшен фильтром, а не затором в сети. Это очень сильно замедляет сканирование.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 не фильтруется (unfiltered) - Это состояние означает, что порт доступен, но нельзя определить, открыт он или закрыт. Только ACK сканирование, используемое для определения правил брандмауэра, может охарактеризовать порт этим состоянием. Сканирование не фильтруемых портов другими способами, такими, как Windows сканирование, SYN сканирование или FIN сканирование, может помочь определить, является ли порт открытым.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 открыт|фильтруется (open|filtered) - Порт характеризуется таким состоянием, когда нельзя определить, открыт порт или фильтруется. Это состояние возникает при таких типах сканирования, при которых открытые порты не отвечают. Отсутствие ответа также может означать, что пакетный фильтр не пропустил запрос или ответ не был получен. Порт может быть охарактеризован таким состоянием при сканировании UDP, по IP протоколу, FIN, NULL, а также Xmas.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 закрыт|фильтруется (closed|filtered) - Это состояние используется, когда нельзя определить, закрыт порт или фильтруется. Используется только при сканировании IP ID idle типа.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0442\u0430\u0442\u0443\u0441\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u0442\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0442\u0430\u0442\u0443\u0441\u044b_\u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438_\u043f\u043e\u0440\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2354-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 10 Jul 2023 06:33:00 +0000</pubDate>
        </item>
        <item>
            <title>deploy_elk_using_helm</title>
            <link>https://wiki.autosys.tk/devops/deploy_elk_using_helm</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;add_elastic_repo&quot;&gt;Add elastic repo&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;helm repo add elastic https://helm.elastic.co&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Add elastic repo&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;add_elastic_repo&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-79&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;install_elasticsearch&quot;&gt;Install Elasticsearch&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Install Elasticsearch&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;install_elasticsearch&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;80-115&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;create_namespace&quot;&gt;Create namespace&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns elasticsearch&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Create namespace&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;create_namespace&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;116-178&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;deploy_elasticsearch_from_helm&quot;&gt;deploy Elasticsearch from helm&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;helm install --namespace elasticsearch --name elasticsearch elastic/elasticsearch --set replicas=1&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;deploy Elasticsearch from helm&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;deploy_elasticsearch_from_helm&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;179-322&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;create_persistent_volume_for_elasticsearch&quot;&gt;Create Persistent Volume for Elasticsearch&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;sudo mkdir /kubernetes_volumes/elasticsearch-data
sudo chmod a+rw -R /kubernetes_volumes/elasticsearch-data/&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: PersistentVolume
metadata:
   name: elasticsearch-data
   namespace: elasticsearch
   labels:
     app: elasticsearch-master
spec:
  capacity:
    storage: 32Gi
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: &amp;quot;/kubernetes_volumes/elasticsearch-data&amp;quot;
    type: Directory
  persistentVolumeReclaimPolicy: Retain&lt;/pre&gt;

&lt;p&gt;
И дадим права на запись в индексы:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n elasticsearch elasticsearch-master-0 -- curl -XPUT -H &amp;quot;Content-Type: application/json&amp;quot; http://localhost:9200/_all/_settings -d &amp;#039;{&amp;quot;index.blocks.read_only_allow_delete&amp;quot;: null}&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Так как нода у меня одна, то мне нужно запретить создавать реплики. Иниче - в дальнейшем кластер просто перестанет работать:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n elasticsearch elasticsearch-master-0 -- curl -H &amp;quot;Content-Type: application/json&amp;quot; -XPUT &amp;#039;http://127.0.0.1:9200/_template/default&amp;#039; -d &amp;#039;{&amp;quot;index_patterns&amp;quot;: [&amp;quot;*&amp;quot;],&amp;quot;order&amp;quot;: -1,&amp;quot;settings&amp;quot;: {&amp;quot;number_of_shards&amp;quot;: &amp;quot;1&amp;quot;,&amp;quot;number_of_replicas&amp;quot;: &amp;quot;0&amp;quot;}}&amp;#039;&lt;/pre&gt;

&lt;p&gt;
И почистим уже созданные индексы:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n elasticsearch elasticsearch-master-0 -- curl -XDELETE &amp;#039;http://127.0.0.1:9200/*&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Теперь в логах пода &lt;strong&gt;elasticsearch-master-0&lt;/strong&gt; появится строка:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Cluster health status changed from [YELLOW] to [GREEN]&lt;/pre&gt;

&lt;p&gt;
И в этот elasticsearch можно будет писать логи.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Create Persistent Volume for Elasticsearch&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;create_persistent_volume_for_elasticsearch&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;323-1976&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;install_kibana&quot;&gt;Install Kibana&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns kibana
helm install --namespace elasticsearch --name kibana elastic/kibana --set elasticsearchHosts=http://elasticsearch-master.elasticsearch.svc.cluster.local:9200&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  helm upgrade kibana elastic/kibana --set elasticsearchHosts=http://openresty-oidc-http.elasticsearch.svc.cluster.local:9200 --set elasticsearch.requestHeadersWhitelist=[X-Auth-Username]  &lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Install Kibana&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;install_kibana&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;1977-2385&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;kibana_ingress&quot;&gt;Kibana Ingress&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt
  name: kibana-ingress
  namespace: elasticsearch
spec:
  rules:
  - host: kibana.autosys.tk
    http:
      paths:
      - backend:
          serviceName: kibana-kibana
          servicePort: 5601
        path: /
  tls:
  - hosts:
    - kibana.autosys.tk
    secretName:  kibana-autosys-tk-tls&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kibana Ingress&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;kibana_ingress&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;2386-2879&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit8&quot; id=&quot;kibana_saved_objects&quot;&gt;Kibana Saved Objects&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
В кибане есть сохраненные пользователем объекты. Например - Index Patterns.&lt;br/&gt;

Создать можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n elk elk-openresty-oidc-559f46d69d-shbwg -- curl -H &amp;#039;Authorization: Basic dXN....o&amp;#039; -H &amp;#039;kbn-xsrf: true&amp;#039; -H &amp;#039;Content-Type: application/json&amp;#039; -d &amp;#039;{&amp;quot;attributes&amp;quot;: {&amp;quot;title&amp;quot;: &amp;quot;my-pattern-*&amp;quot;}}&amp;#039; http://elk-kb-http:5601/api/saved_objects/index-pattern/my-pattern&lt;/pre&gt;

&lt;p&gt;
Посмотреть их можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n elk elk-openresty-oidc-559f46d69d-shbwg -- curl -H &amp;#039;Authorization: Basic dXN....o&amp;#039; http://elk-kb-http:5601/api/saved_objects/_find?type=index-pattern | grep &amp;#039;&amp;quot;type&amp;quot;:&amp;quot;index-pattern&amp;quot;&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Удалить какой-то можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n elk elk-openresty-oidc-559f46d69d-shbwg -- curl -X DELETE -H &amp;#039;kbn-xsrf: true&amp;#039; -H &amp;#039;Authorization: Basic dXN....o&amp;#039; http://elk-kb-http:5601/api/saved_objects/index-pattern/vrm&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kibana Saved Objects&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;kibana_saved_objects&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;2880-3847&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit9&quot; id=&quot;logstash&quot;&gt;Logstash&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://habr.com/ru/post/421819/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/post/421819/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/post/421819/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://helm.elastic.co/&quot; class=&quot;urlextern&quot; title=&quot;https://helm.elastic.co/&quot; rel=&quot;ugc nofollow&quot;&gt;https://helm.elastic.co/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;helm install --namespace elasticsearch --name logstash elastic/logstash -f ./values.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Logstash&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;logstash&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;3848-4026&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit10&quot; id=&quot;настройка_rsyslog_и_фильтра_logstash&quot;&gt;Настройка rsyslog и фильтра logstash&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
У меня &lt;strong&gt;rsyslog&lt;/strong&gt; сыплет логи в таком виде:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Dec 25 14:06:25 kub kubelet[989]: W1225 14:06:25.516800     989 volume_linux.go:45] Setting volume ownership for /var/lib/kubelet/pods/d36eb244-fe63-4f5d-b133-c4e4232c68b3/volumes/kubernetes.io~configmap/sc-dashboard-provider and fsGroup set. If the volume has a lot of files then setting volume ownership could be slow, see https://github.com/kubernetes/kubernetes/issues/69699&lt;/pre&gt;

&lt;p&gt;
Для того, чтобы &lt;strong&gt;logstash&lt;/strong&gt; смог сформировать объект json-объект &lt;strong&gt;message&lt;/strong&gt; нужно в конфигурацию прописать фильтр, который распарсит строку &lt;strong&gt;message&lt;/strong&gt; , чтобы на выходе получился объект. &lt;br/&gt;

Встроенные паттерны тут: &lt;a href=&quot;https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns&lt;/a&gt; &lt;br/&gt;

Проверить паттерны можно тут: &lt;a href=&quot;http://grokdebug.herokuapp.com/&quot; class=&quot;urlextern&quot; title=&quot;http://grokdebug.herokuapp.com/&quot; rel=&quot;ugc nofollow&quot;&gt;http://grokdebug.herokuapp.com/&lt;/a&gt; &lt;br/&gt;

Для вышеприведенной стоки подходит такой фильтр:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;%{SYSLOGTIMESTAMP:timestamp}%{SPACE}%{SYSLOGHOST:host}%{SPACE}%{SYSLOGPROG:process}:%{SPACE}%{GREEDYDATA:SYSLOGMESSAGE}&lt;/pre&gt;

&lt;p&gt;
Для того, чтобы логи попадали в &lt;strong&gt;elasticsearch&lt;/strong&gt; в конфиг &lt;strong&gt;rsyslog&lt;/strong&gt; (/etc/rsyslog.conf) в конце надо дописать такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;*.*  @@logstash.autosys.tk:1514&lt;/pre&gt;

&lt;p&gt;
Тут *.* - это значит все записи, @@ - это TCP (@ - UDP), дальше хост &lt;strong&gt;logstash&lt;/strong&gt; и порт.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 rsyslog \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 logstash&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_rsyslog_\u0438_\u0444\u0438\u043b\u044c\u0442\u0440\u0430_logstash&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;4027-5655&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit11&quot; id=&quot;logstash_valuesyaml&quot;&gt;logstash_values.yaml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;---
replicas: 1

# Allows you to add any config files in /usr/share/logstash/config/
# such as logstash.yml and log4j2.properties
logstashConfig:
  logstash.yml: |
    http.host: &amp;quot;0.0.0.0&amp;quot;
    config.reload.automatic: &amp;quot;true&amp;quot;
    xpack.management.enabled: &amp;quot;false&amp;quot;
    
#    key:
#      nestedkey: value
#  log4j2.properties: |
#    key = value

# Allows you to add any pipeline files in /usr/share/logstash/pipeline/
logstashPipeline:
  input_main.conf: |
    input {
      udp {
        port =&amp;gt; 1514
        type =&amp;gt; syslog
      }
      tcp {
        port =&amp;gt; 1514
        type =&amp;gt; syslog
      }
      http {
        port =&amp;gt; 8080
      }
      # kafka {
      #  ## ref: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html
      #   bootstrap_servers =&amp;gt; &amp;quot;kafka-input:9092&amp;quot;
      #   codec =&amp;gt; json { charset =&amp;gt; &amp;quot;UTF-8&amp;quot; }
      #   consumer_threads =&amp;gt; 1
      #   topics =&amp;gt; [&amp;quot;source&amp;quot;]
      #   type =&amp;gt; &amp;quot;example&amp;quot;
      # }
    }
  filter_main.conf: |
    filter {
      if [type] == &amp;quot;syslog&amp;quot; {
       # Uses built-in Grok patterns to parse this standard format
        grok {
          match =&amp;gt; {
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;%{SYSLOGTIMESTAMP:@timestamp}%{SPACE}%{SYSLOGHOST:host}%{SPACE}%{SYSLOGPROG:process}:%{SPACE}%{GREEDYDATA:syslogmessage}&amp;quot;
          }
        }
        # Sets the timestamp of the event to the timestamp of recorded in the log-data
        # By default, logstash sets the timestamp to the time it was ingested.
        #date {
        #  match =&amp;gt; [ &amp;quot;timestamp&amp;quot;, &amp;quot;MMM  d HH:mm:ss&amp;quot;, &amp;quot;MMM dd HH:mm:ss&amp;quot; ]
        #}
        mutate {
          rename =&amp;gt; [&amp;quot;syslogmessage&amp;quot;, &amp;quot;message&amp;quot; ]
        }
      }
    }
  output_main.conf: |
    output {
     # stdout { codec =&amp;gt; rubydebug }
      elasticsearch {
        hosts =&amp;gt; [&amp;quot;${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}&amp;quot;]
        manage_template =&amp;gt; false
        index =&amp;gt; &amp;quot;logs-%{+YYYY.MM.dd}&amp;quot;
     }
     # kafka {
     #   ## ref: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-kafka.html
     #   bootstrap_servers =&amp;gt; &amp;quot;kafka-output:9092&amp;quot;
     #   codec =&amp;gt; json { charset =&amp;gt; &amp;quot;UTF-8&amp;quot; }
     #   compression_type =&amp;gt; &amp;quot;lz4&amp;quot;
     #   topic_id =&amp;gt; &amp;quot;destination&amp;quot;
     # }
    }

# Extra environment variables to append to this nodeGroup
# This will be appended to the current &amp;#039;env:&amp;#039; key. You can use any of the kubernetes env
# syntax here
extraEnvs: 
  - name: &amp;quot;ELASTICSEARCH_HOST&amp;quot;
    value: &amp;quot;elasticsearch-master.elasticsearch.svc.cluster.local&amp;quot;
  - name: &amp;quot;ELASTICSEARCH_PORT&amp;quot;
    value: &amp;quot;9200&amp;quot;
#  - name: MY_ENVIRONMENT_VAR
#    value: the_value_goes_here

# A list of secrets and their paths to mount inside the pod
secretMounts: []

image: &amp;quot;docker.elastic.co/logstash/logstash&amp;quot;
imageTag: &amp;quot;7.5.1&amp;quot;
imagePullPolicy: &amp;quot;IfNotPresent&amp;quot;
imagePullSecrets: []

podAnnotations: {}

# additionals labels
labels:
  app: logstash
  
logstashJavaOpts: &amp;quot;-Xmx1g -Xms1g&amp;quot;

resources:
  requests:
    cpu: &amp;quot;100m&amp;quot;
    memory: &amp;quot;1536Mi&amp;quot;
  limits:
    cpu: &amp;quot;1000m&amp;quot;
    memory: &amp;quot;1536Mi&amp;quot;

volumeClaimTemplate:
  accessModes: [ &amp;quot;ReadWriteOnce&amp;quot; ]
  resources:
    requests:
      storage: 1Gi

rbac:
  create: false
  serviceAccountName: &amp;quot;&amp;quot;

podSecurityPolicy:
  create: false
  name: &amp;quot;&amp;quot;
  spec:
    privileged: true
    fsGroup:
      rule: RunAsAny
    runAsUser:
      rule: RunAsAny
    seLinux:
      rule: RunAsAny
    supplementalGroups:
      rule: RunAsAny
    volumes:
      - secret
      - configMap
      - persistentVolumeClaim

persistence:
  enabled: false
  annotations: {}

extraVolumes: &amp;quot;&amp;quot;
  # - name: extras
  #   emptyDir: {}

extraVolumeMounts: &amp;quot;&amp;quot;
  # - name: extras
  #   mountPath: /usr/share/extras
  #   readOnly: true

extraContainers: &amp;quot;&amp;quot;
  # - name: do-something
  #   image: busybox
  #   command: [&amp;#039;do&amp;#039;, &amp;#039;something&amp;#039;]

extraInitContainers: &amp;quot;&amp;quot;
  # - name: do-something
  #   image: busybox
  #   command: [&amp;#039;do&amp;#039;, &amp;#039;something&amp;#039;]

# This is the PriorityClass settings as defined in
# https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: &amp;quot;&amp;quot;

# By default this will make sure two pods don&amp;#039;t end up on the same node
# Changing this to a region would allow you to spread pods across regions
antiAffinityTopologyKey: &amp;quot;kubernetes.io/hostname&amp;quot;

# Hard means that by default pods will only be scheduled if there are enough nodes for them
# and that they will never end up on the same node. Setting this to soft will do this &amp;quot;best effort&amp;quot;
antiAffinity: &amp;quot;hard&amp;quot;

# This is the node affinity settings as defined in
# https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity-beta-feature
nodeAffinity: {}

# The default is to deploy all pods serially. By setting this to parallel all pods are started at
# the same time when bootstrapping the cluster
podManagementPolicy: &amp;quot;Parallel&amp;quot;

httpPort: 9600

updateStrategy: RollingUpdate

# This is the max unavailable setting for the pod disruption budget
# The default value of 1 will make sure that kubernetes won&amp;#039;t allow more than 1
# of your pods to be unavailable during maintenance
maxUnavailable: 1

podSecurityContext:
  fsGroup: 1000
  runAsUser: 1000

securityContext:
  capabilities:
    drop:
    - ALL
  # readOnlyRootFilesystem: true
  runAsNonRoot: true
  runAsUser: 1000

# How long to wait for logstash to stop gracefully
terminationGracePeriod: 120

livenessProbe:
  httpGet:
    path: /
    port: http
  initialDelaySeconds: 300
  periodSeconds: 10
  timeoutSeconds: 5
  failureThreshold: 3
  successThreshold: 1

readinessProbe:
  httpGet:
    path: /
    port: http
  initialDelaySeconds: 60
  periodSeconds: 10
  timeoutSeconds: 5
  failureThreshold: 3
  successThreshold: 3

## Use an alternate scheduler.
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
##
schedulerName: &amp;quot;&amp;quot;

nodeSelector: {}
tolerations: []

nameOverride: &amp;quot;&amp;quot;
fullnameOverride: &amp;quot;&amp;quot;

lifecycle: {}
  # preStop:
  #   exec:
  #     command: [&amp;quot;/bin/sh&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;echo Hello from the postStart handler &amp;gt; /usr/share/message&amp;quot;]
  # postStart:
  #   exec:
  #     command: [&amp;quot;/bin/sh&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;echo Hello from the postStart handler &amp;gt; /usr/share/message&amp;quot;]

service:
  annotations: {}
  type: LoadBalancer
  ports:
  - name: beats
    port: 5044
    protocol: TCP
    targetPort: 5044
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080
  - name: syslog
    port: 1514
    targetPort: 1514&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;logstash_values.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;logstash_valuesyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;5656-12031&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit12&quot; id=&quot;create_persistent_volume_for_logstash&quot;&gt;Create Persistent Volume for LogStash&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;sudo mkdir /kubernetes_volumes/logstash-data
sudo chmod a+rw -R /kubernetes_volumes/logstash-data&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: PersistentVolume
metadata:
   name: logstash-data
   namespace: elasticsearch
   labels:
     app: logstash
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: &amp;quot;/kubernetes_volumes/logstash-data&amp;quot;
    type: Directory
  persistentVolumeReclaimPolicy: Retain&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Create Persistent Volume for LogStash&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;create_persistent_volume_for_logstash&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;12032-12513&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit13&quot; id=&quot;проверка_работоспособности_elk&quot;&gt;Проверка работоспособности ELK&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Теперь можно проверить, что всё вместе работает. &lt;br/&gt;

Можно отправить сообщение в &lt;strong&gt;logstash&lt;/strong&gt; на &lt;strong&gt;input http&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -XPUT &amp;#039;http://~~~logstash~IP~~~:8080/test/test1/1&amp;#039; -d &amp;#039;hello&amp;#039;&lt;/pre&gt;

&lt;p&gt;
В ответ должно быть &lt;strong&gt;ok&lt;/strong&gt;. &lt;br/&gt;

А в &lt;strong&gt;kibana&lt;/strong&gt; можно нажать &lt;strong&gt;Discovery&lt;/strong&gt;, увидеть там новый индекс.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 ELK&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430_\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438_elk&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;12514-12980&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit14&quot; id=&quot;filebeat&quot;&gt;Filebeat&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Для работы с файлами логов потребуется дополнительный сервис &lt;strong&gt;Filebeat&lt;/strong&gt;, который будет читать логи из файла и отправлять в &lt;strong&gt;Logstash&lt;/strong&gt;. Пример конфигурации:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;filebeat.inputs:
- type: log
  enabled: true
  paths:
      - /var/log/nginx/access.log
  fields:
    type: nginx
  fields_under_root: true
  scan_frequency: 5s

output.logstash:
  hosts: [&amp;quot;logstash:5000&amp;quot;]&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Filebeat&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;filebeat&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;12981-13497&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit15&quot; id=&quot;filebeat_autodiscover&quot;&gt;Filebeat Autodiscover&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
У Filebeat есть отличный функцмонал - Autodiscover. Он позволяет по заданным правилам автоматически обнаруживать файлы с логами. Прмиер конфига для K8S:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;filebeat:
  autodiscover:
    providers:
    - node: ${HOSTNAME}
      templates:
      - config:
        - containers:
            ids:
            - ${data.kubernetes.container.id}
          paths:
          - /var/log/containers/*-${data.kubernetes.container.id}.log
          type: container
      type: kubernetes
output:
  elasticsearch:
    hosts:
    - https://elk-es-http.elk.svc:9200
    password: 7hhjEqA6oH3049D1oTT9s4O2
    ssl:
      certificate_authorities:
      - /mnt/elastic-internal/elasticsearch-certs/ca.crt
    username: elk-elk-beat-user
processors:
- drop_fields:
    fields:
    - log
    - container.id
    - container.runtime
    - container.image.name
    - input.type
    - tags
    - kubernetes.labels
    - kubernetes.pod.uid
    - kubernetes.replicaset.name
    - kubernetes.node
    - kubernetes.namespace_labels
    - kubernetes.namespace_uid
    - ecs.version
    - agent
    ignore_missing: false
setup:
  dashboards:
    enabled: true
  kibana:
    host: http://elk-kb-http.elk.svc:5601
    password: 6l2IPFK8mBR88w6ek49ePI71
    username: elk-elk-beat-kb-user&lt;/pre&gt;

&lt;p&gt;
Этот конфиг сформирован оператором &lt;strong&gt;ECK 1.8&lt;/strong&gt;. &lt;br/&gt;

Что делать, если &lt;strong&gt;Filebeat Kubernetes Autodiscover&lt;/strong&gt; не работает без видимых причин?? В моем случае - ошибок не было, но и логи контейнеров &lt;strong&gt;Filebeat Autodiscover&lt;/strong&gt; не обнаруживал. Лог выглядел так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;...
2021-10-24T11:11:24.565Z        INFO    [autodiscover.pod]      kubernetes/util.go:122  kubernetes: Using node MCS-K8S-201 provided in the config
2021-10-24T11:11:24.565Z        DEBUG   [autodiscover.pod]      kubernetes/pod.go:80    Initializing a new Kubernetes watcher using node: MCS-K8S-201
2021-10-24T11:11:24.587Z        DEBUG   [autodiscover]  autodiscover/autodiscover.go:90 Configured autodiscover provider: kubernetes
2021-10-24T11:11:24.587Z        INFO    [autodiscover]  autodiscover/autodiscover.go:113        Starting autodiscover manager
2021-10-24T11:11:24.687Z        DEBUG   [kubernetes]    kubernetes/watcher.go:184       cache sync done
2021-10-24T11:11:24.788Z        DEBUG   [kubernetes]    kubernetes/watcher.go:184       cache sync done
2021-10-24T11:11:24.889Z        DEBUG   [kubernetes]    kubernetes/watcher.go:184       cache sync done
...&lt;/pre&gt;

&lt;p&gt;
Однако, при нормальной работе - должно быть что-то такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;...
2021-10-24T11:49:30.633Z        INFO    [autodiscover.pod]      kubernetes/util.go:122  kubernetes: Using node mcs-k8s-203 provided in the config
2021-10-24T11:49:30.642Z        INFO    [autodiscover]  autodiscover/autodiscover.go:113        Starting autodiscover manager
2021-10-24T11:49:31.048Z        INFO    [input] log/input.go:164        Configured paths: [/var/log/containers/*-70600db8d4371ebdacc300edd825c030e6698a6b75467ea8b280c7aef1faa366.log]  {&amp;quot;input_id&amp;quot;: &amp;quot;f60ce837-5828-4125-afe5-5a40d70fc613&amp;quot;}
2021-10-24T11:49:31.048Z        INFO    [input] log/input.go:164        Configured paths: [/var/log/containers/*-70600db8d4371ebdacc300edd825c030e6698a6b75467ea8b280c7aef1faa366.log]  {&amp;quot;input_id&amp;quot;: &amp;quot;ba234dcb-e0bd-4395-baa4-ba47dd1f1f6d&amp;quot;}
...&lt;/pre&gt;

&lt;p&gt;
Я потратил довольно много времени на выяснение причин такого поведения. дело оказалось в том, что HOSTNAME на ноде задан большими буквами (MCS-K8S-203), а в кластере нода имеет имя маленькими буквами (mcs-k8s-203). В итоге - всё вылечилось, когда я на хостах кластера выполнил:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  sudo hostnamectl set-hostname `echo &amp;quot;$HOSTNAME&amp;quot; | tr &amp;#039;[:upper:]&amp;#039; &amp;#039;[:lower:]&amp;#039;`&lt;/pre&gt;

&lt;p&gt;
то есть переменовал хосты  кластера в нижнем регистре. 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Filebeat Autodiscover&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;filebeat_autodiscover&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:15,&amp;quot;range&amp;quot;:&amp;quot;13498-17714&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit16&quot; id=&quot;настройка_безопасности&quot;&gt;Настройка безопасности&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
По-умолчанию стек &lt;strong&gt;ELK&lt;/strong&gt; не обеспечивает безопасного доступа к данным и компоненты никак не аутентифицируются. То есть записать и читать данные может кто угодно. &lt;br/&gt;

Базовая бесплатная лицензия не позволяет аутентифицировать пользователей из каталогов &lt;strong&gt;LDAP&lt;/strong&gt;, поэтому нужно либо платить, либо настраивать аутентификацют сторонними методами. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:16,&amp;quot;range&amp;quot;:&amp;quot;17715-18398&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit17&quot; id=&quot;ldap-аутентификация_в_kibana_и_rbac_для_elasticsearch_помощью_oidc_и_proxy&quot;&gt;LDAP-аутентификация в Kibana и RBAC для elasticsearch помощью oidc и proxy&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Общая идея такая:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Пользователи имеют доступ только к &lt;strong&gt;kibana&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Перед &lt;strong&gt;Kibana&lt;/strong&gt; работает &lt;strong&gt;oidc-proxy&lt;/strong&gt; (&lt;strong&gt;openresty&lt;/strong&gt;), который осуществляет аутентификацию пользователя с помощью &lt;strong&gt;keycloak&lt;/strong&gt;. Этот прокси добавляет в запросы, поступающие в &lt;strong&gt;kibana&lt;/strong&gt;, заголовки, содержащие информацию о пользователе (в частности - список групп).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Kibana&lt;/strong&gt; добавляет выбранные заголовки в запросы к &lt;strong&gt;elasticsearch&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Запросы от &lt;strong&gt;kibana&lt;/strong&gt; к &lt;strong&gt;elasticsearch&lt;/strong&gt; идет через второй &lt;strong&gt;proxy&lt;/strong&gt;, который смотрит состав групп из заголовков и проксирует запросы только с разрешенными для данной группы &lt;abbr title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/abbr&gt; и HTTP-методами.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Используемые компоненты:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Active Directory&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Keycloak&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;openresty&lt;/strong&gt; + &lt;strong&gt;lua-resty-openidc&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Вот ссылочки, которые помогали мне в настройке &lt;strong&gt;oidc-proxy&lt;/strong&gt; для LDAP-аутентификации :
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://mapr.com/blog/how-secure-elasticsearch-and-kibana/&quot; class=&quot;urlextern&quot; title=&quot;https://mapr.com/blog/how-secure-elasticsearch-and-kibana/&quot; rel=&quot;ugc nofollow&quot;&gt;https://mapr.com/blog/how-secure-elasticsearch-and-kibana/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://github.com/zmartzone/lua-resty-openidc&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/zmartzone/lua-resty-openidc&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/zmartzone/lua-resty-openidc&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://developers.redhat.com/blog/2018/10/08/configuring-nginx-keycloak-oauth-oidc/&quot; class=&quot;urlextern&quot; title=&quot;https://developers.redhat.com/blog/2018/10/08/configuring-nginx-keycloak-oauth-oidc/&quot; rel=&quot;ugc nofollow&quot;&gt;https://developers.redhat.com/blog/2018/10/08/configuring-nginx-keycloak-oauth-oidc/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://daenney.github.io/2019/10/05/beyondcorp-at-home-authn-authz-openresty&quot; class=&quot;urlextern&quot; title=&quot;https://daenney.github.io/2019/10/05/beyondcorp-at-home-authn-authz-openresty&quot; rel=&quot;ugc nofollow&quot;&gt;https://daenney.github.io/2019/10/05/beyondcorp-at-home-authn-authz-openresty&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://discuss.elastic.co/t/kibana-default-basic-auth/86045&quot; class=&quot;urlextern&quot; title=&quot;https://discuss.elastic.co/t/kibana-default-basic-auth/86045&quot; rel=&quot;ugc nofollow&quot;&gt;https://discuss.elastic.co/t/kibana-default-basic-auth/86045&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
Я изобретаю свои велосипеды, а вот есть некторые готовые компоненты:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 образ &lt;strong&gt;openresty&lt;/strong&gt; с &lt;strong&gt;oidc&lt;/strong&gt; - &lt;a href=&quot;https://github.com/flix-tech/openresty-oidc-proxy&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/flix-tech/openresty-oidc-proxy&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/flix-tech/openresty-oidc-proxy&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 вот решение для аутентификации &lt;strong&gt;elasticsearch&lt;/strong&gt; в &lt;strong&gt;LDAP&lt;/strong&gt; - &lt;a href=&quot;https://mapr.com/blog/how-secure-elasticsearch-and-kibana/&quot; class=&quot;urlextern&quot; title=&quot;https://mapr.com/blog/how-secure-elasticsearch-and-kibana/&quot; rel=&quot;ugc nofollow&quot;&gt;https://mapr.com/blog/how-secure-elasticsearch-and-kibana/&lt;/a&gt; - без использования &lt;strong&gt;OIDC&lt;/strong&gt;, но там описана авторизация доступа к определенным &lt;strong&gt;&lt;abbr title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/abbr&gt;&lt;/strong&gt; и &lt;strong&gt;HTTP&lt;/strong&gt;-методам с помощью &lt;strong&gt;lua&lt;/strong&gt;, на основе имени пользователя (&lt;strong&gt;HTTP&lt;/strong&gt;-заголовка) из реквеста. Я настраиваю более универсальный (но и более ресурсоемкий по причине перебора всех доступных групп) вариант с группами. Более экономичным может быть вариант с ролями. Для реализации ролей - их нужно настроить на &lt;strong&gt;keycloak&lt;/strong&gt;. Роль, в сущности, это та же группа, однако, есть нюансы. &lt;strong&gt;LDAP&lt;/strong&gt;-роль в &lt;strong&gt;keycloak&lt;/strong&gt; дается на основании членства в группе. Роль может быть единственной (остальные, если есть, отбрасываются). Группы ролей, должны быть расположены в определенной &lt;strong&gt;OU&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;LDAP-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432 Kibana \u0438 RBAC \u0434\u043b\u044f elasticsearch \u043f\u043e\u043c\u043e\u0449\u044c\u044e oidc \u0438 proxy&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;ldap-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f_\u0432_kibana_\u0438_rbac_\u0434\u043b\u044f_elasticsearch_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_oidc_\u0438_proxy&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:17,&amp;quot;range&amp;quot;:&amp;quot;18399-21641&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit18&quot; id=&quot;keycloak&quot;&gt;Keycloak&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Развернут с помощью &lt;strong&gt;helm&lt;/strong&gt; - &lt;a href=&quot;https://wiki.autosys.tk/devops/deploy_keycloak_using_helm&quot; class=&quot;wikilink1&quot; title=&quot;devops:deploy_keycloak_using_helm&quot; data-wiki-id=&quot;devops:deploy_keycloak_using_helm&quot;&gt;deploy_keycloak_using_helm&lt;/a&gt;. &lt;br/&gt;

&lt;strong&gt;REALM&lt;/strong&gt; настроен так: &lt;a href=&quot;https://habr.com/ru/post/441112/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/post/441112/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/post/441112/&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Keycloak&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;keycloak&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:18,&amp;quot;range&amp;quot;:&amp;quot;21642-21820&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit19&quot; id=&quot;собираем_образ_openresty_с_модулем_lua-resty-openidc&quot;&gt;Собираем образ openresty с модулем lua-resty-openidc&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Dockerfile&lt;/strong&gt; на базе &lt;a href=&quot;https://github.com/Revomatico/docker-openresty-oidc/blob/master/Dockerfile&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/Revomatico/docker-openresty-oidc/blob/master/Dockerfile&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/Revomatico/docker-openresty-oidc/blob/master/Dockerfile&lt;/a&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;FROM alpine:3.10
MAINTAINER Mikhail Usik &amp;lt;mike@autosys.tk&amp;gt;

ENV LUA_SUFFIX=jit-2.1.0-beta3 \
    LUAJIT_VERSION=2.1 \
    NGINX_PREFIX=/opt/openresty/nginx \
    OPENRESTY_PREFIX=/opt/openresty \
    OPENRESTY_SRC_SHA256=bf92af41d3ad22880047a8b283fc213d59c7c1b83f8dae82e50d14b64d73ac38 \
    OPENRESTY_VERSION=1.15.8.2 \
    LUAROCKS_VERSION=3.1.3 \
    LUAROCKS_SRC_SHA256=c573435f495aac159e34eaa0a3847172a2298eb6295fcdc35d565f9f9b990513 \
    LUA_RESTY_OPENIDC_VERSION=1.7.2-1 \
    VAR_PREFIX=/var/nginx

RUN set -ex \
  &amp;amp;&amp;amp; apk --no-cache add \
    libgcc \
    libpcrecpp \
    libpcre16 \
    libpcre32 \
    libssl1.1 \
    libstdc++ \
    openssl \
    pcre \
    curl \
    unzip \
    git \
    dnsmasq \
    ca-certificates \
  &amp;amp;&amp;amp; apk --no-cache add --virtual .build-dependencies \
    make \
    musl-dev \
    gcc \
    ncurses-dev \
    openssl-dev \
    pcre-dev \
    perl \
    readline-dev \
    zlib-dev \
    libc-dev \
  \
## OpenResty
  &amp;amp;&amp;amp; curl -fsSL https://github.com/openresty/openresty/releases/download/v${OPENRESTY_VERSION}/openresty-${OPENRESTY_VERSION}.tar.gz -o /tmp/openresty.tar.gz \
  \
  &amp;amp;&amp;amp; cd /tmp \
  &amp;amp;&amp;amp; echo &amp;quot;${OPENRESTY_SRC_SHA256} *openresty.tar.gz&amp;quot; | sha256sum -c - \
  &amp;amp;&amp;amp; tar -xzf openresty.tar.gz \
  \
  &amp;amp;&amp;amp; cd openresty-* \
  &amp;amp;&amp;amp; readonly NPROC=$(grep -c ^processor /proc/cpuinfo 2&amp;gt;/dev/null || 1) \
  &amp;amp;&amp;amp; ./configure \
    --prefix=${OPENRESTY_PREFIX} \
    --http-client-body-temp-path=${VAR_PREFIX}/client_body_temp \
    --http-proxy-temp-path=${VAR_PREFIX}/proxy_temp \
    --http-log-path=${VAR_PREFIX}/access.log \
    --error-log-path=${VAR_PREFIX}/error.log \
    --pid-path=${VAR_PREFIX}/nginx.pid \
    --lock-path=${VAR_PREFIX}/nginx.lock \
    --with-luajit \
    --with-pcre-jit \
    --with-ipv6 \
    --with-http_ssl_module \
    --without-http_ssi_module \
    --with-http_realip_module \
    --without-http_scgi_module \
    --without-http_uwsgi_module \
    --without-http_userid_module \
    -j${NPROC} \
  &amp;amp;&amp;amp; make -j${NPROC} \
  &amp;amp;&amp;amp; make install \
  \
  &amp;amp;&amp;amp; rm -rf /tmp/openresty* \
  \
## LuaRocks
  &amp;amp;&amp;amp; curl -fsSL http://luarocks.github.io/luarocks/releases/luarocks-${LUAROCKS_VERSION}.tar.gz -o /tmp/luarocks.tar.gz \
  \
  &amp;amp;&amp;amp; cd /tmp \
  &amp;amp;&amp;amp; echo &amp;quot;${LUAROCKS_SRC_SHA256} *luarocks.tar.gz&amp;quot; | sha256sum -c - \
  &amp;amp;&amp;amp; tar -xzf luarocks.tar.gz \
  \
  &amp;amp;&amp;amp; cd luarocks-* \
  &amp;amp;&amp;amp; ./configure \
    --prefix=${OPENRESTY_PREFIX}/luajit \
    --lua-suffix=${LUA_SUFFIX} \
    --with-lua=${OPENRESTY_PREFIX}/luajit \
    --with-lua-lib=${OPENRESTY_PREFIX}/luajit/lib \
    --with-lua-include=${OPENRESTY_PREFIX}/luajit/include/luajit-${LUAJIT_VERSION} \
  &amp;amp;&amp;amp; make build \
  &amp;amp;&amp;amp; make install \
  \
  &amp;amp;&amp;amp; rm -rf /tmp/luarocks* \
  &amp;amp;&amp;amp; rm -rf ~/.cache/luarocks \
## Post install
  &amp;amp;&amp;amp; ln -sf ${NGINX_PREFIX}/sbin/nginx /usr/local/bin/nginx \
  &amp;amp;&amp;amp; ln -sf ${NGINX_PREFIX}/sbin/nginx /usr/local/bin/openresty \
  &amp;amp;&amp;amp; ln -sf ${OPENRESTY_PREFIX}/bin/resty /usr/local/bin/resty \
  &amp;amp;&amp;amp; ln -sf ${OPENRESTY_PREFIX}/luajit/bin/luajit-* ${OPENRESTY_PREFIX}/luajit/bin/lua \
  &amp;amp;&amp;amp; ln -sf ${OPENRESTY_PREFIX}/luajit/bin/luajit-* /usr/local/bin/lua  \
  &amp;amp;&amp;amp; ln -sf ${OPENRESTY_PREFIX}/luajit/bin/luarocks /usr/local/bin/luarocks \
  &amp;amp;&amp;amp; ln -sf ${OPENRESTY_PREFIX}/luajit/bin/luarocks-admin /usr/local/bin/luarocks-admin \
  &amp;amp;&amp;amp; echo user=root &amp;gt;&amp;gt; /etc/dnsmasq.conf \
## Install lua-resty-openidc
  &amp;amp;&amp;amp; cd ~/ \
  # Fix for https://github.com/zmartzone/lua-resty-openidc/issues/213#issuecomment-432471572
#  &amp;amp;&amp;amp; luarocks install lua-resty-hmac \
  &amp;amp;&amp;amp; luarocks install lua-resty-openidc ${LUA_RESTY_OPENIDC_VERSION} \
## Install lua-resty-xacml-pep
#  &amp;amp;&amp;amp; curl -fsSL https://raw.githubusercontent.com/zmartzone/lua-resty-xacml-pep/master/lib/resty/xacml_pep.lua -o /opt/openresty/lualib/resty/xacml_pep.lua \
## Cleanup
  &amp;amp;&amp;amp; apk del .build-dependencies 2&amp;gt;/dev/null

WORKDIR $NGINX_PREFIX

CMD dnsmasq; openresty -g &amp;quot;daemon off; error_log /dev/stderr info;&amp;quot;&lt;/pre&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 openresty \u0441 \u043c\u043e\u0434\u0443\u043b\u0435\u043c lua-resty-openidc&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c_\u043e\u0431\u0440\u0430\u0437_openresty_\u0441_\u043c\u043e\u0434\u0443\u043b\u0435\u043c_lua-resty-openidc&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:19,&amp;quot;range&amp;quot;:&amp;quot;21821-25900&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit20&quot; id=&quot;configmap_для_openresty&quot;&gt;ConfigMap для openresty&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Создано по мотивам &lt;a href=&quot;https://developers.redhat.com/blog/2018/10/08/configuring-nginx-keycloak-oauth-oidc/&quot; class=&quot;urlextern&quot; title=&quot;https://developers.redhat.com/blog/2018/10/08/configuring-nginx-keycloak-oauth-oidc/&quot; rel=&quot;ugc nofollow&quot;&gt;https://developers.redhat.com/blog/2018/10/08/configuring-nginx-keycloak-oauth-oidc/&lt;/a&gt; и &lt;a href=&quot;https://daenney.github.io/2019/10/05/beyondcorp-at-home-authn-authz-openresty&quot; class=&quot;urlextern&quot; title=&quot;https://daenney.github.io/2019/10/05/beyondcorp-at-home-authn-authz-openresty&quot; rel=&quot;ugc nofollow&quot;&gt;https://daenney.github.io/2019/10/05/beyondcorp-at-home-authn-authz-openresty&lt;/a&gt; &lt;br/&gt;

&lt;br/&gt;

Описаны два виртуальных сервра (оба - прокси). &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Первый - для аутентификации в &lt;strong&gt;kibana&lt;/strong&gt; (аутентифицирует пользователя с помощью &lt;strong&gt;OIDC&lt;/strong&gt;). 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Второй - для авторизации запросов от &lt;strong&gt;kibana&lt;/strong&gt; в &lt;strong&gt;elasticsearch&lt;/strong&gt;. Проверяется содержимое заголовков (список групп пользователя) в запросах от &lt;strong&gt;Kibana&lt;/strong&gt; и разрешения определенных методов при доступе к &lt;strong&gt;elasticsearch&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;kind: ConfigMap
apiVersion: v1
metadata:
  name: openresty-oidc-config
  namespace: elasticsearch
data:
  nginx.conf: |
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        gzip  on;
        ##
        # LUA options
        ##
        lua_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
        lua_package_path &amp;#039;~/lua/?.lua;;&amp;#039;;
        resolver 192.168.77.1;
        # cache for discovery metadata documents
        lua_shared_dict discovery 1m;
        # cache for JWKs
        lua_shared_dict jwks 1m;
        # allow the server to close connection on non responding client, this will free up memory
        reset_timedout_connection on;
    
        server {
        listen 80 default_server;
        server_name kibana.autosys.tk;
        #access_log /dev/stdout;
        #error_log /dev/stdout;
        access_by_lua &amp;#039;
          local opts = {
            redirect_uri = &amp;quot;/redirect_uri&amp;quot;,
            accept_none_alg = true,
            discovery = &amp;quot;https://sso.autosys.tk/auth/realms/Autosys/.well-known/openid-configuration&amp;quot;,
            client_id = &amp;quot;kibana&amp;quot;,
            client_secret = &amp;quot;af903747-905c-4342-a62c-83033d3289cc&amp;quot;,
            redirect_uri_scheme = &amp;quot;https&amp;quot;,
            logout_path = &amp;quot;/logout&amp;quot;,
            redirect_after_logout_uri = &amp;quot;https://sso.autosys.tk/auth/realms/Autosys/protocol/openid-connect/logout?redirect_uri=https://kibana.autosys.tk/&amp;quot;,
            redirect_after_logout_with_id_token_hint = false,
            session_contents = {id_token=true}
          }
          -- call introspect for OAuth 2.0 Bearer Access Token validation
          local res, err = require(&amp;quot;resty.openidc&amp;quot;).authenticate(opts)
          if err then
            ngx.status = 403
            ngx.say(err)
            ngx.exit(ngx.HTTP_FORBIDDEN)
          end
          -- set data from the ID token as HTTP Request headers
          ngx.req.set_header(&amp;quot;X-Auth-Username&amp;quot;, res.id_token.preferred_username)
          ngx.req.set_header(&amp;quot;X-Auth-Groups&amp;quot;, res.id_token.groups)
          -- ngx.req.set_header(&amp;quot;X-Auth-Audience&amp;quot;, res.id_token.aud)
          -- ngx.req.set_header(&amp;quot;X-Auth-Email&amp;quot;, res.id_token.email)
          -- ngx.req.set_header(&amp;quot;X-Auth-ExpiresIn&amp;quot;, res.id_token.exp)
          -- ngx.req.set_header(&amp;quot;X-Auth-Roles&amp;quot;, res.id_token.roles)
          -- ngx.req.set_header(&amp;quot;X-Auth-Name&amp;quot;, res.id_token.name)
          -- ngx.req.set_header(&amp;quot;X-Auth-Subject&amp;quot;, res.id_token.sub)
          -- ngx.req.set_header(&amp;quot;X-Auth-Userid&amp;quot;, res.id_token.preferred_username)
          -- ngx.req.set_header(&amp;quot;X-Auth-Locale&amp;quot;, res.id_token.locale)
          -- Output headers to nginx err log
          --ngx.log(ngx.ERR, &amp;quot;Got header X-Auth-Userid: &amp;quot;..res.id_token.preferred_username..&amp;quot;;&amp;quot;)
        &amp;#039;;
        expires           0;
        add_header        Cache-Control private;
        location / {
          proxy_connect_timeout 5s;
          proxy_pass http://kibana-kibana.elasticsearch.svc.cluster.local:5601;
        }
      }
      server {
        listen 9200;
        access_log /dev/stdout;
        error_log /dev/stdout;
        access_by_lua &amp;#039;
        local restrictions = {
          elasticsearch_ro = {
            [&amp;quot;^/$&amp;quot;]                             = { &amp;quot;GET&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_mget&amp;quot;]           = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_doc&amp;quot;]            = { &amp;quot;GET&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_search&amp;quot;]         = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_msearch&amp;quot;]        = { &amp;quot;GET&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_validate/query&amp;quot;] = { &amp;quot;GET&amp;quot; },
            [&amp;quot;/_aliases&amp;quot;]                       = { &amp;quot;GET&amp;quot; },
            [&amp;quot;/_cluster.*&amp;quot;]                     = { &amp;quot;GET&amp;quot; }
          },
          elasticsearch_rw = {
            [&amp;quot;^/$&amp;quot;]                             = { &amp;quot;GET&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_search&amp;quot;]         = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_msearch&amp;quot;]        = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;^/?[^/]*/traffic*&amp;quot;]               = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;, &amp;quot;PUT&amp;quot;, &amp;quot;DELETE&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_validate/query&amp;quot;] = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;/_aliases&amp;quot;]                       = { &amp;quot;GET&amp;quot; },
            [&amp;quot;/_cluster.*&amp;quot;]                     = { &amp;quot;GET&amp;quot; }
          },
          elasticsearch_full = {
            [&amp;quot;^/?[^/]*/?[^/]*/_bulk&amp;quot;]          = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/_refresh&amp;quot;]       = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/?[^/]*/_create&amp;quot;] = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/?[^/]*/_update&amp;quot;] = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*/?.*&amp;quot;]            = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;, &amp;quot;PUT&amp;quot;, &amp;quot;DELETE&amp;quot; },
            [&amp;quot;^/?[^/]*/?[^/]*$&amp;quot;]               = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;, &amp;quot;PUT&amp;quot;, &amp;quot;DELETE&amp;quot; },
            [&amp;quot;/_aliases&amp;quot;]                      = { &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot; }
          }
        }
        local groups = ngx.req.get_headers()[&amp;quot;x-auth-groups&amp;quot;]
        local authenticated_group = nil
        local ngx_re = require &amp;quot;ngx.re&amp;quot;
        if ( type(groups) == &amp;quot;string&amp;quot; and string.len(groups) &amp;gt;= 1 ) then
          groups = string.lower(groups)
          ngx.log(ngx.ERR, &amp;quot;Got header X-Auth-Groups: &amp;quot;..groups..&amp;quot;;&amp;quot;)
          local groups_table = ngx_re.split(groups, &amp;quot;, &amp;quot;)
          local groups_number = table.getn(groups_table)
          ngx.log(ngx.ERR, &amp;quot;Groups number : &amp;quot;..groups_number..&amp;quot;;&amp;quot;)
          for i=1,groups_number do
            local group = groups_table[i]:gsub(&amp;quot;/&amp;quot;,&amp;quot;&amp;quot;)
            group = group:gsub(&amp;quot;%s&amp;quot;,&amp;quot;_&amp;quot;)
            ngx.log(ngx.ERR, &amp;quot;Check group: &amp;quot;..group..&amp;quot;;&amp;quot;)
            if (restrictions[group] ~= nil) then
              ngx.log(ngx.ERR, &amp;quot;User belongs to Authenticated Group: &amp;quot;..group..&amp;quot;;&amp;quot;)
              authenticated_group = group
              break
            end
          end
          -- exit 403 when no matching role has been found
          if authenticated_group == nil then
            ngx.header.content_type = &amp;quot;text/plain&amp;quot;
            ngx.log(ngx.ERR, &amp;quot;Unauthenticated request... User - &amp;quot;..ngx.req.get_headers()[&amp;quot;x-auth-username&amp;quot;]..&amp;quot;;&amp;quot;)
            ngx.status = 403
            ngx.say(&amp;quot;403 Forbidden: You don\&amp;#039;t have access to this resource.&amp;quot;)
            return ngx.exit(403)
          end
          
          -- get URL
          local uri = ngx.var.uri
          ngx.log(ngx.DEBUG, uri)
          -- get method
          local method = ngx.req.get_method()
          ngx.log(ngx.DEBUG, method)
          
          local allowed  = false
          
          for path, methods in pairs(restrictions[authenticated_group]) do
          
            -- path matched rules?
            local p = string.match(uri, path)
            
            local m = nil
            
            -- method matched rules?
            for _, _method in pairs(methods) do
              m = m and m or string.match(method, _method)
            end
            
            if p and m then
              allowed = true
              ngx.log(ngx.NOTICE, method..&amp;quot; &amp;quot;..uri..&amp;quot; matched: &amp;quot;..tostring(m)..&amp;quot; &amp;quot;..tostring(path)..&amp;quot; for &amp;quot;..authenticated_group)
              break
            end
          end

          if not allowed then
            ngx.header.content_type = &amp;quot;text/plain&amp;quot;
            ngx.log(ngx.WARN, &amp;quot;Group [&amp;quot;..authenticated_group..&amp;quot;] not allowed to access the resource [&amp;quot;..method..&amp;quot; &amp;quot;..uri..&amp;quot;]&amp;quot;)
            ngx.status = 403
            ngx.say(&amp;quot;403 Forbidden: You don\&amp;#039;t have access to this resource.&amp;quot;)
            return ngx.exit(403)
          end
        end
        &amp;#039;;
        location / {
          proxy_connect_timeout 15s;
          proxy_pass http://elasticsearch-master.elasticsearch.svc.cluster.local:9200;
        }
      }
    }&lt;/pre&gt;

&lt;p&gt;
В конфигурации первого прокси аутентификацию выполняет блок &lt;strong&gt;access_by_lua&lt;/strong&gt;. В &lt;strong&gt;local opts&lt;/strong&gt; прописано следующее:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;redirect_uri&lt;/strong&gt; - всегда будет &lt;strong&gt;“/redirect_uri”&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;discovery&lt;/strong&gt; - ссылка с конфигурацией реалма. Обычно нужно заменить адрес хоста &lt;strong&gt;keycloak&lt;/strong&gt; и имя реалма.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;client_id&lt;/strong&gt; - задается в &lt;strong&gt;keycloak&lt;/strong&gt; при создании клиента.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;client_secret&lt;/strong&gt; - генерируется в &lt;strong&gt;keycloak&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;redirect_uri_scheme&lt;/strong&gt; - http или https 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;logout_path&lt;/strong&gt; - всегда будет &lt;strong&gt;“/logout”&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В конфигурации второго прокси авторизацию также выполняет блок &lt;strong&gt;access_by_lua&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В блоке &lt;strong&gt;local restrictions = {&lt;/strong&gt; содержится список таблиц (с именами групп), а в таблицах - список &lt;strong&gt;uri&lt;/strong&gt; и методов разрешенных членам группы для этих &lt;strong&gt;uri&lt;/strong&gt;. Имена групп в &lt;strong&gt;LDAP&lt;/strong&gt;  могут включать в себя пробелы и большие буквы (при проверке имена групп из &lt;strong&gt;LDAP&lt;/strong&gt; будут приведены к нижнему регистру, а пробелы будут преобразованы в символ подчеркивания).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В данном алгоритме группы, которые нашлись в заголовке &lt;strong&gt;x-auth-groups&lt;/strong&gt; проверяются по порядку. Если нашлось совпадение имени группы из заголовка &lt;strong&gt;x-auth-groups&lt;/strong&gt; с именем таблицы из &lt;strong&gt;local restrictions&lt;/strong&gt;, то пользователю будут даны права в соотвествии с первой найденной группой.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;ConfigMap \u0434\u043b\u044f openresty&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;configmap_\u0434\u043b\u044f_openresty&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:20,&amp;quot;range&amp;quot;:&amp;quot;25901-36389&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit21&quot; id=&quot;openresty-oidc_deploymentyaml&quot;&gt;openresty-oidc_deployment.yaml&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: apps/v1
kind: Deployment
metadata:    
  name: openresty-oidc
  namespace: elasticsearch
spec:
  replicas: 1
  selector:  
    matchLabels:
      app: openresty-oidc
  template:  
    metadata:
      labels:
        app: openresty-oidc
    spec:
      imagePullSecrets:
      - name: autosys-regcred    
      containers:    
        - name: openresty-oidc
          image: registry.autosys.tk/openresty-oidc
          volumeMounts:
            - name: openresty-oidc-config-volume
              mountPath: /opt/openresty/nginx/conf/nginx.conf
              subPath: nginx.conf
      volumes:
        - name: openresty-oidc-config-volume
          configMap:
            name: openresty-oidc-config&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;openresty-oidc_deployment.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;openresty-oidc_deploymentyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:11,&amp;quot;secid&amp;quot;:21,&amp;quot;range&amp;quot;:&amp;quot;36390-37156&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit22&quot; id=&quot;openresty-oidc-service&quot;&gt;openresty-oidc-service&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Service
metadata:
  name: openresty-oidc-http
  namespace: elasticsearch
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  - name: elasticsearch
    port: 9200
    protocol: TCP
    targetPort: 9200
  selector:
    app: openresty-oidc
  sessionAffinity: None
  type: ClusterIP&lt;/pre&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;openresty-oidc-service&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;openresty-oidc-service&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:12,&amp;quot;secid&amp;quot;:22,&amp;quot;range&amp;quot;:&amp;quot;37157-37535&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit23&quot; id=&quot;kibana-valuesyaml&quot;&gt;kibana-values.yaml&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
В конфигурации &lt;strong&gt;kibana&lt;/strong&gt; нужно внести следующие изменения с помощью &lt;strong&gt;helm upgrade&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Включить &lt;strong&gt;elasticsearch.requestHeadersWhitelist&lt;/strong&gt;, чтобы &lt;strong&gt;kibana&lt;/strong&gt; добавляла в свои запросы к &lt;strong&gt;elasticsearch&lt;/strong&gt; заголовки с группами пользователя.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Указать в качестве &lt;strong&gt;elasticsearchHosts&lt;/strong&gt; адрес авторизующего &lt;strong&gt;proxy&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;elasticsearchHosts: &amp;quot;http://openresty-oidc-http.elasticsearch.svc.cluster.local:9200&amp;quot;
kibanaConfig:
  kibana.yml: |
    server.name: kibana
    server.host: &amp;quot;0&amp;quot;
    xpack.monitoring.ui.container.elasticsearch.enabled: true
    elasticsearch.requestHeadersWhitelist:
    - authorization
    - x-auth-groups
    - x-auth-username&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;kibana-values.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;kibana-valuesyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:13,&amp;quot;secid&amp;quot;:23,&amp;quot;range&amp;quot;:&amp;quot;37536-38373&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit24&quot; id=&quot;kibana-ingressyaml&quot;&gt;kibana-ingress.yaml&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
    kubernetes.io/ingress.class: nginx
  name: kibana-ingress
  namespace: elasticsearch
spec:
  rules:
  - host: kibana.autosys.tk
    http:
      paths:
      - backend:
          serviceName: openresty-oidc-http
          servicePort: 80
        path: /
  tls:
  - hosts:
    - kibana.autosys.tk
    secretName: kibana-autosys-tk-tls
&lt;/pre&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;kibana-ingress.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;kibana-ingressyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:14,&amp;quot;secid&amp;quot;:24,&amp;quot;range&amp;quot;:&amp;quot;38374-38878&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit25&quot; id=&quot;rbac_using_oidc_proxy&quot;&gt;RBAC using Oidc proxy&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 С одной стороны - можно продолжать наполнять таблицу привилегий &lt;strong&gt;OIDC&lt;/strong&gt;-proxy. Недостатки - большая и сложная таблица, медленная работа. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 C другой стороны - в коде OIDC-proxy средствами &lt;strong&gt;ES &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt; можно реализовать механизм проверки наличия пользователя в базе &lt;strong&gt;ES&lt;/strong&gt;, создания ее в случае отсутствия, а также назначения ролей встроенных в &lt;strong&gt;ES&lt;/strong&gt;, в соответствии с группами.
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; - &lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html&lt;/a&gt;  &lt;br/&gt;

ROles - &lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-roles.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-roles.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-roles.html&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;table sectionedit26&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; RO &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; RW &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; FULL &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; /_cluster &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; GET PUT POST DELETE &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; /_cat &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; /_nodes &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; GET POST &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; /_remote &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; /_tasks  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; /_ccr  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; * &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col3&quot;&gt; GET &lt;/td&gt;&lt;td class=&quot;col4&quot;&gt; PUT &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;secid&amp;quot;:26,&amp;quot;range&amp;quot;:&amp;quot;39745-40001&amp;quot;} --&gt;
&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;RBAC using Oidc proxy&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;rbac_using_oidc_proxy&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:15,&amp;quot;secid&amp;quot;:25,&amp;quot;range&amp;quot;:&amp;quot;38879-40001&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit27&quot; id=&quot;разные_проблемы&quot;&gt;Разные проблемы&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u043d\u044b\u0435_\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:15,&amp;quot;secid&amp;quot;:27,&amp;quot;range&amp;quot;:&amp;quot;40002-40045&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit28&quot; id=&quot;произвольная_деаутентификация_клиента_openresty_oidc_proxy&quot;&gt;Произвольная деаутентификация клиента openresty oidc proxy&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Меня зачпокала ситуация, когда вроде всё работает, но в любой момент в логе &lt;strong&gt;nginx oidc-proxy&lt;/strong&gt; может появиться ошибка
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;2020/04/07 18:46:22 [alert] 12#0: *12 ignoring stale global SSL error (SSL: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt) while SSL handshaking to upstream, client: 10.244.0.71, server: kibanadomain.local, request: &amp;quot;GET /built_assets/css/plugins/ml/application/index.light.css HTTP/1.1&amp;quot;, upstream: &amp;quot;https://10.104.117.4:5601/built_assets/css/plugins/ml/application/index.light.css&amp;quot;, host: &amp;quot;kibana.domain.local&amp;quot;, referrer: &amp;quot;https://kibana.domain.local/app/kibana&lt;/pre&gt;

&lt;p&gt;
и дальше &lt;strong&gt;cookie&lt;/strong&gt; сессии сбрасываются, клиент деаутетифицируется и последующие запросы уже идут с кодом 302 и редиректом на &lt;strong&gt;redirect_uri&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u0434\u0435\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 openresty oidc proxy&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f_\u0434\u0435\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f_\u043a\u043b\u0438\u0435\u043d\u0442\u0430_openresty_oidc_proxy&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:15,&amp;quot;secid&amp;quot;:28,&amp;quot;range&amp;quot;:&amp;quot;40046-41095&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit29&quot; id=&quot;причина&quot;&gt;Причина&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Причина и решение описаны тут: &lt;a href=&quot;https://github.com/bungle/lua-resty-session/issues/23&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/bungle/lua-resty-session/issues/23&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/bungle/lua-resty-session/issues/23&lt;/a&gt; &lt;br/&gt;

Судя по всему - причина кроется в механизмах шифрования-расшифровывания. А именно - в сессионном ключе. Если явно не задано значение переменной &lt;strong&gt;$session_secret&lt;/strong&gt;, то каждый &lt;strong&gt;worker&lt;/strong&gt; сгенерирует свой собственный секрет и они не смогут расшифровать данные зашифрованные разными ключами. Поэтому - глюк плавающий. Он повторяется рандомно. &lt;br/&gt;

Решение - либо добавить в секцию &lt;strong&gt;server&lt;/strong&gt; значение &lt;strong&gt;$session_secret&lt;/strong&gt; длинной 32 байта:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;server {
    ...
    set $session_secret T62DGscdGyb4So4tLsXhNIRdlEpt4J2k;&lt;/pre&gt;

&lt;p&gt;
либо использовать единственный &lt;strong&gt;worker&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0438\u0447\u0438\u043d\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0438\u0447\u0438\u043d\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:16,&amp;quot;secid&amp;quot;:29,&amp;quot;range&amp;quot;:&amp;quot;41096-42130&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit30&quot; id=&quot;elasticsearch_operator_и_oss_docker_images&quot;&gt;Elasticsearch operator и OSS docker images&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
При попытке использовать имиджи &lt;strong&gt;Elasticsearch &lt;abbr title=&quot;Open Source Software&quot;&gt;OSS&lt;/abbr&gt; 7.6.2&lt;/strong&gt;, для разворачивания кластера средствами &lt;strong&gt;elasticsearch operator&lt;/strong&gt; все поды всегда уходили в бесконечный &lt;strong&gt;InitError&lt;/strong&gt;.&lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Elasticsearch operator \u0438 OSS docker images&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;elasticsearch_operator_\u0438_oss_docker_images&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:17,&amp;quot;secid&amp;quot;:30,&amp;quot;range&amp;quot;:&amp;quot;42131-42463&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit31&quot; id=&quot;диагностика&quot;&gt;Диагностика&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Смотрим describe любого пода и видим:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Events:
  Type     Reason     Age                From                       Message
  ----     ------     ----               ----                       -------
  Normal   Scheduled  44s                default-scheduler          Successfully assigned default/elasticsearch-es-master-2 to kub-dev-master01
  Normal   Pulled     22s (x3 over 41s)  kubelet, kub-dev-master01  Container image &amp;quot;registry.rdleas.ru:5000/elasticsearch/elasticsearch-oss:7.6.2&amp;quot; already present on machine
  Normal   Created    21s (x3 over 40s)  kubelet, kub-dev-master01  Created container elastic-internal-init-filesystem
  Normal   Started    21s (x3 over 40s)  kubelet, kub-dev-master01  Started container elastic-internal-init-filesystem
  Warning  BackOff    7s (x5 over 36s)   kubelet, kub-dev-master01  Back-off restarting failed container&lt;/pre&gt;

&lt;p&gt;
Смотрим логи контейнера &lt;strong&gt;elastic-internal-init-filesystem&lt;/strong&gt; и видим:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ kubectl logs elasticsearch-es-master-0 -c elastic-internal-init-filesystem
unsupported_distribution&lt;/pre&gt;

&lt;p&gt;
Легкое гугление приводит нас сюда: &lt;a href=&quot;https://github.com/sebgl/cloud-on-k8s/commit/c1a88cee00bc583dc28217747d4a39160904f013&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/sebgl/cloud-on-k8s/commit/c1a88cee00bc583dc28217747d4a39160904f013&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/sebgl/cloud-on-k8s/commit/c1a88cee00bc583dc28217747d4a39160904f013&lt;/a&gt; , где написано, что &lt;abbr title=&quot;Open Source Software&quot;&gt;OSS&lt;/abbr&gt; имиджи не поддерживаются оператором: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;The operator only works with the official ES distributions to enable the security
available with the basic (free), gold and platinum licenses in order to ensure that
all clusters launched are secured by default.

A check is done in the prepare-fs script by looking at the existence of the
Elastic License. If not present, the script exit with a custom exit code.

Then the ES reconcilation loop sends an event of type warning if it detects that
a prepare-fs init container terminated with this exit code.&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:17,&amp;quot;secid&amp;quot;:31,&amp;quot;range&amp;quot;:&amp;quot;42464-44378&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit32&quot; id=&quot;ошибки_ssl&quot;&gt;Ошибки SSL&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Кластер развернут с помощью &lt;strong&gt;elasticsearch operator 1.0.1&lt;/strong&gt;.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ kubectl exec -it elasticsearch-es-master-0 -- bin/elasticsearch-setup-passwords interactive
19:52:29.467 [main] WARN  org.elasticsearch.common.ssl.DiagnosticTrustManager - failed to establish trust with server at [10.244.0.210]; the server provided a certificate with subject name [CN=elasticsearch-es-http.default.es.local,OU=elasticsearch] and fingerprint [74c38cee7c20e080613da16e86c9d5570d238717]; the certificate has subject alternative names [DNS:elasticsearch-es-http.default.es.local,DNS:elasticsearch-es-http,DNS:elasticsearch-es-http.default.svc,DNS:elasticsearch-es-http.default]; the certificate is issued by [CN=elasticsearch-http,OU=elasticsearch]; the certificate is signed by (subject [CN=elasticsearch-http,OU=elasticsearch] fingerprint [5d410bb81a7da9148cf71156ee07e36fa85ee5ef] {trusted issuer}) which is self-issued; the [CN=elasticsearch-http,OU=elasticsearch] certificate is trusted in this ssl context ([xpack.security.http.ssl])
java.security.cert.CertificateException: No subject alternative names matching IP address 10.244.0.210 found
....
....
....
SSL connection to https://10.244.0.210:9200/_security/_authenticate?pretty failed: No subject alternative names matching IP address 10.244.0.210 found
Please check the elasticsearch SSL settings under xpack.security.http.ssl.

ERROR: Failed to establish SSL connection to elasticsearch at https://10.244.0.210:9200/_security/_authenticate?pretty. 
command terminated with exit code 78&lt;/pre&gt;

&lt;p&gt;
В кластере единственный master. При попытке подключения утилита обращается по IP-адресу, а не по имени. Видно, что сертификат у сервера есть. &lt;br/&gt;

Как написано тут: &lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/master/trb-security-setup.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.elastic.co/guide/en/elasticsearch/reference/master/trb-security-setup.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.elastic.co/guide/en/elasticsearch/reference/master/trb-security-setup.html&lt;/a&gt; достаточно привести конфиг к такому виду:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  xpack.security.enabled: true
  xpack.security.http.ssl.verification_mode: certificate&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0448\u0438\u0431\u043a\u0438 SSL&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0448\u0438\u0431\u043a\u0438_ssl&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:20,&amp;quot;secid&amp;quot;:32,&amp;quot;range&amp;quot;:&amp;quot;44379-46521&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit33&quot; id=&quot;ошибка_при_начальной_смене_паролей_binelasticsearch-setup-passwords&quot;&gt;Ошибка при начальной смене паролей bin/elasticsearch-setup-passwords&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
При выполнении команды &lt;strong&gt;bin/elasticsearch-setup-passwords&lt;/strong&gt; появляется ошибка : 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ kubectl exec -it elasticsearch-es-master-0 -- bin/elasticsearch-setup-passwords auto
Failed to authenticate user &amp;#039;elastic&amp;#039; against https://10.244.0.219:9200/_security/_authenticate?pretty
Possible causes include:
 * The password for the &amp;#039;elastic&amp;#039; user has already been changed on this cluster
 * Your elasticsearch node is running against a different keystore
   This tool used the keystore at /usr/share/elasticsearch/config/elasticsearch.keystore&lt;/pre&gt;

&lt;p&gt;
Это значит, что пароли встроенных учеток уже заданы &lt;strong&gt;elasticsearch operator&lt;/strong&gt; в процессе установки &lt;strong&gt;elasticsearch&lt;/strong&gt;, они хранятся в секретах &lt;strong&gt;elasticsearch-es-internal-users&lt;/strong&gt; и &lt;strong&gt;elasticsearch-es-elastic-user&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get secrets elasticsearch-es-internal-users -o=jsonpath=&amp;#039;{.data.elastic-internal}&amp;#039; | base64 --decode&lt;/pre&gt;

&lt;p&gt;
и
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get secret elasticsearch-es-elastic-user -o=jsonpath=&amp;#039;{.data.elastic}&amp;#039; | base64 --decode&lt;/pre&gt;

&lt;p&gt;
Если на перед создание экземпляра кластера &lt;strong&gt;elasticsearch&lt;/strong&gt; создать секреты &lt;strong&gt;elasticsearch-es-internal-users&lt;/strong&gt; и &lt;strong&gt;elasticsearch-es-elastic-user&lt;/strong&gt;, то встроенным учетным записям будут назначены указанные там пароли. Это написано тут (там же написано как заскриптовать смену пароля): &lt;a href=&quot;https://github.com/elastic/cloud-on-k8s/issues/967&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/elastic/cloud-on-k8s/issues/967&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/elastic/cloud-on-k8s/issues/967&lt;/a&gt; &lt;br/&gt;

А вообще - в ближайшее время &lt;strong&gt;elasticsearch operator&lt;/strong&gt; позволит задавать пароли для встроенных учеток прямо в конфиге: &lt;a href=&quot;https://github.com/elastic/cloud-on-k8s/pull/2682&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/elastic/cloud-on-k8s/pull/2682&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/elastic/cloud-on-k8s/pull/2682&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043c\u0435\u043d\u0435 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 bin\/elasticsearch-setup-passwords&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0448\u0438\u0431\u043a\u0430_\u043f\u0440\u0438_\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439_\u0441\u043c\u0435\u043d\u0435_\u043f\u0430\u0440\u043e\u043b\u0435\u0439_binelasticsearch-setup-passwords&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:22,&amp;quot;secid&amp;quot;:33,&amp;quot;range&amp;quot;:&amp;quot;46522-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Sun, 24 Oct 2021 12:06:27 +0000</pubDate>
        </item>
        <item>
            <title>deploy_jupyterhub_on_kubernetes</title>
            <link>https://wiki.autosys.tk/devops/deploy_jupyterhub_on_kubernetes</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;jupyterhub&quot;&gt;JupyterHub&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;strong&gt;&lt;a href=&quot;https://jupyterhub.readthedocs.io/en/stable/&quot; class=&quot;urlextern&quot; title=&quot;https://jupyterhub.readthedocs.io/en/stable/&quot; rel=&quot;ugc nofollow&quot;&gt;JupyterHub&lt;/a&gt;&lt;/strong&gt; - решение для многопользовательских сред.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;HTTP-proxy&lt;/strong&gt;, осуществляющий маршрутизацию запросов пользователей&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;strong&gt;HUB&lt;/strong&gt;, который осуществляет аутентификацию пользователей (с помощью &lt;strong&gt;Authenticator&lt;/strong&gt;) и управление индивидуальными &lt;strong&gt;jupyter-notebook&lt;/strong&gt;  (с помощью &lt;strong&gt;Spawners&lt;/strong&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
При входе пользователя для него создается Pod (с именем &lt;strong&gt;jupyter-username&lt;/strong&gt;), в котором и будет работать пользователь. Для этого &lt;strong&gt;pod&lt;/strong&gt;&amp;#039;а создается &lt;strong&gt;PersistentVolumeClaim&lt;/strong&gt;, соотвественно нужен &lt;strong&gt;PersistentVolume&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://z2jh.jupyter.org/en/latest/setup-jupyterhub/setup-jupyterhub.html&quot; class=&quot;urlextern&quot; title=&quot;https://z2jh.jupyter.org/en/latest/setup-jupyterhub/setup-jupyterhub.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://z2jh.jupyter.org/en/latest/setup-jupyterhub/setup-jupyterhub.html&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://hub.docker.com/r/jupyterhub/k8s-hub/tags&quot; class=&quot;urlextern&quot; title=&quot;https://hub.docker.com/r/jupyterhub/k8s-hub/tags&quot; rel=&quot;ugc nofollow&quot;&gt;https://hub.docker.com/r/jupyterhub/k8s-hub/tags&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://zero-to-jupyterhub.readthedocs.io/en/latest/administrator/authentication.html&quot; class=&quot;urlextern&quot; title=&quot;https://zero-to-jupyterhub.readthedocs.io/en/latest/administrator/authentication.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://zero-to-jupyterhub.readthedocs.io/en/latest/administrator/authentication.html&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://ipython-books.github.io/36-introducing-jupyterlab/&quot; class=&quot;urlextern&quot; title=&quot;https://ipython-books.github.io/36-introducing-jupyterlab/&quot; rel=&quot;ugc nofollow&quot;&gt;https://ipython-books.github.io/36-introducing-jupyterlab/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns jhub
helm repo add jupyterhub https://jupyterhub.github.io/helm-chart/
helm repo update
echo -e &amp;quot;proxy:\n  secretToken: &amp;#039;`openssl rand -hex 32`&amp;#039;&amp;quot; &amp;gt; ./jhub_config.yaml
helm upgrade --install jhub jupyterhub/jupyterhub --namespace jhub --version=0.9.0-beta.2 --values jhub_config.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;JupyterHub&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;jupyterhub&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-1474&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;jhub_pvsyaml&quot;&gt;jhub_pvs.yaml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: PersistentVolume
metadata:
  name: hub-db-dir-pv
  namespace: jhub
  labels:
    app: jupyterhub
    component: hub
spec:
  capacity:
    storage: 20Gi
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: &amp;quot;/kubernetes_volumes/jhub/hub-db-dir-pv&amp;quot;
    type: Directory
  persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jhub-admin-pv
  namespace: jhub 
  labels:
    app: jupyterhub
    component: singleuser-server
spec:
  capacity:
    storage: 20Gi
  accessModes:   
  - ReadWriteOnce
  hostPath:
    path: &amp;quot;/kubernetes_volumes/jhub/jhub-admin-pv&amp;quot;
    type: Directory
  persistentVolumeReclaimPolicy: Retain&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;jhub_pvs.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;jhub_pvsyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1475-2197&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;ошибки_текущей_стабильной_версии_082&quot;&gt;Ошибки текущей стабильной версии 0.8.2&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;Exception in Future &amp;lt;Task finished coro=&amp;lt;BaseHandler.spawn_single_user.&amp;lt;locals&amp;gt;.finish_user_spawn() done, defined at /usr/local/lib/python3.6/dist-packages/jupyterhub/handlers/base.py:629&amp;gt; exception=TypeError(&amp;quot;&amp;#039;&amp;lt;&amp;#039; not supported between instances of &amp;#039;datetime.datetime&amp;#039; and &amp;#039;NoneType&amp;#039;&amp;quot;,)&amp;gt; after timeout&lt;/pre&gt;

&lt;p&gt;
Такая ошибка возникает, если запускать версию &lt;strong&gt;0.8.2&lt;/strong&gt; в кластере &lt;strong&gt;kubernetes&lt;/strong&gt; версии выше, чем &lt;strong&gt;0.14&lt;/strong&gt;. Решение для версии 0.8.2 можно найти тут: &lt;a href=&quot;https://github.com/jupyterhub/kubespawner/issues/354&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/jupyterhub/kubespawner/issues/354&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/jupyterhub/kubespawner/issues/354&lt;/a&gt; &lt;br/&gt;

Либо можно обновить jhub до более новой версии :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt; helm upgrade jhub jupyterhub/jupyterhub --namespace jhub --version=0.9.0-beta.2&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0448\u0438\u0431\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 0.8.2&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0448\u0438\u0431\u043a\u0438_\u0442\u0435\u043a\u0443\u0449\u0435\u0439_\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439_\u0432\u0435\u0440\u0441\u0438\u0438_082&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;2198-3046&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;jupyter_notebook_on_kubernetes&quot;&gt;Jupyter Notebook on kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Как выбрать подходящий docker-image: &lt;a href=&quot;https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html&quot; class=&quot;urlextern&quot; title=&quot;https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html&lt;/a&gt; &lt;br/&gt;

Я буду разворачивать &lt;strong&gt;jupyter/scipy-notebook&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Jupyter Notebook on kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;jupyter_notebook_on_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;3047-3294&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;jupyter_deploymentyaml&quot;&gt;jupyter_deployment.yaml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kind: Namespace
apiVersion: v1
metadata:
  name: jupyter-notebook
  labels:
    name: jupyter-notebook
---
apiVersion: apps/v1
kind: Deployment
metadata:    
  name: jupyter-notebook
  namespace: jupyter-notebook
spec:
  replicas: 1
  selector:  
    matchLabels:
      app: jupyter-notebook
  template:  
    metadata:
      labels:
        app: jupyter-notebook
    spec:
      containers:    
        - name: jupyter-notebook
          image: jupyter/scipy-notebook:latest
---
apiVersion: v1
kind: Service
metadata:
  name: jupyter-notebook-http
  namespace: jupyter-notebook
spec:
  selector: 
    app: jupyter-notebook
  type: ClusterIP
  ports:
  - name: http
    port: 8888
    protocol: TCP
    targetPort: 8888
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt
    nginx.ingress.kubernetes.io/proxy-body-size: &amp;quot;0&amp;quot;
    nginx.ingress.kubernetes.io/proxy-read-timeout: &amp;quot;3600&amp;quot;
    nginx.ingress.kubernetes.io/proxy-send-timeout: &amp;quot;3600&amp;quot;
  name: jupyter-notebook-ingress
  namespace: jupyter-notebook
spec:
  rules:
  - host: jpn.autosys.tk
    http:
      paths:
      - backend:
          serviceName: jupyter-notebook-http
          servicePort: 8888
        path: /
  tls:
  - hosts:
    - jpn.autosys.tk
    secretName:  jpn-autosys-tk-tls&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;jupyter_deployment.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;jupyter_deploymentyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3295-4703&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;книжка_по_jupyter_notebook&quot;&gt;Книжка по JuPyter Notebook&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://ipython-books.github.io/&quot; class=&quot;urlextern&quot; title=&quot;https://ipython-books.github.io/&quot; rel=&quot;ugc nofollow&quot;&gt;https://ipython-books.github.io/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://github.com/ipython-books/cookbook-2nd&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/ipython-books/cookbook-2nd&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/ipython-books/cookbook-2nd&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u043d\u0438\u0436\u043a\u0430 \u043f\u043e JuPyter Notebook&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043d\u0438\u0436\u043a\u0430_\u043f\u043e_jupyter_notebook&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;4704-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 17 Jan 2020 07:44:27 +0000</pubDate>
        </item>
        <item>
            <title>deploy_keycloak_using_helm</title>
            <link>https://wiki.autosys.tk/devops/deploy_keycloak_using_helm</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;установка_keycloak_с_помощью_helm-чарта&quot;&gt;Установка keycloak с помощью helm-чарта&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Клонируем репозиторий с чартом:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;mkdir ~/keycloak &amp;amp;&amp;amp; cd ~/keycloak
git clone https://github.com/codecentric/helm-charts.git
echo &amp;#039;&amp;#039; &amp;gt; helm-charts/charts/keycloak/requirements.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 keycloak \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e helm-\u0447\u0430\u0440\u0442\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_keycloak_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_helm-\u0447\u0430\u0440\u0442\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-288&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;cоздание_базы_на_сервере_postgres&quot;&gt;Cоздание базы на сервере postgres&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;user@postgres:~$ sudo su - postgres
postgres@postgres:~$ psql

postgres=# create database keycloak;
CREATE DATABASE
postgres=# create user keycloak with encrypted password &amp;#039;keycloak_db_password&amp;#039;;
CREATE ROLE
postgres=# grant all privileges on database keycloak to keycloak;
GRANT&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;C\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 postgres&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;c\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0431\u0430\u0437\u044b_\u043d\u0430_\u0441\u0435\u0440\u0432\u0435\u0440\u0435_postgres&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;289-648&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;создание_неймспейса_и_секретов_паролей_и_сертов&quot;&gt;Создание неймспейса и секретов (паролей и сертов)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Создаем неймспейс
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns keycloak&lt;/pre&gt;

&lt;p&gt;
Создаем секреты с дефолтным паролем админской учетки &lt;strong&gt;keycloak&lt;/strong&gt; и паролем пользователя базы данных:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create secret generic keycloak-default-admin-password -n keycloak --from-literal=password=keycloak_console_password 
kubectl create secret generic keycloak-db-password -n keycloak --from-literal=password=keycloak_db_password --from-literal=username=keycloak &lt;/pre&gt;

&lt;p&gt;
Создаем секрет с &lt;strong&gt;ssl&lt;/strong&gt;-сертификатом &lt;strong&gt;web&lt;/strong&gt;-интерфейса:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;openssl pkcs12 -in sso.domain.local.pfx -nocerts -out sso.domain.local.key
openssl rsa -in sso.domain.local.key -out sso.domain.local.key.pem
openssl pkcs12 -in sso.domain.local.pfx -clcerts -nokeys -out sso.domain.local.cert.crt
kubectl create secret generic -n keycloak sso-domain-local --from-file=tls.crt=./sso.domain.local.cert.crt --from-file=tls.key=./sso.domain.local.key.pem&lt;/pre&gt;

&lt;p&gt;
Создаем &lt;strong&gt;ConfigMap&lt;/strong&gt; с корпоративными корневыми сертификатами. Они должны быть в формате &lt;strong&gt;pem&lt;/strong&gt; и оформлены стандартными разделителями - &lt;strong&gt;—–BEGIN CERTIFICATE—–&lt;/strong&gt; и &lt;strong&gt;—–END CERTIFICATE—–&lt;/strong&gt;.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n keycloak create configmap ca-bundle --from-file=./ca.cer&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430 \u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 (\u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u0438 \u0441\u0435\u0440\u0442\u043e\u0432)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430_\u0438_\u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432_\u043f\u0430\u0440\u043e\u043b\u0435\u0439_\u0438_\u0441\u0435\u0440\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;649-2132&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;keycloak_valuesyaml&quot;&gt;keycloak_values.yaml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;keycloak:
  replicas: 1
  image:
    tag: 8.0.2
  existingSecret: &amp;quot;keycloak-default-admin-password&amp;quot;

  extraVolumes: |
    - name: ca-bundle
      configMap:
        name: ca-bundle
  extraVolumeMounts: |
    - name: ca-bundle
      mountPath: /custom_certs/

  extraEnv: |
    - name: X509_CA_BUNDLE
      value: &amp;quot;/custom_certs/ca.cer&amp;quot;
    - name:  PROXY_ADDRESS_FORWARDING
      value: &amp;quot;true&amp;quot;
    - name: JAVA_OPTS
      value: |
        -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dkeycloak.profile.feature.upload_scripts=enabled

  ingress:
    enabled: true
    path: /
    annotations: 
      kubernetes.io/ingress.class: nginx
    hosts:
      - sso.domain.local
    tls:
      - hosts:
        - sso.domain.local
        secretName: sso-domain-local

  persistence:
    deployPostgres: false
    dbVendor: &amp;quot;postgres&amp;quot;
    existingSecret: &amp;quot;keycloak-db-password&amp;quot;
    dbName: keycloak
    dbHost: 10.10.10.10
    dbPort: 5432

test:
  enabled: false&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Созданный &lt;strong&gt;ConfigMap&lt;/strong&gt; с корпоративными корневыми сертификатами монтируется в директорию  &lt;strong&gt;/custom_certs/&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Переменная &lt;strong&gt;X509_CA_BUNDLE&lt;/strong&gt; указывает на путь к файлу с сертификатами и при старте контейнера используется скриптом &lt;strong&gt;/opt/jboss/tools/x509.sh&lt;/strong&gt;, который импортирует сертификаты из файла в &lt;strong&gt;keystore&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Переменная &lt;strong&gt;PROXY_ADDRESS_FORWARDING&lt;/strong&gt; нужна для нормального проксирования заголовков &lt;strong&gt;X-Forwarded-For&lt;/strong&gt;. Если ёе не задать, то при попытке открыть &lt;strong&gt;Keycloak Administration Console&lt;/strong&gt; можно будет увидеть лишь пустую страницу. &lt;br/&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Переменная &lt;strong&gt;JAVA_OPTS&lt;/strong&gt; переопределяется для того, чтобы добавить &lt;strong&gt;-Dkeycloak.profile.feature.upload_scripts=enabled&lt;/strong&gt;. Это нужно для того, чтобы нормально работал импорт ранее забекапленных (экспортированных) реалмов. Без этого параметра, при попытке импорта ранее экспортированного реалма в логах будет ошибка: &lt;pre class=&quot;code&quot;&gt;keycloak Uncaught server error: java.lang.RuntimeException: Script upload is disabled&lt;/pre&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;keycloak_values.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;keycloak_valuesyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2133-4765&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;ошибки_при_обновлении&quot;&gt;Ошибки при обновлении&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
При обновлении с версии &lt;strong&gt;8.0.2&lt;/strong&gt; до версии &lt;strong&gt;9.0.3&lt;/strong&gt; в логах возникла ошибка:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;16:11:15,512 INFO  [org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider] (ServerService Thread Pool -- 68) Updating database. Using changelog META-INF/jpa-changelog-master.xml
16:11:15,595 ERROR [org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider] (ServerService Thread Pool -- 68) Change Set META-INF/jpa-changelog-9.0.1.xml::9.0.1-KEYCLOAK-12579-add-not-null-constraint::keycloak failed.  Error: ERROR: duplicate key value violates unique constraint &amp;quot;sibling_names&amp;quot;
  Detail: Key (realm_id, parent_group, name)=(rdleas,  , 1_SrvDocs_DocumentationAIB_Owner) already exists. [Failed SQL: UPDATE public.KEYCLOAK_GROUP SET PARENT_GROUP = &amp;#039; &amp;#039; WHERE PARENT_GROUP IS NULL]
16:11:15,602 FATAL [org.keycloak.services] (ServerService Thread Pool -- 68) java.lang.RuntimeException: Failed to update database&lt;/pre&gt;

&lt;p&gt;
Судя по всему - в базе две записи о группе &lt;strong&gt;1_SrvDocs_DocumentationAIB_Owner&lt;/strong&gt;. &lt;br/&gt;

Сначала - останавливаем &lt;strong&gt;keycloak&lt;/strong&gt;. для этого редактируем &lt;strong&gt;statefullSet&lt;/strong&gt; и ставим &lt;strong&gt;replicas: 0&lt;/strong&gt; &lt;br/&gt;

Идем на сервер &lt;strong&gt;postgres&lt;/strong&gt;, перевоплощаемся в пользователя &lt;strong&gt;postgres&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo su - postgres&lt;/pre&gt;

&lt;p&gt;
и лечим. Для начала - восстановим базу из бекапа в исходное состояние:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;dropdb keycloak
createdb keycloak
psql -d keycloak -f ./keycloak_10.06.20_15-03.bak&lt;/pre&gt;

&lt;p&gt;
Дальше запускаем &lt;strong&gt;psql&lt;/strong&gt; и смотрим список баз:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;\l&lt;/pre&gt;

&lt;p&gt;
Переключаемся на базу &lt;strong&gt;keycloak&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;\c keycloak&lt;/pre&gt;

&lt;p&gt;
Убеждаемся, что записей о группе две:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;SELECT * FROM public.KEYCLOAK_GROUP WHERE name = &amp;#039;1_SrvDocs_DocumentationAIB_Owner&amp;#039;;&lt;/pre&gt;

&lt;p&gt;
Непонятно, какая из них правильная - удаляем обе:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;DELETE FROM public.KEYCLOAK_GROUP WHERE name = &amp;#039;1_SrvDocs_DocumentationAIB_Owner&amp;#039;;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0448\u0438\u0431\u043a\u0438_\u043f\u0440\u0438_\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;4766-6920&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;приложение_для_тестирования_keycloak_python_flask&quot;&gt;Приложение для тестирования KeyCloak (python Flask)&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Протестировать &lt;strong&gt;keycloak&lt;/strong&gt; и убедиться, что он настроен правильно и работает можно с помощью простых приложений.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f KeyCloak (python Flask)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435_\u0434\u043b\u044f_\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f_keycloak_python_flask&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;6921-7210&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;flask_oidc&quot;&gt;flask_oidc&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://gist.github.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a&quot; class=&quot;urlextern&quot; title=&quot;https://gist.github.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a&quot; rel=&quot;ugc nofollow&quot;&gt;https://gist.github.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a&lt;/a&gt; (&lt;a href=&quot;https://gist.githubusercontent.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a/raw/a72a9462b2bd693913efba86cbc74f87c043121d/app.py&quot; class=&quot;urlextern&quot; title=&quot;https://gist.githubusercontent.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a/raw/a72a9462b2bd693913efba86cbc74f87c043121d/app.py&quot; rel=&quot;ugc nofollow&quot;&gt;https://gist.githubusercontent.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a/raw/a72a9462b2bd693913efba86cbc74f87c043121d/app.py&lt;/a&gt;) &lt;br/&gt;

&lt;a href=&quot;https://gist.githubusercontent.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a/raw/a72a9462b2bd693913efba86cbc74f87c043121d/client_secrets.json&quot; class=&quot;urlextern&quot; title=&quot;https://gist.githubusercontent.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a/raw/a72a9462b2bd693913efba86cbc74f87c043121d/client_secrets.json&quot; rel=&quot;ugc nofollow&quot;&gt;https://gist.githubusercontent.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a/raw/a72a9462b2bd693913efba86cbc74f87c043121d/client_secrets.json&lt;/a&gt;
&lt;br/&gt;

Ставим то что нужно:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo pip3 --trusted-host pypi.org --trusted-host files.pythonhosted.org --proxy=http://127.0.0.1:3130 install flask flask_oidc cherrypy cryptojwt cryptography&amp;gt;=2.8&lt;/pre&gt;

&lt;p&gt;
Тестовое приложение на фреймворке &lt;strong&gt;flask&lt;/strong&gt; - &lt;strong&gt;app.py&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#!/usr/bin/env python3
import json
import logging

from flask import Flask, g
from flask_oidc import OpenIDConnect
import requests

logging.basicConfig(level=logging.DEBUG)

app = Flask(__name__)
app.config.update({
    &amp;#039;SECRET_KEY&amp;#039;: &amp;#039;SomethingNotEntirelySecret&amp;#039;,
    &amp;#039;TESTING&amp;#039;: True,
    &amp;#039;DEBUG&amp;#039;: True,
    &amp;#039;OIDC_CLIENT_SECRETS&amp;#039;: &amp;#039;client_secrets.json&amp;#039;,
    &amp;#039;OIDC_ID_TOKEN_COOKIE_SECURE&amp;#039;: False,
    &amp;#039;OIDC_REQUIRE_VERIFIED_EMAIL&amp;#039;: False,
    &amp;#039;OIDC_USER_INFO_ENABLED&amp;#039;: True,
    &amp;#039;OIDC_OPENID_REALM&amp;#039;: &amp;#039;flask-demo&amp;#039;,
    &amp;#039;OIDC_SCOPES&amp;#039;: [&amp;#039;openid&amp;#039;, &amp;#039;email&amp;#039;, &amp;#039;profile&amp;#039;],
    &amp;#039;OIDC_INTROSPECTION_AUTH_METHOD&amp;#039;: &amp;#039;client_secret_post&amp;#039;
})

oidc = OpenIDConnect(app)

@app.route(&amp;#039;/&amp;#039;)
def hello_world():
    if oidc.user_loggedin:
        return (&amp;#039;Hello, %s, &amp;lt;a href=&amp;quot;/private&amp;quot;&amp;gt;See private&amp;lt;/a&amp;gt; &amp;#039;
                &amp;#039;&amp;lt;a href=&amp;quot;/logout&amp;quot;&amp;gt;Log out&amp;lt;/a&amp;gt;&amp;#039;) % \
            oidc.user_getfield(&amp;#039;preferred_username&amp;#039;)
    else:
        return &amp;#039;Welcome anonymous, &amp;lt;a href=&amp;quot;/private&amp;quot;&amp;gt;Log in&amp;lt;/a&amp;gt;&amp;#039;

@app.route(&amp;#039;/private&amp;#039;)
@oidc.require_login
def hello_me():
    &amp;quot;&amp;quot;&amp;quot;Example for protected endpoint that extracts private information from the OpenID Connect id_token.
       Uses the accompanied access_token to access a backend service.
    &amp;quot;&amp;quot;&amp;quot;

    info = oidc.user_getinfo([&amp;#039;preferred_username&amp;#039;, &amp;#039;email&amp;#039;, &amp;#039;sub&amp;#039;, &amp;#039;groups&amp;#039;])

    username = info.get(&amp;#039;preferred_username&amp;#039;)
    email = info.get(&amp;#039;email&amp;#039;)
    user_id = info.get(&amp;#039;sub&amp;#039;)
    groups = info.get(&amp;#039;groups&amp;#039;)
    greeting = &amp;#039;Greeting!!!&amp;#039;
    &amp;quot;&amp;quot;&amp;quot;if user_id in oidc.credentials_store:
        try:
            from oauth2client.client import OAuth2Credentials
            access_token = OAuth2Credentials.from_json(oidc.credentials_store[user_id]).access_token
            print (&amp;#039;access_token=&amp;lt;%s&amp;gt;&amp;#039; % access_token)
            headers = {&amp;#039;Authorization&amp;#039;: &amp;#039;Bearer %s&amp;#039; % (access_token)}
            # YOLO
            # greeting = requests.get(&amp;#039;http://localhost:8080/greeting&amp;#039;, headers=headers).text
        except:
            print (&amp;quot;Could not access greeting-service&amp;quot;)
            greeting = &amp;quot;Hello %s&amp;quot; % username
&amp;quot;&amp;quot;&amp;quot;
    return (&amp;quot;&amp;quot;&amp;quot; %s &amp;lt;/br&amp;gt;
               Your email is %s &amp;lt;/br&amp;gt;
               Your user_id is %s! &amp;lt;/br&amp;gt;
               Your Groups - %s &amp;lt;/br&amp;gt;
               &amp;lt;ul&amp;gt;
                 &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                 &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;https://sso.rdleas.ru/auth/realms/rdleas/account?referrer=flask-app&amp;amp;referrer_uri=http://192.168.104.94:5000/private&amp;amp;&amp;quot;&amp;gt;Account&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;/ul&amp;gt;&amp;quot;&amp;quot;&amp;quot; %
            (greeting, email, user_id, groups))

@app.route(&amp;#039;/api&amp;#039;, methods=[&amp;#039;POST&amp;#039;])
@oidc.accept_token(require_token=True, scopes_required=[&amp;#039;openid&amp;#039;])
def hello_api():
    &amp;quot;&amp;quot;&amp;quot;OAuth 2.0 protected API endpoint accessible via AccessToken&amp;quot;&amp;quot;&amp;quot;

    return json.dumps({&amp;#039;hello&amp;#039;: &amp;#039;Welcome %s&amp;#039; % g.oidc_token_info[&amp;#039;sub&amp;#039;]})

@app.route(&amp;#039;/logout&amp;#039;)
def logout():
    &amp;quot;&amp;quot;&amp;quot;Performs local logout by removing the session cookie.&amp;quot;&amp;quot;&amp;quot;

    oidc.logout()
    return &amp;#039;Hi, you have been logged out! &amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Return&amp;lt;/a&amp;gt;&amp;#039;

if __name__ == &amp;#039;__main__&amp;#039;:
     app.run(host= &amp;#039;0.0.0.0&amp;#039;)
#    app.run()&lt;/pre&gt;

&lt;p&gt;
И конфигурационный файл для него - &lt;strong&gt;client_secrets.json&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;{
    &amp;quot;web&amp;quot;: {
        &amp;quot;issuer&amp;quot;: &amp;quot;https://sso.rdleas.ru/auth/realms/rdleas&amp;quot;,
        &amp;quot;auth_uri&amp;quot;: &amp;quot;https://sso.rdleas.ru/auth/realms/rdleas/protocol/openid-connect/auth&amp;quot;,
        &amp;quot;client_id&amp;quot;: &amp;quot;test&amp;quot;,
        &amp;quot;client_secret&amp;quot;: &amp;quot;32e8263a-9edc-4159-902a-e23c22606b1d&amp;quot;,
        &amp;quot;redirect_uris&amp;quot;: [
            &amp;quot;http://192.168.104.94:5000/*&amp;quot;
        ],
        &amp;quot;userinfo_uri&amp;quot;: &amp;quot;https://sso.rdleas.ru/auth/realms/rdleas/protocol/openid-connect/userinfo&amp;quot;,
        &amp;quot;token_uri&amp;quot;: &amp;quot;https://sso.rdleas.ru/auth/realms/rdleas/protocol/openid-connect/token&amp;quot;,
        &amp;quot;token_introspection_uri&amp;quot;: &amp;quot;https://sso.rdleas.ru/auth/realms/rdleas/protocol/openid-connect/token/introspect&amp;quot;
    }
}&lt;/pre&gt;

&lt;p&gt;
Запускаем так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;./app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;flask_oidc&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;flask_oidc&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;7211-11721&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit8&quot; id=&quot;jwtconnect-python-oidcrp&quot;&gt;JWTConnect-Python-OidcRP&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Вот еще один ваиант тестового приложения. Но его запуск я не осилил. 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone https://github.com/openid/JWTConnect-Python-OidcRP.git
cd ./JWTConnect-Python-OidcRP/chrp
cp ./example_conf.py ./conf.py
./make_opbyuid_html.py conf &amp;gt; html/opbyuid.html
sudo pip3 --trusted-host pypi.org --trusted-host files.pythonhosted.org --proxy=http://127.0.0.1:3130 install cherrypy cryptojwt cryptography&amp;gt;=2.8  &lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;JWTConnect-Python-OidcRP&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;jwtconnect-python-oidcrp&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;11722-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 10 Jun 2020 18:59:20 +0000</pubDate>
        </item>
        <item>
            <title>deploy_nexus_on_kubernetes</title>
            <link>https://wiki.autosys.tk/devops/deploy_nexus_on_kubernetes</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;задача&quot;&gt;Задача&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Нужно развернуть &lt;strong&gt;Nexus Repository 3&lt;/strong&gt; внутри кластера &lt;strong&gt;Kubernetes&lt;/strong&gt;. &lt;br/&gt;

В кластере настроен &lt;strong&gt;LoadBalancer&lt;/strong&gt; и &lt;strong&gt;CertManager&lt;/strong&gt;. &lt;br/&gt;

Образ Docker есть на &lt;strong&gt;hub.docker.com&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-264&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;nexus_namespace&quot;&gt;Nexus Namespace&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns nexus&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Nexus Namespace&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nexus_namespace&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;265-321&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;nexus_storageclass_persistentvolumeclaim_persistentvolume&quot;&gt;Nexus StorageClass PersistentVolumeClaim PersistentVolume&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Для работы &lt;strong&gt;Nexus&lt;/strong&gt; нужна директория. где он будет хранить артефакты. Для этого создаим &lt;strong&gt;StorageClass&lt;/strong&gt;, &lt;strong&gt;PersistentVolumeСlaim&lt;/strong&gt; и сам &lt;strong&gt;PersistentVolume&lt;/strong&gt;:  
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nexus-storage-class
  namespace: nexus
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nexus-data-pv-claim
  namespace: nexus
spec:
  storageClassName: nexus-storage-class
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  selector:
    matchLabels:
      app: nexus-server
---
apiVersion: v1
kind: PersistentVolume
metadata:
   name: nexus-data-pv
   namespace: nexus
   labels:
     app: nexus-server
spec:
  capacity:
    storage: 20Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: nexus-storage-class
  hostPath:
    path: &amp;quot;/kubernetes_volumes/nexus-data&amp;quot;
    type: Directory
  persistentVolumeReclaimPolicy: Retain&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Nexus StorageClass PersistentVolumeClaim PersistentVolume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nexus_storageclass_persistentvolumeclaim_persistentvolume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;322-1488&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;nexus_deployment&quot;&gt;Nexus deployment&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: apps/v1
kind: Deployment
metadata:    
  name: nexus
  namespace: nexus
spec:
  replicas: 1
  selector:  
    matchLabels:
      app: nexus-server
  template:  
    metadata:
      labels:
        app: nexus-server
    spec:
      containers:    
        - name: nexus
          image: sonatype/nexus3:latest
          resources:
            limits:
              memory: &amp;quot;4Gi&amp;quot;
              cpu: &amp;quot;1000m&amp;quot;
            requests:
              memory: &amp;quot;1Gi&amp;quot;
              cpu: &amp;quot;500m&amp;quot;
          ports:
            - containerPort: 8081
          volumeMounts:
            - name: nexus-data
              mountPath: /nexus-data
      volumes:
      - name: nexus-data
        persistentVolumeClaim:
          claimName: nexus-data-pv-claim&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Nexus deployment&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nexus_deployment&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1489-2281&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;nexus_service_and_ingress&quot;&gt;Nexus Service and Ingress&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Service
metadata:
  name: nexus-svc
  namespace: nexus
  annotations:
      prometheus.io/scrape: &amp;#039;true&amp;#039;
      prometheus.io/path:   /
      prometheus.io/port:   &amp;#039;8081&amp;#039;
spec:
  selector: 
    app: nexus-server
  type: ClusterIP
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8081
  - name: docker-registry
    port: 5000
    protocol: TCP
    targetPort: 5000
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt
    nginx.ingress.kubernetes.io/proxy-body-size: &amp;quot;0&amp;quot;
    nginx.ingress.kubernetes.io/proxy-read-timeout: &amp;quot;3600&amp;quot;
    nginx.ingress.kubernetes.io/proxy-send-timeout: &amp;quot;3600&amp;quot;
    nginx.ingress.kubernetes.io/client-max-body-size: &amp;quot;4096m&amp;quot;
  name: nexus-ingress
  namespace: nexus
spec:
  rules:
  - host: nexus.domain.com
    http:
      paths:
      - backend:
          serviceName: nexus-svc
          servicePort: 80
        path: /
  tls:
  - hosts:
    - nexus.domain.com
    secretName:  nexus-domain-com-tls
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt
    nginx.ingress.kubernetes.io/proxy-body-size: &amp;quot;0&amp;quot;
    nginx.ingress.kubernetes.io/proxy-read-timeout: &amp;quot;3600&amp;quot;
    nginx.ingress.kubernetes.io/proxy-send-timeout: &amp;quot;3600&amp;quot;
    nginx.ingress.kubernetes.io/client-max-body-size: &amp;quot;4096m&amp;quot;
  name: nexus-docker-ingress
  namespace: nexus
spec:
  rules:
  - host: registry.autosys.tk
    http:
      paths:
      - backend:
          serviceName: nexus-svc
          servicePort: 5000
        path: /
  tls:
  - hosts:
    - registry.autosys.tk
    secretName:  registry-autosys-tk-tls&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Nexus Service and Ingress&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;nexus_service_and_ingress&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2282-4101&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;дефолтный_пароль_admin&quot;&gt;Дефолтный пароль admin&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Администативная учетка - &lt;strong&gt;admin&lt;/strong&gt;. &lt;br/&gt;

Пароль по-умолчанию от учетки &lt;strong&gt;admin&lt;/strong&gt; генерируется во время deplyment&amp;#039;а и хранится в корневой папке &lt;strong&gt;PersistentVolume&lt;/strong&gt; - в файле &lt;strong&gt;admin.password&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c admin&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439_\u043f\u0430\u0440\u043e\u043b\u044c_admin&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;4102-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 20 Mar 2020 13:59:34 +0000</pubDate>
        </item>
        <item>
            <title>deploy_prometheus_on_kubernetes_using_prometheus-operator</title>
            <link>https://wiki.autosys.tk/devops/deploy_prometheus_on_kubernetes_using_prometheus-operator</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;installing&quot;&gt;Installing&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns monitoring
helm install --name prometheus-operator --namespace monitoring stable/prometheus-operator&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Installing&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;installing&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-159&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;deleting&quot;&gt;Deleting&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;helm del --purge prometheus-operator
kubectl delete ns monitoring
kubectl delete crd alertmanagers.monitoring.coreos.com podmonitors.monitoring.coreos.com prometheuses.monitoring.coreos.com prometheusrules.monitoring.coreos.com servicemonitors.monitoring.coreos.com
kubectl delete service -n kube-system prometheus-prometheus-oper-kubelet&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Deleting&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;deleting&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;160-536&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;valuesyaml&quot;&gt;values.yaml&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/helm/charts/blob/master/stable/prometheus-operator/values.yaml&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/helm/charts/blob/master/stable/prometheus-operator/values.yaml&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/helm/charts/blob/master/stable/prometheus-operator/values.yaml&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;values.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;valuesyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;537-645&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;openid_для_входа_в_grafana&quot;&gt;OpenID для входа в grafana&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://steemit.com/grafana/@timoschuetz/setting-up-grafana-oauth2-in-kubernetes&quot; class=&quot;urlextern&quot; title=&quot;https://steemit.com/grafana/@timoschuetz/setting-up-grafana-oauth2-in-kubernetes&quot; rel=&quot;ugc nofollow&quot;&gt;https://steemit.com/grafana/@timoschuetz/setting-up-grafana-oauth2-in-kubernetes&lt;/a&gt; &lt;br/&gt;

Вот пример настроек &lt;strong&gt;grafana&lt;/strong&gt; для авторизации пользователей из &lt;strong&gt;Active Directory&lt;/strong&gt;, которые аутентифицируются на &lt;strong&gt;Keycloak&lt;/strong&gt;. Тут важно обратить внимание на то, что роли пользователей задаются в соответствии с группами, в которые входит пользователь (параметр &lt;strong&gt;role_attribute_path&lt;/strong&gt;), а имена групп должны быть со слешем в начале: &lt;strong&gt;/Grafana_Editor&lt;/strong&gt; (это видно в логах).
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  grafana.ini:
    paths:
      data: /var/lib/grafana/data
      logs: /var/log/grafana
      plugins: /var/lib/grafana/plugins
      provisioning: /etc/grafana/provisioning
    analytics:
      check_for_updates: true
    log:
      mode: console
      level: debug
    grafana_net:
      url: https://grafana.net
    server:
      root_url: &amp;quot;https://grafana.domain.local&amp;quot;
    auth.basic:
      enabled: false
      oauth_auto_login: true
      disable_login_form: true
    auth.generic_oauth:
      enabled: true
      tls_skip_verify_insecure: true
      name: keycloak
      allow_sign_up: true
      client_id: grafana
      client_secret: 12345678-123345678-12345678
      scopes: groups profile email
      #https://grafana.com/docs/grafana/latest/auth/generic-oauth/#jmespath-examples
      role_attribute_path: contains(groups[*], &amp;#039;/Grafana_Admin&amp;#039;) &amp;amp;&amp;amp; &amp;#039;Admin&amp;#039; || contains(groups[*], &amp;#039;/Grafana_Editor&amp;#039;) &amp;amp;&amp;amp; &amp;#039;Editor&amp;#039; || &amp;#039;Viewer&amp;#039;
      auth_url: https://sso.domain.local/auth/realms/ad_realm/protocol/openid-connect/auth
      token_url: https://sso.domain.local/auth/realms/ad_realm/protocol/openid-connect/token
      api_url: https://sso.domain.local/auth/realms/ad_realm/protocol/openid-connect/userinfo
      signout_redirect_url: https://sso.domain.local/auth/realms/ad_realm/protocol/openid-connect/logout?redirect_uri=https://grafana.domain.local/login
&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;OpenID \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 grafana&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;openid_\u0434\u043b\u044f_\u0432\u0445\u043e\u0434\u0430_\u0432_grafana&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;646-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 17 Sep 2020 06:54:39 +0000</pubDate>
        </item>
        <item>
            <title>deploy_rsyslog_on_kubernetes</title>
            <link>https://wiki.autosys.tk/devops/deploy_rsyslog_on_kubernetes</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://github.com/rsyslog/rsyslog-docker/tree/master/appliance/alpine&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/rsyslog/rsyslog-docker/tree/master/appliance/alpine&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/rsyslog/rsyslog-docker/tree/master/appliance/alpine&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kind: Namespace
apiVersion: v1
metadata:
  name: rsyslog
  labels:
    name: rsyslog
---
apiVersion: apps/v1
kind: Deployment
metadata:    
  name: rsyslog
  namespace: rsyslog
spec:
  replicas: 1
  selector:  
    matchLabels:
      app: rsyslog
  template:  
    metadata:
      labels:
        app: rsyslog
    spec:
      containers:    
        - name: rsyslog
          image: rsyslog/syslog_appliance_alpine:latest
          
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: rsyslog-config
  namespace: rsyslog
data:
  nginx.conf: |

---
apiVersion: v1
kind: Service
metadata:
  name: rsyslog-tcp
  namespace: rsyslog
spec:
  selector: 
    app: rsyslog
  type: ClusterIP
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 10 Jan 2020 10:30:52 +0000</pubDate>
        </item>
        <item>
            <title>dns_hints</title>
            <link>https://wiki.autosys.tk/devops/dns_hints</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;dns_lookup_в_чистом_debian&quot;&gt;DNS Lookup в чистом Debian&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Мне нужно в чистом контейнере Haproxy на базе Debian Bullseye выполнить запрос к &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; и убедиться что имя резолвится. Оказалочь, что там есть perl и это можно сделать во такой строкой в shell:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;perl -MSocket -le&amp;#039;my $ip = gethostbyname(&amp;quot;ya.ru&amp;quot;); if(defined $ip){exit 0}else{exit 1}&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 22 Aug 2022 09:57:43 +0000</pubDate>
        </item>
        <item>
            <title>docker</title>
            <link>https://wiki.autosys.tk/devops/docker</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;скачать_обновить_все_docker_images&quot;&gt;Скачать(обновить) все docker images&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker images |grep -v REPOSITORY|awk &amp;#039;{print $1}&amp;#039;|xargs -L1 docker pull&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043a\u0430\u0447\u0430\u0442\u044c(\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c) \u0432\u0441\u0435 docker images&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043a\u0430\u0447\u0430\u0442\u044c_\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c_\u0432\u0441\u0435_docker_images&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-146&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;удалить_ненужные_docker_images&quot;&gt;Удалить ненужные docker images&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
В данном случае - удаляю &lt;strong&gt;amazon/opendistro-for-elasticsearch&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;docker images | grep &amp;#039;amazon/opendistro-for-elasticsearch&amp;#039; | awk &amp;#039;{print $3}&amp;#039; | xargs -L1 docker rmi&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 docker images&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0434\u0430\u043b\u0438\u0442\u044c_\u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435_docker_images&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;147-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 06 Dec 2019 20:27:43 +0000</pubDate>
        </item>
        <item>
            <title>docker_registry_auth_using_curl</title>
            <link>https://wiki.autosys.tk/devops/docker_registry_auth_using_curl</link>
            <description>&lt;pre class=&quot;code&quot;&gt;DOCKER_KEY=$(cat ~/.docker/config.json | jq &amp;#039;.auths[&amp;quot;https://index.docker.io/v1/&amp;quot;].auth&amp;#039;)

TOKEN=$(curl -X GET https://auth.docker.io/token?service=registry.docker.io&amp;amp;scope=repository:${REPO}:pull -H &amp;quot;Authorization: Basic ${DOCKER_KEY}&amp;quot;) | jq -r .token

curl -s -X GET https://registry.hub.docker.com/v2/repositories/${REPO}/tags/ -H &amp;quot;Authorization: Bearer ${TOKEN}&amp;quot;&lt;/pre&gt;

&lt;p&gt;
для GCP:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#!/usr/bin/env bash

GCP_PROJECT_ID=...
MY_IMAGE=...

USERNAME=_json_key
PASSWORD=$(cat keyfile.json)

TOKEN=$(echo &amp;quot;$USERNAME:$PASSWORD&amp;quot; | base64)

RESPONSE=$(curl --header &amp;quot;Authorization: Basic $TOKEN&amp;quot; &amp;quot;https://gcr.io/v2/token?service=gcr.io&amp;amp;scope=registry:$GCP_PROJECT_ID/$MY_IMAGE:*&amp;quot;)

REGISTRY_TOKEN=$(echo $RESPONSE | jq -r &amp;#039;.token&amp;#039;)

echo &amp;quot;Registry token: $REGISTRY_TOKEN&amp;quot;
curl --header &amp;quot;Authorization: Bearer $REGISTRY_TOKEN&amp;quot; &amp;quot;https://gcr.io/v2/$GCP_PROJECT_ID/$MY_IMAGE/manifests/latest&amp;quot;
echo&lt;/pre&gt;

&lt;p&gt;
Для Yandex Cloud:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 28 Apr 2022 06:08:01 +0000</pubDate>
        </item>
        <item>
            <title>fast_helm_carts</title>
            <link>https://wiki.autosys.tk/devops/fast_helm_carts</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://github.com/k8s-at-home/library-charts/&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/k8s-at-home/library-charts/&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/k8s-at-home/library-charts/&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v2
description: Function library for k8s-at-home charts
home: https://github.com/k8s-at-home/library-charts/tree/main/stable/common&lt;/pre&gt;

&lt;p&gt;
Собственно библиотека - &lt;a href=&quot;https://github.com/bjw-s/helm-charts/tree/main/charts/library/common&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/bjw-s/helm-charts/tree/main/charts/library/common&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/bjw-s/helm-charts/tree/main/charts/library/common&lt;/a&gt;
Пример чарта (фактически темплейт) - &lt;a href=&quot;https://github.com/bjw-s/helm-charts/tree/main/charts/other/app-template&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/bjw-s/helm-charts/tree/main/charts/other/app-template&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/bjw-s/helm-charts/tree/main/charts/other/app-template&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 07 Sep 2022 14:30:40 +0000</pubDate>
        </item>
        <item>
            <title>free_helm_chart_repository_with_github_pages</title>
            <link>https://wiki.autosys.tk/devops/free_helm_chart_repository_with_github_pages</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;публикуем_helm_chart_на_github_pages_с_помощью_github_actions&quot;&gt;Публикуем helm chart на GitHub Pages с помощью GitHub Actions&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Создаем в репе в ветке &lt;strong&gt;main&lt;/strong&gt; директорию &lt;strong&gt;charts&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Создаем в директории сharts собственно директорию helm-чарта Например с помощью &lt;pre class=&quot;code&quot;&gt;cd charts
helm create your-chart-name&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Создаем директорию &lt;strong&gt;./.github/workflows/&lt;/strong&gt; и в ней файлик &lt;strong&gt;publish-charts.yml&lt;/strong&gt; с таким содержимым:&lt;pre class=&quot;code&quot;&gt;name: Release Charts
on:
  push:
    branches:
      - main
jobs:
  release:
    # depending on default permission settings for your org (contents being read-only or read-write for workloads), you will have to add permissions
    # see: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token
    permissions:
      contents: write
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Configure Git
        run: |
          git config user.name &amp;quot;$GITHUB_ACTOR&amp;quot;
          git config user.email &amp;quot;$GITHUB_ACTOR@users.noreply.github.com&amp;quot;
      - name: Run chart-releaser
        uses: helm/chart-releaser-action@v1.7.0
        env:
          CR_TOKEN: &amp;quot;${{ secrets.GITHUB_TOKEN }}&amp;quot;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Коммитим в ветке main то что там теперь есть и пушим:&lt;pre class=&quot;code&quot;&gt;git add .
git commit -am &amp;#039;helm chart&amp;#039;
git push&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Теперь создаем пустую ветку &lt;strong&gt;gh-pages&lt;/strong&gt; в которой собственно и будут публиковаться чарты:&lt;pre class=&quot;code&quot;&gt;git checkout --orphan gh-pages
git rm -rf .
rm &amp;#039;.gitignore&amp;#039;
echo &amp;quot;#Readme&amp;quot; &amp;gt; README.md
git add README.md
git commit -a -m &amp;quot;gh-pages&amp;quot;
git push -u origin gh-pages&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В настройках репозитория на &lt;strong&gt;GitHub&lt;/strong&gt; включаем публикацию &lt;strong&gt;GitHub Pages&lt;/strong&gt; из ветки &lt;strong&gt;gh-pages&lt;/strong&gt;: &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Pages&lt;/strong&gt; (слева) → в &lt;strong&gt;Branch&lt;/strong&gt; выбираем ветку &lt;strong&gt;gh-pages&lt;/strong&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ну и все. После того как в Actions проудет публикация - можно ставить чарт:&lt;pre class=&quot;code&quot;&gt;helm repo add my-repo https://&amp;lt;owner&amp;gt;.github.io/&amp;lt;repoName&amp;gt;/
helm install my-chart my-repo/my-chart-name&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 02 Apr 2026 12:35:43 +0000</pubDate>
        </item>
        <item>
            <title>git</title>
            <link>https://wiki.autosys.tk/devops/git</link>
            <description>
&lt;p&gt;
много рецептов: &lt;a href=&quot;https://webhamster.ru/mytetrashare/index/mtb0/&quot; class=&quot;urlextern&quot; title=&quot;https://webhamster.ru/mytetrashare/index/mtb0/&quot; rel=&quot;ugc nofollow&quot;&gt;https://webhamster.ru/mytetrashare/index/mtb0/&lt;/a&gt;
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;ветвление_и_слияние_веток&quot;&gt;Ветвление и слияние веток&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Клонируем репозиторий:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone https://....&lt;/pre&gt;

&lt;p&gt;
Создаем ветку:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git branch new-branch&lt;/pre&gt;

&lt;p&gt;
и переключаемся на нее:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout new-branch&lt;/pre&gt;

&lt;p&gt;
или обе команды в одной (создаем и сразу переключаемся на ветку):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout -b new-branch&lt;/pre&gt;

&lt;p&gt;
Увидеть какие ветки есть можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git branch -a&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0432\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435_\u0438_\u0441\u043b\u0438\u044f\u043d\u0438\u0435_\u0432\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;77-554&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;слияние_веток&quot;&gt;Слияние веток&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Например - есть две ветки &lt;strong&gt;master&lt;/strong&gt; и &lt;strong&gt;new-branch&lt;/strong&gt;. &lt;br/&gt;

Когда говорят, что нужно слить ветку &lt;strong&gt;new-branch&lt;/strong&gt; с веткой &lt;strong&gt;master&lt;/strong&gt;, то это значит, что нужно выполнить переключение на ветку &lt;strong&gt;master&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout master&lt;/pre&gt;

&lt;p&gt;
и выполнить слияние ветки &lt;strong&gt;new-branch&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git merge new-branch&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043b\u0438\u044f\u043d\u0438\u0435 \u0432\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043b\u0438\u044f\u043d\u0438\u0435_\u0432\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;555-1006&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;разрешение_конфликтов_при_слиянии&quot;&gt;Разрешение конфликтов при слиянии&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Конфликт возникает, если изменения в одном и том же файле были произведены в двух ветках и мы пытаемся слить эти ветки. &lt;br/&gt;

Для того, чтобы увидеть суть конфиликта нужно видеть три состояния:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Состояние первой ветки
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Состояние второй ветки
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Общее начальное состояние веток до изменений.
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
Включить отображение различий и общего начального стсоояния можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git config merge.conflictstyle diff3&lt;/pre&gt;

&lt;p&gt;
Допустим, была ветка &lt;strong&gt;master&lt;/strong&gt;, от которой ответвились две ветки - &lt;strong&gt;develop&lt;/strong&gt; и &lt;strong&gt;feature&lt;/strong&gt;, в которых были произведены изменения в одном и том же файле. &lt;br/&gt;

При попытке слияния ветки &lt;strong&gt;feature&lt;/strong&gt; с веткой &lt;strong&gt;develop&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout develop
git merge feature&lt;/pre&gt;

&lt;p&gt;
будет создан коммит, в котором зафиксирован конфликт двух веток:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Auto-merging main.go
CONFLICT (content): Merge conflict in main.go
Automatic merge failed; fix conflicts and then commit the result.&lt;/pre&gt;

&lt;p&gt;
Увидеть суть конфликта можно в конце листинга указанного файла:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat ./main.go
...
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
func sum (a, b int) int {
  return a + b
||||||| merged common ancestors
func sum (a, b int) int {
  t := a + b
  return t
=======
func sum(a, b int) int {
        t := a + b
        return t
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature
}&lt;/pre&gt;

&lt;p&gt;
Тут три фрагмента:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Первый принадлежит ветке &lt;strong&gt;develop&lt;/strong&gt;:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;func sum (a, b int) int {
  return a + b
}&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Второй - принадлежит общему предку - коммиту в ветке &lt;strong&gt;master&lt;/strong&gt;:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;func sum (a, b int) int {
  t := b + a
  return t
}&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Третий - ветке &lt;strong&gt;feature&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;func sum(a, b int) int {
        t := a + b
        return t
}&lt;/pre&gt;

&lt;p&gt;
Теперь нужно как-то разрешить конфликт. Например, мы знаем, что нужно оставить самые последние версии (по времени внесения изменений). &lt;br/&gt;

Отлично написано тут: &lt;a href=&quot;https://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/&quot; class=&quot;urlextern&quot; title=&quot;https://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/&lt;/a&gt; &lt;br/&gt;

Для разрешения конфликта будем использовать дефолтную утилиту &lt;strong&gt;vimdiff&lt;/strong&gt;. &lt;br/&gt;

Настраиваем git для использования &lt;strong&gt;vimdiff&lt;/strong&gt; в качестве &lt;strong&gt;mergetool&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git config merge.tool vimdiff
git config mergetool.prompt false&lt;/pre&gt;

&lt;p&gt;
Приступаем к разрешению конфликта:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git mergetool&lt;/pre&gt;

&lt;p&gt;
Листаем вниз и видим конфликт:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  func sum (a, b int) int {               |  func sum (a, b int) int {               |  func sum(a, b int) int {                
    return a + b                          |    t := a + b                            |          t := a + b                      
  ----------------------------------------|    return t                              |          return t                        
  ----------------------------------------|  ----------------------------------------|  ----------------------------------------
  ----------------------------------------|  ----------------------------------------|  ----------------------------------------
  ----------------------------------------|  ----------------------------------------|  ----------------------------------------
  ----------------------------------------|  ----------------------------------------|  ----------------------------------------
  ----------------------------------------|  ----------------------------------------|  ----------------------------------------
  ----------------------------------------|  ----------------------------------------|  ----------------------------------------
  ----------------------------------------|  ----------------------------------------|  ----------------------------------------
./main_LOCAL_25754.go   44,2           97% ./main_BASE_25754.go    45,2           97% ./main_REMOTE_25754.go  45,2           97%
  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD                                                                                                                  
  func sum (a, b int) int {                                                                                                     
    return a + b                                                                                                                
  ||||||| merged common ancestors                                                                                               
  func sum (a, b int) int {                                                                                                     
    t := a + b                                                                                                                  
    return t                                                                                                                    
  =======                                                                                                                       
  func sum(a, b int) int {                                                                                                      
          t := a + b                                                                                                            
          return t                                                                                                              
main.go                                                                                                       47,8           95%&lt;/pre&gt;

&lt;p&gt;
Тут мы видим:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 слева - состояние ветки в которую мерджим изменения (обозначены &lt;strong&gt;LOCAL&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 в середине - общий предок (&lt;strong&gt;BASE&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 справа - состояние ветки которую мы мерджим (&lt;strong&gt;REMOTE&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Внизу - конфликт
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
Нужно оставить изменения, которые содержатся в ветке &lt;strong&gt;REMOTE&lt;/strong&gt;. Для этого переключаемся между окошками с помощью &lt;strong&gt;Ctrl + w,j&lt;/strong&gt; на нижнее окошко, листам вниз до конфликта и жмем последовательно:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Esc
:diffg RE
:wqa&lt;/pre&gt;

&lt;p&gt;
Эта последовательность команд переводит редактор в режим команд (кнопочка &lt;strong&gt;Esc&lt;/strong&gt;), затем применяем изменения из ветки &lt;strong&gt;REMOTE&lt;/strong&gt;, а затем сохраняем изменения. &lt;br/&gt;

Измнения из &lt;strong&gt;LOCAL&lt;/strong&gt; или &lt;strong&gt;BASE&lt;/strong&gt; применяются соответственно командами:
&lt;/p&gt;
&lt;dl&gt;
&lt;dd class=&quot;level1&quot;&gt;&lt;div class=&quot;dd&quot;&gt;
diffg BA
&lt;/div&gt;&lt;/dd&gt;
&lt;dd class=&quot;level1&quot;&gt;&lt;div class=&quot;dd&quot;&gt;
diffg LO
&lt;/div&gt;&lt;/dd&gt;
&lt;/dl&gt;


&lt;p&gt;
И наконец можно выполнить commit:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git commit -a -m &amp;quot;Branch &amp;#039;feature&amp;#039; merged to &amp;#039;develop&amp;#039;&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435_\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432_\u043f\u0440\u0438_\u0441\u043b\u0438\u044f\u043d\u0438\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1007-8303&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;разрешение_всех_конфликтов_слияния_в_пользу_текущего_или_входящего_состояния&quot;&gt;Разрешение всех конфликтов слияния в пользу текущего или входящего состояния&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Если при merge возникли конфиликты, то можно одной командой разрешить все конфликты в ту или другую пользу. &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Оставить все конфликтные участки в текущем состоянии:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout --ours .&lt;/pre&gt;

&lt;p&gt;
Применить во всех случаях конфликтов входящие изменения:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout --theirs .&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u043b\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435_\u0432\u0441\u0435\u0445_\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432_\u0441\u043b\u0438\u044f\u043d\u0438\u044f_\u0432_\u043f\u043e\u043b\u044c\u0437\u0443_\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e_\u0438\u043b\u0438_\u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e_\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;8304-8911&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;переключиться_на_нужный_коммит&quot;&gt;Переключиться на нужный коммит&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Находим нужный коммит с помощью 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git log&lt;/pre&gt;

&lt;p&gt;
И переключаемся на него:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout &amp;lt;commit_hash&amp;gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f_\u043d\u0430_\u043d\u0443\u0436\u043d\u044b\u0439_\u043a\u043e\u043c\u043c\u0438\u0442&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;8912-9128&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;тегирование_коммитов&quot;&gt;Тегирование коммитов&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Тегируем текущий коммит и пушим тег:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git tag &amp;lt;tag_name&amp;gt;
git push &amp;lt;remote_name&amp;gt; &amp;lt;branch_name&amp;gt; &amp;lt;tag_name&amp;gt;&lt;/pre&gt;

&lt;p&gt;
Например:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git tag ops.07
git push origin master ops.07&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;9129-9388&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit7&quot; id=&quot;откат_изменений&quot;&gt;Откат изменений&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;git reset --hard&lt;/pre&gt;

&lt;p&gt;
Откат определенных коммитов (&lt;strong&gt;rebase&lt;/strong&gt; &amp;amp; &lt;strong&gt;cherry-pick&lt;/strong&gt; vs. &lt;strong&gt;revert&lt;/strong&gt;): &lt;a href=&quot;https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert&quot; class=&quot;urlextern&quot; title=&quot;https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git revert ...&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0442\u043a\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u043a\u0430\u0442_\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;9389-9644&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit8&quot; id=&quot;объединение_коммитов&quot;&gt;Объединение коммитов&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://git-scm.com/book/ru/v1/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8&quot; class=&quot;urlextern&quot; title=&quot;https://git-scm.com/book/ru/v1/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8&quot; rel=&quot;ugc nofollow&quot;&gt;https://git-scm.com/book/ru/v1/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8&lt;/a&gt; &lt;br/&gt;

Объединить коммиты можно с помощью &lt;strong&gt;interactive rebase&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git rebase -i HEAD~3&lt;/pre&gt;

&lt;p&gt;
Откроется тектовый редактор, в котором в начале будут перечислены коммиты (в данном случае - 3 штуки, начиная с самого старого) и применяемые к ним действия (по умолчанию - &lt;strong&gt;pick&lt;/strong&gt;). Для того, чтобы объединить коммиты нужно для самого первого (старого) оставить &lt;strong&gt;pick&lt;/strong&gt;, а для остальных прописать &lt;strong&gt;squash&lt;/strong&gt; (или сокращенно &lt;strong&gt;s&lt;/strong&gt;). В результате, изменения в коммитах объединятся в один (самый старый). 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435_\u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;9645-10718&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit9&quot; id=&quot;объединение_всех_коммитов_ветки&quot;&gt;Объединение всех коммитов ветки&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;git reset `echo &amp;quot;Total Squash Commit&amp;quot; | git commit-tree HEAD^{tree}`&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0432\u0435\u0442\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435_\u0432\u0441\u0435\u0445_\u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432_\u0432\u0435\u0442\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;10719-10862&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit10&quot; id=&quot;разбиение_коммитов_и_распределение_их_по_веткам&quot;&gt;Разбиение коммитов и распределение их по веткам&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Предствьте себе, что случилась неприятность - вы недумая коммитили в master, в одном коммите могли оказаться изменения, касающиеся разных фич. И всё было хорошо, пока кто-то не захотел сделать ревью и увидел ХАОС. Что нужно - нужно разбить сделанные коммиты по веткам фич. Для этого - нужно разбить все старые коммиты и потом применить их к нужным веткам. Как разбить коммит, который зарыт глубоко в истории?? Поможет  rebase! Что он делает - применяет коммиты последовательно к тому, на котором мы делаем rebase. Как вмешаться в этот процесс - запустить его в интерактивном режиме, когда мы можем указать что делать с каждым коммитом.&lt;br/&gt;

Допустим - у нас поверх последнего хорошего коммита выполнено уже 4 нехороших хаотичных.
Первое - выполняем интерактивный ребейс:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git rebase -i HEAD~4&lt;/pre&gt;

&lt;p&gt;
Либо прямо делаем &lt;strong&gt;rebase&lt;/strong&gt;, указав хеш коммита:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git rebase -i &amp;lt;LAST_GOOD_COMMIT&amp;gt;&lt;/pre&gt;

&lt;p&gt;
Откроется окно редактора, в котором будет список коммитов, начиная с самого старого. На против каждого будет стоять &lt;strong&gt;pick&lt;/strong&gt;. Если сейчас ничего не менять - то ничего и не произойдет. Все коммиты применятся и мы откажемся на последнем. Но! Если для первого поставить вместо &lt;strong&gt;pick&lt;/strong&gt; - &lt;strong&gt;edit&lt;/strong&gt;, сохраним файлик и выйдем, то мы окажемся на этом коммите. А дальше - магия &lt;strong&gt;git&lt;/strong&gt;. \
Отменяем коммит, на котором мы находимся в данный момент (который был закоммичен последним с нашей точки зрения - а это тот, для которого мы указали &lt;strong&gt;edit&lt;/strong&gt;):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git reset HEAD~&lt;/pre&gt;

&lt;p&gt;
Проверим, что изменения откатились и увидим список измененных в этом коммите файлов:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git status&lt;/pre&gt;

&lt;p&gt;
Например, файлы разбиты по каталогам feature1 и feature2 (будем считать так для простоты). Нам надо разбить изменения в этих каталогах на два коммита. Последовательно добавляем в stage каталоги (или файлы) и коммитим:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git add ./feature1/*
git commit -m &amp;#039;feature1 commit&amp;#039;
git add ./feature2/*
git commit -m &amp;#039;feature2 commit&amp;#039;&lt;/pre&gt;

&lt;p&gt;
В итоге наш крупный коммит был разбит на два. А теперь - продолжим &lt;strong&gt;rebase&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git rebase --continue&lt;/pre&gt;

&lt;p&gt;
Всё. &lt;br/&gt;

Теперь эту процедуру можно повторить для остальных крупных беспорядочных коммитов. &lt;br/&gt;

А потом - ответвить от последнего хорошего коммита ветки и применять на эти ветки коммиты, соответствующие фичам:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout &amp;lt;LAST_GOOD_COMMIT&amp;gt;
git checkout -b feature1
git cherry-pick &amp;lt;FEATURE1_SHA1&amp;gt;&lt;/pre&gt;

&lt;p&gt;
и для второй фичи:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git checkout &amp;lt;LAST_GOOD_COMMIT&amp;gt;
git checkout -b feature2
git cherry-pick &amp;lt;FEATURE2_COMMIT_SHA1&amp;gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0445 \u043f\u043e \u0432\u0435\u0442\u043a\u0430\u043c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435_\u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432_\u0438_\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435_\u0438\u0445_\u043f\u043e_\u0432\u0435\u0442\u043a\u0430\u043c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;10863-14848&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit11&quot; id=&quot;скачать_из_репозитория_git_одну_единственную_папку&quot;&gt;Скачать из репозитория git одну единственную папку&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;mkdir charts
cd charts
git init
git remote add origin https://github.com/helm/charts.git
git config core.sparseCheckout true
echo &amp;quot;stable/jenkins&amp;quot; &amp;gt; .git/info/sparse-checkout
git pull origin master&lt;/pre&gt;

&lt;p&gt;
или
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage &amp;gt; /tmp/usage_docs.tar&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f git \u043e\u0434\u043d\u0443 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043a\u0430\u0447\u0430\u0442\u044c_\u0438\u0437_\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f_git_\u043e\u0434\u043d\u0443_\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e_\u043f\u0430\u043f\u043a\u0443&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;14849-15278&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit12&quot; id=&quot;почистить_репозиторий_git&quot;&gt;Почистить репозиторий git&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Допустим, у нас не было файлика &lt;strong&gt;.gitignore&lt;/strong&gt; и в репозиторий попало много ненужного. &lt;br/&gt;

Теперь я хочу избавиться от ненужных файлов в репозитории. &lt;br/&gt;

Для этого:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 делаем коммит текущего состояния, вместе с файликом &lt;strong&gt;.gitignore&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 удаляем все ненужные файлики из репы
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 удаляем все файлики из индекса репозитория ( отдельный файлик можно удалить так: git rm –cached foo.txt )
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;git rm -r --cached .&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 и добавляем все файлики обратно в индекс:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;git add .&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Коммитим состояние
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;git commit -m &amp;quot;.gitignore fix&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 git&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c_\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439_git&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;15279-16203&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit13&quot; id=&quot;no_url_found_for_submodule_path&quot;&gt;No url found for submodule path&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Иногда в проект попадают подпроекты, которые сами по себе являются репозиториями git. В этому случае они становятся &lt;strong&gt;submodules&lt;/strong&gt; и &lt;strong&gt;git&lt;/strong&gt; работает с ними как со ссылками на внешние репы. То есть он не сохраняет в репозитории файлы этих проектов, а скачивает их по требованию. &lt;br/&gt;

Однако, может так статься, что файлы подпроекта становятся частью проекта, а ссылки на внешние репозитории изменяются или перестают работать. &lt;br/&gt;

Если ссылка на внешний репозитрий изменилать, то следует поправить ее в файле &lt;strong&gt;.gitmodules&lt;/strong&gt; в корне проекта:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[submodule &amp;quot;path_to_submodule&amp;quot;] 
  path = path_to_submodule 
  url = git://url-of-source/&lt;/pre&gt;

&lt;p&gt;
А если подпроект нужно просто сделать частью проекта, то удаляем его так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git rm --cached path_to_submodule&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;No url found for submodule path&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;no_url_found_for_submodule_path&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;16204-17466&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit14&quot; id=&quot;fatalrefusing_to_merge_unrelated_histories&quot;&gt;fatal: refusing to merge unrelated histories&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Иногда, после манипуляций с историей коммитов нарушается связность историй веток и при попытке выполнения
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git merge BRANCHNAME&lt;/pre&gt;

&lt;p&gt;
Появляется сообщение вида:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;fatal: refusing to merge unrelated histories&lt;/pre&gt;

&lt;p&gt;
В этом случае - если нам нужно заменить содержимое одной ветки, содержимым другой, то в ветке куда делаем merge выполняем:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git pull origin BRANCHNAME -X theirs --allow-unrelated-histories&lt;/pre&gt;

&lt;p&gt;
То есть - подтягиваем в текущую ветку все изменения из ветки репозитория &lt;strong&gt;BRANCHNAME&lt;/strong&gt;, разрешаем нарушение истории коммитов (&lt;strong&gt;–allow-unrelated-histories&lt;/strong&gt;) и автоматически разрешаем все конфликты в пользу применения входящих изменений (&lt;strong&gt;-X theirs&lt;/strong&gt;)
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fatal: refusing to merge unrelated histories&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;fatalrefusing_to_merge_unrelated_histories&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;17467-18544&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit15&quot; id=&quot;создать_пустой_коммит_перед_корневым&quot;&gt;Создать пустой коммит перед корневым&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://qastack.ru/programming/645450/insert-a-commit-before-the-root-commit-in-git&quot; class=&quot;urlextern&quot; title=&quot;https://qastack.ru/programming/645450/insert-a-commit-before-the-root-commit-in-git&quot; rel=&quot;ugc nofollow&quot;&gt;https://qastack.ru/programming/645450/insert-a-commit-before-the-root-commit-in-git&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u043c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u0442\u044c_\u043f\u0443\u0441\u0442\u043e\u0439_\u043a\u043e\u043c\u043c\u0438\u0442_\u043f\u0435\u0440\u0435\u0434_\u043a\u043e\u0440\u043d\u0435\u0432\u044b\u043c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:15,&amp;quot;range&amp;quot;:&amp;quot;18545-18713&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit16&quot; id=&quot;удалить_большие_файлы_из_репозитория_git&quot;&gt;Удалить большие файлы из репозитория git&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Найти большие файлы в текущей репе git:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git rev-list --objects --all | grep -f &amp;lt;(git verify-pack -v  .git/objects/pack/*.idx| sort -k 3 -n | cut -f 1 -d &amp;quot; &amp;quot; | tail -10)&lt;/pre&gt;

&lt;p&gt;
или так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git rev-list --objects --all | while read sha1 fname; do   echo -e &amp;quot;$(git cat-file -s $sha1)\t$fname&amp;quot;; done | sort -n -r | head -n 20&lt;/pre&gt;

&lt;p&gt;
Удаляем те файлики, которые не нужны, используя пути к ним:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git filter-repo --path-glob &amp;#039;~~~FILE_PATH~~~&amp;#039; --invert-paths --force&lt;/pre&gt;

&lt;p&gt;
Либо - можно удалять по расширению:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git filter-repo --path-glob &amp;#039;*.zip&amp;#039; --invert-paths --force&lt;/pre&gt;

&lt;p&gt;
Теперь надо  снова прописать &lt;strong&gt;remote&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git remote add origin git@github.com:.........&lt;/pre&gt;

&lt;p&gt;
И запушить всё:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git push --all --force
git push --tags --force&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f git&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0434\u0430\u043b\u0438\u0442\u044c_\u0431\u043e\u043b\u044c\u0448\u0438\u0435_\u0444\u0430\u0439\u043b\u044b_\u0438\u0437_\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f_git&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:16,&amp;quot;range&amp;quot;:&amp;quot;18714-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 16 Mar 2026 10:20:51 +0000</pubDate>
        </item>
        <item>
            <title>github_git_clone_decryption_has_failed</title>
            <link>https://wiki.autosys.tk/devops/github_git_clone_decryption_has_failed</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;github_-_git_clone_-_decryption_has_failed&quot;&gt;GitHub - git clone - Decryption has failed&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;abbr title=&quot;Operating System&quot;&gt;OS&lt;/abbr&gt; - &lt;strong&gt;22.04.1 LTS (Jammy Jellyfish)&lt;/strong&gt;. git - установлен из репозития &lt;br/&gt;

При попытке склонировать репозиторий с &lt;strong&gt;GitHub&lt;/strong&gt; операция завершается с ошибкой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;remote: Enumerating objects: 3094, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
error: RPC failed; curl 56 GnuTLS recv error (-24): Decryption has failed.
error: 5651 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;GitHub - git clone - Decryption has failed&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;github_-_git_clone_-_decryption_has_failed&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-688&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;что_не_помогло&quot;&gt;Что НЕ помогло&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apt install gnutls-bin&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;git config --global http.postBuffer 1048576000
git config --global https.postBuffer 1048576000
git config --global http.sslVerify false
git config --system core.longpaths true
git config --global core.compression -1
unset all_proxy &amp;amp;&amp;amp; unset ALL_PROXY
git config --global http.proxy &amp;quot;&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0427\u0442\u043e \u041d\u0415 \u043f\u043e\u043c\u043e\u0433\u043b\u043e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0447\u0442\u043e_\u043d\u0435_\u043f\u043e\u043c\u043e\u0433\u043b\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;689-1056&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;что_помогло&quot;&gt;Что помогло&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Причиной оказались настройки точки доступа Wi-Fi. Скорее всего - MTU. &lt;br/&gt;

Проблема решилась после переключения на другую точку доступа.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0427\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u043b\u043e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0447\u0442\u043e_\u043f\u043e\u043c\u043e\u0433\u043b\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1057-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 12 Jan 2023 07:07:33 +0000</pubDate>
        </item>
        <item>
            <title>gitlab</title>
            <link>https://wiki.autosys.tk/devops/gitlab</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;терминология_gitlab&quot;&gt;Терминология Gitlab&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
В Gitlab многие сущности именуются несколько иначе, чем в других системах:
&lt;/p&gt;
&lt;div class=&quot;table sectionedit2&quot;&gt;&lt;table class=&quot;inline&quot;&gt;
	&lt;tr class=&quot;row0&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Название в GitLab  &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Что это &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Названия в других &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row1&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Проект (Project) &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Базовый элемент рабочего процесса, включающий в себя код приложения и связанные с ним сущности (задачи, документацию, пайплайн CI/CD и другое) &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Репозиторий (Repository) &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row2&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Группа (Group) &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Именованный набор проектов и/или групп (напоминает директории). Группы могут быть вложенными и могут включать в себя не только проекты, но и учетные записи разработчиков для раздачи прав. Gitlab поддерживает до 20 уровней вложенных групп. &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Проект (Project) &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row3&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Задача (Issue) &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Задачи - это базовые элементы планирования, связанные с проектами. Используются для планирования, контроля выполнения и документирования работ &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Story, Narrative, Ticket &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row4&quot;&gt;
		&lt;td class=&quot;col0 leftalign&quot;&gt; Эпик (Epic)	&lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Эпик - это набор связанных по смыслу задач, в разных проектах и их группах. Для Эпиков поддерживается иерархия - дочерние эпики. Поддерживаются в редакциях &lt;strong&gt;Premium&lt;/strong&gt; и &lt;strong&gt;Ultimate&lt;/strong&gt; &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Initiatives, Themes &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row5&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Merge Request &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; MR позволяет связать задачу (issue) и коммиты кода, реализующие эту задачу, а также все сопутствующие детали (обсуждения, результаты review и прочее) &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Pull Request &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row6&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Метка (Label) &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Метки относятся к задачам и позволяют обозначать различные состояния работы над ними. Это не теги коммитов git. Это именно метки для задач (Issues) &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Tag &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row7&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Доска (Board) &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Доска позволяет визуализировать текущее состояние проектов и задач для удобного планирования работы &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; - &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row8&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Майлстоун (Milestone) &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Группа выполненных (готовых к доставке) задач и связанных с ними изменений кода &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; Релиз (Release) &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr class=&quot;row9&quot;&gt;
		&lt;td class=&quot;col0&quot;&gt; Дорожная карта (Roadmap) &lt;/td&gt;&lt;td class=&quot;col1&quot;&gt; Визуализация эпиков для группы проектов. Необходима редакция &lt;strong&gt;Ultimate&lt;/strong&gt; &lt;/td&gt;&lt;td class=&quot;col2&quot;&gt; - &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;table&amp;quot;,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;178-2925&amp;quot;} --&gt;
&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u044f Gitlab&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u044f_gitlab&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-2926&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;примеры_cicd&quot;&gt;Примеры CI/CD&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://gitlab.com/gitlab-examples/ruby-autodeploy&quot; class=&quot;urlextern&quot; title=&quot;https://gitlab.com/gitlab-examples/ruby-autodeploy&quot; rel=&quot;ugc nofollow&quot;&gt;Ruby Autodeploy&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://gitlab.com/gitlab-examples/multi-project-pipelines/simple-maven-app&quot; class=&quot;urlextern&quot; title=&quot;https://gitlab.com/gitlab-examples/multi-project-pipelines/simple-maven-app&quot; rel=&quot;ugc nofollow&quot;&gt;Simple Maven App&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://www.youtube.com/watch?v=0Tc0YYBxqi4&quot; class=&quot;urlextern&quot; title=&quot;https://www.youtube.com/watch?v=0Tc0YYBxqi4&quot; rel=&quot;ugc nofollow&quot;&gt;Gitlab AutoDevops&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://gitlab.com/gitlab-examples&quot; class=&quot;urlextern&quot; title=&quot;https://gitlab.com/gitlab-examples&quot; rel=&quot;ugc nofollow&quot;&gt;Много Всяких Других Примеров&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0438\u043c\u0435\u0440\u044b CI\/CD&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0438\u043c\u0435\u0440\u044b_cicd&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;2927-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Sun, 09 Jan 2022 20:55:50 +0000</pubDate>
        </item>
        <item>
            <title>gitlab_ci_gke</title>
            <link>https://wiki.autosys.tk/devops/gitlab_ci_gke</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;практикуюсь_в_построении_ci_на_базе_gitlab_и_gke&quot;&gt;Практикуюсь в построении CI на базе GitLab и GKE&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Итак. У меня есть стандартное тестовое приложение &lt;a href=&quot;https://github.com/GoogleCloudPlatform/microservices-demo&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/GoogleCloudPlatform/microservices-demo&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/GoogleCloudPlatform/microservices-demo&lt;/a&gt; &lt;br/&gt;

Я залил этот репозиторий на &lt;a href=&quot;https://gitlab.com/dashboard/projects&quot; class=&quot;urlextern&quot; title=&quot;https://gitlab.com/dashboard/projects&quot; rel=&quot;ugc nofollow&quot;&gt;https://gitlab.com/dashboard/projects&lt;/a&gt; &lt;br/&gt;

&lt;br/&gt;

Предполагаю, что на машинке установлен и инициализирован &lt;strong&gt;gcloud&lt;/strong&gt; и &lt;strong&gt;terraform&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u044e\u0441\u044c \u0432 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 CI \u043d\u0430 \u0431\u0430\u0437\u0435 GitLab \u0438 GKE&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u044e\u0441\u044c_\u0432_\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438_ci_\u043d\u0430_\u0431\u0430\u0437\u0435_gitlab_\u0438_gke&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-479&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;разворачиваем_кластер_kubernetes_на_gke&quot;&gt;Разворачиваем кластер Kubernetes на GKE&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;git clone https://gitlab.com/mike.obninsk/gke_cluster.git
cd gke_cluster
terrafrom init
terraform plan
terraform apply&lt;/pre&gt;

&lt;p&gt;
Получаем учетные данные для кластера :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;KUBECONFIG=./kubeconfig gcloud container clusters get-credentials otus-project-cluster --zone us-east1-b --project otus-kuber-course&lt;/pre&gt;

&lt;p&gt;
В результате в текущей директории в файлике &lt;strong&gt;kubeconfig&lt;/strong&gt; будет содержаться конфиг для доступа к кластеру.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u043d\u0430 GKE&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c_\u043a\u043b\u0430\u0441\u0442\u0435\u0440_kubernetes_\u043d\u0430_gke&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;480-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 09 Sep 2020 15:00:57 +0000</pubDate>
        </item>
        <item>
            <title>gitlab_ci_semver</title>
            <link>https://wiki.autosys.tk/devops/gitlab_ci_semver</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;какие_вараинты_я_расмотрел&quot;&gt;Какие вараинты я расмотрел&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://github.com/mrooding/gitlab-semantic-versioning&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/mrooding/gitlab-semantic-versioning&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/mrooding/gitlab-semantic-versioning&lt;/a&gt; - относительно простой скрипт на питоне. Преимущества - может просто работать на ранненере, при наличии питона, либо - в Docker&amp;#039;е
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://semantic-release.gitbook.io/semantic-release/&quot; class=&quot;urlextern&quot; title=&quot;https://semantic-release.gitbook.io/semantic-release/&quot; rel=&quot;ugc nofollow&quot;&gt;https://semantic-release.gitbook.io/semantic-release/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://threedots.tech/post/automatic-semantic-versioning-in-gitlab-ci/&quot; class=&quot;urlextern&quot; title=&quot;https://threedots.tech/post/automatic-semantic-versioning-in-gitlab-ci/&quot; rel=&quot;ugc nofollow&quot;&gt;https://threedots.tech/post/automatic-semantic-versioning-in-gitlab-ci/&lt;/a&gt; - вот какое-то тоже решение на питончике
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 27 Apr 2022 08:03:44 +0000</pubDate>
        </item>
        <item>
            <title>gslb</title>
            <link>https://wiki.autosys.tk/devops/gslb</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;polaris&quot;&gt;Polaris&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/polaris-gslb/polaris-gslb&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/polaris-gslb/polaris-gslb&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/polaris-gslb/polaris-gslb&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
An extendable high availability solution for the data center and beyond, Global Server Load Balancing(GSLB), &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-based traffic manager.
&lt;/p&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 02 Nov 2022 10:59:24 +0000</pubDate>
        </item>
        <item>
            <title>haproxy_hints</title>
            <link>https://wiki.autosys.tk/devops/haproxy_hints</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;доступные_samples_-_свойства_для_stick_on&quot;&gt;Доступные Samples - свойства для stick on&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://cbonte.github.io/haproxy-dconv/2.5/configuration.html#7.3.6&quot; class=&quot;urlextern&quot; title=&quot;https://cbonte.github.io/haproxy-dconv/2.5/configuration.html#7.3.6&quot; rel=&quot;ugc nofollow&quot;&gt;https://cbonte.github.io/haproxy-dconv/2.5/configuration.html#7.3.6&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 Samples - \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f stick on&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435_samples_-_\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430_\u0434\u043b\u044f_stick_on&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-146&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;посмотреть_содержимое_sticky_tables&quot;&gt;Посмотреть содержимое sticky tables&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://stackoverflow.com/a/51065175&quot; class=&quot;urlextern&quot; title=&quot;https://stackoverflow.com/a/51065175&quot; rel=&quot;ugc nofollow&quot;&gt;https://stackoverflow.com/a/51065175&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;stats socket /var/lib/haproxy/stats


bash#&amp;gt; echo &amp;quot;show table&amp;quot; | socat unix-connect:/var/lib/haproxy/stats stdio
# table: BACKEND_NAME, type: binary, size:20971520, used:2

bash#&amp;gt;echo &amp;quot;show table BACKEND_NAME&amp;quot; | socat unix-connect:/var/lib/haproxy/stats stdio
# table: BACKEND_NAME, type: binary, size:20971520, used:2
0x7f9ca0f24314:
key=8A3DF855010388A4DD94F71E0FEAF7A54A7032EA56D477D20F59B4F28CEF183B use=0
exp=1264499 server_id=1
0x7f9ca0f245c4:
key=C7EA05BA85730EAF725035EFB3C4F7537FCCCFD0469FB45A4A2DE85308ECF1C7 use=0
exp=1696667 server_id=2&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 sticky tables&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c_\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435_sticky_tables&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;147-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 16 Aug 2022 15:20:32 +0000</pubDate>
        </item>
        <item>
            <title>hashicorp_vault_workflow</title>
            <link>https://wiki.autosys.tk/devops/hashicorp_vault_workflow</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;о_чем_это&quot;&gt;О чем это&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Тут некоторе заметки по поводу использования &lt;strong&gt;HashiCorp Vault&lt;/strong&gt;. &lt;br/&gt;

&lt;strong&gt;HashiCorp Vault&lt;/strong&gt; реализует &lt;strong&gt;&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt; для безопасного доступа к сенситивным данным. Он шифрует/дешифрует их и передает/извлекает в/из хранилища, в качестве которого могут выступать как обычные файлы, так и базы данных (mysql), key-value хранилища (etcd), но рекомендуемым является &lt;strong&gt;Hashicorp Consul&lt;/strong&gt;. &lt;br/&gt;

&lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Все эксперименты провожу в отдельном неймспйсе:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns vault&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e \u0447\u0435\u043c \u044d\u0442\u043e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e_\u0447\u0435\u043c_\u044d\u0442\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-755&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;установка_hashicorp_vault&quot;&gt;Установка Hashicorp Vault&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Установим &lt;strong&gt;Consul&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;helm upgrade --install consul -n vault ./consul-helm/ --set server.replicas=1   --set server.bootstrapExpect=1&lt;/pre&gt;

&lt;p&gt;
Установим &lt;strong&gt;Vault&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;helm upgrade --install vault -n vault ./vault-helm/ --set server.standalone.enabled=false --set server.ha.enabled=true --set server.ha.replicas=1 --set ui.enabled=true --set ui.serviceType: &amp;quot;ClusterIP&amp;quot;&lt;/pre&gt;

&lt;p&gt;
Убедимся, что всё запустилось:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get po -n vault&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Hashicorp Vault&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_hashicorp_vault&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;756-1264&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;инициализация_vault&quot;&gt;Инициализация Vault&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault operator init --key-shares=1  --key-threshold=1&lt;/pre&gt;

&lt;p&gt;
В ответ получим что-то такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Unseal Key 1: EEvC8nTJ7gw1SQtMJIly6JKtk6SWm+DyJWGycq/ECq4=

Initial Root Token: s.Ta90nQ3ynlOEqkWm4g0WiJRJ

Vault initialized with 1 key shares and a key threshold of 1. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 1 of these keys to unseal it
before it can start servicing requests.

Vault does not store the generated master key. Without at least 1 key to
reconstruct the master key, Vault will remain permanently sealed!

It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See &amp;quot;vault operator rekey&amp;quot; for more information.&lt;/pre&gt;

&lt;p&gt;
Теперь поглядим статус Vault:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault status -tls-skip-verify&lt;/pre&gt;

&lt;p&gt;
И получим такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       1
Threshold          1
Unseal Progress    0/1
Unseal Nonce       n/a
Version            1.4.2
HA Enabled         true
command terminated with exit code 2&lt;/pre&gt;

&lt;p&gt;
Тут видно, что Vault запечатан (Sealed true). Распечатаем его:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it vault-0 -n vault -- vault operator unseal&lt;/pre&gt;

&lt;p&gt;
Если Vault развернут в HA-конфигурации, то распечатать нужно каждую реплику.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it vault-0 -- vault operator unseal&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Vault&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f_vault&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1265-2942&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;работа_с_данными_в_vault&quot;&gt;Работа с данными в Vault&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Для начала нужно залогиниться в Vault (получить токен для доступа к &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it vault-0 -n vault -- vault login&lt;/pre&gt;

&lt;p&gt;
Тут нужно ввести root token, полученный при инициализации &lt;strong&gt;Vault&lt;/strong&gt;. &lt;br/&gt;

Теперь запросим список хрянящихся в Vault авторизаций:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault auth list&lt;/pre&gt;

&lt;p&gt;
Создадим путь (директорию) для хранения секретов:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault secrets enable --path=otus kv&lt;/pre&gt;

&lt;p&gt;
Посмотрим список существующих секретов:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault secrets list --detailed&lt;/pre&gt;

&lt;p&gt;
Создадим пару секретов в нашей “директории”
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault kv put otus/otus-ro/config username=&amp;#039;otus&amp;#039; password=&amp;#039;asajkjkahs&amp;#039;
kubectl exec -it -n vault vault-0 -- vault kv put otus/otus-rw/config username=&amp;#039;otus&amp;#039; password=&amp;#039;asajkjkahs&amp;#039;&lt;/pre&gt;

&lt;p&gt;
И теперь прочитаем их:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault read otus/otus-ro/config
kubectl exec -it -n vault vault-0 -- vault kv get otus/otus-rw/config&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 Vault&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0431\u043e\u0442\u0430_\u0441_\u0434\u0430\u043d\u043d\u044b\u043c\u0438_\u0432_vault&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2943-4230&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;интеграция_с_kubernetes&quot;&gt;Интеграция с Kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Базовый вариант использования Vault с Kubernetes подразумевает чтение секретов из Vault. Для этого используются init-контейнер vault-agent, который читает из Vault секрет и помещает его в файл-шаблон. &lt;br/&gt;

Включим авторизацию через Kubernetes:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault auth enable kubernetes&lt;/pre&gt;

&lt;p&gt;
И убедимся, что она включилась:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault auth list &lt;/pre&gt;

&lt;p&gt;
Создадим ServiceAcccount
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create serviceaccount -n vault vault-auth&lt;/pre&gt;

&lt;p&gt;
И дадим ей права с помощью CLusterRoleBinding:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: role-tokenreview-binding
  namespace: vault
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: vault-auth
  namespace: vault
EOF&lt;/pre&gt;

&lt;p&gt;
Теперь мы сконфигурируем в &lt;strong&gt;Vault&lt;/strong&gt; параметры аутентификации для доступа к &lt;strong&gt;Kubernetes&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export VAULT_SA_NAME=$(kubectl get sa vault-auth -n vault -o jsonpath=&amp;quot;{.secrets[*][&amp;#039;name&amp;#039;]}&amp;quot;)
export SA_JWT_TOKEN=$(kubectl get secret $VAULT_SA_NAME -n vault -o jsonpath=&amp;quot;{.data.token}&amp;quot; | base64 --decode; echo)
export SA_CA_CRT=$(kubectl get secret $VAULT_SA_NAME -n vault -o jsonpath=&amp;quot;{.data[&amp;#039;ca\.crt&amp;#039;]}&amp;quot; | base64 --decode; echo)
#export K8S_HOST=$(more ~/.kube/config | grep server |awk &amp;#039;/http/ {print $NF}&amp;#039;)
export K8S_HOST=&amp;quot;https://kub:6443&amp;quot;&lt;/pre&gt;

&lt;p&gt;
И сконфигурируем аутентификацию (вернее поместим полученные значения в &lt;strong&gt;Vault&lt;/strong&gt;):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault write auth/kubernetes/config token_reviewer_jwt=&amp;quot;$SA_JWT_TOKEN&amp;quot; kubernetes_host=&amp;quot;$K8S_HOST&amp;quot; kubernetes_ca_cert=&amp;quot;$SA_CA_CRT&amp;quot;&lt;/pre&gt;

&lt;p&gt;
Дальше нужно дать права на доступ к секретам (вернее к “директориям”) в Vault. Для этого - создади файлик политики:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;tee otus-policy.hcl &amp;lt;&amp;lt;EOF
path &amp;quot;otus/otus-ro/*&amp;quot; {
capabilities = [&amp;quot;read&amp;quot;, &amp;quot;list&amp;quot;]
}
path &amp;quot;otus/otus-rw/*&amp;quot; {
capabilities = [&amp;quot;read&amp;quot;, &amp;quot;create&amp;quot;, &amp;quot;list&amp;quot;, &amp;quot;update&amp;quot;]
}
EOF&lt;/pre&gt;

&lt;p&gt;
скопируем его в pod vault&amp;#039;а:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n vault cp otus-policy.hcl vault-0:/tmp/&lt;/pre&gt;

&lt;p&gt;
и создадим с его помощью политику:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n vault exec -it vault-0 -- vault policy write otus-policy /tmp/otus-policy.hcl&lt;/pre&gt;

&lt;p&gt;
а также - создаим роль в &lt;strong&gt;vault&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n vault exec -it vault-0 -- vault write auth/kubernetes/role/otus bound_service_account_names=vault-auth bound_service_account_namespaces=default policies=otus-policy ttl=24h&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f_\u0441_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;4231-7146&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;проверка_аутентификации_и_авторизации_pod_а_в_vault&quot;&gt;Проверка аутентификации и авторизации pod&amp;#039;а в Vault&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Сейчас нужно запустить pod с &lt;strong&gt;ServiceAccount&lt;/strong&gt;, которая была создана ранее и попытаться залогиниться в Vault с помощью токена этой &lt;strong&gt;ServiceAccount&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl run -n vault --generator=run-pod/v1 tmp --rm -i --tty --serviceaccount=vault-auth --image alpine:3.7&lt;/pre&gt;

&lt;p&gt;
В результате выполнения этой команды моявится приглашение командной строки внутри запущенного контейнера. Установим в контейнере &lt;strong&gt;curl&lt;/strong&gt; и &lt;strong&gt;jq&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apk add curl jq&lt;/pre&gt;

&lt;p&gt;
И попытаемся залогиниться в Vault (также внутри тестового контейнера):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;VAULT_ADDR=http://vault:8200
KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl --request POST --data &amp;#039;{&amp;quot;jwt&amp;quot;: &amp;quot;&amp;#039;$KUBE_TOKEN&amp;#039;&amp;quot;, &amp;quot;role&amp;quot;: &amp;quot;otus&amp;quot;}&amp;#039; $VAULT_ADDR/v1/auth/kubernetes/login | jq
TOKEN=$(curl -k -s --request POST --data &amp;#039;{&amp;quot;jwt&amp;quot;: &amp;quot;&amp;#039;$KUBE_TOKEN&amp;#039;&amp;quot;, &amp;quot;role&amp;quot;: &amp;quot;otus&amp;quot;}&amp;#039; $VAULT_ADDR/v1/auth/kubernetes/login | jq &amp;#039;.auth.client_token&amp;#039; | awk -F\&amp;quot; &amp;#039;{print $2}&amp;#039;)&lt;/pre&gt;

&lt;p&gt;
В итоге у нас должно получиться значение токена:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;echo $TOKEN
s.ZmPegZEMIbB3pzBavjSWDLab&lt;/pre&gt;

&lt;p&gt;
И теперь с помощью этого токена можно почитать секреты:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl --header &amp;quot;X-Vault-Token:s.pPjvLHcbKsNoWo7zAAuhMoVK&amp;quot; $VAULT_ADDR/v1/otus/otus-ro/config
curl --header &amp;quot;X-Vault-Token:s.pPjvLHcbKsNoWo7zAAuhMoVK&amp;quot; $VAULT_ADDR/v1/otus/otus-rw/config&lt;/pre&gt;

&lt;p&gt;
или записать секреты:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl --request POST --data &amp;#039;{&amp;quot;bar&amp;quot;: &amp;quot;baz&amp;quot;}&amp;#039; --header &amp;quot;X-Vault-Token:s.pPjvLHcbKsNoWo7zAAuhMoVK&amp;quot; $VAULT_ADDR/v1/otus/otus-rw/config&lt;/pre&gt;

&lt;p&gt;
Теперь можно сконфигурировать тестовый под, который сможет забрать секреты из Vault. Объекты создадим на базе примеров: &lt;a href=&quot;https://github.com/hashicorp/vault-guides/tree/master/identity/vault-agent-k8s-demo&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/hashicorp/vault-guides/tree/master/identity/vault-agent-k8s-demo&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/hashicorp/vault-guides/tree/master/identity/vault-agent-k8s-demo&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 pod&amp;#039;\u0430 \u0432 Vault&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430_\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438_\u0438_\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438_pod_\u0430_\u0432_vault&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;7147-9290&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;configmap&quot;&gt;Configmap&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: v1
data:
  vault-agent-config.hcl: |
    # Comment this out if running as sidecar instead of initContainer
    exit_after_auth = true

    pid_file = &amp;quot;/home/vault/pidfile&amp;quot;

    auto_auth {
        method &amp;quot;kubernetes&amp;quot; {
            mount_path = &amp;quot;auth/kubernetes&amp;quot;
            config = {
                role = &amp;quot;otus&amp;quot;
            }
        }

        sink &amp;quot;file&amp;quot; {
            config = {
                path = &amp;quot;/home/vault/.vault-token&amp;quot;
            }
        }
    }

  consul-template-config.hcl: |
    vault {
      renew_token = false
      vault_agent_token_file = &amp;quot;/home/vault/.vault-token&amp;quot;
      retry {
        backoff = &amp;quot;1s&amp;quot;
      }
    }
    template {
    destination = &amp;quot;/etc/secrets/index.html&amp;quot;
    contents = &amp;lt;&amp;lt;EOT
    &amp;lt;html&amp;gt;
    &amp;lt;body&amp;gt;
    &amp;lt;p&amp;gt;Some secrets:&amp;lt;/p&amp;gt;
    {{- with secret &amp;quot;otus/otus-ro/config&amp;quot; }}
    &amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;pre&amp;gt;username: {{ .Data.username }}&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;pre&amp;gt;password: {{ .Data.password }}&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    {{ end }}
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
    EOT
    }
kind: ConfigMap
metadata:
  name: example-vault-agent-config
  namespace: vault
EOF&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Configmap&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;configmap&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;9291-10444&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit8&quot; id=&quot;pod&quot;&gt;pod&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: v1
kind: Pod
metadata:
  name: vault-agent-example
  namespace: vault
spec:
  serviceAccountName: vault-auth

  volumes:
  - configMap:
      items:
      - key: vault-agent-config.hcl
        path: vault-agent-config.hcl
      - key: consul-template-config.hcl
        path: consul-template-config.hcl
      name: example-vault-agent-config
    name: config
  - emptyDir: {}
    name: shared-data
  - emptyDir: {}
    name: vault-token    

  initContainers:
  - args:
    - agent
    - -config=/etc/vault/vault-agent-config.hcl
    - -log-level=debug
    env:
    - name: VAULT_ADDR
      value: http://vault:8200
    image: vault
    name: vault-agent
    volumeMounts:
    - mountPath: /etc/vault
      name: config
    - name: vault-token
      mountPath: /home/vault

  containers:
  - image: nginx
    name: nginx-container
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: shared-data

  - name: consul-template
    image: hashicorp/consul-template:alpine
    imagePullPolicy: Always
    volumeMounts:
      - name: vault-token
        mountPath: /home/vault
      - name: config
        mountPath: /etc/consul-template
      - name: shared-data
        mountPath: /etc/secrets
    env:
      - name: HOME
        value: /home/vault
      - name: VAULT_ADDR
        value: http://vault:8200
    args: [&amp;quot;-config=/etc/consul-template/consul-template-config.hcl&amp;quot;]
EOF&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;pod&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;pod&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;10445-11938&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit9&quot; id=&quot;запуск_certification_authority_на_базе_vault&quot;&gt;Запуск Certification Authority на базе Vault&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.vaultproject.io/docs/secrets/pki&quot; class=&quot;urlextern&quot; title=&quot;https://www.vaultproject.io/docs/secrets/pki&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.vaultproject.io/docs/secrets/pki&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u043f\u0443\u0441\u043a Certification Authority \u043d\u0430 \u0431\u0430\u0437\u0435 Vault&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u043f\u0443\u0441\u043a_certification_authority_\u043d\u0430_\u0431\u0430\u0437\u0435_vault&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;11939-12054&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit10&quot; id=&quot;создадим_ca_на_базе_vault&quot;&gt;создадим CA на базе vault&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Включим секреты pki и сконфигурирум некоторые параметры:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault secrets enable pki
kubectl exec -it -n vault vault-0 -- vault secrets tune -max-lease-ttl=87600h pki&lt;/pre&gt;

&lt;p&gt;
Сгенерируем сертификат CA:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault write -field=certificate pki/root/generate/internal common_name=&amp;quot;example.ru&amp;quot; ttl=87600h &amp;gt; CA_cert.crt&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c CA \u043d\u0430 \u0431\u0430\u0437\u0435 vault&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c_ca_\u043d\u0430_\u0431\u0430\u0437\u0435_vault&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;12055-12553&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit11&quot; id=&quot;пропишем_ссылки_для_ca_и_проверки_отозванных_сертификатов&quot;&gt;Пропишем ссылки для CA и проверки отозванных сертификатов&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault write pki/config/urls issuing_certificates=&amp;quot;http://vault:8200/v1/pki/ca&amp;quot; сrl_distribution_points=&amp;quot;http://vault:8200/v1/pki/crl&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u0434\u043b\u044f CA \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c_\u0441\u0441\u044b\u043b\u043a\u0438_\u0434\u043b\u044f_ca_\u0438_\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438_\u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0445_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;12554-12846&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit12&quot; id=&quot;создадим_промежуточный_сертификат&quot;&gt;Создадим промежуточный сертификат&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault secrets enable --path=pki_int pki
kubectl exec -it -n vault vault-0 -- vault secrets tune -max-lease-ttl=87600h pki_int
kubectl exec -it -n vault vault-0 -- vault write -format=json pki_int/intermediate/generate/internal common_name=&amp;quot;example.ru Intermediate Authority&amp;quot; | jq -r &amp;#039;.data.csr&amp;#039; &amp;gt; pki_intermediate.csr&lt;/pre&gt;

&lt;p&gt;
пропишем промежуточный сертификат в vault:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl cp pki_intermediate.csr -n vault vault-0:/tmp/
kubectl exec -it -n vault vault-0 -- vault write -format=json pki/root/sign-intermediate csr=@/tmp/pki_intermediate.csr format=pem_bundle ttl=&amp;quot;43800h&amp;quot; | jq -r &amp;#039;.data.certificate&amp;#039; &amp;gt; intermediate.cert.pem
kubectl cp intermediate.cert.pem -n vault vault-0:/tmp/
kubectl exec -it -n vault vault-0 -- vault write pki_int/intermediate/set-signed certificate=@/tmp/intermediate.cert.pem&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c_\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;12847-13802&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit13&quot; id=&quot;создадим_и_отзовем_новые_сертификаты&quot;&gt;Создадим и отзовем новые сертификаты&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Создадим роль для выдачи сертификатов
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault write pki_int/roles/example-dot-ru allowed_domains=&amp;quot;example.ru&amp;quot; allow_subdomains=true max_ttl=&amp;quot;720h&amp;quot;&lt;/pre&gt;

&lt;p&gt;
Создадим и отзовем сертификат
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it -n vault vault-0 -- vault write pki_int/issue/example-dot-ru common_name=&amp;quot;test.example.ru&amp;quot; ttl=&amp;quot;24h&amp;quot;
kubectl exec -it -n vault vault-0 -- vault write pki_int/revoke serial_number=&amp;quot;71:a8:4f:4c:bd:74:c6:d8:ea:27:64:cb:53:ef:80:1a:6b:c8:be:e3&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u043e\u0442\u0437\u043e\u0432\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c_\u0438_\u043e\u0442\u0437\u043e\u0432\u0435\u043c_\u043d\u043e\u0432\u044b\u0435_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;13803-14421&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit14&quot; id=&quot;автоматическое_обновление_сертификатов_с_помощью_consul-template&quot;&gt;Автоматическое обновление сертификатов с помощью consul-template&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://medium.com/hashicorp-engineering/certificates-issuing-and-renewal-with-vault-and-consul-template-18e766228dac&quot; class=&quot;urlextern&quot; title=&quot;https://medium.com/hashicorp-engineering/certificates-issuing-and-renewal-with-vault-and-consul-template-18e766228dac&quot; rel=&quot;ugc nofollow&quot;&gt;https://medium.com/hashicorp-engineering/certificates-issuing-and-renewal-with-vault-and-consul-template-18e766228dac&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://learn.hashicorp.com/tutorials/nomad/vault-pki-nomad&quot; class=&quot;urlextern&quot; title=&quot;https://learn.hashicorp.com/tutorials/nomad/vault-pki-nomad&quot; rel=&quot;ugc nofollow&quot;&gt;https://learn.hashicorp.com/tutorials/nomad/vault-pki-nomad&lt;/a&gt; &lt;br/&gt;

Как все работает.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 в деплойменте пода помимио прикладного контейнера (&lt;strong&gt;nginx&lt;/strong&gt;) прописываются два дополнительных контейнера. Первый - &lt;strong&gt;init&lt;/strong&gt;-контейнер &lt;strong&gt;vault-agent&lt;/strong&gt;, который берет конфигурацию из конфигмапа и получает токен. Этот токен в дальнейшем использует второй контейнер - &lt;strong&gt;consul-template&lt;/strong&gt;, который занимается тем, что обновляет данные в соответствии с темплейтом записаным в конфигмап. Обновленные данные он кладет в папку, которая смонтирована в него и в прикладной под с &lt;strong&gt;nginx&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Для того, чтобы все работало в &lt;strong&gt;Vault&lt;/strong&gt; должна быть заведена политика, которая бы разрешала доступ для заданной роли в путь, где выпускаются сертификаты.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Создадим файл политики, которая разрешить выпуск сертификатов с помощью промежуточного &lt;strong&gt;CA&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;tee cert_issue_policy.hcl &amp;lt;&amp;lt;EOF
path &amp;quot;pki_int/issue/*&amp;quot; {
    capabilities = [&amp;quot;create&amp;quot;, &amp;quot;read&amp;quot;, &amp;quot;update&amp;quot;, &amp;quot;list&amp;quot;]
}
EOF&lt;/pre&gt;

&lt;p&gt;
скопируем файл политики в &lt;strong&gt;vault&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n vault cp cert_issue_policy.hcl vault-0:/tmp/&lt;/pre&gt;

&lt;p&gt;
и создадим с него помощью политику:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n vault exec -it vault-0 -- vault policy write cert-issue-policy /tmp/cert_issue_policy.hcl&lt;/pre&gt;

&lt;p&gt;
а также - создадим роль в &lt;strong&gt;vault&lt;/strong&gt;, которую привяжем к ServiceAccount (с правами которого будет работать pod) и назначим этой роли созданную ранее политику, разрешающую выпуск сертов:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n vault exec -it vault-0 -- vault write auth/kubernetes/role/cert-issue-role bound_service_account_names=vault-auth bound_service_account_namespaces=vault policies=cert-issue-policy ttl=24h&lt;/pre&gt;

&lt;p&gt;
А теперь создадим объекты в K8S.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e consul-template&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435_\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_consul-template&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;14422-17022&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit15&quot; id=&quot;configmap1&quot;&gt;configmap&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Конфигмап содержит три конфига:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 для &lt;strong&gt;init&lt;/strong&gt;-контейнера &lt;strong&gt;vault-agent&lt;/strong&gt;, который аутентифицируется с помощью &lt;strong&gt;ServiceAccount&lt;/strong&gt; и получит токен для контейнера &lt;strong&gt;consul-template&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 для &lt;strong&gt;consul-template&lt;/strong&gt;в котором описано где взять токен, поученный &lt;strong&gt;vault-agent&lt;/strong&gt;, что именно забрать из &lt;strong&gt;vault&lt;/strong&gt; (сертификат и ключ), куда это потом положить (в файлы) и что сделать после этого (послать сигнал nginx для обновления конфига).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 конфиг &lt;strong&gt;nginx&lt;/strong&gt;, в котором настроен HTTPS-сервер, использующий файлы сертификата и ключа, полученные из &lt;strong&gt;Vault&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-cert-renew-config
  namespace: vault
data:
  vault-agent-config.hcl: |
    # Comment this out if running as sidecar instead of initContainer
    exit_after_auth = true

    pid_file = &amp;quot;/home/vault/pidfile&amp;quot;

    auto_auth {
        method &amp;quot;kubernetes&amp;quot; {
            mount_path = &amp;quot;auth/kubernetes&amp;quot;
            config = {
                role = &amp;quot;cert-issue-role&amp;quot;
            }
        }

        sink &amp;quot;file&amp;quot; {
            config = {
                path = &amp;quot;/home/vault/.vault-token&amp;quot;
            }
        }
    }

  consul-template-config.hcl: |
    vault {
      renew_token = false
      vault_agent_token_file = &amp;quot;/home/vault/.vault-token&amp;quot;
      retry {
        backoff = &amp;quot;1s&amp;quot;
      }
    }

    template {
        contents = &amp;quot;{{ with secret \&amp;quot;pki_int/issue/example-dot-ru\&amp;quot; \&amp;quot;common_name=test.example.ru\&amp;quot; \&amp;quot;ttl=2m\&amp;quot;}}{{ .Data.certificate }}{{ end }}&amp;quot;
        destination=&amp;quot;/etc/secrets/tls.crt&amp;quot;
        command=&amp;quot;sh -c &amp;#039;killall -s HUP nginx || true&amp;#039;&amp;quot;
    }
    template {
        contents = &amp;quot;{{ with secret \&amp;quot;pki_int/issue/example-dot-ru\&amp;quot; \&amp;quot;common_name=test.example.ru\&amp;quot; \&amp;quot;ttl=2m\&amp;quot;}}{{ .Data.private_key }}{{ end }}&amp;quot;
        destination=&amp;quot;/etc/secrets/tls.key&amp;quot;
    }
    template {
        contents = &amp;quot;{{ with secret \&amp;quot;pki_int/issue/example-dot-ru\&amp;quot; \&amp;quot;common_name=test.example.ru\&amp;quot; \&amp;quot;ttl=2m\&amp;quot;}}{{ .Data.issuing_ca }}{{ end }}&amp;quot;
        destination=&amp;quot;/etc/secrets/int_ca.crt&amp;quot;
    }

  nginx_ssl.conf: |
    server {
      listen              443 ssl;
      server_name         test.example.ru;
      ssl_certificate     /etc/nginx/ssl/tls.crt;
      ssl_certificate_key /etc/nginx/ssl/tls.key;
      ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers         HIGH:!aNULL:!MD5;

      location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
      }
    }&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;configmap&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;configmap1&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:15,&amp;quot;range&amp;quot;:&amp;quot;17023-19782&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit16&quot; id=&quot;pod1&quot;&gt;Pod&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Манифест Pod&amp;#039;а с тремя контейнерами:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Pod
metadata:
  name: nginx-cert-renew-example
  namespace: vault
  labels:
    app: nginx
spec:
  shareProcessNamespace: true
  serviceAccountName: vault-auth
  volumes:
  - configMap:
      items:
      - key: vault-agent-config.hcl
        path: vault-agent-config.hcl
      - key: consul-template-config.hcl
        path: consul-template-config.hcl
      name: nginx-cert-renew-config
    name: config
  - configMap:
      items:
      - key: nginx_ssl.conf
        path: nginx_ssl.conf
      name: nginx-cert-renew-config
    name: nginx-config
  - emptyDir: {}
    name: shared-data
  - emptyDir: {}
    name: vault-token    

  initContainers:
  - args:
    - agent
    - -config=/etc/vault/vault-agent-config.hcl
    - -log-level=debug
    env:
    - name: VAULT_ADDR
      value: http://vault:8200
    image: vault
    imagePullPolicy: IfNotPresent
    name: vault-agent
    volumeMounts:
    - mountPath: /etc/vault
      name: config
    - name: vault-token
      mountPath: /home/vault

  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: nginx-container
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /etc/nginx/ssl/
      name: shared-data
    - mountPath: /etc/nginx/conf.d/
      name: nginx-config
  - name: consul-template
    image: hashicorp/consul-template:alpine
    imagePullPolicy: IfNotPresent
    securityContext:
      runAsUser: 0
      capabilities:
        add:
        - SYS_PTRACE
    volumeMounts:
      - name: vault-token
        mountPath: /home/vault
      - name: config
        mountPath: /etc/consul-template
      - name: shared-data
        mountPath: /etc/secrets
    env:
      - name: HOME
        value: /home/vault
      - name: VAULT_ADDR
        value: http://vault:8200
    args: [&amp;quot;-config=/etc/consul-template/consul-template-config.hcl&amp;quot;]&lt;/pre&gt;

&lt;p&gt;
Тут стоит обратить внимание на:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;shareProcessNamespace: true&lt;/pre&gt;

&lt;p&gt;
Эта конструкция позволяет иметь процессам всех контейнеров общий &lt;strong&gt;namespace&lt;/strong&gt;, чтобы можно было управлять процессом &lt;strong&gt;nginx&lt;/strong&gt; из контейнера &lt;strong&gt;consul-template&lt;/strong&gt;. &lt;br/&gt;

Также важно, чтобы у контейнера consul-template был такой &lt;strong&gt;securityContext&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  securityContext:
    runAsUser: 0
    capabilities:
      add:
      - SYS_PTRACE&lt;/pre&gt;

&lt;p&gt;
Это значит, что процессы этого контейнера будут исполняться с &lt;strong&gt;id=0&lt;/strong&gt; (то есть иметь права &lt;strong&gt;root&lt;/strong&gt; с точки зрения всех процессов pod&amp;#039;а) и у процессов этого контейнера будут права посылать сигналы в другеи контейнеры (&lt;strong&gt;SYS_PTRACE&lt;/strong&gt;). Подробнее тут - &lt;a href=&quot;https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Pod&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;pod1&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:16,&amp;quot;range&amp;quot;:&amp;quot;19783-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 13 Aug 2020 19:48:12 +0000</pubDate>
        </item>
        <item>
            <title>helm</title>
            <link>https://wiki.autosys.tk/devops/helm</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;создание_чартов_helm&quot;&gt;Создание чартов helm&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://helm.sh/docs/topics/charts/&quot; class=&quot;urlextern&quot; title=&quot;https://helm.sh/docs/topics/charts/&quot; rel=&quot;ugc nofollow&quot;&gt;https://helm.sh/docs/topics/charts/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://helm.sh/docs/chart_template_guide/getting_started/&quot; class=&quot;urlextern&quot; title=&quot;https://helm.sh/docs/chart_template_guide/getting_started/&quot; rel=&quot;ugc nofollow&quot;&gt;https://helm.sh/docs/chart_template_guide/getting_started/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0430\u0440\u0442\u043e\u0432 helm&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0447\u0430\u0440\u0442\u043e\u0432_helm&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-151&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;ошибка_parse_error_atbad_character_u_002d&quot;&gt;Ошибка parse error at ...: bad character U+002D &amp;#039;-&amp;#039;&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Такое происходит, если в имени параметра в &lt;strong&gt;values.yaml&lt;/strong&gt; есть символ “-”. &lt;br/&gt;

Если переименовать параметр невозможно, то подставлять его следует с помощью конструкции &lt;strong&gt;index&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;{{ index .Values &amp;quot;mysub-chart&amp;quot; &amp;quot;servicename&amp;quot; }}&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0448\u0438\u0431\u043a\u0430 parse error at ...: bad character U+002D &amp;#039;-&amp;#039;&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0448\u0438\u0431\u043a\u0430_parse_error_atbad_character_u_002d&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;152-576&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;определение_значений_valuesyaml_через_уже_известные_значения&quot;&gt;Определение значений values.yaml через уже известные значения&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/helm/helm/issues/2492&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/helm/helm/issues/2492&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/helm/helm/issues/2492&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://github.com/helm/helm/issues/2492#issuecomment-589699208&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/helm/helm/issues/2492#issuecomment-589699208&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/helm/helm/issues/2492#issuecomment-589699208&lt;/a&gt; &lt;br/&gt;

Например, у меня есть чарт, который разворачивает кластер &lt;strong&gt;Elasticsearch&lt;/strong&gt; с помощью &lt;strong&gt;Elasticsearch Operator&lt;/strong&gt;. В составе этого чарта есть &lt;strong&gt;subchart&lt;/strong&gt;, который разворачивает &lt;strong&gt;logstash&lt;/strong&gt;. &lt;br/&gt;

В конфигурацию &lt;strong&gt;logstash&lt;/strong&gt; должны попасть путь к &lt;strong&gt;elasticsearch&lt;/strong&gt; и пароль для &lt;strong&gt;basic&lt;/strong&gt;-аутентификации. FQDN-имя, по которому будет доступен &lt;strong&gt;Elastic&lt;/strong&gt; формируется при разворачивании кластера и включает в себя имя релиза ( &lt;strong&gt;.Release.Name&lt;/strong&gt; ), а пароль хотелось бы задать один раз, в одном месте в едином файле &lt;strong&gt;values.yaml&lt;/strong&gt;! &lt;br/&gt;

Задача - сделать так, чтобы значения, определенные для кластера &lt;strong&gt;elasticsaerch&lt;/strong&gt; стали доступны для &lt;strong&gt;logstash&lt;/strong&gt; с минимальными изменениями в коде чарта &lt;strong&gt;logstash&lt;/strong&gt;, а лучше даже и без них!
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 values.yaml \u0447\u0435\u0440\u0435\u0437 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435_\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439_valuesyaml_\u0447\u0435\u0440\u0435\u0437_\u0443\u0436\u0435_\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435_\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;577-1938&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;valuesyaml&quot;&gt;values.yaml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;global:
  internalElasticUserPassword: AG7dGmsZp2NDpRED
  # пароль, который будет установлен для встроенного пользователя elastic.
  # Он будет использован как минимум дважды. Первый раз - при создании секрета с паролем пользователя в основном чарте кластера elasticsearch.
  # И второй раз - для создания переменной окружения logstash, которая будет использована в конфигурации output.
#.....
logstash:
  image:
    tag: |-
      {{ .Chart.AppVersion }}
      
  config:
    ELASTIC_PASSWORD: |-
      {{ tpl (printf &amp;quot;%s&amp;quot; .Values.global.internalElasticUserPassword) $ }}
    queue.max_bytes: 1gb
    queue.type: memory
    
  elasticsearch:
    host: |-
      {{ tpl (printf &amp;quot;%s%s%s%s&amp;quot; .Release.Name &amp;quot;-es-http.&amp;quot; .Release.Namespace &amp;quot;.svc.cluster.local&amp;quot; ) $  }}
    port: 9200

  outputs:
    main: |-
      output {
              elasticsearch {
                  hosts =&amp;gt; [&amp;quot;${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}&amp;quot;]
                  index =&amp;gt; &amp;quot;etl-%{+YYYY.MM.dd}&amp;quot;
                  user =&amp;gt; &amp;quot;elastic&amp;quot;
                  password =&amp;gt; &amp;quot;${ELASTIC_PASSWORD}&amp;quot;
                  ssl =&amp;gt; true
                  ssl_certificate_verification =&amp;gt; false
              }
      }&lt;/pre&gt;

&lt;p&gt;
а в &lt;strong&gt;statefullset.yaml&lt;/strong&gt; субчарта &lt;strong&gt;logstash&lt;/strong&gt; приводим соответствующие строки к такому виду:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;        - name: {{ .Chart.Name }}
          image: &amp;quot;{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}&amp;quot;
          
            ## Elasticsearch output
            - name: ELASTICSEARCH_HOST
              value: {{ tpl (.Values.elasticsearch.host | toString) . | quote }}
            
            ####
            
          {{- range $key, $value := .Values.config }}
            - name: {{ $key | upper | replace &amp;quot;.&amp;quot; &amp;quot;_&amp;quot; }}
              value: {{ tpl ($value | toString ) $ | quote }}
          {{- end }}&lt;/pre&gt;

&lt;p&gt;
То есть строки, указанные в &lt;strong&gt;values&lt;/strong&gt; интерпретируются с помощью функции &lt;strong&gt;tpl&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;values.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;valuesyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1939-4195&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;templating_in_values_hack&quot;&gt;templating in values hack&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Например, у меня есть набор &lt;strong&gt;volumes&lt;/strong&gt;, которые я хотел бы добавить к &lt;strong&gt;deployment&lt;/strong&gt;, в именах которых присутствует название релиза - &lt;a href=&quot;https://wiki.autosys.tk/_media/devops/release.name&quot; class=&quot;media mediafile mf_name wikilink2&quot; title=&quot;devops:release.name&quot;&gt;release.name&lt;/a&gt;. Стандартными средствами &lt;strong&gt;helm&lt;/strong&gt; не позволяет темплейтинг в &lt;strong&gt;values.yaml&lt;/strong&gt;, поэтому можно применить такой хак: &lt;br/&gt;

В темплейте &lt;strong&gt;deployment&lt;/strong&gt;&amp;#039;а пишем такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;{{- if .Values.volumes }}
{{- with .Values.volumes }}
{{/*      volumes: {{ toYaml .Values.volumes | nindent 8 }}*/}}
      volumes:
      {{- tpl . $ | nindent 8 }}
{{- end }}
{{- end }}&lt;/pre&gt;

&lt;p&gt;
а в &lt;strong&gt;values&lt;/strong&gt; пишем такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  volumes: |
    - name: volume1
      configMap:
        name: {{ .Release.Name }}-config1
    - name: volume2
      configMap:
        name: {{ .Release.Name }}-config2
    - name: volume3
      configMap:
        name: {{ .Release.Name }}-config3&lt;/pre&gt;

&lt;p&gt;
В итоге - в &lt;strong&gt;deployment&lt;/strong&gt; попадут 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;templating in values hack&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;templating_in_values_hack&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;4196-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 23 Mar 2021 11:32:14 +0000</pubDate>
        </item>
        <item>
            <title>ingress_413_request_entity_too_large</title>
            <link>https://wiki.autosys.tk/devops/ingress_413_request_entity_too_large</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;проблема&quot;&gt;Проблема&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
При &lt;strong&gt;upload&lt;/strong&gt;&amp;#039;е через &lt;strong&gt;Ingress&lt;/strong&gt; наблюдаю ошибку:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;413 Request Entity Too Large&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-137&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;решение&quot;&gt;Решение&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
В раздел &lt;strong&gt;annotations&lt;/strong&gt; декларации &lt;strong&gt;ingress&lt;/strong&gt;&amp;#039;а нужно добавить:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: &amp;quot;0&amp;quot;
    nginx.ingress.kubernetes.io/proxy-read-timeout: &amp;quot;3600&amp;quot;
    nginx.ingress.kubernetes.io/proxy-send-timeout: &amp;quot;3600&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0448\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0448\u0435\u043d\u0438\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;138-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 14 Nov 2019 12:02:07 +0000</pubDate>
        </item>
        <item>
            <title>java_app_cd_pipeline_with_jenkins</title>
            <link>https://wiki.autosys.tk/devops/java_app_cd_pipeline_with_jenkins</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;о_чем_это&quot;&gt;О чем это&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Автоматизация сборки &lt;strong&gt;Java&lt;/strong&gt;-приложения с помощью &lt;strong&gt;Jenkins&lt;/strong&gt; в кластере &lt;strong&gt;Kubernetes&lt;/strong&gt; &lt;br/&gt;

Вариация на тему туториалов:
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://jenkins.io/doc/tutorials/build-a-java-app-with-maven/&quot; class=&quot;urlextern&quot; title=&quot;https://jenkins.io/doc/tutorials/build-a-java-app-with-maven/&quot; rel=&quot;ugc nofollow&quot;&gt;https://jenkins.io/doc/tutorials/build-a-java-app-with-maven/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://akomljen.com/set-up-a-jenkins-ci-cd-pipeline-with-kubernetes/&quot; class=&quot;urlextern&quot; title=&quot;https://akomljen.com/set-up-a-jenkins-ci-cd-pipeline-with-kubernetes/&quot; rel=&quot;ugc nofollow&quot;&gt;https://akomljen.com/set-up-a-jenkins-ci-cd-pipeline-with-kubernetes/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://kublr.com/blog/cicd-pipeline-with-jenkins-nexus-kubernetes/&quot; class=&quot;urlextern&quot; title=&quot;https://kublr.com/blog/cicd-pipeline-with-jenkins-nexus-kubernetes/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kublr.com/blog/cicd-pipeline-with-jenkins-nexus-kubernetes/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://pushbuildtestdeploy.com/jenkins-on-kubernetes-building-docker-images/&quot; class=&quot;urlextern&quot; title=&quot;https://pushbuildtestdeploy.com/jenkins-on-kubernetes-building-docker-images/&quot; rel=&quot;ugc nofollow&quot;&gt;https://pushbuildtestdeploy.com/jenkins-on-kubernetes-building-docker-images/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e \u0447\u0435\u043c \u044d\u0442\u043e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e_\u0447\u0435\u043c_\u044d\u0442\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-517&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;установка_jenkins_в_кластер_kubernetes&quot;&gt;Установка Jenkins в кластер Kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://wiki.autosys.tk/devops/setup_jenkins_on_kubernetes&quot; class=&quot;wikilink1&quot; title=&quot;devops:setup_jenkins_on_kubernetes&quot; data-wiki-id=&quot;devops:setup_jenkins_on_kubernetes&quot;&gt;Установка Jenkins в кластер Kubernetes с помощью helm&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Jenkins \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_jenkins_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;518-705&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;настройка_jenkins_для_работы_в_кластере_kubernetes&quot;&gt;Настройка jenkins для работы в кластере kubernetes&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.oracle.com/webfolder/technetwork/tutorials/obe/oci/configure_jenkins_kubernetes_plugin/configurekubernetesplugin.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.oracle.com/webfolder/technetwork/tutorials/obe/oci/configure_jenkins_kubernetes_plugin/configurekubernetesplugin.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.oracle.com/webfolder/technetwork/tutorials/obe/oci/configure_jenkins_kubernetes_plugin/configurekubernetesplugin.html&lt;/a&gt; &lt;br/&gt;

&lt;br/&gt;

Если разворачивание &lt;strong&gt;jenkins&lt;/strong&gt; осуществлялось с помощью &lt;strong&gt;helm&lt;/strong&gt;, то в кластере &lt;strong&gt;kubernetes&lt;/strong&gt; уже все настроено (&lt;strong&gt;service account&lt;/strong&gt; и прочее). &lt;br/&gt;

Чтобы запускать конвейеры в кластере &lt;strong&gt;kubernetes&lt;/strong&gt; достаточно в разделе &lt;strong&gt;Cloud&lt;/strong&gt; настроить:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В поле &lt;strong&gt;Name&lt;/strong&gt; - &lt;strong&gt;kubernetes&lt;/strong&gt;. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В поле &lt;strong&gt;Kubernetes &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt; указать &lt;strong&gt;&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt;, где доступен &lt;strong&gt;Kubernetes &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt;,
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;kubectl cluster-info | grep &amp;#039;Kubernetes master&amp;#039;&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Если кластер развернут с самоподписанными сертификатами - нужно добавить корневой сертификат &lt;strong&gt;/etc/kubernetes/pki/ca.crt&lt;/strong&gt; с &lt;strong&gt;master&lt;/strong&gt;-ноды &lt;strong&gt;kubernetes&lt;/strong&gt; в &lt;strong&gt;docker&lt;/strong&gt;-образ &lt;strong&gt;jenkins&lt;/strong&gt; и прописать в &lt;strong&gt;Kubernetes server certificate key&lt;/strong&gt; - сертификат &lt;strong&gt;master&lt;/strong&gt;-ноды &lt;strong&gt;kubernetes&lt;/strong&gt;. ИЛИ просто  поставить галочку &lt;strong&gt;Disable https certificate check&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;cat ~/.kube/config | grep certificate-authority-data: | cut -d: -f2 | tr -d &amp;#039; &amp;#039; | base64 -d&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 нажать &lt;strong&gt;Test Connection&lt;/strong&gt;. В ответ будет &lt;strong&gt;Connection test successful&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В поле &lt;strong&gt;Jenkins &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt; вставить &lt;strong&gt;&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt;, на котором доступна &lt;strong&gt;master&lt;/strong&gt;-нода &lt;strong&gt;Jenkins&lt;/strong&gt; (внешний &lt;strong&gt;&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt;, на котором доступна &lt;strong&gt;master&lt;/strong&gt;-нода, либо актуальный &lt;strong&gt;&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt; сервиса &lt;strong&gt;jenkins&lt;/strong&gt; в кластере). Если там будет неверный &lt;strong&gt;&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt;, то в логах запускаемых &lt;strong&gt;pod&lt;/strong&gt;&amp;#039;ов будут ошибки типа &lt;strong&gt;SEVERE: Failed to connect to &lt;a href=&quot;http://jenkins.jenkins.svc.cluster.local:8080/tcpSlaveAgentListener/&quot; class=&quot;urlextern&quot; title=&quot;http://jenkins.jenkins.svc.cluster.local:8080/tcpSlaveAgentListener/&quot; rel=&quot;ugc nofollow&quot;&gt;http://jenkins.jenkins.svc.cluster.local:8080/tcpSlaveAgentListener/&lt;/a&gt;: connect timed out&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В разделе &lt;strong&gt;Pod Templates&lt;/strong&gt; → &lt;strong&gt;Containers&lt;/strong&gt; → &lt;strong&gt;EnvVars&lt;/strong&gt; по-умолчанию прописана единственная переменная - &lt;strong&gt;JENKINS_&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt;. Ей нужно либо дать актуальное значение (внешний &lt;strong&gt;&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt;, на котором доступна &lt;strong&gt;master&lt;/strong&gt;-нода, либо актуальный &lt;strong&gt;Jenkins &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt; сервиса в кластере), либо просто удалить, потому как &lt;strong&gt;Jenkins &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt; в текущей версии задается на уровне плагина.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Также нужно обратить внимание на значение &lt;strong&gt;Pod Templates&lt;/strong&gt; → &lt;strong&gt;Labels&lt;/strong&gt;. Метки должны быть одинаковые в &lt;strong&gt;Pod Templates&lt;/strong&gt; и в конфигурации конвейера.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 jenkins \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_jenkins_\u0434\u043b\u044f_\u0440\u0430\u0431\u043e\u0442\u044b_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;706-3601&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;проверка_работоспособности_плагина_jenkins_kubernetes&quot;&gt;Проверка работоспособности плагина Jenkins kubernetes&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 Jenkins kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430_\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438_\u043f\u043b\u0430\u0433\u0438\u043d\u0430_jenkins_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;3602-3699&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit5&quot; id=&quot;freestyle_project&quot;&gt;Freestyle project&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
При использовании типа &lt;strong&gt;Freestyle Project&lt;/strong&gt; пайплайн конфигурируется из web-интерфейса.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; На главной страничке web-интерфейса &lt;strong&gt;Jenkins&lt;/strong&gt; жмем &lt;strong&gt;New Item&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Даем проекту имя (например - test)&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Выбираем тип - &lt;strong&gt;Freestyle project&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; На вкладке &lt;strong&gt;General&lt;/strong&gt; ставим галку &lt;strong&gt;Restrict where this project can be run&lt;/strong&gt;, а в поле &lt;strong&gt;Label Expression&lt;/strong&gt; вводим метку, указанную в параметре &lt;strong&gt;Pod Templates&lt;/strong&gt; → &lt;strong&gt;Labels&lt;/strong&gt;. Если метка введена корректная, то под полем будет напись примерно такая:&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;code&quot;&gt;Label TEST is serviced by no nodes and 1 cloud. Permissions or other restrictions provided by plugins may prevent this job from running on those nodes.&lt;/pre&gt;

&lt;p&gt;
А если нод/агентов с такой меткой не найдено, то подсказочка:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;There’s no agent/cloud that matches this assignment. Did you mean ‘TEST’ instead of ‘TEST2’?&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Затем нужно на вкладке (в разделе) &lt;strong&gt;Build&lt;/strong&gt; кликнуть &lt;strong&gt;Add build step&lt;/strong&gt; и выбрать &lt;strong&gt;Execute shell&lt;/strong&gt;, а затем ввести:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;echo &amp;#039;hello world&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Теперь можно нажать &lt;strong&gt;Save&lt;/strong&gt; и запустить конвейер - &lt;strong&gt;Build Now&lt;/strong&gt;, а затем наблюдать за прогрессом.&lt;br/&gt;

Слева в меню появится выполняющееся задание. Можно нажать на него и выбрать &lt;strong&gt;Console Output&lt;/strong&gt;, где будет видно &lt;strong&gt;yaml&lt;/strong&gt;-декларация &lt;strong&gt;pod&lt;/strong&gt;&amp;#039;а и в конце:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Building remotely on jenkins-agent-kdslp (TEST) in workspace /home/jenkins/agent/workspace/test2
[test2] $ /bin/sh -xe /tmp/jenkins5492002065026255241.sh
+ echo hello world
hello world
Finished: SUCCESS&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Freestyle project&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;freestyle_project&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3700-5692&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;pipeline&quot;&gt;Pipeline&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Также можно протестировать работу пайплайна в проектах типа &lt;strong&gt;Pipeline&lt;/strong&gt;. В этом случае конвейер описывается с помощью &lt;strong&gt;Jenkinsfile&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 На главной страничке web-интерфейса &lt;strong&gt;Jenkins&lt;/strong&gt; жмем &lt;strong&gt;New Item&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Даем проекту имя (например - test)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Выбираем тип - &lt;strong&gt;Pipeline&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Pipeline&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;pipeline&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;5693-6149&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit7&quot; id=&quot;декларативный_стиль&quot;&gt;Декларативный стиль&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Листаем вниз и в разделе &lt;strong&gt;Pipeline&lt;/strong&gt; выбираем &lt;strong&gt;Pipeline Script&lt;/strong&gt; и вставляем туда скрипт пайплайна в декларативном стиле:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;pipeline {
   agent {
    node {
        label &amp;#039;kube&amp;#039;
    }
   }

   stages {
      stage(&amp;#039;Hello&amp;#039;) {
         steps {
            echo &amp;#039;Hello World&amp;#039;
         }
      }
   }
}&lt;/pre&gt;

&lt;p&gt;
Тут важна строка с меткой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;label &amp;#039;kube&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Эта же метка должна быть в настройках плагина &lt;strong&gt;Kubernetes&lt;/strong&gt; - &lt;strong&gt;Pod Templates&lt;/strong&gt; → &lt;strong&gt;Labels&lt;/strong&gt;. &lt;br/&gt;

Однако, можно переопределить параметры контейнера (&lt;strong&gt;containerTemplate&lt;/strong&gt;), указав их в декларации:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;pipeline {
   agent {
     kubernetes {
       label &amp;#039;build-service-pod&amp;#039;
       containerTemplate {
         name &amp;#039;jnlp&amp;#039;
         image &amp;#039;jenkins/jnlp-slave:3.27-1&amp;#039;
         ttyEnabled true
        }
      }
    }

   stages {
      stage(&amp;#039;Hello&amp;#039;) {
         steps {
            echo &amp;#039;Hello World&amp;#039;
         }
      }&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439_\u0441\u0442\u0438\u043b\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;6150-7279&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit8&quot; id=&quot;императивный_стиль&quot;&gt;Императивный стиль&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
Также можно протестировать скрипт в императивном стиле:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;node(&amp;#039;kube&amp;#039;) {
  stage(&amp;#039;test&amp;#039;) { 
    echo &amp;#039;Hello World&amp;#039;
  }
}&lt;/pre&gt;

&lt;p&gt;
Тут важна строка с меткой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;node(&amp;#039;kube&amp;#039;)&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439_\u0441\u0442\u0438\u043b\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;7280-7569&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit9&quot; id=&quot;исходники_приложения&quot;&gt;Исходники приложения&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Я буду тренироваться на тренировочном java-приложении - &lt;a href=&quot;https://github.com/jenkins-docs/simple-java-maven-app&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/jenkins-docs/simple-java-maven-app&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/jenkins-docs/simple-java-maven-app&lt;/a&gt; &lt;br/&gt;

Нужно взять эти исходники и загрузить на доступный вам &lt;strong&gt;git&lt;/strong&gt;-репозиторий. У меня развернут &lt;strong&gt;GitLab&lt;/strong&gt; и в нем создан пустой проект, но можно обойтись и без сервера &lt;strong&gt;git&lt;/strong&gt;, указывая в качестве адреса локальную папку.&lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone https://github.com/jenkins-docs/simple-java-maven-app
cd simple-java-maven-app/
git remote add autosys https://git.autosys.tk/username/simple-java-maven-app.git
git push -u autosys master&lt;/pre&gt;

&lt;p&gt;
Затем нужно в &lt;strong&gt;GitLab&lt;/strong&gt; сгенерировать для этого проекта &lt;strong&gt;Deploy Token&lt;/strong&gt; (Settings → Repository → Deploy Tokens).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;7570-8520&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit10&quot; id=&quot;создание_jenkins-файла&quot;&gt;Создание Jenkins-файла&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Jenkins-\u0444\u0430\u0439\u043b\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_jenkins-\u0444\u0430\u0439\u043b\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;8521-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 18 Nov 2019 14:53:43 +0000</pubDate>
        </item>
        <item>
            <title>jenkins</title>
            <link>https://wiki.autosys.tk/devops/jenkins</link>
            <description>
&lt;p&gt;
Тут я фиксирую для себя сведения о Jenkins (версии 2 и последующих).
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;терминология&quot;&gt;Терминология&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Node&lt;/strong&gt; (узел) - система (физический сервер, виртуальная машина, контейнер), которая способна выполнять задания Jenkins (в том числе и master). В сценарии конвейера под термином &lt;strong&gt;node&lt;/strong&gt; понимается система с установленным агентом (agent).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Master&lt;/strong&gt; - узел, который хранит настройки конвейеров и управляет запуском задач.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Agent&lt;/strong&gt; (агент, slave) - программный компонент, работающий на узле, управляемый &lt;strong&gt;master&lt;/strong&gt;&amp;#039;ом и выполняющий задания.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Worker&lt;/strong&gt; (исполнитель) - сущность внутри агента, которая непосредственно исполняет задание. У одного агента можент быть несколько исполнителей. Количество исполнителей на узле можно настроить.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Stage&lt;/strong&gt; (этап) - набор действий (шагов) конвейера, объединяемых по смыслу (получение исходников, компиляция, тестирование и т.д.).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;117-1488&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;синтаксис_конвейеров_jenkins&quot;&gt;Синтаксис конвейеров Jenkins&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Jenkins 2 поддерживает два варианта синтаксиса описания конвейеров (Jenkinsfile). 
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043e\u0432 Jenkins&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441_\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043e\u0432_jenkins&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1489-1684&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;сценарный_синтаксис&quot;&gt;Сценарный синтаксис&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Грубо говоря - описание конвейера представляет собой скрипт на языке &lt;strong&gt;Groovy&lt;/strong&gt;. &lt;br/&gt;

Сценарный синтаксис более функционален, по сравнению с декларативным и позвоялет создавать максимально гибкие конвейеры. &lt;br/&gt;

Визуально сценарный конвейер можно определить по конструкциям вида:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;node(&amp;#039;worker&amp;#039;) {
   stage(&amp;#039;Source&amp;#039;) {
   ...
   ...&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0446\u0435\u043d\u0430\u0440\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0446\u0435\u043d\u0430\u0440\u043d\u044b\u0439_\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1685-2300&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;декларативный_синтаксис&quot;&gt;Декларативный синтаксис&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Декларативный способ описания конвейера заключается в объявлении состояний и ожидаемых результатов. &lt;br/&gt;

Декларативный синтаксис напоминает web-интерфейс с заполняемыми формами. Если каких-то необходимых действий не предусмотрено, то их придется дописывать. &lt;br/&gt;

Описание конвейера в декларативном стиле начинается так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;pipeline {
   agent {label:&amp;#039;worker&amp;#039;}
   stages {
      stage(&amp;#039;Source&amp;#039;) {
      ...
      ...&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439_\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2301-3048&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;синтаксис_описания_шагов_конвейера_jenkins&quot;&gt;Синтаксис описания шагов конвейера Jenkins&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
В общем случае - действие описывается его названием, а также набором именованных параметров, которые могут быть обязательными и не обязательными. Для обязательных параметров можно не указывать имя параметра. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0448\u0430\u0433\u043e\u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 Jenkins&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441_\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f_\u0448\u0430\u0433\u043e\u0432_\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430_jenkins&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3049-3520&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;варианты_синтаксиса_шагов_конвейера&quot;&gt;Варианты синтаксиса шагов конвейера&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Полный вариант синтаксиса:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git([branch: &amp;#039;test&amp;#039;, url: &amp;#039;http://github.com/brentlaster/gradle-greetings.git&amp;#039;])&lt;/pre&gt;

&lt;p&gt;
Допускается запись без скобок:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git branch: &amp;#039;test&amp;#039;, url: https://github.com/brentlaster/gradle-greetings.git&lt;/pre&gt;

&lt;p&gt;
Обязательным является только именованный параметр &lt;strong&gt;url&lt;/strong&gt;, поэтому допускается еще более упрощенная запись:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git &amp;#039;https://github.com/brentlaster/gradle-greetings.git&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Если именованный параметр не требуется, то параметром по умолчанию является объект сценария:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;bat ([script: &amp;#039;echo hi&amp;#039;])&lt;/pre&gt;

&lt;p&gt;
или
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;bat &amp;#039;echo hi&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0448\u0430\u0433\u043e\u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b_\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430_\u0448\u0430\u0433\u043e\u0432_\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;3521-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 18 Nov 2019 08:56:05 +0000</pubDate>
        </item>
        <item>
            <title>jvm_memory_limits_in_k8s</title>
            <link>https://wiki.autosys.tk/devops/jvm_memory_limits_in_k8s</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;проблема&quot;&gt;Проблема&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Нагруженный сервис на &lt;strong&gt;Java2&lt;/strong&gt;1 постоянно тыкается в лимит памяти. &lt;br/&gt;

Пляски с &lt;strong&gt;Xmx&lt;/strong&gt; что-то не помогают.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-209&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;что_же_делать&quot;&gt;Что же делать&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Чтобы &lt;strong&gt;JVM&lt;/strong&gt; корректно определяла объем памяти, заданный с помощью &lt;strong&gt;k8s mem limit&lt;/strong&gt; добавляем в опции:&lt;pre class=&quot;code&quot;&gt;-XX:+UseContainerSupport&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Чтобы не возиться с &lt;strong&gt;Xm&lt;/strong&gt;x, а позволить &lt;strong&gt;JVM&lt;/strong&gt; самостоятельно определить сколько надо - добавляем:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;-XX:InitialRAMPercentage=50.0
-XX:MaxRAMPercentage=70.0&lt;/pre&gt;

&lt;p&gt;
 Максимальная цифра 70 - установлена и подтверждена экспериментально. &lt;a href=&quot;https://stackoverflow.com/a/54076834&quot; class=&quot;urlextern&quot; title=&quot;https://stackoverflow.com/a/54076834&quot; rel=&quot;ugc nofollow&quot;&gt;https://stackoverflow.com/a/54076834&lt;/a&gt; и &lt;a href=&quot;https://stackoverflow.com/questions/65114573/java-memory-settings-in-a-docker-container&quot; class=&quot;urlextern&quot; title=&quot;https://stackoverflow.com/questions/65114573/java-memory-settings-in-a-docker-container&quot; rel=&quot;ugc nofollow&quot;&gt;https://stackoverflow.com/questions/65114573/java-memory-settings-in-a-docker-container&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В итоге &lt;strong&gt;Xmx&lt;/strong&gt; вычислится сам по формуле 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;MaxHeapSize = MaxRAM * MaxRAMPercentage / 100% (default MaxRAMPercentage=25)&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Важно учитывать, что если задана &lt;strong&gt;Xmx&lt;/strong&gt;, то &lt;strong&gt;MaxRAMPercentage&lt;/strong&gt; не используется. 
&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0447\u0442\u043e_\u0436\u0435_\u0434\u0435\u043b\u0430\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;210-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 28 Jan 2025 18:23:08 +0000</pubDate>
        </item>
        <item>
            <title>k3s</title>
            <link>https://wiki.autosys.tk/devops/k3s</link>
            <description>
&lt;p&gt;
Надо пощупать - &lt;a href=&quot;https://k3s.io/&quot; class=&quot;urlextern&quot; title=&quot;https://k3s.io/&quot; rel=&quot;ugc nofollow&quot;&gt;https://k3s.io/&lt;/a&gt; &lt;br/&gt;

K3S - легковесный kubernetes. &lt;br/&gt;

Если у стандартного кубера api-server потребляет минимум 400Mb памяти, то тут обещают всего 100. &lt;br/&gt;

По идее - для построения однонодового кластера на легкой VPS - самое оно. &lt;br/&gt;

&lt;/p&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 17 Aug 2020 18:22:36 +0000</pubDate>
        </item>
        <item>
            <title>k3s_containerd_shim_high_cpu_load</title>
            <link>https://wiki.autosys.tk/devops/k3s_containerd_shim_high_cpu_load</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;проблема&quot;&gt;Проблема&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Есть хост &lt;strong&gt;Debian 12&lt;/strong&gt; с &lt;strong&gt;k3s&lt;/strong&gt; версии - &lt;strong&gt;v1.33.3+k3s1&lt;/strong&gt; . &lt;br/&gt;

На хосте бывает большая нагрузка на проц от процесса &lt;strong&gt;containerd-shim-runc-v2&lt;/strong&gt; &lt;br/&gt;

Надо выяснить - что же за контейнер это делает? &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Поехали. Смотрим путь до бинарника:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ps -aux | grep 3462
root        3462 91.8  0.1 1240124 14692 ?       Sl   Jul31 28967:46 /var/lib/rancher/k3s/data/8460fc4df8e204d507e141d109ea776ef78412e65121eeb3cf7c67ee581d699f/bin/containerd-shim-runc-v2 -namespace k8s.io -id b9c5ed80dfec2738772a5600fba83c5d83ded282e487687ee2ddc7cda896a0e1 -address /run/k3s/containerd/containerd.sock&lt;/pre&gt;

&lt;p&gt;
Берем &lt;strong&gt;id&lt;/strong&gt; контейнера и смотрим что же это:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ctr c info b9c5ed80dfec2738772a5600fba83c5d83ded282e487687ee2ddc7cda896a0e1&lt;/pre&gt;

&lt;p&gt;
В верхней части вывода будут метки контейнера с именем и прочим. 
&lt;/p&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 22 Aug 2025 11:52:20 +0000</pubDate>
        </item>
        <item>
            <title>k8s_actual_container_cpu_memory_consumption</title>
            <link>https://wiki.autosys.tk/devops/k8s_actual_container_cpu_memory_consumption</link>
            <description>
&lt;p&gt;
Актуальное потребление контейнером CPU можно посмотреть так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it podname -- cat /sys/fs/cgroup/cpu/cpuacct.usage&lt;/pre&gt;

&lt;p&gt;
Актуальное потребление контейнером памяти можно посмотреть так:  
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it podname -- cat /sys/fs/cgroup/memory/memory.usage_in_bytes
kubectl exec -it podname -- cat /sys/fs/cgroup/memory.peak&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 01 Apr 2026 19:03:49 +0000</pubDate>
        </item>
        <item>
            <title>k8s_ephemeral_storage_consumption</title>
            <link>https://wiki.autosys.tk/devops/k8s_ephemeral_storage_consumption</link>
            <description>&lt;pre class=&quot;code&quot;&gt;kubectl get --raw &amp;quot;/api/v1/nodes/ip-172-31-92-255.eu-west-1.compute.internal/proxy/stats/summary&amp;quot; | jq -r &amp;#039;
  .pods[] 
  | select(.[&amp;quot;ephemeral-storage&amp;quot;].usedBytes &amp;gt; 1000000) 
  | [
      .podRef.namespace, 
      .podRef.name, 
      ((.[&amp;quot;ephemeral-storage&amp;quot;].usedBytes / 1024 / 1024 | floor | tostring) + &amp;quot; MB&amp;quot;)
    ] 
  | @tsv&amp;#039; | column -t -s $&amp;#039;\t&amp;#039;&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;for NODE in `kubectl get no --no-headers=true -o name | cut -d &amp;#039;/&amp;#039; -f2`; do kubectl get --raw &amp;quot;/api/v1/nodes/${NODE}/proxy/stats/summary&amp;quot; | jq -r &amp;#039;
  .pods[] 
  | select(.[&amp;quot;ephemeral-storage&amp;quot;].usedBytes &amp;gt; 1000000) 
  | [
      .podRef.namespace, 
      .podRef.name, 
      ((.[&amp;quot;ephemeral-storage&amp;quot;].usedBytes / 1024 / 1024 | floor | tostring) + &amp;quot; MB&amp;quot;)
    ] 
  | @tsv&amp;#039; | column -t -s $&amp;#039;\t&amp;#039;; done&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 26 Mar 2026 10:01:23 +0000</pubDate>
        </item>
        <item>
            <title>k8s_hints</title>
            <link>https://wiki.autosys.tk/devops/k8s_hints</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;удалить_все_подики_которые_не_running&quot;&gt;Удалить все подики, которые не Running&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;k get po -A | grep -v Running | grep -v NAME | awk &amp;#039;{print &amp;quot; -n &amp;quot;$1 &amp;quot; &amp;quot; $2}&amp;#039; | while IFS= read -r line; do kubectl delete po $line ; done&lt;/pre&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 01 Apr 2026 20:19:49 +0000</pubDate>
        </item>
        <item>
            <title>kafka_monitoring</title>
            <link>https://wiki.autosys.tk/devops/kafka_monitoring</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://www.datadoghq.com/blog/monitoring-kafka-performance-metrics/&quot; class=&quot;urlextern&quot; title=&quot;https://www.datadoghq.com/blog/monitoring-kafka-performance-metrics/&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.datadoghq.com/blog/monitoring-kafka-performance-metrics/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://kamaok.org.ua/?p=3345&quot; class=&quot;urlextern&quot; title=&quot;https://kamaok.org.ua/?p=3345&quot; rel=&quot;ugc nofollow&quot;&gt;https://kamaok.org.ua/?p=3345&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 22 Jan 2020 11:25:05 +0000</pubDate>
        </item>
        <item>
            <title>kubernetes</title>
            <link>https://wiki.autosys.tk/devops/kubernetes</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://ansilh.com/01-introduction/&quot; class=&quot;urlextern&quot; title=&quot;https://ansilh.com/01-introduction/&quot; rel=&quot;ugc nofollow&quot;&gt;https://ansilh.com/01-introduction/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://ansilh.com/15-k8s_from_sratch/&quot; class=&quot;urlextern&quot; title=&quot;https://ansilh.com/15-k8s_from_sratch/&quot; rel=&quot;ugc nofollow&quot;&gt;https://ansilh.com/15-k8s_from_sratch/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Материалов про kubernetes очень много. В процессе обучения просто я фиксирую для себя то что считаю важным. Это не тутораил и не гайд. Это просто мои заметки.&lt;br/&gt;

&lt;a href=&quot;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&lt;/a&gt;
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;docker&quot;&gt;Docker&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;420-440&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;сборка_контейнера_docker&quot;&gt;Сборка контейнера docker&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Создаем файл &lt;strong&gt;Dockerfile&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;FROM node:7
ADD app.js /app.js
ENTRYPOINT [&amp;quot;node&amp;quot;, &amp;quot;app.js&amp;quot;]&lt;/pre&gt;

&lt;p&gt;
В одной директории с &lt;strong&gt;Dockerfile&lt;/strong&gt; размещаем файл приложения &lt;strong&gt;app.js&lt;/strong&gt; и собираем:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;docker build -t kubia .&lt;/pre&gt;

&lt;p&gt;
Смотрим что контейнер собрался:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;docker images&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0431\u043e\u0440\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0431\u043e\u0440\u043a\u0430_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430_docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;441-843&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;запуск_контейнера_вручную_в_локальном_docker&quot;&gt;Запуск контейнера вручную в локальном Docker&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker run --name kubia-container -p 8080:8080 -d kubia&lt;/pre&gt;

&lt;p&gt;
В результате будет запущен новый контейнер с именем &lt;strong&gt;kubia-container&lt;/strong&gt; из образа &lt;strong&gt;kubia&lt;/strong&gt;. Контейнер будет отсоединен от консоли (флаг -d), а порт 8080 на локальной машине будет увязан с портом 8080 внутри контейнера. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c Docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u043f\u0443\u0441\u043a_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430_\u0432\u0440\u0443\u0447\u043d\u0443\u044e_\u0432_\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c_docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;844-1358&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;список_всех_запущенных_контейнеров_docker&quot;&gt;Список всех запущенных контейнеров docker&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker ps&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_\u0432\u0441\u0435\u0445_\u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432_docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1359-1455&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;получение_дополнительной_информации_о_контейнере_docker&quot;&gt;Получение дополнительной информации о контейнере docker&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker inspect kubia-container&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435_\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439_\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438_\u043e_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435_docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;1456-1600&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;запуск_bash_shell_внутри_существующего_контейнера_docker&quot;&gt;Запуск bash shell внутри существующего контейнера docker&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker exec -it kubia-container bash  
* **-i** убеждается, что STDIN держится открытым для ввода команд в оболочку;
* **-t** выделяет псевдотерминал (TTY).&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u043f\u0443\u0441\u043a bash shell \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u043f\u0443\u0441\u043a_bash_shell_\u0432\u043d\u0443\u0442\u0440\u0438_\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430_docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;1601-1941&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;остановка_и_удаление_контейнера_docker&quot;&gt;Остановка и удаление контейнера docker&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker stop kubia-container
docker rm kubia-container&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_\u0438_\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430_docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;1942-2078&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit8&quot; id=&quot;тегирование_образа_тегом_docker&quot;&gt;Тегирование образа тегом docker&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Образ контейнера может иметь несколько тегов:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;docker tag kubia luksa/kubia&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0430 \u0442\u0435\u0433\u043e\u043c docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u043e\u0431\u0440\u0430\u0437\u0430_\u0442\u0435\u0433\u043e\u043c_docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;2079-2260&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit9&quot; id=&quot;передача_образа_контейнера_docker_в_хранилище_docker_hub&quot;&gt;Передача образа контейнера docker в хранилище docker hub&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker push luksa/kubia&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043e\u0431\u0440\u0430\u0437\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 docker \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 docker hub&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430_\u043e\u0431\u0440\u0430\u0437\u0430_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430_docker_\u0432_\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435_docker_hub&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;2261-2389&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit10&quot; id=&quot;запуск_образа_контейнера_docker_на_другой_машине&quot;&gt;Запуск образа контейнера docker на другой машине&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker run -p 8080:8080 -d luksa/kubia&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u043f\u0443\u0441\u043a \u043e\u0431\u0440\u0430\u0437\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 docker \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u043f\u0443\u0441\u043a_\u043e\u0431\u0440\u0430\u0437\u0430_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430_docker_\u043d\u0430_\u0434\u0440\u0443\u0433\u043e\u0439_\u043c\u0430\u0448\u0438\u043d\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;2390-2527&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit11&quot; id=&quot;просмотр_журналов_контейнера_docker&quot;&gt;Просмотр журналов контейнера docker&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;docker logs &amp;lt;container_ID&amp;gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 docker&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440_\u0436\u0443\u0440\u043d\u0430\u043b\u043e\u0432_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430_docker&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;2528-2631&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit12&quot; id=&quot;запуск_приложения_в_среде_kubernetes&quot;&gt;Запуск приложения в среде kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1&lt;/pre&gt;

&lt;p&gt;
&lt;strong&gt;kubectl run&lt;/strong&gt; создаст все необходимые компоненты без необходимости декларировать компоненты с помощью JSON или YAML. &lt;br/&gt;

&lt;strong&gt;–generator=run/v1&lt;/strong&gt; - нужен для того, чтобы текущая версия kubernetes не создавала &lt;strong&gt;Deployment&lt;/strong&gt;, а создала &lt;strong&gt;ReplicationController&lt;/strong&gt;. 
В результате будет создан &lt;strong&gt;Pod&lt;/strong&gt; с одним контейнером &lt;strong&gt;kubia&lt;/strong&gt;. &lt;br/&gt;

При выполнении команды произошло следующее:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 команда &lt;strong&gt;kubectl&lt;/strong&gt; создала в кластере новый объект контроллера репликации (&lt;strong&gt;ReplicationController&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 контроллер репликации создал новый &lt;strong&gt;Pod&lt;/strong&gt;, который планировщик запланировал для одного из рабочих узлов. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Агент &lt;strong&gt;Kubelet&lt;/strong&gt; на этом узле увидел, что модуль был назначен рабочему узлу, и поручил платформе &lt;strong&gt;Docker&lt;/strong&gt; выгрузить указанный образ из хранилища, После скачивания образа платформа &lt;strong&gt;Docker&lt;/strong&gt; создала и запустила контейнер.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0440\u0435\u0434\u0435 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u043f\u0443\u0441\u043a_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f_\u0432_\u0441\u0440\u0435\u0434\u0435_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:12,&amp;quot;range&amp;quot;:&amp;quot;2632-4102&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit13&quot; id=&quot;получение_списка_pods&quot;&gt;Получение списка pods&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Список pods в дефолтном namespace:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get pods&lt;/pre&gt;

&lt;p&gt;
Список pods в заданном namespace:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n nsname get po&lt;/pre&gt;

&lt;p&gt;
Список pods во всех неймспейсах:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get po -A&lt;/pre&gt;

&lt;p&gt;
Вывод списка Pod&amp;#039;ов с дополнительной информацией:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get pods -o wide&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 pods&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435_\u0441\u043f\u0438\u0441\u043a\u0430_pods&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:13,&amp;quot;range&amp;quot;:&amp;quot;4103-4489&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit14&quot; id=&quot;доступа_к_приложению_в_контейнере_kubernetes_по_сети&quot;&gt;Доступа к приложению в контейнере kubernetes по сети&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Для доступа к приложению используются объекты &lt;strong&gt;Service&lt;/strong&gt;. Они привязывают динамически разворачиваемые экземпляры приложения к статичным IP-адресам и портам:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl expose rc kubia --type=LoadBalancer --name kubia-http &lt;/pre&gt;

&lt;p&gt;
В данном случае - создается объект Service с именем &lt;strong&gt;kubia-http&lt;/strong&gt; типа &lt;strong&gt;LoadBalancer&lt;/strong&gt;, который указывает на экземпляры приложения, за которыми следит &lt;strong&gt;ReplicatioController&lt;/strong&gt; (rc)  с именем &lt;strong&gt;kubia&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 kubernetes \u043f\u043e \u0441\u0435\u0442\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u0441\u0442\u0443\u043f\u0430_\u043a_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e_\u0432_\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435_kubernetes_\u043f\u043e_\u0441\u0435\u0442\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:14,&amp;quot;range&amp;quot;:&amp;quot;4490-5240&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit15&quot; id=&quot;вывод_списка_kubernetes_services&quot;&gt;Вывод списка kubernetes Services&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get services &lt;/pre&gt;

&lt;p&gt;
или 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get svc&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412\u044b\u0432\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 kubernetes Services&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432\u044b\u0432\u043e\u0434_\u0441\u043f\u0438\u0441\u043a\u0430_kubernetes_services&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:15,&amp;quot;range&amp;quot;:&amp;quot;5241-5346&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit16&quot; id=&quot;увеличение_количества_реплик_pod_a&quot;&gt;Увеличение количества реплик pod&amp;#039;a&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Увеличить количество запущенных реплик Pod&amp;#039;а на контроллере репликации:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl scale rc kubia --replicas=3&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0435\u043f\u043b\u0438\u043a pod&amp;#039;a&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435_\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430_\u0440\u0435\u043f\u043b\u0438\u043a_pod_a&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:16,&amp;quot;range&amp;quot;:&amp;quot;5347-5588&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit17&quot; id=&quot;получение_полного_описания_объекта_kubernetes&quot;&gt;Получение полного описания объекта kubernetes&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl describe rc kubia&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435_\u043f\u043e\u043b\u043d\u043e\u0433\u043e_\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f_\u043e\u0431\u044a\u0435\u043a\u0442\u0430_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:17,&amp;quot;range&amp;quot;:&amp;quot;5589-5705&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit18&quot; id=&quot;создание_объекта_kubernetes_с_помощью_файла_описания&quot;&gt;Создание объекта kubernetes с помощью файла описания&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create -f filename.yml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 kubernetes \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u043e\u0431\u044a\u0435\u043a\u0442\u0430_kubernetes_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_\u0444\u0430\u0439\u043b\u0430_\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:18,&amp;quot;range&amp;quot;:&amp;quot;5706-5839&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit19&quot; id=&quot;сеть&quot;&gt;Сеть&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Внутри кластера &lt;strong&gt;kubernetes&lt;/strong&gt; между подами (Pods) сеть плоская. Без шлюзов и трансляциий (nat-snat). &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0435\u0442\u044c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u0442\u044c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:19,&amp;quot;range&amp;quot;:&amp;quot;5840-6023&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit20&quot; id=&quot;под_-_pod&quot;&gt;Под - Pod&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u0434 - Pod&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u0434_-_pod&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:20,&amp;quot;range&amp;quot;:&amp;quot;6024-6050&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit21&quot; id=&quot;базовое_описание_pod_а&quot;&gt;Базовое описание pod&amp;#039;а&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1                     # Версия API
kind: Pod                          # Тип объекта - pod
metadata:                          # Начало секции метаданных
  name: kubia-manual               # имя Pod&amp;#039;a
spec:                              # начало секции спецификации
  containers:                      # начало секции, описывающей контейнеры pod&amp;#039;а
  – image: luksa/kubia             # начало описания первого контейнера. используется образ luksa/kubia 
    name: kubia                    # Имя контейнера в pod&amp;#039;е
    ports:                         # секция портов, используемых приложением в контейнере
    – containerPort: 8080          # номер порта
      protocol: TCP                # используемый протокол&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 pod&amp;#039;\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0431\u0430\u0437\u043e\u0432\u043e\u0435_\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435_pod_\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:21,&amp;quot;range&amp;quot;:&amp;quot;6051-7079&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit22&quot; id=&quot;создание_pod_а_с_помощью_файла_описания&quot;&gt;Создание pod&amp;#039;а с помощью файла описания&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create -f kubia-manual.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 pod&amp;#039;\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_pod_\u0430_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_\u0444\u0430\u0439\u043b\u0430_\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:22,&amp;quot;range&amp;quot;:&amp;quot;7080-7199&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit23&quot; id=&quot;удаление_pod_ов&quot;&gt;Удаление pod&amp;#039;ов&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl delete po kubia-gpu&lt;/pre&gt;

&lt;p&gt;
Или с помощью селектора по метке:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl delete po -l creation_method=manual&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 pod&amp;#039;\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435_pod_\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:23,&amp;quot;range&amp;quot;:&amp;quot;7200-7374&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit24&quot; id=&quot;просмотр_логов_pod_а&quot;&gt;Просмотр логов pod&amp;#039;а&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl logs kubia-manual&lt;/pre&gt;

&lt;p&gt;
Если в pod&amp;#039;е больше одного контейнера, то увидеть логи конкретного контейнера можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl logs kubia-manual -c kubia&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043b\u043e\u0433\u043e\u0432 pod&amp;#039;\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440_\u043b\u043e\u0433\u043e\u0432_pod_\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:24,&amp;quot;range&amp;quot;:&amp;quot;7375-7646&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit25&quot; id=&quot;маппинг_локального_порта_на_порт_в_pod_е_без_использования_service&quot;&gt;Маппинг локального порта на порт в pod&amp;#039;е без использования service&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Иногда для отладки нужно просто сделать так, чтобы порт pod&amp;#039;а стал доступен на локальной машине. Без создания service. Это делается так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl port-forward kubia-manual 8888:8080&lt;/pre&gt;

&lt;p&gt;
В результате приложение pod&amp;#039;а (порт 8080) станет доступно на локальной машине на порте 8888.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 \u043d\u0430 \u043f\u043e\u0440\u0442 \u0432 pod&amp;#039;\u0435 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f service&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u0430\u043f\u043f\u0438\u043d\u0433_\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e_\u043f\u043e\u0440\u0442\u0430_\u043d\u0430_\u043f\u043e\u0440\u0442_\u0432_pod_\u0435_\u0431\u0435\u0437_\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f_service&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:25,&amp;quot;range&amp;quot;:&amp;quot;7647-8213&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit26&quot; id=&quot;метки&quot;&gt;Метки&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Метки могут быть созданы для многих объектов. В примерах рассматриваются pod&amp;#039;ы.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041c\u0435\u0442\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043c\u0435\u0442\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:26,&amp;quot;range&amp;quot;:&amp;quot;8214-8381&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit27&quot; id=&quot;создание_и_изменение_меток_labels&quot;&gt;Создание и изменение меток (labels)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Метки позволяют разделять pod&amp;#039;ы по некоторому признаку и обращаться к ним. &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl label po kubia-manual creation_method=manual&lt;/pre&gt;

&lt;p&gt;
Метки могут быть прописаны в секции метаданных:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual-v2
  labels:
    creation_method: manual
    env: prod&lt;/pre&gt;

&lt;p&gt;
При изменении существующих меток нужно использовать параметр &lt;strong&gt;–overwrite&lt;/strong&gt;.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl label po kubia-manual-v2 env=debug --overwrite&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u043a (labels)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0438_\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435_\u043c\u0435\u0442\u043e\u043a_labels&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:27,&amp;quot;range&amp;quot;:&amp;quot;8382-9047&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit28&quot; id=&quot;список_всех_pod_ов_и_их_меток&quot;&gt;Список всех pod&amp;#039;ов и их меток&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get po --show-labels&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 pod&amp;#039;\u043e\u0432 \u0438 \u0438\u0445 \u043c\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_\u0432\u0441\u0435\u0445_pod_\u043e\u0432_\u0438_\u0438\u0445_\u043c\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:28,&amp;quot;range&amp;quot;:&amp;quot;9048-9140&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit29&quot; id=&quot;список_pod_ов_у_которых_не_установлены_заданные_метки&quot;&gt;Список pod&amp;#039;ов у которых (не)установлены заданные метки&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get po -l creation_method,env
kubectl get po -l &amp;#039;!env&amp;#039;,creation_method&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a pod&amp;#039;\u043e\u0432 \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 (\u043d\u0435)\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_pod_\u043e\u0432_\u0443_\u043a\u043e\u0442\u043e\u0440\u044b\u0445_\u043d\u0435_\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b_\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435_\u043c\u0435\u0442\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:29,&amp;quot;range&amp;quot;:&amp;quot;9141-9332&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit30&quot; id=&quot;список_pod_ов_с_заданными_значениями_меток&quot;&gt;Список pod&amp;#039;ов с заданными значениями меток&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get po -l creation_method=manual&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a pod&amp;#039;\u043e\u0432 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_pod_\u043e\u0432_\u0441_\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438_\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438_\u043c\u0435\u0442\u043e\u043a&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:30,&amp;quot;range&amp;quot;:&amp;quot;9333-9463&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit31&quot; id=&quot;список_pod_ов_со_значениями_меток_отличными_от_заданного&quot;&gt;Список pod&amp;#039;ов со значениями меток отличными от заданного&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get po -l creation_method!=manual&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a pod&amp;#039;\u043e\u0432 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0442\u043e\u043a \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043e\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_pod_\u043e\u0432_\u0441\u043e_\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438_\u043c\u0435\u0442\u043e\u043a_\u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c\u0438_\u043e\u0442_\u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:31,&amp;quot;range&amp;quot;:&amp;quot;9464-9623&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit32&quot; id=&quot;установка_метки_на_узел_node_и_привязка_pod_а_к_нему&quot;&gt;Установка метки на узел (node) и привязка pod&amp;#039;а к нему&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Устанавливаем метку на узел:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl label node gke-kubia-85f6-node-0rrx gpu=true&lt;/pre&gt;

&lt;p&gt;
Описываем привязку в декларации pod&amp;#039;а:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  nodeSelector:
    gpu: &amp;quot;true&amp;quot;                #селектор узла с меткой gpu
  containers:
  – image: luksa/kubia
    name: kubia&lt;/pre&gt;

&lt;p&gt;
Или к узлу с заданным именем:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  nodeSelector:
    kubernetes.io/hostname: &amp;quot;desired.node.hostname&amp;quot;                #селектор узла по его hostname
  containers:
  – image: luksa/kubia
    name: kubia&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u0435\u0442\u043a\u0438 \u043d\u0430 \u0443\u0437\u0435\u043b (node) \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 pod&amp;#039;\u0430 \u043a \u043d\u0435\u043c\u0443&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_\u043c\u0435\u0442\u043a\u0438_\u043d\u0430_\u0443\u0437\u0435\u043b_node_\u0438_\u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430_pod_\u0430_\u043a_\u043d\u0435\u043c\u0443&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:32,&amp;quot;range&amp;quot;:&amp;quot;9624-10441&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit33&quot; id=&quot;пространства_имен_namespaces&quot;&gt;Пространства имен (namespaces)&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d (namespaces)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430_\u0438\u043c\u0435\u043d_namespaces&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:33,&amp;quot;range&amp;quot;:&amp;quot;10442-10502&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit34&quot; id=&quot;список_доступных_пространств_имен_неймспейсов&quot;&gt;Список доступных пространств имен (неймспейсов)&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get ns&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432 \u0438\u043c\u0435\u043d (\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u043e\u0432)&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445_\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432_\u0438\u043c\u0435\u043d_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:34,&amp;quot;range&amp;quot;:&amp;quot;10503-10620&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit35&quot; id=&quot;список_pod_ов_неймспейса&quot;&gt;Список pod&amp;#039;ов неймспейса&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get po --namespace kube-syste&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a pod&amp;#039;\u043e\u0432 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_pod_\u043e\u0432_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:35,&amp;quot;range&amp;quot;:&amp;quot;10621-10715&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit36&quot; id=&quot;создание_неймспейсов&quot;&gt;Создание неймспейсов&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create namespace custom-namespace&lt;/pre&gt;

&lt;p&gt;
Или декларативно с помощью файла yaml:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Namespace
metadata:
  name: custom-namespace&lt;/pre&gt;

&lt;p&gt;
и затем
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create -f custom-namespace.yaml&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:36,&amp;quot;range&amp;quot;:&amp;quot;10716-11008&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit37&quot; id=&quot;создание_объектов_в_заданном_неймспейсе&quot;&gt;Создание объектов в заданном неймспейсе&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create -f kubia-manual.yaml -n custom-namespace&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432_\u0432_\u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:37,&amp;quot;range&amp;quot;:&amp;quot;11009-11153&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit38&quot; id=&quot;переключение_между_неймспейсами&quot;&gt;Переключение между неймспейсами&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl  config  set-context $(kubectl config currentcontext) --namespace custom-namespace&lt;/pre&gt;

&lt;p&gt;
или для быстрого переключения на другое пространство имен можно создать алиас:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;alias  kcd=&amp;#039;kubectl  config  set-context $(kubectl config currentcontext) --namespace &amp;#039;&lt;/pre&gt;

&lt;p&gt;
прописать его в ~/.bash.rc
и затем переключаться между пространствами имен с помощью 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kcd some-namespace&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430\u043c\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435_\u043c\u0435\u0436\u0434\u0443_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430\u043c\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:38,&amp;quot;range&amp;quot;:&amp;quot;11154-11726&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit39&quot; id=&quot;удаление_неймспейса_со_всем_содержимым&quot;&gt;Удаление неймспейса со всем содержимым&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl delete ns custom-namespace&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430 \u0441\u043e \u0432\u0441\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430_\u0441\u043e_\u0432\u0441\u0435\u043c_\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:39,&amp;quot;range&amp;quot;:&amp;quot;11727-11848&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit40&quot; id=&quot;удаление_содержимого_неймспейса_с_сохранением_неймспейса&quot;&gt;Удаление содержимого неймспейса с сохранением неймспейса&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Удаление pod&amp;#039;ов
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl delete po --all&lt;/pre&gt;

&lt;p&gt;
Удаление почти всех ресурсов из неймспейса:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl delete all --all&lt;/pre&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
&lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435_\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430_\u0441_\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:40,&amp;quot;range&amp;quot;:&amp;quot;11849-12195&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit41&quot; id=&quot;глоссарий&quot;&gt;Глоссарий&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Kubernetes&lt;/strong&gt; - система оркестрации контейнеров docker.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Namespace &lt;/strong&gt; - это способ логического деления запускаемых в кластере сущностей. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Nodes&lt;/strong&gt; (node.md): &lt;strong&gt;Нода&lt;/strong&gt; это машина в кластере &lt;strong&gt;Kubernetes&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Pods&lt;/strong&gt; (pods.md): &lt;strong&gt;Pod&lt;/strong&gt; это группа контейнеров с общими разделами, запускаемых как единое целое. Обычно &lt;strong&gt;Pod&lt;/strong&gt; объединет контейнеры, которые всместе выполняют некоторую функцию и не имеют смысла друг без друга. Например, в рамках pod&amp;#039;а процессы разных контейнеров могут общаться друг с другом по сети, используя адреса 127.0.0.1:port. То есть процессы различных контейнеров работают в едином сетевом неймспейсе pod&amp;#039;а. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;ReplicaSet&lt;/strong&gt; - набор экземпляров (реплик) какого-то pod&amp;#039;а. &lt;strong&gt;ReplicaSet&lt;/strong&gt; - это более функциональные &lt;strong&gt;Replication Controllers&lt;/strong&gt;. Сейчас они сосуществуют, но в дальнейшем останутся только &lt;strong&gt;ReplicaSet&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Deployment&lt;/strong&gt; - набор экземпляров pod&amp;#039;а, для которого можно произвести обновление. При обновлении экземпляры будут по одному замещаться новыми версиями (rolling update). Таким образом реализуется &lt;strong&gt;zero downtime&lt;/strong&gt; при обновлениях. Описывается с помощью yml-файла, содержащего спецификации (&lt;abbr title=&quot;specification&quot;&gt;spec&lt;/abbr&gt;).  
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Services&lt;/strong&gt; (services.md): &lt;strong&gt;Сервис&lt;/strong&gt; в &lt;strong&gt;Kubernetes&lt;/strong&gt; это абстракция (описывается yml-файлом) которая определяет логический объединённый набор &lt;strong&gt;pod&lt;/strong&gt; и политику доступа к ним. Например - сервис типа &lt;strong&gt;LoadBalancer&lt;/strong&gt; балансирует нагрузку между подами деплоймента. В простейшем случае - сервис просто пробрасывает порт для доступа к приложению.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Volumes&lt;/strong&gt; (volumes.md): &lt;strong&gt;Volume&lt;/strong&gt;(раздел) это директория, возможно, с данными в ней, которая доступна в контейнере.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Labels&lt;/strong&gt; (labels.md): &lt;strong&gt;Label&lt;/strong&gt;&amp;#039;ы это пары ключ/значение которые прикрепляются к объектам, например &lt;strong&gt;pod&lt;/strong&gt;&amp;#039;ам. &lt;strong&gt;Label&lt;/strong&gt;&amp;#039;ы могут быть использованы для создания и выбора наборов объектов.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Kubectl Command Line Interface&lt;/strong&gt; (kubectl.md): &lt;strong&gt;kubectl&lt;/strong&gt; интерфейс командной строки для управления &lt;strong&gt;Kubernetes&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Config Map&lt;/strong&gt; - yml-файлик, содержащий некоторую конфигурационную информацию (например описание сервера nginx). В дальнейшем, в описании контейнера прописывается &lt;strong&gt;volumeMount&lt;/strong&gt;, с указанием куда смонтируется &lt;strong&gt;volume&lt;/strong&gt;, а также сам &lt;strong&gt;Volume&lt;/strong&gt;, который ссылается на &lt;strong&gt;configmap&lt;/strong&gt;. В результате - содержимое &lt;strong&gt;Config Map&lt;/strong&gt; монтируется в контейнер в файлик в заданную директорию. Инструкции для монтирования содержатся в описании deployment&amp;#039;а или pod&amp;#039;а.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0413\u043b\u043e\u0441\u0441\u0430\u0440\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0433\u043b\u043e\u0441\u0441\u0430\u0440\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:41,&amp;quot;range&amp;quot;:&amp;quot;12196-16077&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit42&quot; id=&quot;архитектура&quot;&gt;Архитектура&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Программыне компоненты Kubernetes можно разделить на две части:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;kubelet&lt;/strong&gt; - компоненты, которые работают на нодах кластера и обеспечивают запуск сервисов на них.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;master components&lt;/strong&gt; - компоненты, необходимые для управления кластером (APIs, scheduler, etc).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:42,&amp;quot;range&amp;quot;:&amp;quot;16078-16546&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit43&quot; id=&quot;deployment_в_кластер_kubernetes&quot;&gt;Deployment в кластер kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Для деплоймента в кластер &lt;strong&gt;kubernetes&lt;/strong&gt; нужно описать в docker-файлах сервисы Pod&amp;#039;а.
Порядок такой:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 создаем docker-файлик.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 собираем контейнер
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 помещаем (push) контейнер в репозиторий контейнеров docker (cloud.docker.com)
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В кластере kubernetes создаем namespace (логичекий контейнер для pod&amp;#039;ов, деплойментов (deployments) и т.д.)
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create namespace _name_&lt;/pre&gt;

&lt;p&gt;
Для деплоймента в kubernetes нужно описать три сущности:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сам deployment,  в котором описано какие docker-контейнеры нужно загрузить в pod, сколько таких pod&amp;#039;ов создать, а также какую конфигурацию применить к контейнерам (с помощью ConfigMap&amp;#039;ов).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 ConfigMap&amp;#039;ы, которые содержат конфигурационные файлы, необходимые для работы приложений контейнерах. Например - конфигурация nginx для контейнера с nginx. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Service - способ доступа к приложениям в контейнерах (балансировка и проброс портов).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Ход обновления:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 клонируем исходник из git.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 собираем его.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 собираем docker-контейнер с новым тегом версии, содержащий файлы приложения (docker build)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 помещаем docker-контейнер в docker registry (docker push)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 указываем в деплойменте тег новой версии контейнера. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 применяем deployment (kubectl apply) в результате чего обновятся pod&amp;#039;ы.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Для автоматизации с помощью GitLab:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 в свойствах проекта создаем &lt;strong&gt;Runner&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 по инструкци устанавливаем gitlab-runner и добавляем пользователя gitlab-runner в группу докера, для того, чтобы раннер мог запускать деплоймент.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 после установки gitlab-runner его нужно зарегистрировать (gitlab-runner register)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В конфиге раннера прописываются стадии: build и deploy. build включает в себя создание докерконтейнера, пригодного для деплоя.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Deployment \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;deployment_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:43,&amp;quot;range&amp;quot;:&amp;quot;16547-19273&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit44&quot; id=&quot;доступ_к_private_registry_с_паролем&quot;&gt;Доступ к private registry с паролем&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
У меня есть &lt;strong&gt;private registry&lt;/strong&gt; на базе &lt;strong&gt;Nexus 3&lt;/strong&gt;. Доступ туда осуществляется по логину-паролю (учетка из &lt;strong&gt;Active Directory&lt;/strong&gt;). &lt;br/&gt;

Для того чтобы образы можно было забирать из частного запароленного репозитория нужно:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 залогиниться в него:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;docker login -u _username_ -p _password_ registry.domain.com&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 в результате в файлике &lt;strong&gt;~/.docker/config.json&lt;/strong&gt; окажутся учетные данные, необходимые для работы.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 сделать из этого файлика секрет:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;kubectl create secret generic registry-credentials -n namespace-name --from-file=.dockerconfigjson=&amp;lt;path_to_home&amp;gt;/.docker/config.json --type=kubernetes.io/dockerconfigjson&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 и в дальнейшем использовать этот секрет:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Pod
metadata:
  name: private-reg
  namespace: namespace-name
spec:
  containers:
  - name: private-reg-container
    image: &amp;lt;your-private-image&amp;gt;
  imagePullSecrets:
  - name: registry-credentials&lt;/pre&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Стоит обратить внимание на то, что секреты изолированы на уроне неймспейсов и в каджом неймспейсе должна быть копия секрета для доступа к &lt;strong&gt;registry&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u0441\u0442\u0443\u043f \u043a private registry \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u0441\u0442\u0443\u043f_\u043a_private_registry_\u0441_\u043f\u0430\u0440\u043e\u043b\u0435\u043c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:44,&amp;quot;range&amp;quot;:&amp;quot;19274-20805&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit45&quot; id=&quot;патчинг_конфигурации_из_командной_строки&quot;&gt;Патчинг конфигурации из командной строки&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://stupefied-goodall-e282f7.netlify.com/contributors/devel/strategic-merge-patch/&quot; class=&quot;urlextern&quot; title=&quot;https://stupefied-goodall-e282f7.netlify.com/contributors/devel/strategic-merge-patch/&quot; rel=&quot;ugc nofollow&quot;&gt;https://stupefied-goodall-e282f7.netlify.com/contributors/devel/strategic-merge-patch/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;http://jsonpatch.com/&quot; class=&quot;urlextern&quot; title=&quot;http://jsonpatch.com/&quot; rel=&quot;ugc nofollow&quot;&gt;http://jsonpatch.com/&lt;/a&gt; &lt;br/&gt;

Иногда нужно отредактировать объекты из скрипта, не запуская редактор. &lt;br/&gt;

Для этого у &lt;strong&gt;kubectl&lt;/strong&gt; есть команда &lt;strong&gt;patch&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0430\u0442\u0447\u0438\u043d\u0433 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0430\u0442\u0447\u0438\u043d\u0433_\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438_\u0438\u0437_\u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439_\u0441\u0442\u0440\u043e\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:45,&amp;quot;range&amp;quot;:&amp;quot;20806-21213&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit46&quot; id=&quot;удаление_раздела_из_конфигурации&quot;&gt;Удаление раздела из конфигурации&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl patch PersistentVolume elasticsearch-data --type=json -p=&amp;#039;[{&amp;quot;op&amp;quot;: &amp;quot;remove&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/claimRef&amp;quot;}]&amp;#039;
kubectl patch PersistentVolume my-pv-name-123465789 -p &amp;#039;{&amp;quot;spec&amp;quot;:{&amp;quot;claimRef&amp;quot;: null}}&amp;#039;
kubectl patch deployment es-master --type=json -p=&amp;#039;[{&amp;quot;op&amp;quot;: &amp;quot;remove&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/template/spec/containers/0/resources&amp;quot;}]&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435_\u0440\u0430\u0437\u0434\u0435\u043b\u0430_\u0438\u0437_\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:46,&amp;quot;range&amp;quot;:&amp;quot;21214-21615&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit47&quot; id=&quot;очистка_раздела_но_не_удаление_его&quot;&gt;Очистка раздела, но не удаление его&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl patch PersistentVolume elasticsearch-data  -p &amp;#039;{&amp;quot;spec&amp;quot;:{&amp;quot;claimRef&amp;quot;:{&amp;quot;$patch&amp;quot;: &amp;quot;delete&amp;quot;}}}&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0430, \u043d\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0435\u0433\u043e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0447\u0438\u0441\u0442\u043a\u0430_\u0440\u0430\u0437\u0434\u0435\u043b\u0430_\u043d\u043e_\u043d\u0435_\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435_\u0435\u0433\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:47,&amp;quot;range&amp;quot;:&amp;quot;21616-21793&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit48&quot; id=&quot;изменение_значения_параметра&quot;&gt;Изменение значения параметра&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n kubernetes-dashboard patch service kubernetes-dashboard  -p &amp;#039;{&amp;quot;spec&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;NodePort&amp;quot;}}&amp;#039;&lt;/pre&gt;

&lt;p&gt;
в данном случае - редактируем элемент номер &lt;strong&gt;0&lt;/strong&gt; списка &lt;strong&gt;containers&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n elasticsearch patch deployment es-master --type=json -p=&amp;#039;[{&amp;quot;op&amp;quot;: &amp;quot;replace&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/template/spec/containers/0/resources/requests/cpu&amp;quot;, &amp;quot;value&amp;quot;:1}]&amp;#039;
kubectl -n elasticsearch patch deployment es-master --type=json -p=&amp;#039;[{&amp;quot;op&amp;quot;: &amp;quot;replace&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/template/spec/containers/0/env/2&amp;quot;, &amp;quot;value&amp;quot;:{&amp;quot;name&amp;quot;: &amp;quot;NUMBER_OF_MASTERS&amp;quot;, &amp;quot;value&amp;quot;: &amp;quot;1&amp;quot;}}]&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435_\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f_\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:48,&amp;quot;range&amp;quot;:&amp;quot;21794-22442&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit49&quot; id=&quot;добавление_объекта&quot;&gt;Добавление объекта&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl patch pod alpine-correct --type=&amp;#039;json&amp;#039; -p=&amp;#039;[{&amp;quot;op&amp;quot;:&amp;quot;add&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;/metadata/annotations&amp;quot;, &amp;quot;value&amp;quot;:{&amp;quot;testone.annotation.io&amp;quot;:&amp;quot;test-one&amp;quot;,&amp;quot;testtwo.annotation.io&amp;quot;:&amp;quot;test-two&amp;quot;,&amp;quot;testthree.annotation.io&amp;quot;:&amp;quot;test-three&amp;quot;}}]&amp;#039;&lt;/pre&gt;

&lt;p&gt;
В список:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl -n elasticsearch patch sts es-data --type=json -p=&amp;#039;[{&amp;quot;op&amp;quot;: &amp;quot;add&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/template/spec/tolerations&amp;quot;, &amp;quot;value&amp;quot;:[{&amp;quot;effect&amp;quot;:&amp;quot;NoSchedule&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;node.kubernetes.io/rrr&amp;quot;,&amp;quot;operator&amp;quot;:&amp;quot;Exists&amp;quot;}]}]&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Добавляем порт для контейнера в &lt;strong&gt;Deployment&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl patch deployment mcs-api --type=json -p=&amp;#039;[{&amp;quot;op&amp;quot;: &amp;quot;add&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/template/spec/containers/0/ports&amp;quot;, &amp;quot;value&amp;quot;:[{&amp;quot;containerPort&amp;quot;: 5000}]}]&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435_\u043e\u0431\u044a\u0435\u043a\u0442\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:49,&amp;quot;range&amp;quot;:&amp;quot;22443-23163&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit50&quot; id=&quot;патчинг_нескольких_значений_за_раз&quot;&gt;Патчинг нескольких значений за раз&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl patch ns default --type=json -p &amp;#039;[
{&amp;quot;op&amp;quot;:&amp;quot;add&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;/metadata/annotations&amp;quot;,&amp;quot;value&amp;quot;:{&amp;quot;a&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;b&amp;quot;:&amp;quot;2&amp;quot;}},
{&amp;quot;op&amp;quot;:&amp;quot;add&amp;quot;,&amp;quot;path&amp;quot;:&amp;quot;/metadata/labels&amp;quot;,&amp;quot;value&amp;quot;:{&amp;quot;c&amp;quot;:&amp;quot;3&amp;quot;}}
]&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0430\u0442\u0447\u0438\u043d\u0433 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0437\u0430 \u0440\u0430\u0437&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0430\u0442\u0447\u0438\u043d\u0433_\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445_\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439_\u0437\u0430_\u0440\u0430\u0437&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:50,&amp;quot;range&amp;quot;:&amp;quot;23164-23422&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit51&quot; id=&quot;отвязать_persistentvolume_от_заявки_persistentvolumeclaim&quot;&gt;Отвязать PersistentVolume от заявки PersistentVolumeClaim&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl patch PersistentVolume elasticsearch-data --type=json -p=&amp;#039;[{&amp;quot;op&amp;quot;: &amp;quot;remove&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/claimRef&amp;quot;}]&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0442\u0432\u044f\u0437\u0430\u0442\u044c PersistentVolume \u043e\u0442 \u0437\u0430\u044f\u0432\u043a\u0438 PersistentVolumeClaim&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u0432\u044f\u0437\u0430\u0442\u044c_persistentvolume_\u043e\u0442_\u0437\u0430\u044f\u0432\u043a\u0438_persistentvolumeclaim&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:51,&amp;quot;range&amp;quot;:&amp;quot;23423-23622&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit52&quot; id=&quot;найти_все_объекты_kubernetes_во_всех_неймспейсах&quot;&gt;Найти все объекты kubernetes во всех неймспейсах&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;while read -r line; do echo &amp;quot;===============  $line  ==================&amp;quot;; kubectl get $line -A; done &amp;lt; &amp;lt;(kubectl api-resources | grep -v NAME | cut -d &amp;#039; &amp;#039; -f1)&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b kubernetes \u0432\u043e \u0432\u0441\u0435\u0445 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430\u0445&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0439\u0442\u0438_\u0432\u0441\u0435_\u043e\u0431\u044a\u0435\u043a\u0442\u044b_kubernetes_\u0432\u043e_\u0432\u0441\u0435\u0445_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430\u0445&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:52,&amp;quot;range&amp;quot;:&amp;quot;23623-23883&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit53&quot; id=&quot;удобное_редактирование_секретов_kubernetes&quot;&gt;Удобное редактирование секретов kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/lbolla/kube-secret-editor&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/lbolla/kube-secret-editor&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/lbolla/kube-secret-editor&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt-get -y install python3-pip python-pip
sudo pip install PyYaml
sudo pip3 install PyYaml
sudo wget https://raw.githubusercontent.com/lbolla/kube-secret-editor/master/kube-secret-editor.py -O /usr/local/bin/kube-secret-editor.py
sudo chmod a+x /usr/local/bin/kube-secret-editor.py
alias kedit-secret=&amp;quot;EDITOR=nano KUBE_EDITOR=/usr/local/bin/kube-secret-editor.py kubectl edit secret&amp;quot;
sudo awk -v line=&amp;#039;alias kedit-secret=&amp;quot;EDITOR=nano KUBE_EDITOR=/usr/local/bin/kube-secret-editor.py kubectl edit secret&amp;quot;&amp;#039; &amp;#039;FNR==NR &amp;amp;&amp;amp; line==$0{f=1; exit} END{if (!f) print line &amp;gt;&amp;gt; FILENAME}&amp;#039; /etc/bash.bashrc&lt;/pre&gt;

&lt;p&gt;
После перелогина (или нового запуска/перезапуска) &lt;strong&gt;bash&lt;/strong&gt; станет доступен &lt;strong&gt;alias&lt;/strong&gt;  &lt;strong&gt;kedit-secret&lt;/strong&gt; и отредактировать секрет можно будет так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kedit-secret -n nsname secret-name&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0434\u043e\u0431\u043d\u043e\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0434\u043e\u0431\u043d\u043e\u0435_\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435_\u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:53,&amp;quot;range&amp;quot;:&amp;quot;23884-24901&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit54&quot; id=&quot;предоставление_ограниченного_доступа_в_кластер_с_помощью_rbac_и_сертификатов&quot;&gt;Предоставление ограниченного доступа в кластер с помощью RBAC и сертификатов&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://medium.com/better-programming/k8s-tips-give-access-to-your-clusterwith-a-client-certificate-dfb3b71a76fe&quot; class=&quot;urlextern&quot; title=&quot;https://medium.com/better-programming/k8s-tips-give-access-to-your-clusterwith-a-client-certificate-dfb3b71a76fe&quot; rel=&quot;ugc nofollow&quot;&gt;https://medium.com/better-programming/k8s-tips-give-access-to-your-clusterwith-a-client-certificate-dfb3b71a76fe&lt;/a&gt; &lt;br/&gt;

Что нужно понимать.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; В кубернетесе НЕ существует базы данных с &lt;strong&gt;Пользователями&lt;/strong&gt; и &lt;strong&gt;Группами&lt;/strong&gt;. &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Аутентификация при доступе к кластеру осуществляется с помощью сертификатов. Фактически &lt;strong&gt;CN&lt;/strong&gt; в сертификате - это имя субъекта (пользователя), обращающегося к кластеру. &lt;strong&gt;O&lt;/strong&gt; в сертификате - это имя группы, в которую включе пользователь.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; При использовании аутентификации по сертификатам нужно сгенерировать запрос на сертификат, на основании которого кластер может выпустить клиентский сертификат, с некоторым значением полей &lt;strong&gt;CN&lt;/strong&gt; и &lt;strong&gt;O&lt;/strong&gt;.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Привилегии раздаются с помощью ролей. &lt;strong&gt;Role&lt;/strong&gt; - это набор привилегий для субъекта (пользователя или группы). &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Для того, чтобы дать права владельцу сертификата нужно создать &lt;strong&gt;RoleBinding&lt;/strong&gt;, которая свяжет роль с тем что написано в сертификате. Если даем права пользователю, то имя пользователя в &lt;strong&gt;RoleBinding&lt;/strong&gt; должно совпадать со значением поля &lt;strong&gt;CN&lt;/strong&gt; в сертификате. Если даем права группе, то имя группы в &lt;strong&gt;RoleBinding&lt;/strong&gt; должно совпадать со значение поля &lt;strong&gt;O&lt;/strong&gt; в сертификате.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;br/&gt;

Конкретная задача формулируется следующим образом:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Для обращений к api-серверу используется аутентификация по сертикатам.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Разработчику нужно предоставить доступ на просмотр объектов в заданном неймспейсе.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В перспективе аналогичные права понадобятся другим разработчикам. То есть - права будем выдавать на группу.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e RBAC \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435_\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e_\u0434\u043e\u0441\u0442\u0443\u043f\u0430_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_rbac_\u0438_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:54,&amp;quot;range&amp;quot;:&amp;quot;24902-27569&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit55&quot; id=&quot;скрипт&quot;&gt;Скрипт&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
set -e

KUB_CONTEXT=&amp;#039;kubernetes-admin@kubernetes&amp;#039;
KUB_USERNAME=&amp;#039;developer-ro&amp;#039;
KUB_USERGROUP=&amp;#039;mcs-ro&amp;#039;
#cluster or ns (namespace)
#AUTH_SCOPE=&amp;#039;cluster&amp;#039;
AUTH_SCOPE=&amp;#039;ns&amp;#039;
# If AUTH_SCOPE = ns then we need namespace name
KUB_NAMESPACE=&amp;#039;default&amp;#039;
KUB_ROLE_NAME=&amp;quot;${KUB_USERGROUP}-role&amp;quot;
# Comma separated quoted - &amp;#039;&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;&amp;#039;. For all use &amp;quot;*&amp;quot;
KUB_ROLE_APIGROUPS=&amp;#039;&amp;quot;*&amp;quot;&amp;#039;
KUB_ROLE_RESOURCES=&amp;#039;&amp;quot;*&amp;quot;&amp;#039;
#KUB_ROLE_VERBS=&amp;#039;&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;&amp;#039;
KUB_ROLE_VERBS=&amp;#039;&amp;quot;*&amp;quot;&amp;#039;

echo &amp;quot;Switching to context &amp;#039;${KUB_CONTEXT}&amp;#039;...&amp;quot;
kubectl config use-context $KUB_CONTEXT

echo &amp;quot;Get Kubernetes Cluster Details...&amp;quot;
CLUSTER_NAME=${KUB_CONTEXT}-cluster
CLUSTER_ENDPOINT=`kubectl get po -n kube-system -o jsonpath=&amp;quot;{.items[?(@.metadata.labels.component==\&amp;quot;kube-apiserver\&amp;quot;)].metadata.annotations.kubeadm\.kubernetes\.io\/kube-apiserver\.advertise-address\.endpoint}&amp;quot; | cut -d&amp;#039; &amp;#039; -f 1`
[ -z &amp;quot;$CLUSTER_ENDPOINT&amp;quot; ] &amp;amp;&amp;amp; CLUSTER_ENDPOINT=`kubectl cluster-info | grep &amp;#039;control plane&amp;#039; | awk &amp;#039;{print $NF}&amp;#039; | sed &amp;#039;s/^.*\/\///&amp;#039; | sed -r &amp;quot;s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g&amp;quot;`
KUB_SYSTEM_TOKEN_SECRET=`kubectl get secret -n kube-system -o name | grep default-token | cut -d&amp;#039;/&amp;#039; -f 2`
CLUSTER_CA=`kubectl get secret -n kube-system $KUB_SYSTEM_TOKEN_SECRET -o jsonpath={&amp;quot;.data.ca\.crt&amp;quot;}`

if [ ! -f ./${KUB_USERNAME}.key ]; then
    openssl genrsa -out ./${KUB_USERNAME}.key 4096
fi

echo &amp;quot;Create CSR config file ${KUB_USERNAME}.csr.cnf...&amp;quot;
cat &amp;lt;&amp;lt;EOF &amp;gt; ./${KUB_USERNAME}.csr.cnf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[ dn ]
CN = ${KUB_USERNAME}
O = ${KUB_USERGROUP}

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
EOF

echo &amp;quot;Create CSR file ${KUB_USERNAME}.csr...&amp;quot;
openssl req -config ./${KUB_USERNAME}.csr.cnf -new -key ${KUB_USERNAME}.key -nodes -out ${KUB_USERNAME}.csr

echo &amp;quot;Create CertificateSigningRequest in ${KUB_CONTEXT} cluster...&amp;quot;
export BASE64_CSR=$(cat ./${KUB_USERNAME}.csr | base64 | tr -d &amp;#039;\n&amp;#039;)
kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: ${KUB_USERNAME}_csr
spec:
  groups:
  - system:authenticated
  request: ${BASE64_CSR}
  #signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
EOF

echo &amp;quot;Check if CSR created successfully...&amp;quot;
kubectl get csr ${KUB_USERNAME}_csr

echo &amp;quot;Approving CSR created...&amp;quot;
kubectl certificate approve ${KUB_USERNAME}_csr

echo &amp;quot;Download certificate for user ${KUB_USERNAME} to ${KUB_USERNAME}.crt file...&amp;quot;
kubectl get csr ${KUB_USERNAME}_csr -o jsonpath=&amp;#039;{.status.certificate}&amp;#039; | base64 --decode &amp;gt; ${KUB_USERNAME}.crt

if [ &amp;quot;$AUTH_SCOPE&amp;quot; = &amp;quot;cluster&amp;quot; ]; then
echo &amp;quot;Create Cluster Role...&amp;quot;
kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: ${KUB_ROLE_NAME}
rules:
- apiGroups: [${KUB_ROLE_APIGROUPS}]
  resources: [${KUB_ROLE_RESOURCES}]
  verbs: [${KUB_ROLE_VERBS}]
EOF

echo &amp;quot;Create Cluster Role Binding for group ${KUB_USERGROUP}...&amp;quot;
kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: ${KUB_ROLE_NAME}-${KUB_USERGROUP}
subjects:
- kind: Group
  name: ${KUB_USERGROUP}
  apiGroup: rbac.authorization.k8s.io
roleRef:
 kind: ClusterRole
 name: ${KUB_ROLE_NAME}
 apiGroup: rbac.authorization.k8s.io
EOF
fi

if [ &amp;quot;$AUTH_SCOPE&amp;quot; = &amp;quot;ns&amp;quot; ]; then
kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 namespace: ${KUB_NAMESPACE}
 name: ${KUB_ROLE_NAME}
rules:
- apiGroups: [${KUB_ROLE_APIGROUPS}]
  resources: [${KUB_ROLE_RESOURCES}]
  verbs: [${KUB_ROLE_VERBS}]
EOF

kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: ${KUB_ROLE_NAME}-${KUB_USERGROUP}
 namespace: ${KUB_NAMESPACE}
subjects:
- kind: Group
  name: ${KUB_USERGROUP}
  apiGroup: rbac.authorization.k8s.io
roleRef:
 kind: Role
 name: ${KUB_ROLE_NAME}
 apiGroup: rbac.authorization.k8s.io
EOF
fi

CLIENT_CERTIFICATE_DATA=$(kubectl get csr ${KUB_USERNAME}_csr -o jsonpath=&amp;#039;{.status.certificate}&amp;#039;)
CLIENT_KEY_DATA=$(cat ./${KUB_USERNAME}.key | base64 |  tr -d &amp;#039;\n&amp;#039; )

cat &amp;lt;&amp;lt;EOF &amp;gt; ./kubeconfig_${KUB_USERNAME}_${CLUSTER_NAME}
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: ${CLUSTER_CA}
    server: https://${CLUSTER_ENDPOINT}
    #insecure-skip-tls-verify: true
  name: ${CLUSTER_NAME}
users:
- name: ${KUB_USERNAME}-${CLUSTER_NAME}
  user:
    client-certificate-data: ${CLIENT_CERTIFICATE_DATA}
    client-key-data: ${CLIENT_KEY_DATA}
contexts:
- context:
    cluster: ${CLUSTER_NAME}
    user: ${KUB_USERNAME}-${CLUSTER_NAME}
  name: ${KUB_USERNAME}-${CLUSTER_NAME}
current-context: ${KUB_USERNAME}-${CLUSTER_NAME}
EOF

kubectl delete certificatesigningrequests ${KUB_USERNAME}_csr&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043a\u0440\u0438\u043f\u0442&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043a\u0440\u0438\u043f\u0442&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:55,&amp;quot;range&amp;quot;:&amp;quot;27570-32424&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit56&quot; id=&quot;создание_закрытого_ключа_пользователя_и_запроса_сертификата&quot;&gt;Создание закрытого ключа пользователя и запроса сертификата&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Генерируем закрытый ключ:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;openssl genrsa -out mike.key 4096&lt;/pre&gt;

&lt;p&gt;
Для генерации закрытого ключа пользователя нужно подготовить файлик &lt;strong&gt;mike.csr.cnf&lt;/strong&gt;, в котором указать имя пользователя и группу, которой мы дадим права:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[ dn ]
CN = mike
O = development

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth&lt;/pre&gt;

&lt;p&gt;
Тут:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 CN - имя пользователя
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 O - имя группы
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
И дальше генерируем запрос сертификата:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;openssl req -config ./mike.csr.cnf -new -key mike.key -nodes -out mike.csr&lt;/pre&gt;

&lt;p&gt;
В итоге - получаем файл запроса сертификата - &lt;strong&gt;mike.csr&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e_\u043a\u043b\u044e\u0447\u0430_\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f_\u0438_\u0437\u0430\u043f\u0440\u043e\u0441\u0430_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:56,&amp;quot;range&amp;quot;:&amp;quot;32425-33522&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit57&quot; id=&quot;создание_сертификата&quot;&gt;Создание сертификата&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Теперь нужно отправить запрос в кластер, чтобы на его основе был сгенерирован сертификат. &lt;br/&gt;

Создаем переменную окружения, в которую помещаем наш запрос сертификата в кодировке &lt;strong&gt;base64&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export BASE64_CSR=$(cat ./mike.csr | base64 | tr -d &amp;#039;\n&amp;#039;)&lt;/pre&gt;

&lt;p&gt;
И загоняем манифест в кластер, попутно подставляя в него значение созданной переменной:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: csr
spec:
  groups:
  - system:authenticated
  request: ${BASE64_CSR}
  usages:
  - digital signature
  - key encipherment
  - server auth
  - client auth
EOF&lt;/pre&gt;

&lt;p&gt;
Убеждаемся, что запрос создан:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;$ kubectl get csr
NAME      AGE   REQUESTOR          CONDITION
csr       31s   kubernetes-admin   Pending&lt;/pre&gt;

&lt;p&gt;
И выпускаем сертификат:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl certificate approve csr&lt;/pre&gt;

&lt;p&gt;
Если при аппруве появляется ошибка типа:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;error: no kind &amp;quot;CertificateSigningRequest&amp;quot; is registered for version &amp;quot;certificates.k8s.io/v1&amp;quot; in scheme &amp;quot;k8s.io/kubectl/pkg/scheme/scheme.go:28&amp;quot;&lt;/pre&gt;

&lt;p&gt;
то скорее всего делл в том, что в кластере несколько версий &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; для ресурса &lt;strong&gt;certifictes&lt;/strong&gt;, либо версия &lt;strong&gt;kubectl&lt;/strong&gt; отстает от версии кластера. Проверяем это:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get apiservice | grep certificates
kubectl version --short&lt;/pre&gt;

&lt;p&gt;
Если там две версии &lt;strong&gt;&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt; для ресурса &lt;strong&gt;certifictes&lt;/strong&gt;, то удаляем старую, а также обновляем &lt;strong&gt;kubectl&lt;/strong&gt; при необходимости:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl delete apiservice v1beta1.certificates.k8s.io&lt;/pre&gt;

&lt;p&gt;
А теперь - извлекаем его:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get csr csr -o jsonpath=&amp;#039;{.status.certificate}&amp;#039; | base64 --decode &amp;gt; mike.crt&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:57,&amp;quot;range&amp;quot;:&amp;quot;33523-35611&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit58&quot; id=&quot;создаем_роль_для_ограничения_прав_в_неймспейсе&quot;&gt;Создаем роль для ограничения прав в неймспейсе&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 namespace: development
 name: dev
rules:
- apiGroups: [&amp;quot;&amp;quot;]
  resources: [&amp;quot;pods&amp;quot;, &amp;quot;services&amp;quot;]
  verbs: [&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;]
EOF&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432 \u0432 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u0435\u043c_\u0440\u043e\u043b\u044c_\u0434\u043b\u044f_\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f_\u043f\u0440\u0430\u0432_\u0432_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:12,&amp;quot;secid&amp;quot;:58,&amp;quot;range&amp;quot;:&amp;quot;35612-35934&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit59&quot; id=&quot;даем_права_пользователю_или_группе&quot;&gt;Даем права пользователю или группе&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Привязываем пользователя к роли (по имени):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: dev
 namespace: development
subjects:
- kind: User
  name: mike
  apiGroup: rbac.authorization.k8s.io
roleRef:
 kind: Role
 name: dev
 apiGroup: rbac.authorization.k8s.io
EOF&lt;/pre&gt;

&lt;p&gt;
Либо к группе:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: dev
 namespace: development
subjects:
- kind: Group
  name: development
  apiGroup: rbac.authorization.k8s.io
roleRef:                             
 kind: Role                          
 name: dev
 apiGroup: rbac.authorization.k8s.io 
EOF&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0438\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0430\u0435\u043c_\u043f\u0440\u0430\u0432\u0430_\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e_\u0438\u043b\u0438_\u0433\u0440\u0443\u043f\u043f\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:13,&amp;quot;secid&amp;quot;:59,&amp;quot;range&amp;quot;:&amp;quot;35935-36760&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit60&quot; id=&quot;создание_файлика_kubeconfig&quot;&gt;Создание файлика kubeconfig&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Теперь для доступа к кластеру пользователю нужен файл, конфигурации, который будет содержать ссылку на api-сервер кластера, а также сертификаты. &lt;br/&gt;

Зададим значения переменных, которые будут подставлены в шаблон:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export USER=&amp;quot;mike&amp;quot;
export CLUSTER_NAME=$(kubectl config view --minify -o jsonpath={.clusters[0].name})
export CLUSTER_ENDPOINT=$(kubectl config view --raw -o json | jq -r &amp;quot;.clusters[] | select(.name == \&amp;quot;$CLUSTER_NAME\&amp;quot;) | .cluster.server&amp;quot;)
export CLIENT_CERTIFICATE_DATA=$(kubectl get csr mycsr -o jsonpath=&amp;#039;{.status.certificate}&amp;#039;)
export CLIENT_KEY_DATA=$(cat ./mike.key | base64 | tr -d &amp;#039;\n&amp;#039;)
export CLUSTER_CA=$(kubectl get secret -o jsonpath=&amp;quot;{.items[?(@.type==\&amp;quot;kubernetes.io/service-account-token\&amp;quot;)].data[&amp;#039;ca\.crt&amp;#039;]}&amp;quot;)&lt;/pre&gt;

&lt;p&gt;
И создадим файлик, в который подставим эти значения параметров:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; kubeconfig
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: ${CLUSTER_CA}
    server: ${CLUSTER_ENDPOINT}
    #insecure-skip-tls-verify: true
  name: ${CLUSTER_NAME}
users:
- name: ${USER}
  user:
    client-certificate-data: ${CLIENT_CERTIFICATE_DATA}
    client-key-data: ${CLIENT_KEY_DATA}
contexts:
- context:
    cluster: ${CLUSTER_NAME}
    user: ${USER}
  name: ${USER}-${CLUSTER_NAME}
current-context: ${USER}-${CLUSTER_NAME}
EOF&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0438\u043a\u0430 kubeconfig&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_\u0444\u0430\u0439\u043b\u0438\u043a\u0430_kubeconfig&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:15,&amp;quot;secid&amp;quot;:60,&amp;quot;range&amp;quot;:&amp;quot;36761-38356&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit61&quot; id=&quot;предоставление_ограниченного_доступа_в_кластер_с_помощью_rbac_и_service_accounts&quot;&gt;Предоставление ограниченного доступа в кластер с помощью RBAC и Service Accounts&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
# &lt;a href=&quot;https://documentation.commvault.com/v11/essential/129223_creating_kubernetes_cluster_admin_service_account_for_commvault.html&quot; class=&quot;urlextern&quot; title=&quot;https://documentation.commvault.com/v11/essential/129223_creating_kubernetes_cluster_admin_service_account_for_commvault.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://documentation.commvault.com/v11/essential/129223_creating_kubernetes_cluster_admin_service_account_for_commvault.html&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
set -e

KUB_CONTEXT=&amp;#039;anima-lightning2-dev&amp;#039;
KUB_USERNAME=&amp;#039;dashboard-ro&amp;#039;
KUB_NAMESPACES=(&amp;#039;lightning-dev&amp;#039; &amp;#039;lightning-tst&amp;#039;)
######KUB_USERGROUP=&amp;#039;mcs-ro&amp;#039;
#cluster or ns (namespace)
#AUTH_SCOPE=&amp;#039;cluster&amp;#039;
AUTH_SCOPE=&amp;#039;ns&amp;#039;
# If AUTH_SCOPE = ns then we need namespace name
#KUB_NAMESPACES=(&amp;#039;default&amp;#039;)

# Comma separated quoted - &amp;#039;&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;&amp;#039;. For all use &amp;quot;*&amp;quot;
KUB_ROLE_APIGROUPS=&amp;#039;&amp;quot;*&amp;quot;&amp;#039;
KUB_ROLE_RESOURCES=&amp;#039;&amp;quot;*&amp;quot;&amp;#039;
#KUB_ROLE_VERBS=&amp;#039;&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;&amp;#039;
KUB_ROLE_VERBS=&amp;#039;&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;&amp;#039;

echo &amp;quot;Switching to context &amp;#039;${KUB_CONTEXT}&amp;#039;...&amp;quot;
kubectl config use-context $KUB_CONTEXT

echo &amp;quot;Get Kubernetes Cluster Details...&amp;quot;
CLUSTER_NAME=${KUB_CONTEXT}-cluster
CLUSTER_ENDPOINT=`kubectl get po -n kube-system -o jsonpath=&amp;quot;{.items[?(@.metadata.labels.component==\&amp;quot;kube-apiserver\&amp;quot;)].metadata.annotations.kubeadm\.kubernetes\.io\/kube-apiserver\.advertise-address\.endpoint}&amp;quot; | cut -d&amp;#039; &amp;#039; -f 1`
[ -z &amp;quot;$CLUSTER_ENDPOINT&amp;quot; ] &amp;amp;&amp;amp; CLUSTER_ENDPOINT=`kubectl cluster-info | grep &amp;#039;control plane&amp;#039; | awk &amp;#039;{print $NF}&amp;#039; | sed &amp;#039;s/^.*\/\///&amp;#039; | sed -r &amp;quot;s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g&amp;quot;`
KUB_SYSTEM_TOKEN_SECRET=`kubectl get secret -n kube-system -o name | grep default-token | cut -d&amp;#039;/&amp;#039; -f 2`
CLUSTER_CA=`kubectl get secret -n kube-system $KUB_SYSTEM_TOKEN_SECRET -o jsonpath={&amp;quot;.data.ca\.crt&amp;quot;}`

kubectl create serviceaccount ${KUB_USERNAME}-sa -n kube-system || true

echo &amp;quot;Create ClusterRole &amp;#039;${KUB_USERNAME}-ns-cluster-role&amp;#039; to List Namespaces...&amp;quot;
kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ${KUB_USERNAME}-ns-cluster-role
rules:
- apiGroups: [&amp;quot;&amp;quot;]
  resources: [&amp;quot;namespaces&amp;quot;]
  verbs: [&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;]

EOF

echo &amp;quot;Create Cluster Role Binding for group &amp;#039;${KUB_USERNAME}-ns-cluster-role&amp;#039; to List Namespaces...&amp;quot;
kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ${KUB_USERNAME}-ns-cluster-rolebinding
subjects:
- kind: ServiceAccount
  name: ${KUB_USERNAME}-sa
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: ${KUB_USERNAME}-ns-cluster-role
  apiGroup: rbac.authorization.k8s.io
EOF

if [ &amp;quot;$AUTH_SCOPE&amp;quot; = &amp;quot;ns&amp;quot; ]; then
for KUB_NAMESPACE in ${KUB_NAMESPACES[@]}; do
kubectl create ns ${KUB_NAMESPACE} || true

echo &amp;quot;Creating Role - &amp;#039;${KUB_USERNAME}-role&amp;#039; in the namespace &amp;#039;${KUB_NAMESPACE}&amp;#039;...&amp;quot;
kubectl replace -f - &amp;lt;&amp;lt;EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: ${KUB_NAMESPACE}
  name: ${KUB_USERNAME}-role
rules:
- apiGroups: [${KUB_ROLE_APIGROUPS}]
  resources: [${KUB_ROLE_RESOURCES}]
  verbs: [${KUB_ROLE_VERBS}]
EOF

echo &amp;quot;Creating RoleBinding for the &amp;#039;${KUB_USERNAME}-role&amp;#039; in the namespace &amp;#039;${KUB_NAMESPACE}&amp;#039;...&amp;quot;
kubectl replace -f - &amp;lt;&amp;lt;EOF
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ${KUB_USERNAME}
  namespace: ${KUB_NAMESPACE}
subjects:
- kind: ServiceAccount
  name: ${KUB_USERNAME}-sa
  namespace: kube-system
roleRef:
  kind: Role
  name: ${KUB_USERNAME}-role
  apiGroup: rbac.authorization.k8s.io
EOF
done
fi

if [ &amp;quot;$AUTH_SCOPE&amp;quot; = &amp;quot;cluster&amp;quot; ]; then
echo &amp;quot;Creating ClusterRole &amp;#039;${KUB_USERNAME}-cluster-role&amp;#039; to access resources...&amp;quot;
kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ${KUB_USERNAME}-cluster-role
rules:
- apiGroups: [${KUB_ROLE_APIGROUPS}]
  resources: [${KUB_ROLE_RESOURCES}]
  verbs: [${KUB_ROLE_VERBS}]
EOF

echo &amp;quot;Create Cluster Role Binding for group &amp;#039;${KUB_USERNAME}-cluster-role&amp;#039; to access resources...&amp;quot;
kubectl apply -f - &amp;lt;&amp;lt;EOF
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ${KUB_USERNAME}-cluster-rolebinding
subjects:
- kind: ServiceAccount
  name: ${KUB_USERNAME}-sa
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: ${KUB_USERNAME}-cluster-role
  apiGroup: rbac.authorization.k8s.io
fi
EOF
fi

kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: v1
kind: Secret
metadata:
  name: ${KUB_USERNAME}-sa-token
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: ${KUB_USERNAME}-sa
type: kubernetes.io/service-account-token
EOF

SA_TOKEN=`echo &amp;quot;kubectl get secrets -n kube-system -o jsonpath=\&amp;quot;{.items[?(@.metadata.annotations[&amp;#039;kubernetes\\.io/service-account\\.name&amp;#039;]==&amp;#039;${KUB_USERNAME}-sa&amp;#039;)].data.token}\&amp;quot; | base64 --decode&amp;quot; | /bin/bash`

cat &amp;lt;&amp;lt;EOF &amp;gt; ./kubeconfig_${KUB_USERNAME}_${CLUSTER_NAME}
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: ${CLUSTER_CA}
    server: https://${CLUSTER_ENDPOINT}
    #insecure-skip-tls-verify: true
  name: ${CLUSTER_NAME}
users:
- name: ${KUB_USERNAME}-${CLUSTER_NAME}
  user:
    token: ${SA_TOKEN}
contexts:
- context:
    cluster: ${CLUSTER_NAME}
    user: ${KUB_USERNAME}-${CLUSTER_NAME}
  name: ${KUB_USERNAME}-${CLUSTER_NAME}
current-context: ${KUB_USERNAME}-${CLUSTER_NAME}
EOF&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e RBAC \u0438 Service Accounts&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435_\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e_\u0434\u043e\u0441\u0442\u0443\u043f\u0430_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_rbac_\u0438_service_accounts&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:17,&amp;quot;secid&amp;quot;:61,&amp;quot;range&amp;quot;:&amp;quot;38357-43427&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit62&quot; id=&quot;bash-скрипты_в_init-контейнерах_при_деплойменте_с_помощью_helm&quot;&gt;Bash-скрипты в init-контейнерах при деплойменте с помощью helm&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
В чарте в директории files я имею просто скрипт, который должне запуститься в init-контейнере. &lt;br/&gt;

Я поменщаю этот скрипт в секрет с помощью такого манифеста:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Secret
metadata:
  name: files
type: Opaque
data: 
{{ (.Files.Glob &amp;quot;files/*&amp;quot;).AsSecrets | indent 2 }}&lt;/pre&gt;

&lt;p&gt;
В деплойменте я запускаю init-контейнер, в котором монтируется секрет с этим скриптом и выполняется этот скрипт:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;...
      initContainers:
      - name: copy-files
        image: docker.rdleas.ru/busybox
        command:
        - &amp;quot;sh&amp;quot;
        - &amp;quot;-c&amp;quot;
        - &amp;quot;cp /tmp/files/init-script.sh /tmp/ &amp;amp;&amp;amp; chmod u+x /tmp/init-script.sh &amp;amp;&amp;amp; /tmp/init-script.sh&amp;quot;
        volumeMounts:
        - name: files
          mountPath: /tmp/files/
...
      volumes:
      - name: files
        secret:
          secretName: files&lt;/pre&gt;

&lt;p&gt;
то есть мне надо сделать скрипт исполняемым (дать соотвествующие разрешения), но смонтирован он как read-only, поэтому я предварительно копирую его. А после того, как разрешено его исполнение - запускаю скрипт.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432 init-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e helm&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;bash-\u0441\u043a\u0440\u0438\u043f\u0442\u044b_\u0432_init-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445_\u043f\u0440\u0438_\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0435_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_helm&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:18,&amp;quot;secid&amp;quot;:62,&amp;quot;range&amp;quot;:&amp;quot;43428-44955&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit63&quot; id=&quot;обновление_сертификатов&quot;&gt;Обновление сертификатов&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/kubernetes/kubeadm/issues/581#issuecomment-471575078&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/kubernetes/kubeadm/issues/581#issuecomment-471575078&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/kubernetes/kubeadm/issues/581#issuecomment-471575078&lt;/a&gt; &lt;br/&gt;

Обновление сертификатов (даже просроченных) на мастерах. &lt;br/&gt;

Проверить валидность:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubeadm certs check-expiration&lt;/pre&gt;

&lt;p&gt;
Обновить все сразу:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubeadm certs renew all&lt;/pre&gt;

&lt;p&gt;
Обновить по одному:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubeadm certs renew apiserver
kubeadm certs renew apiserver-kubelet-client
kubeadm certs renew front-proxy-client
kubeadm certs renew admin.conf&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:20,&amp;quot;secid&amp;quot;:63,&amp;quot;range&amp;quot;:&amp;quot;44956-45524&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit64&quot; id=&quot;просроченный_сертификат_ноды_в_kubeletconf&quot;&gt;Просроченный сертификат ноды в kubelet.conf&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043d\u043e\u0434\u044b \u0432 kubelet.conf&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0439_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442_\u043d\u043e\u0434\u044b_\u0432_kubeletconf&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:20,&amp;quot;secid&amp;quot;:64,&amp;quot;range&amp;quot;:&amp;quot;45525-45607&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit65&quot; id=&quot;проблема&quot;&gt;Проблема&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
На ноде не стартует &lt;strong&gt;kubelet&lt;/strong&gt;, при старте в &lt;strong&gt;/var/log/syslog&lt;/strong&gt; такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Nov 22 15:10:08 kub-master01 systemd[1]: Started Kubernetes systemd probe.
Nov 22 15:10:08 kub-master01 kubelet[6927]: I1122 15:10:08.032987    6927 server.go:411] Version: v1.19.3
Nov 22 15:10:08 kub-master01 kubelet[6927]: I1122 15:10:08.033277    6927 server.go:831] Client rotation is on, will bootstrap in background
Nov 22 15:10:08 kub-master01 kubelet[6927]: E1122 15:10:08.035302    6927 bootstrap.go:265] part of the existing bootstrap client certificate is expired: 2020-11-20 08:19:12 +0000 UTC
Nov 22 15:10:08 kub-master01 kubelet[6927]: F1122 15:10:08.035329    6927 server.go:265] failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory&lt;/pre&gt;

&lt;p&gt;
Проблема усугубляется тем, что это однонодовый кластер и просто сделать &lt;strong&gt;kubeadm join&lt;/strong&gt; не выйдет.  &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:20,&amp;quot;secid&amp;quot;:65,&amp;quot;range&amp;quot;:&amp;quot;45608-46652&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit66&quot; id=&quot;диагностика&quot;&gt;Диагностика&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Вот такой конвейер позвоялет увидеть дату окончания сертификата ноды, который хранится в &lt;strong&gt;kubelet.conf&lt;/strong&gt;.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat /etc/kubernetes/kubelet.conf  | grep &amp;#039;client-certificate-data:&amp;#039; | cut -d&amp;#039;:&amp;#039; -f2 | sed &amp;#039;s/\s*//g&amp;#039; | base64 -d | openssl x509 -noout -enddate
notAfter=Nov 20 08:19:12 2020 GMT&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:21,&amp;quot;secid&amp;quot;:66,&amp;quot;range&amp;quot;:&amp;quot;46653-47053&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit67&quot; id=&quot;обновляем_сертификат&quot;&gt;Обновляем сертификат&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Извлекаем сертификат:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat /etc/kubernetes/kubelet.conf  | grep &amp;#039;client-certificate-data:&amp;#039; | cut -d&amp;#039;:&amp;#039; -f2 | sed &amp;#039;s/\s*//g&amp;#039; | base64 -d &amp;gt; ./node.crt.pem&lt;/pre&gt;

&lt;p&gt;
Извлекаем ключ:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat /etc/kubernetes/kubelet.conf  | grep &amp;#039;client-key-data:&amp;#039; | cut -d&amp;#039;:&amp;#039; -f2 | sed &amp;#039;s/\s*//g&amp;#039; | base64 -d &amp;gt; ./node.key.pem&lt;/pre&gt;

&lt;p&gt;
Генерируем запрос:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;openssl x509 -x509toreq -signkey ./node.key.pem -in ./node.crt.pem -out ./node.csr &lt;/pre&gt;

&lt;p&gt;
Проверяем запрос:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;openssl req -text -noout -verify -in ./node.csr&lt;/pre&gt;

&lt;p&gt;
Создаем новый сертификат
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;openssl x509 -req -in node.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -set_serial 10 -out ./new_node.crt.pem&lt;/pre&gt;

&lt;p&gt;
Кодируем новый сертификат в &lt;strong&gt;base64&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;base64 -w 0 ./new_node.crt.pem&lt;/pre&gt;

&lt;p&gt;
И затем подставляем в поле &lt;strong&gt;client-certificate-data:&lt;/strong&gt; в файлике &lt;strong&gt;/etc/kubernetes/kubelet.conf&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:21,&amp;quot;secid&amp;quot;:67,&amp;quot;range&amp;quot;:&amp;quot;47054-48044&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit68&quot; id=&quot;kubernetes_ldap_auth&quot;&gt;Kubernetes LDAP Auth&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;strong&gt;LDAP&lt;/strong&gt;-аутентификацию к кластеру &lt;strong&gt;kubernetes&lt;/strong&gt; можно прикрутить с помощью различных средств, но все они используют один подход и схожие по назначению компоненты:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Служба каталога с поддрежкой протокола LDAP. Например - Active Directory
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Провайдер &lt;strong&gt;OpenID Connect&lt;/strong&gt;, с которым взаимодействует кластер &lt;strong&gt;kubernetes&lt;/strong&gt;. &lt;strong&gt;OIDC&lt;/strong&gt; - это приложение, которое аутентифицирует пользователей в &lt;strong&gt;LDAP&lt;/strong&gt; и сообщает кластеру &lt;strong&gt;Kubernetes&lt;/strong&gt; сведения о нем, чтобы &lt;strong&gt;kubernetes&lt;/strong&gt; мог сгенерировать сертификат.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Некое web-приложение, с которым взаимодействует пользователи. Оно перенапрявляет пользователя на &lt;strong&gt;OpenID Connector&lt;/strong&gt;, получает от кластера &lt;strong&gt;kubernetes&lt;/strong&gt; сертификат и генерирует конфиг для &lt;strong&gt;kubectl&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kubernetes LDAP Auth&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;kubernetes_ldap_auth&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:21,&amp;quot;secid&amp;quot;:68,&amp;quot;range&amp;quot;:&amp;quot;48045-49229&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit69&quot; id=&quot;oidc_providers&quot;&gt;OIDC Providers&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Dex
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Keycloak
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;OIDC Providers&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;oidc_providers&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:21,&amp;quot;secid&amp;quot;:69,&amp;quot;range&amp;quot;:&amp;quot;49230-49278&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit70&quot; id=&quot;webapps&quot;&gt;WebApps&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Kuberos - &lt;a href=&quot;https://github.com/negz/kuberos&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/negz/kuberos&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/negz/kuberos&lt;/a&gt; (не поддерживается с 2019 года)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 GangWay
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Dex K8s Authenticator
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;WebApps&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;webapps&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:21,&amp;quot;secid&amp;quot;:70,&amp;quot;range&amp;quot;:&amp;quot;49279-49436&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit71&quot; id=&quot;keycloak_kubelogin&quot;&gt;Keycloak + kubelogin&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Мне понравился такой вариант - &lt;strong&gt;Keycloak&lt;/strong&gt; в качестве OIDC-провайдера и &lt;strong&gt;kubelogin&lt;/strong&gt; в качестве способа получения токена. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Keycloak + kubelogin&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;keycloak_kubelogin&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:21,&amp;quot;secid&amp;quot;:71,&amp;quot;range&amp;quot;:&amp;quot;49437-49673&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit72&quot; id=&quot;настройка_client_в_keycloak&quot;&gt;Настройка client в keycloak&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
В параметры клиента в &lt;strong&gt;keycloak&lt;/strong&gt; в &lt;strong&gt;valid redirect uris&lt;/strong&gt; нужно прописать &lt;strong&gt;&lt;a href=&quot;http://localhost:8000&quot; class=&quot;urlextern&quot; title=&quot;http://localhost:8000&quot; rel=&quot;ugc nofollow&quot;&gt;http://localhost:8000&lt;/a&gt;&lt;/strong&gt; (или *)
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 client \u0432 keycloak&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_client_\u0432_keycloak&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:21,&amp;quot;secid&amp;quot;:72,&amp;quot;range&amp;quot;:&amp;quot;49674-49877&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit73&quot; id=&quot;настройка_кластера_kubernetes&quot;&gt;Настройка кластера kubernetes&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
На каждой мастер-ноде редактируем файл &lt;strong&gt;/etc/kubernetes/manifests/kube-apiserver.yaml&lt;/strong&gt; и добавляем туда такие параметры:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;    - --oidc-ca-file=/etc/ssl/certs/RDLeas_Root_CARDleas-SRV-DC02-CA.pem
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://sso.rdleas.ru/auth/realms/rdleas
    - --oidc-username-claim=email&lt;/pre&gt;

&lt;p&gt;
Редактируем &lt;strong&gt;Configmap&lt;/strong&gt; и также добавляем туда эти параметры:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl edit cm -n kube-system kubeadm-config&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;data:
  ClusterConfiguration: |
    apiServer:
      ...
      extraArgs:
        authorization-mode: Node,RBAC
        oidc-ca-file: /etc/ssl/certs/RDLeas_Root_CARDleas-SRV-DC02-CA.pem
        oidc-client-id: kubernetes          
        oidc-groups-claim: groups
        oidc-issuer-url: https://sso.rdleas.ru/auth/realms/rdleas
        oidc-username-claim: email&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:21,&amp;quot;secid&amp;quot;:73,&amp;quot;range&amp;quot;:&amp;quot;49878-50904&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit74&quot; id=&quot;настройка_клиентской_машины&quot;&gt;Настройка клиентской машины&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Устанавливаем плагин kubelogin. &lt;br/&gt;

Скачиваем бинарник &lt;a href=&quot;https://github.com/int128/kubelogin/releases&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/int128/kubelogin/releases&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/int128/kubelogin/releases&lt;/a&gt; &lt;br/&gt;

Извлекаем его куда-то в $PATH, например - /usr/local/bin/kubelogin &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
В &lt;strong&gt;~/.kube/config&lt;/strong&gt; прописываем пользователя:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;- name: oidc
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - get-token
      - --oidc-issuer-url=https://sso.rdleas.ru/auth/realms/rdleas
      - --oidc-client-id=kubernetes
      command: kubelogin
      env: null
      provideClusterInfo: false&lt;/pre&gt;

&lt;p&gt;
И контекст с его участием:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;- context:
    cluster: sbl-apps-dev
    user: oidc
  name: sbl-apps-dev-oidc&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439_\u043c\u0430\u0448\u0438\u043d\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:23,&amp;quot;secid&amp;quot;:74,&amp;quot;range&amp;quot;:&amp;quot;50905-51721&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit75&quot; id=&quot;назначение_привилегий_в_кластере&quot;&gt;Назначение привилегий в кластере&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Название групп в манифестах должно быть точно таким же как и в токене. В моей инсталляции в начале названия группы есть слеш. &lt;br/&gt;

Права на неймспейс (в даннос лучае - default) выдаем так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;NAMESPACE=default
GROUP=&amp;#039;/Kubernetes_Default_Ns_Admins&amp;#039;
kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: ${NAMESPACE}-admins
  namespace: ${NAMESPACE}
rules:
- apiGroups:
  - &amp;#039;*&amp;#039;
  resources:
  - &amp;#039;*&amp;#039;
  verbs:
  - &amp;#039;*&amp;#039;
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-${NAMESPACE}-namespace-admins
  namespace: ${NAMESPACE}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ${NAMESPACE}-admins
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: ${GROUP}
EOF&lt;/pre&gt;

&lt;p&gt;
Права на весь кластер выдаем так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;GROUP=&amp;#039;/Kubernetes_Cluster_Admins&amp;#039;
kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admins-oidc
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: ${GROUP}
EOF&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435_\u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:25,&amp;quot;secid&amp;quot;:75,&amp;quot;range&amp;quot;:&amp;quot;51722-53127&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit76&quot; id=&quot;разрешение_проблем&quot;&gt;Разрешение проблем&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Поглядеть текущий токен можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubelogin get-token --oidc-issuer-url=https://sso.rdleas.ru/auth/realms/rdleas --oidc-client-id=kubernetes&lt;/pre&gt;

&lt;p&gt;
Расшифровать его (и увидеть список групп в нем) можно тут: &lt;a href=&quot;https://jwt.io/&quot; class=&quot;urlextern&quot; title=&quot;https://jwt.io/&quot; rel=&quot;ugc nofollow&quot;&gt;https://jwt.io/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435_\u043f\u0440\u043e\u0431\u043b\u0435\u043c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:27,&amp;quot;secid&amp;quot;:76,&amp;quot;range&amp;quot;:&amp;quot;53128-53471&amp;quot;} --&gt;
&lt;h4 class=&quot;sectionedit77&quot; id=&quot;invalid_bearer_token_oidcemail_not_verified&quot;&gt;invalid bearer token, oidc: email not verified&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;

&lt;p&gt;
В логе &lt;strong&gt;kube-apiserver&lt;/strong&gt; ошибка
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Unable to authenticate the request due to an error: [invalid bearer token, oidc: email not verified]&lt;/pre&gt;

&lt;p&gt;
В токене такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&amp;quot;email_verified&amp;quot;: false&lt;/pre&gt;

&lt;p&gt;
Нужно выключить верификацию email на keycloak (поле email_verified не будет появляться в токене). &lt;br/&gt;

В &lt;strong&gt;Keycloak&lt;/strong&gt; идем: &lt;strong&gt;Client Scopes&lt;/strong&gt; → &lt;strong&gt;Email&lt;/strong&gt; → &lt;strong&gt;Mappers&lt;/strong&gt; и удаляем &lt;strong&gt;Email verified&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Поглядеть подробный лог можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl --token=$token --server=https://192.168.1.2:6443 --insecure-skip-tls-verify get po --v=10&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;invalid bearer token, oidc: email not verified&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;invalid_bearer_token_oidcemail_not_verified&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:27,&amp;quot;secid&amp;quot;:77,&amp;quot;range&amp;quot;:&amp;quot;53472-54161&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit78&quot; id=&quot;dex_dex_k8s_authenticator&quot;&gt;Dex + Dex K8s authenticator&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://uni.dtln.ru/digest/autentifikaciya-v-kubernetes-s-pomoshchyu-dex-prikruchivaem-ldap&quot; class=&quot;urlextern&quot; title=&quot;https://uni.dtln.ru/digest/autentifikaciya-v-kubernetes-s-pomoshchyu-dex-prikruchivaem-ldap&quot; rel=&quot;ugc nofollow&quot;&gt;https://uni.dtln.ru/digest/autentifikaciya-v-kubernetes-s-pomoshchyu-dex-prikruchivaem-ldap&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://habr.com/ru/post/436238/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/post/436238/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/post/436238/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://habr.com/ru/company/dataline/blog/497482/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/company/dataline/blog/497482/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/company/dataline/blog/497482/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://github.com/mintel/dex-k8s-authenticator&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/mintel/dex-k8s-authenticator&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/mintel/dex-k8s-authenticator&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Dex + Dex K8s authenticator&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;dex_dex_k8s_authenticator&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:27,&amp;quot;secid&amp;quot;:78,&amp;quot;range&amp;quot;:&amp;quot;54162-54437&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit79&quot; id=&quot;keycloak_gangway&quot;&gt;Keycloak + Gangway&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/heptiolabs/gangway&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/heptiolabs/gangway&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/heptiolabs/gangway&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Keycloak + Gangway&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;keycloak_gangway&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:27,&amp;quot;secid&amp;quot;:79,&amp;quot;range&amp;quot;:&amp;quot;54438-54510&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit80&quot; id=&quot;dex_gangway&quot;&gt;Dex + GangWay&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/alexbrand/gangway-dex-tutorial&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/alexbrand/gangway-dex-tutorial&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/alexbrand/gangway-dex-tutorial&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Dex + GangWay&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;dex_gangway&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:27,&amp;quot;secid&amp;quot;:80,&amp;quot;range&amp;quot;:&amp;quot;54511-54587&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit81&quot; id=&quot;jwt-токены_для_аутентификации&quot;&gt;JWT-Токены для аутентификации&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://github.com/negz/kubehook&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/negz/kubehook&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/negz/kubehook&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;JWT-\u0422\u043e\u043a\u0435\u043d\u044b \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;jwt-\u0442\u043e\u043a\u0435\u043d\u044b_\u0434\u043b\u044f_\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:27,&amp;quot;secid&amp;quot;:81,&amp;quot;range&amp;quot;:&amp;quot;54588-54685&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit82&quot; id=&quot;ссылки&quot;&gt;Ссылки&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-create-a-kubernetes-cluster-using-kubeadm-on-ubuntu-18-04&quot; class=&quot;urlextern&quot; title=&quot;https://www.digitalocean.com/community/tutorials/how-to-create-a-kubernetes-cluster-using-kubeadm-on-ubuntu-18-04&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.digitalocean.com/community/tutorials/how-to-create-a-kubernetes-cluster-using-kubeadm-on-ubuntu-18-04&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:27,&amp;quot;secid&amp;quot;:82,&amp;quot;range&amp;quot;:&amp;quot;54686-54827&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit83&quot; id=&quot;отмена_удаления_persistentvolume&quot;&gt;Отмена удаления PersistentVolume&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Если так случайно вышло, что вы удалили &lt;strong&gt;PersistentVolume&lt;/strong&gt;, то не отчаивайтесь! Он будет находитьтся в состоянии &lt;strong&gt;Terminating&lt;/strong&gt; до тех пор, пока существуют &lt;strong&gt;pod&lt;/strong&gt;, куда он смонтирован и &lt;strong&gt;PersistentVolumeClaim&lt;/strong&gt;, которая породила этот PV и удаление можно отменить. &lt;br/&gt;

На помощь приходит специальная утилитка: &lt;a href=&quot;https://github.com/jianz/k8s-reset-terminating-pv&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/jianz/k8s-reset-terminating-pv&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/jianz/k8s-reset-terminating-pv&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone https://github.com/jianz/k8s-reset-terminating-pv.git
cd k8s-reset-terminating-pv
go build -o resetpv&lt;/pre&gt;

&lt;p&gt;
Собранный бинарник: &lt;a href=&quot;https://wiki.autosys.tk/_media/devops/resetpv.tar.gz&quot; class=&quot;media mediafile mf_gz&quot; title=&quot;devops:resetpv.tar.gz (10.6 MB)&quot;&gt;resetpv.tar.gz&lt;/a&gt; &lt;br/&gt;

Заходим на мастер-ноду, архивируем сертификаты и смотрим какой сертификат за что отвечает:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ssh user@master-node
sudo -H tar -cvzf ~/etcd-pki.tar.gz /etc/kubernetes/pki/etcd
sudo docker  ps --no-trunc | grep etcd
exit&lt;/pre&gt;

&lt;p&gt;
В выводе среди всего прочего будет такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;--advertise-client-urls=https://10.77.68.1:2379
--cert-file=/etc/kubernetes/pki/etcd/server.crt
--key-file=/etc/kubernetes/pki/etcd/server.key
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt&lt;/pre&gt;

&lt;p&gt;
В вашей инсталляции имена, пути и порты могут быть иными. &lt;br/&gt;

И забираем с мастер-ноды кластера архив с сертификатами, которые необходимы для подключения к &lt;strong&gt;etcd&lt;/strong&gt; кластера:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;scp user@master-node:/home/user/etcd-pki.tar.gz ./
tar -xvf ./etcd-pki.tar.gя
mv ./etc/kubernetes/pki/etcd/* ./&lt;/pre&gt;

&lt;p&gt;
И дальше применяем утилиту:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;./resetpv --etcd-ca ./ca.crt --etcd-cert ./server.crt --etcd-key ./server.key --etcd-host 10.77.68.1 --etcd-port 2379 pv-name&lt;/pre&gt;

&lt;p&gt;
Если вдруг так вышло, что вы удалили все PV в кластере (как я - хотел удалить &lt;strong&gt;pvc&lt;/strong&gt; в неймспейсе но просто опечатался и вместо &lt;strong&gt;pvc&lt;/strong&gt; ввел &lt;strong&gt;pv&lt;/strong&gt;):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl delete -n namespace pv --all&lt;/pre&gt;

&lt;p&gt;
то чтобы отменить удаление всех PV делаем так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;PVs=`kubectl get pv | grep Terminating | awk &amp;#039;{print $1}&amp;#039; | grep -v NAME`
for pv in $PVs; do ./resetpv --etcd-ca ./ca.crt --etcd-cert ./server.crt --etcd-key ./server.key --etcd-host 10.77.68.1 --etcd-port 2379 $pv; done&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0442\u043c\u0435\u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f PersistentVolume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u043c\u0435\u043d\u0430_\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f_persistentvolume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:27,&amp;quot;secid&amp;quot;:83,&amp;quot;range&amp;quot;:&amp;quot;54828-57415&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit84&quot; id=&quot;распределить_поды_деплоймента_по_разным_нодам_кластера&quot;&gt;Распределить поды деплоймента по разным нодам кластера&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-service
  labels:
    app: my-service
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-service
  template:
    metadata:
      labels:
        app: my-service
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: my-service&lt;/pre&gt;

&lt;p&gt;
Либо:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - {{ .Release.Name }}-logstash
            topologyKey: kubernetes.io/hostname&lt;/pre&gt;

&lt;p&gt;
Разница между этими подходами описана тут: &lt;a href=&quot;https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/#comparison-with-podaffinity-podantiaffinity&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/#comparison-with-podaffinity-podantiaffinity&quot; rel=&quot;ugc nofollow&quot;&gt;https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/#comparison-with-podaffinity-podantiaffinity&lt;/a&gt; &lt;br/&gt;

В двух словах - &lt;strong&gt;podAntiAffinity&lt;/strong&gt; более старый и простой способ и в будущем - предпочтительно пользоваться &lt;strong&gt;topologySpreadConstraints&lt;/strong&gt;, который поддерживает не только распределение по нодам, но и по зонам доступности в облаках.  
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0434\u044b \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043d\u043e\u0434\u0430\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c_\u043f\u043e\u0434\u044b_\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430_\u043f\u043e_\u0440\u0430\u0437\u043d\u044b\u043c_\u043d\u043e\u0434\u0430\u043c_\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:28,&amp;quot;secid&amp;quot;:84,&amp;quot;range&amp;quot;:&amp;quot;57416-58948&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit85&quot; id=&quot;headless_services_для_stafullset&quot;&gt;Headless Services для Stafullset&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
И другие вопросы про то как давать доступ к индивидуальным подам реплик стейтфуллсетов. &lt;br/&gt;

&lt;a href=&quot;https://www.tigera.io/blog/exposing-statefulsets-in-kubernetes/&quot; class=&quot;urlextern&quot; title=&quot;https://www.tigera.io/blog/exposing-statefulsets-in-kubernetes/&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.tigera.io/blog/exposing-statefulsets-in-kubernetes/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Обычно сервисы используются в k8s для балансировки запросов на все реплики микросервиса, однако, в слуаче со statefull-приложениями может понадобиться доступ к конкретной реплике. Для этого в k8s существуют Statefullset&amp;#039;ы и связанные с ними Headless-сервисы. &lt;br/&gt;

Что такое &lt;strong&gt;Statefullset&lt;/strong&gt; - это способ создать набор именованных реплик сервиса, каждая из которых будет сохранять свое имя и после перезапуска. &lt;br/&gt;

Что такое &lt;strong&gt;Headless Service&lt;/strong&gt; - это сервис, который НЕ имеет адреса в кластере (&lt;strong&gt;ClusterIP: None&lt;/strong&gt;) и НЕ выполняет балансировку подключний по эндпоинтам, а просто является списком эндпоинтов для именованных реплик, управляемых Statefullset&amp;#039;ом. А для доступа к именованным репликам в &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; кластера генерируются имена:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&amp;lt;StatefulSet&amp;gt;-&amp;lt;Ordinal&amp;gt;.&amp;lt;Service&amp;gt;.&amp;lt;Namespace&amp;gt;.svc.cluster.local&lt;/pre&gt;

&lt;p&gt;
например:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;app-0.myapp.default.svc.cluster.local.&lt;/pre&gt;

&lt;p&gt;
Вопрос - а как же можно опубликовать именованную реплику в составе Statefullset&amp;#039;а, например через Ingress?? Ведь для этого надо как-то сослаться на сервис, который будет связан с портом на конкретной реплике! &lt;br/&gt;

Все просто - каждый под, управляеый Statefullset&amp;#039;ом имеет уникальну метку (примерно такую - &lt;strong&gt;statefulset.kubernetes.io/pod-name: app-0&lt;/strong&gt; ), которую можно использовать в качестве селектора в сервисе:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Service
metadata:
  name: app-0
spec:
  type: LoadBalancer
  selector:
    statefulset.kubernetes.io/pod-name: app-0
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Headless Services \u0434\u043b\u044f Stafullset&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;headless_services_\u0434\u043b\u044f_stafullset&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:30,&amp;quot;secid&amp;quot;:85,&amp;quot;range&amp;quot;:&amp;quot;58949-61475&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit86&quot; id=&quot;как_скопировать_секрет_из_одного_неймспейса_в_другой&quot;&gt;Как скопировать секрет из одного неймспейса в другой&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get secret my-tlssecret --namespace=nginx-ns -o yaml | sed &amp;#039;s/namespace: .*/namespace: default/&amp;#039; | kubectl apply -f -&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u0430\u043a \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u0430\u043a_\u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c_\u0441\u0435\u043a\u0440\u0435\u0442_\u0438\u0437_\u043e\u0434\u043d\u043e\u0433\u043e_\u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430_\u0432_\u0434\u0440\u0443\u0433\u043e\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:31,&amp;quot;secid&amp;quot;:86,&amp;quot;range&amp;quot;:&amp;quot;61476-61716&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit87&quot; id=&quot;список_и_спецификации_сustomresourcedefinitions&quot;&gt;Список и спецификации СustomResourceDefinitions&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Список существующих в кластере &lt;strong&gt;Сustom Resource Definitions&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get customresourcedefinitions&lt;/pre&gt;

&lt;p&gt;
или
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl get crd&lt;/pre&gt;

&lt;p&gt;
ну и посмотреть спецификацию:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl describe crd &amp;lt;crd_name&amp;gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0421ustomResourceDefinitions&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_\u0438_\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438_\u0441ustomresourcedefinitions&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:31,&amp;quot;secid&amp;quot;:87,&amp;quot;range&amp;quot;:&amp;quot;61717-62046&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit88&quot; id=&quot;плавный_рестарт_подиков_в_деплойментах&quot;&gt;Плавный рестарт подиков в деплойментах&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
В общем случае плавно рестартить можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl rollout restart deployment my-app&lt;/pre&gt;

&lt;p&gt;
А для всех деплойментов в неймспейсе:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ns=namespacename; for deployment in `kubectl get deployment -n ${ns} | grep -v NAME | awk &amp;#039;{print $1}&amp;#039;`; do kubectl -n ${ns} rollout restart deployment ${deployment}; done&lt;/pre&gt;

&lt;p&gt;
Плавный рестарт всех подиков во всех деплойментах во всех неймспейсах:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;for ns in `kubectl get ns | grep -v NAME | awk &amp;#039;{print $1}&amp;#039;`; do for deployment in `kubectl get deployment -n ${ns} | grep -v NAME | awk &amp;#039;{print $1}&amp;#039;`; do kubectl -n ${ns} rollout restart deployment ${deployment}; done; done &lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043b\u0430\u0432\u043d\u044b\u0439 \u0440\u0435\u0441\u0442\u0430\u0440\u0442 \u043f\u043e\u0434\u0438\u043a\u043e\u0432 \u0432 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430\u0445&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043b\u0430\u0432\u043d\u044b\u0439_\u0440\u0435\u0441\u0442\u0430\u0440\u0442_\u043f\u043e\u0434\u0438\u043a\u043e\u0432_\u0432_\u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430\u0445&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:31,&amp;quot;secid&amp;quot;:88,&amp;quot;range&amp;quot;:&amp;quot;62047-62865&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit89&quot; id=&quot;etcresolveconf_в_подиках&quot;&gt;/etc/resolve.conf в подиках&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
При старте подика формируется файл &lt;strong&gt;/etc/resolve.conf&lt;/strong&gt; в котором прописано как будут резолвиться имена. &lt;br/&gt;

Важным параметром является &lt;strong&gt;options ndots:5&lt;/strong&gt; &lt;br/&gt;

Этот параметр задает то, сколько МИНИМУМ точек должно быть точек в имени, чтобы рассмастривать его как FQDN и не пытаться искать это имя с суффиксами из &lt;strong&gt;search&lt;/strong&gt;. &lt;br/&gt;

Изменить его значение можно с помощью специального раздела конфигурации подика:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsConfig:
    options:
      - name: ndots
        value: &amp;quot;1&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\/etc\/resolve.conf \u0432 \u043f\u043e\u0434\u0438\u043a\u0430\u0445&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;etcresolveconf_\u0432_\u043f\u043e\u0434\u0438\u043a\u0430\u0445&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:31,&amp;quot;secid&amp;quot;:89,&amp;quot;range&amp;quot;:&amp;quot;62866-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 30 Nov 2023 08:03:34 +0000</pubDate>
        </item>
        <item>
            <title>kubernetes_backup</title>
            <link>https://wiki.autosys.tk/devops/kubernetes_backup</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://wiki.autosys.tk/_media/devops/kubernetes_backup_recovery_fd.zip&quot; class=&quot;media mediafile mf_zip&quot; title=&quot;devops:kubernetes_backup_recovery_fd.zip (1.8 MB)&quot;&gt;kubernetes_backup_recovery_fd.zip&lt;/a&gt;
&lt;/p&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 19 Jan 2022 18:32:27 +0000</pubDate>
        </item>
        <item>
            <title>kubernetes_dns_reply_from_unexpected_source</title>
            <link>https://wiki.autosys.tk/devops/kubernetes_dns_reply_from_unexpected_source</link>
            <description>
&lt;p&gt;
В кластере запущенные приложения перестали получать корректные ответы от &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;. &lt;br/&gt;

Диагностируем. Запускаем pod с &lt;strong&gt;dnsutils&lt;/strong&gt;: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl run dnsutils --image=gcr.io/kubernetes-e2e-test-images/dnsutils:1.3 -- sleep 3600&lt;/pre&gt;

&lt;p&gt;
Заходим в нему в консольку:  
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl exec -it dnsutils -- /bin/sh&lt;/pre&gt;

&lt;p&gt;
И проверяем:  
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# nslookup kubernetes.default
;; reply from unexpected source: 10.244.0.178#53, expected 10.96.0.10#53&lt;/pre&gt;

&lt;p&gt;
НЕ РАБОТАЕТ!
Оказалось, что после замены &lt;strong&gt;CRI&lt;/strong&gt; (с &lt;strong&gt;docker&lt;/strong&gt; на &lt;strong&gt;containerd&lt;/strong&gt;) скорее всего в результате удаления &lt;strong&gt;docker&lt;/strong&gt;, перестал загружаться модуль ядра  &lt;strong&gt;br_netfilter&lt;/strong&gt;. &lt;br/&gt;

Чтобы просто заставить работать нужно сделать так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Debian
modprobe br_netfilter&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;CentOS
echo &amp;#039;1&amp;#039; &amp;gt; /proc/sys/net/bridge/bridge-nf-call-iptables&lt;/pre&gt;

&lt;p&gt;
А чтобы модуль загружался автоматически при загрузке хоста нужно сделать так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;echo &amp;#039;br_netfilter&amp;#039; | sudo tee -a /etc/modules&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 02 Jun 2021 08:47:36 +0000</pubDate>
        </item>
        <item>
            <title>kubernetes_docker_deprecating</title>
            <link>https://wiki.autosys.tk/devops/kubernetes_docker_deprecating</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://kruyt.org/migrate-docker-containerd-kubernetes/&quot; class=&quot;urlextern&quot; title=&quot;https://kruyt.org/migrate-docker-containerd-kubernetes/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kruyt.org/migrate-docker-containerd-kubernetes/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
Проверяем, что у нас всё хорошо с &lt;strong&gt;containerd&lt;/strong&gt;. Смотрим его неймспейсы. Там должен быть неймспейс &lt;strong&gt;moby&lt;/strong&gt; - неймспейс, в котором запускает контейнеры &lt;strong&gt;docker&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo ctr namespace list
sudo ctr --namespace moby container list&lt;/pre&gt;

&lt;p&gt;
Если неймспейс и контейнеры видны - значит все хорошо. Кордоним и дрейним ноду:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl cordon kub
kubectl drain kub --delete-emptydir-data --ignore-daemonsets&lt;/pre&gt;

&lt;p&gt;
Останавливаем сервисы:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;systemctl stop kubelet
systemctl stop docker&lt;/pre&gt;

&lt;p&gt;
Удаляем докер:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt-get purge docker.io&lt;/pre&gt;

&lt;p&gt;
Генерим дефолтный конфиг и убеждаемся, что плагин &lt;strong&gt;cri&lt;/strong&gt; не входит в список отключенных в конфиге &lt;strong&gt;containerd&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo mkdir -p /etc/containerd/
sudo containerd config default | sudo tee -a /etc/containerd/config.toml
containerd config dump | grep disabled_plugins&lt;/pre&gt;

&lt;p&gt;
А если он там есть, то включаем &lt;strong&gt;cri&lt;/strong&gt; (удаляем его из списка отключенных). Для этого комментируем строку в файле &lt;strong&gt;/etc/containerd/config.toml&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#disabled_plugins = [&amp;quot;cri&amp;quot;]&lt;/pre&gt;

&lt;p&gt;
Включаем containerd в конфиг &lt;strong&gt;kubelet&lt;/strong&gt;. То есть добавляем параметры
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;--container-runtime=remote --container-runtimeendpoint=unix:///run/containerd/containerd.sock&lt;/pre&gt;

&lt;p&gt;
к строке с параметрами запуска &lt;strong&gt;kubelet&lt;/strong&gt; в файле &lt;strong&gt;/var/lib/kubelet/kubeadm-flags.env&lt;/strong&gt;. В итоге содержимое файла в моем случае стало таким:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;KUBELET_KUBEADM_ARGS=&amp;quot;--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2 --resolv-conf=/run/systemd/resolve/resolv.conf --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock&amp;quot;&lt;/pre&gt;

&lt;p&gt;
Всё. теперь можно перезагрузить ноду. &lt;br/&gt;

После перезагрузки  у меня kubelet не завелся с ошибкой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Flag --cgroup-driver has been deprecated, This parameter should be set via the config file specified by the Kubelet&amp;#039;s --config flag.
Flag --resolv-conf has been deprecated, This parameter should be set via the config file specified by the Kubelet&amp;#039;s --config flag. &lt;/pre&gt;

&lt;p&gt;
В итоге:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В &lt;strong&gt;/var/lib/kubelet/kubeadm-flags.env&lt;/strong&gt; осталось вот что: &lt;pre class=&quot;code&quot;&gt;KUBELET_KUBEADM_ARGS=&amp;quot;--network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2 --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock&amp;quot;&lt;/pre&gt;

&lt;p&gt;
 или   
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;KUBELET_KUBEADM_ARGS=&amp;quot;--fail-swap-on=false --pod-infra-container-image=k8s.gcr.io/pause:3.4.1 --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock&amp;quot;&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Параметры &lt;strong&gt;–resolv-conf&lt;/strong&gt; и &lt;strong&gt;–cgroup-driver&lt;/strong&gt; переехали в &lt;strong&gt;/var/lib/kubelet/config.yaml&lt;/strong&gt;: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;resolvConf: /run/systemd/resolve/resolv.conf
cgroupDriver: systemd&lt;/pre&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
После удаления &lt;strong&gt;docker&lt;/strong&gt; многие пакеты, в том числе и &lt;strong&gt;containerd&lt;/strong&gt;, будут считаться ненужными и могут быть автоматически удалены! Поэтому - их нужно переустановить вручную:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apt-get install bridge-utils cgroupfs-mount containerd git patch pigz runc&lt;/pre&gt;

&lt;p&gt;
Также - нужно прописать в свойствах ноды путь до сокета нового CRI. Проверить что там прописано сейчас можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubetl get no -o yaml | grep cri&lt;/pre&gt;

&lt;p&gt;
И там должен быть путь до сокета &lt;strong&gt;containerd&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubeadm.alpha.kubernetes.io/cri-socket: /run/containerd/containerd.sock&lt;/pre&gt;

&lt;p&gt;
В моем случае - некорректное значение этого параметра (он указывал на docker-shim) приводило к тому что в логах kubelet service было много такого:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Apr 23 16:57:45 kub kubelet[771273]: E0423 16:57:45.583662  771273 cri_stats_provider.go:669] &amp;quot;Unable to fetch container log stats&amp;quot; err=&amp;quot;failed to get fsstats for \&amp;quot;/var/log/pods/elk_elk-es-data-0_67a13965-df24-4d48-9abb-e6670f35acab/elasticsearch/4.log\&amp;quot;: no such file or directory&amp;quot; containerName=&amp;quot;elasticsearch&amp;quot;&lt;/pre&gt;

&lt;p&gt;
Кажется, что по пути до сокета &lt;strong&gt;CRI&lt;/strong&gt; определяется его тип и путь до логов. В моем случае - файл который пытался обнаружить kubelet был символической ссылкой на файл в &lt;strong&gt;/var/lib/docker&lt;/strong&gt;, а после зуказания корректного пути до сокета в свойствах ноды - всё встало на свои места! &lt;br/&gt;

Ну и анкордоним ноду:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl uncordon kub&lt;/pre&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;проблемы&quot;&gt;Проблемы&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;5112-5142&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;не_запускается_pod_eck&quot;&gt;не запускается pod eck&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
После перехода на &lt;strong&gt;containerd&lt;/strong&gt; перестал запускаться под &lt;strong&gt;ElasticSearch Operator for kubernetes - eck&lt;/strong&gt; с такой ошибкой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;{&amp;quot;log.level&amp;quot;:&amp;quot;error&amp;quot;,&amp;quot;@timestamp&amp;quot;:&amp;quot;2021-06-01T20:31:34.184Z&amp;quot;,&amp;quot;log.logger&amp;quot;:&amp;quot;manager&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;Error setting GOMAXPROCS&amp;quot;,&amp;quot;service.version&amp;quot;:&amp;quot;1.1.1-f13b6d26&amp;quot;,&amp;quot;service.type&amp;quot;:&amp;quot;eck&amp;quot;,&amp;quot;ecs.version&amp;quot;:&amp;quot;1.4.0&amp;quot;,&amp;quot;error&amp;quot;:&amp;quot;invalid format for CGroupSubsys: \&amp;quot;12:freezer:/kubepods-burstable-podf1fe3a11_2795_4c46_8eb6_a1929f4a53b5.slice:cri-containerd:96c7b19a81ff398e19131d816fb6de264e53499e5ad9b5a563f879cf1b37390c\&amp;quot;&amp;quot;,&amp;quot;error.stack_trace&amp;quot;:&amp;quot;github.com/go-logr/zapr.(*zapLogger).Error\n\t/go/pkg/mod/github.com/go-logr/zapr@v0.1.0/zapr.go:128\ngithub.com/elastic/cloud-on-k8s/cmd/manager.execute\n\t/go/src/github.com/elastic/cloud-on-k8s/cmd/manager/main.go:188\ngithub.com/elastic/cloud-on-k8s/cmd/manager.glob..func1\n\t/go/src/github.com/elastic/cloud-on-k8s/cmd/manager/main.go:74\ngithub.com/spf13/cobra.(*Command).execute\n\t/go/pkg/mod/github.com/spf13/cobra@v0.0.5/command.go:830\ngithub.com/spf13/cobra.(*Command).ExecuteC\n\t/go/pkg/mod/github.com/spf13/cobra@v0.0.5/command.go:914\ngithub.com/spf13/cobra.(*Command).Execute\n\t/go/pkg/mod/github.com/spf13/cobra@v0.0.5/command.go:864\nmain.main\n\t/go/src/github.com/elastic/cloud-on-k8s/cmd/main.go:27\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:203&amp;quot;}&lt;/pre&gt;

&lt;p&gt;
Гугление вывело сюда: &lt;a href=&quot;https://discuss.elastic.co/t/elastic-operator-0-crashloopbackoff/267736/3&quot; class=&quot;urlextern&quot; title=&quot;https://discuss.elastic.co/t/elastic-operator-0-crashloopbackoff/267736/3&quot; rel=&quot;ugc nofollow&quot;&gt;https://discuss.elastic.co/t/elastic-operator-0-crashloopbackoff/267736/3&lt;/a&gt; &lt;br/&gt;

Нужно подредактировать конфиг &lt;strong&gt;containerd&lt;/strong&gt;. В файлике &lt;strong&gt;/etc/containerd/config.toml&lt;/strong&gt; для пары плагинов нужно выставить параметры:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;version = 2
[plugins]
  [plugins.&amp;quot;io.containerd.grpc.v1.cri&amp;quot;]
   [plugins.&amp;quot;io.containerd.grpc.v1.cri&amp;quot;.containerd]
      [plugins.&amp;quot;io.containerd.grpc.v1.cri&amp;quot;.containerd.runtimes]
        [plugins.&amp;quot;io.containerd.grpc.v1.cri&amp;quot;.containerd.runtimes.runc]
          runtime_type = &amp;quot;io.containerd.runc.v1&amp;quot;
          [plugins.&amp;quot;io.containerd.grpc.v1.cri&amp;quot;.containerd.runtimes.runc.options]
            SystemdCgroup = true&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f pod eck&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0435_\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f_pod_eck&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;5143-7319&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;в_кластере_не_работает_dns&quot;&gt;В кластере не работает DNS&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://wiki.autosys.tk/devops/kubernetes_dns_reply_from_unexpected_source&quot; class=&quot;wikilink1&quot; title=&quot;devops:kubernetes_dns_reply_from_unexpected_source&quot; data-wiki-id=&quot;devops:kubernetes_dns_reply_from_unexpected_source&quot;&gt;kubernetes_dns_reply_from_unexpected_source&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0412 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 DNS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435_\u043d\u0435_\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442_dns&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;7320-7434&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;диагностика_с_помощью_crictl&quot;&gt;Диагностика с помощью crictl&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Создаем файлик &lt;strong&gt;/etc/crictl.yaml&lt;/strong&gt;: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: true&lt;/pre&gt;

&lt;p&gt;
И дальше можем делать то что написано тут: &lt;a href=&quot;https://kubernetes.io/docs/tasks/debug-application-cluster/crictl/&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.io/docs/tasks/debug-application-cluster/crictl/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kubernetes.io/docs/tasks/debug-application-cluster/crictl/&lt;/a&gt; &lt;br/&gt;

смотреть поды:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;crictl pods&lt;/pre&gt;

&lt;p&gt;
Смотреть контейнеры:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;crictl ps -a&lt;/pre&gt;

&lt;p&gt;
И логи контейнеров (это полезно, когда не работает инфрастурктура кубера kube-api или etcd):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;crictl logs {Container_ID}&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e crictl&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_crictl&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;7435-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Sat, 23 Apr 2022 17:34:26 +0000</pubDate>
        </item>
        <item>
            <title>logrotate_in_kubernetes</title>
            <link>https://wiki.autosys.tk/devops/logrotate_in_kubernetes</link>
            <description>&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://access.redhat.com/solutions/4367311&quot; class=&quot;urlextern&quot; title=&quot;https://access.redhat.com/solutions/4367311&quot; rel=&quot;ugc nofollow&quot;&gt;https://access.redhat.com/solutions/4367311&lt;/a&gt; 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://sematext.com/guides/kubernetes-logging/&quot; class=&quot;urlextern&quot; title=&quot;https://sematext.com/guides/kubernetes-logging/&quot; rel=&quot;ugc nofollow&quot;&gt;https://sematext.com/guides/kubernetes-logging/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 11 Aug 2020 09:13:06 +0000</pubDate>
        </item>
        <item>
            <title>mainpage</title>
            <link>https://wiki.autosys.tk/devops/mainpage</link>
            <description>
&lt;div&gt;&lt;div id=&quot;nojs_indexmenu_142126422269d429cb66910&quot; data-jsajax=&quot;&amp;group=1&quot; class=&quot;indexmenu_nojs&quot;&gt;
&lt;ul class=&quot;idx&quot;&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/ansible_tips&quot; class=&quot;wikilink1&quot; title=&quot;devops:ansible_tips&quot; data-wiki-id=&quot;devops:ansible_tips&quot;&gt;ansible_tips&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/argocd&quot; class=&quot;wikilink1&quot; title=&quot;devops:argocd&quot; data-wiki-id=&quot;devops:argocd&quot;&gt;argocd&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws&quot; data-wiki-id=&quot;devops:aws&quot;&gt;aws&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws_acm_letsencrypt_renew_lambda_terraform&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws_acm_letsencrypt_renew_lambda_terraform&quot; data-wiki-id=&quot;devops:aws_acm_letsencrypt_renew_lambda_terraform&quot;&gt;aws_acm_letsencrypt_renew_lambda_terraform&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws_certified_cloud_practitioner&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws_certified_cloud_practitioner&quot; data-wiki-id=&quot;devops:aws_certified_cloud_practitioner&quot;&gt;aws_certified_cloud_practitioner&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws_certified_devops_engineer_professional&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws_certified_devops_engineer_professional&quot; data-wiki-id=&quot;devops:aws_certified_devops_engineer_professional&quot;&gt;aws_certified_devops_engineer_professional&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws_end_to_end_pipeline&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws_end_to_end_pipeline&quot; data-wiki-id=&quot;devops:aws_end_to_end_pipeline&quot;&gt;aws_end_to_end_pipeline&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws_k8s_eks_lb_conroller&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws_k8s_eks_lb_conroller&quot; data-wiki-id=&quot;devops:aws_k8s_eks_lb_conroller&quot;&gt;aws_k8s_eks_lb_conroller&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws_rds_performance&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws_rds_performance&quot; data-wiki-id=&quot;devops:aws_rds_performance&quot;&gt;aws_rds_performance&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws_s3_upload_using_bash&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws_s3_upload_using_bash&quot; data-wiki-id=&quot;devops:aws_s3_upload_using_bash&quot;&gt;aws_s3_upload_using_bash&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/aws_using_nat_gateways&quot; class=&quot;wikilink1&quot; title=&quot;devops:aws_using_nat_gateways&quot; data-wiki-id=&quot;devops:aws_using_nat_gateways&quot;&gt;aws_using_nat_gateways&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/awx_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2_progammatic_survey&quot; class=&quot;wikilink1&quot; title=&quot;devops:awx_программное_обновление_опросов_progammatic_survey&quot; data-wiki-id=&quot;devops:awx_программное_обновление_опросов_progammatic_survey&quot;&gt;awx_программное_обновление_опросов_progammatic_survey&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/bare_metal_kubernetes_persistent_volume_dynamic_provisioning&quot; class=&quot;wikilink1&quot; title=&quot;devops:bare_metal_kubernetes_persistent_volume_dynamic_provisioning&quot; data-wiki-id=&quot;devops:bare_metal_kubernetes_persistent_volume_dynamic_provisioning&quot;&gt;bare_metal_kubernetes_persistent_volume_dynamic_provisioning&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/building_and_publishing_deb_package_on_launchpad_using_github_actions&quot; class=&quot;wikilink1&quot; title=&quot;devops:building_and_publishing_deb_package_on_launchpad_using_github_actions&quot; data-wiki-id=&quot;devops:building_and_publishing_deb_package_on_launchpad_using_github_actions&quot;&gt;building_and_publishing_deb_package_on_launchpad_using_github_actions&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/build_docker_images_in_k8s_cluster&quot; class=&quot;wikilink1&quot; title=&quot;devops:build_docker_images_in_k8s_cluster&quot; data-wiki-id=&quot;devops:build_docker_images_in_k8s_cluster&quot;&gt;build_docker_images_in_k8s_cluster&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/build_rpm_from_python_script&quot; class=&quot;wikilink1&quot; title=&quot;devops:build_rpm_from_python_script&quot; data-wiki-id=&quot;devops:build_rpm_from_python_script&quot;&gt;build_rpm_from_python_script&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/cadvisor&quot; class=&quot;wikilink1&quot; title=&quot;devops:cadvisor&quot; data-wiki-id=&quot;devops:cadvisor&quot;&gt;cadvisor&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/cka_preparation&quot; class=&quot;wikilink1&quot; title=&quot;devops:cka_preparation&quot; data-wiki-id=&quot;devops:cka_preparation&quot;&gt;cka_preparation&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/cyber_security&quot; class=&quot;wikilink1&quot; title=&quot;devops:cyber_security&quot; data-wiki-id=&quot;devops:cyber_security&quot;&gt;cyber_security&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/deploy_elk_using_helm&quot; class=&quot;wikilink1&quot; title=&quot;devops:deploy_elk_using_helm&quot; data-wiki-id=&quot;devops:deploy_elk_using_helm&quot;&gt;deploy_elk_using_helm&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/deploy_jupyterhub_on_kubernetes&quot; class=&quot;wikilink1&quot; title=&quot;devops:deploy_jupyterhub_on_kubernetes&quot; data-wiki-id=&quot;devops:deploy_jupyterhub_on_kubernetes&quot;&gt;deploy_jupyterhub_on_kubernetes&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/deploy_keycloak_using_helm&quot; class=&quot;wikilink1&quot; title=&quot;devops:deploy_keycloak_using_helm&quot; data-wiki-id=&quot;devops:deploy_keycloak_using_helm&quot;&gt;deploy_keycloak_using_helm&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/deploy_nexus_on_kubernetes&quot; class=&quot;wikilink1&quot; title=&quot;devops:deploy_nexus_on_kubernetes&quot; data-wiki-id=&quot;devops:deploy_nexus_on_kubernetes&quot;&gt;deploy_nexus_on_kubernetes&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/deploy_prometheus_on_kubernetes_using_prometheus-operator&quot; class=&quot;wikilink1&quot; title=&quot;devops:deploy_prometheus_on_kubernetes_using_prometheus-operator&quot; data-wiki-id=&quot;devops:deploy_prometheus_on_kubernetes_using_prometheus-operator&quot;&gt;deploy_prometheus_on_kubernetes_using_prometheus-operator&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/deploy_rsyslog_on_kubernetes&quot; class=&quot;wikilink1&quot; title=&quot;devops:deploy_rsyslog_on_kubernetes&quot; data-wiki-id=&quot;devops:deploy_rsyslog_on_kubernetes&quot;&gt;deploy_rsyslog_on_kubernetes&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/dns_hints&quot; class=&quot;wikilink1&quot; title=&quot;devops:dns_hints&quot; data-wiki-id=&quot;devops:dns_hints&quot;&gt;dns_hints&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/docker&quot; class=&quot;wikilink1&quot; title=&quot;devops:docker&quot; data-wiki-id=&quot;devops:docker&quot;&gt;docker&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/docker_registry_auth_using_curl&quot; class=&quot;wikilink1&quot; title=&quot;devops:docker_registry_auth_using_curl&quot; data-wiki-id=&quot;devops:docker_registry_auth_using_curl&quot;&gt;docker_registry_auth_using_curl&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/fast_helm_carts&quot; class=&quot;wikilink1&quot; title=&quot;devops:fast_helm_carts&quot; data-wiki-id=&quot;devops:fast_helm_carts&quot;&gt;fast_helm_carts&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/free_helm_chart_repository_with_github_pages&quot; class=&quot;wikilink1&quot; title=&quot;devops:free_helm_chart_repository_with_github_pages&quot; data-wiki-id=&quot;devops:free_helm_chart_repository_with_github_pages&quot;&gt;free_helm_chart_repository_with_github_pages&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/git&quot; class=&quot;wikilink1&quot; title=&quot;devops:git&quot; data-wiki-id=&quot;devops:git&quot;&gt;git&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/github_git_clone_decryption_has_failed&quot; class=&quot;wikilink1&quot; title=&quot;devops:github_git_clone_decryption_has_failed&quot; data-wiki-id=&quot;devops:github_git_clone_decryption_has_failed&quot;&gt;github_git_clone_decryption_has_failed&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/gitlab&quot; class=&quot;wikilink1&quot; title=&quot;devops:gitlab&quot; data-wiki-id=&quot;devops:gitlab&quot;&gt;gitlab&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/gitlab_ci_gke&quot; class=&quot;wikilink1&quot; title=&quot;devops:gitlab_ci_gke&quot; data-wiki-id=&quot;devops:gitlab_ci_gke&quot;&gt;gitlab_ci_gke&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/gitlab_ci_semver&quot; class=&quot;wikilink1&quot; title=&quot;devops:gitlab_ci_semver&quot; data-wiki-id=&quot;devops:gitlab_ci_semver&quot;&gt;gitlab_ci_semver&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/gslb&quot; class=&quot;wikilink1&quot; title=&quot;devops:gslb&quot; data-wiki-id=&quot;devops:gslb&quot;&gt;gslb&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/haproxy_hints&quot; class=&quot;wikilink1&quot; title=&quot;devops:haproxy_hints&quot; data-wiki-id=&quot;devops:haproxy_hints&quot;&gt;haproxy_hints&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/hashicorp_vault_workflow&quot; class=&quot;wikilink1&quot; title=&quot;devops:hashicorp_vault_workflow&quot; data-wiki-id=&quot;devops:hashicorp_vault_workflow&quot;&gt;hashicorp_vault_workflow&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/helm&quot; class=&quot;wikilink1&quot; title=&quot;devops:helm&quot; data-wiki-id=&quot;devops:helm&quot;&gt;helm&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/ingress_413_request_entity_too_large&quot; class=&quot;wikilink1&quot; title=&quot;devops:ingress_413_request_entity_too_large&quot; data-wiki-id=&quot;devops:ingress_413_request_entity_too_large&quot;&gt;ingress_413_request_entity_too_large&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/java_app_cd_pipeline_with_jenkins&quot; class=&quot;wikilink1&quot; title=&quot;devops:java_app_cd_pipeline_with_jenkins&quot; data-wiki-id=&quot;devops:java_app_cd_pipeline_with_jenkins&quot;&gt;java_app_cd_pipeline_with_jenkins&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/jenkins&quot; class=&quot;wikilink1&quot; title=&quot;devops:jenkins&quot; data-wiki-id=&quot;devops:jenkins&quot;&gt;jenkins&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/jvm_memory_limits_in_k8s&quot; class=&quot;wikilink1&quot; title=&quot;devops:jvm_memory_limits_in_k8s&quot; data-wiki-id=&quot;devops:jvm_memory_limits_in_k8s&quot;&gt;jvm_memory_limits_in_k8s&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/k3s&quot; class=&quot;wikilink1&quot; title=&quot;devops:k3s&quot; data-wiki-id=&quot;devops:k3s&quot;&gt;k3s&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/k3s_containerd_shim_high_cpu_load&quot; class=&quot;wikilink1&quot; title=&quot;devops:k3s_containerd_shim_high_cpu_load&quot; data-wiki-id=&quot;devops:k3s_containerd_shim_high_cpu_load&quot;&gt;k3s_containerd_shim_high_cpu_load&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/k8s_actual_container_cpu_memory_consumption&quot; class=&quot;wikilink1&quot; title=&quot;devops:k8s_actual_container_cpu_memory_consumption&quot; data-wiki-id=&quot;devops:k8s_actual_container_cpu_memory_consumption&quot;&gt;k8s_actual_container_cpu_memory_consumption&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/k8s_ephemeral_storage_consumption&quot; class=&quot;wikilink1&quot; title=&quot;devops:k8s_ephemeral_storage_consumption&quot; data-wiki-id=&quot;devops:k8s_ephemeral_storage_consumption&quot;&gt;k8s_ephemeral_storage_consumption&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/k8s_hints&quot; class=&quot;wikilink1&quot; title=&quot;devops:k8s_hints&quot; data-wiki-id=&quot;devops:k8s_hints&quot;&gt;k8s_hints&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/kafka_monitoring&quot; class=&quot;wikilink1&quot; title=&quot;devops:kafka_monitoring&quot; data-wiki-id=&quot;devops:kafka_monitoring&quot;&gt;kafka_monitoring&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/kubernetes&quot; class=&quot;wikilink1&quot; title=&quot;devops:kubernetes&quot; data-wiki-id=&quot;devops:kubernetes&quot;&gt;kubernetes&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/kubernetes_backup&quot; class=&quot;wikilink1&quot; title=&quot;devops:kubernetes_backup&quot; data-wiki-id=&quot;devops:kubernetes_backup&quot;&gt;kubernetes_backup&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/kubernetes_dns_reply_from_unexpected_source&quot; class=&quot;wikilink1&quot; title=&quot;devops:kubernetes_dns_reply_from_unexpected_source&quot; data-wiki-id=&quot;devops:kubernetes_dns_reply_from_unexpected_source&quot;&gt;kubernetes_dns_reply_from_unexpected_source&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/kubernetes_docker_deprecating&quot; class=&quot;wikilink1&quot; title=&quot;devops:kubernetes_docker_deprecating&quot; data-wiki-id=&quot;devops:kubernetes_docker_deprecating&quot;&gt;kubernetes_docker_deprecating&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/logrotate_in_kubernetes&quot; class=&quot;wikilink1&quot; title=&quot;devops:logrotate_in_kubernetes&quot; data-wiki-id=&quot;devops:logrotate_in_kubernetes&quot;&gt;logrotate_in_kubernetes&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/message_to_ms_teams_channel_from_bash_with_curl&quot; class=&quot;wikilink1&quot; title=&quot;devops:message_to_ms_teams_channel_from_bash_with_curl&quot; data-wiki-id=&quot;devops:message_to_ms_teams_channel_from_bash_with_curl&quot;&gt;message_to_ms_teams_channel_from_bash_with_curl&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/ms_teams_search_messages_in_a_channel&quot; class=&quot;wikilink1&quot; title=&quot;devops:ms_teams_search_messages_in_a_channel&quot; data-wiki-id=&quot;devops:ms_teams_search_messages_in_a_channel&quot;&gt;ms_teams_search_messages_in_a_channel&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/nexus&quot; class=&quot;wikilink1&quot; title=&quot;devops:nexus&quot; data-wiki-id=&quot;devops:nexus&quot;&gt;nexus&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/nginx-ingress-backends-debug&quot; class=&quot;wikilink1&quot; title=&quot;devops:nginx-ingress-backends-debug&quot; data-wiki-id=&quot;devops:nginx-ingress-backends-debug&quot;&gt;nginx-ingress-backends-debug&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/npm_codeartifacts_auth_proxy&quot; class=&quot;wikilink1&quot; title=&quot;devops:npm_codeartifacts_auth_proxy&quot; data-wiki-id=&quot;devops:npm_codeartifacts_auth_proxy&quot;&gt;npm_codeartifacts_auth_proxy&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/openebs&quot; class=&quot;wikilink1&quot; title=&quot;devops:openebs&quot; data-wiki-id=&quot;devops:openebs&quot;&gt;openebs&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/otus_course_final&quot; class=&quot;wikilink1&quot; title=&quot;devops:otus_course_final&quot; data-wiki-id=&quot;devops:otus_course_final&quot;&gt;otus_course_final&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/php-fmp-nginx-performance-diags&quot; class=&quot;wikilink1&quot; title=&quot;devops:php-fmp-nginx-performance-diags&quot; data-wiki-id=&quot;devops:php-fmp-nginx-performance-diags&quot;&gt;php-fmp-nginx-performance-diags&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/postgres_investigating_slowness&quot; class=&quot;wikilink1&quot; title=&quot;devops:postgres_investigating_slowness&quot; data-wiki-id=&quot;devops:postgres_investigating_slowness&quot;&gt;postgres_investigating_slowness&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/prometheus_federation&quot; class=&quot;wikilink1&quot; title=&quot;devops:prometheus_federation&quot; data-wiki-id=&quot;devops:prometheus_federation&quot;&gt;prometheus_federation&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/proxy_pass_auth&quot; class=&quot;wikilink1&quot; title=&quot;devops:proxy_pass_auth&quot; data-wiki-id=&quot;devops:proxy_pass_auth&quot;&gt;proxy_pass_auth&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/rebrain_devops_course&quot; class=&quot;wikilink1&quot; title=&quot;devops:rebrain_devops_course&quot; data-wiki-id=&quot;devops:rebrain_devops_course&quot;&gt;rebrain_devops_course&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/setup_jenkins_on_kubernetes&quot; class=&quot;wikilink1&quot; title=&quot;devops:setup_jenkins_on_kubernetes&quot; data-wiki-id=&quot;devops:setup_jenkins_on_kubernetes&quot;&gt;setup_jenkins_on_kubernetes&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/setup_pgadmin_on_kubernetes&quot; class=&quot;wikilink1&quot; title=&quot;devops:setup_pgadmin_on_kubernetes&quot; data-wiki-id=&quot;devops:setup_pgadmin_on_kubernetes&quot;&gt;setup_pgadmin_on_kubernetes&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/skaffold&quot; class=&quot;wikilink1&quot; title=&quot;devops:skaffold&quot; data-wiki-id=&quot;devops:skaffold&quot;&gt;skaffold&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/teamcity_gitlab_merge_pull_requests&quot; class=&quot;wikilink1&quot; title=&quot;devops:teamcity_gitlab_merge_pull_requests&quot; data-wiki-id=&quot;devops:teamcity_gitlab_merge_pull_requests&quot;&gt;teamcity_gitlab_merge_pull_requests&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/terrafrom&quot; class=&quot;wikilink1&quot; title=&quot;devops:terrafrom&quot; data-wiki-id=&quot;devops:terrafrom&quot;&gt;terrafrom&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/tools_bash_completition&quot; class=&quot;wikilink1&quot; title=&quot;devops:tools_bash_completition&quot; data-wiki-id=&quot;devops:tools_bash_completition&quot;&gt;tools_bash_completition&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B&quot; class=&quot;wikilink1&quot; title=&quot;devops:инструменты&quot; data-wiki-id=&quot;devops:инструменты&quot;&gt;инструменты&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%D0%B9_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B&quot; class=&quot;wikilink1&quot; title=&quot;devops:настройка_оболочки_для_удобной_работы&quot; data-wiki-id=&quot;devops:настройка_оболочки_для_удобной_работы&quot;&gt;настройка_оболочки_для_удобной_работы&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot; &gt;&lt;div class=&quot;li&quot;&gt;&lt;a href=&quot;https://wiki.autosys.tk/devops/%D0%BF%D0%BE%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C&quot; class=&quot;wikilink1&quot; title=&quot;devops:почитать&quot; data-wiki-id=&quot;devops:почитать&quot;&gt;почитать&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/div&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 22 Oct 2019 07:52:14 +0000</pubDate>
        </item>
        <item>
            <title>message_to_ms_teams_channel_from_bash_with_curl</title>
            <link>https://wiki.autosys.tk/devops/message_to_ms_teams_channel_from_bash_with_curl</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;задача&quot;&gt;Задача&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Надо отправлять сообщения в канал MS Teams из CI/CD через MS Graph &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;. Тo есть из bash-скрипта.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-175&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;что_для_этого_нужно&quot;&gt;Что для этого нужно&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Зарегать приложение на портале &lt;a href=&quot;https://entra.microsoft.com&quot; class=&quot;urlextern&quot; title=&quot;https://entra.microsoft.com&quot; rel=&quot;ugc nofollow&quot;&gt;https://entra.microsoft.com&lt;/a&gt; . 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Дать приложению права
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сгенерировать &lt;strong&gt;Authorizaton Code&lt;/strong&gt; для того, чтобы получить &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; токен и refresh токен. &lt;strong&gt;Authorizaton Code&lt;/strong&gt; одноразовый, генерируется в интерактивном режиме с аутентификацией пользователя и нужен для получения &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;-токена (короткоживущий для отправки сообщений) и refresh-токена (живет долго - 90 дней, для получения &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;-токенов).
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Получить &lt;strong&gt;team id&lt;/strong&gt; (идентификатор организации в MS Teams), получить &lt;strong&gt;channel id&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сверстать сообщение и отправить.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0427\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0447\u0442\u043e_\u0434\u043b\u044f_\u044d\u0442\u043e\u0433\u043e_\u043d\u0443\u0436\u043d\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;176-1109&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;регистрация_приложения&quot;&gt;Регистрация приложения&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 идем на &lt;a href=&quot;https://entra.microsoft.com&quot; class=&quot;urlextern&quot; title=&quot;https://entra.microsoft.com&quot; rel=&quot;ugc nofollow&quot;&gt;https://entra.microsoft.com&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Дальше - &lt;strong&gt;Identity&lt;/strong&gt; → &lt;strong&gt;App Registrations&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В настройках приложения в &lt;strong&gt;Overview&lt;/strong&gt; смотрим &lt;strong&gt;Application (client) ID&lt;/strong&gt; и сохраняем. 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В &lt;strong&gt;Authentication&lt;/strong&gt; добавляем &lt;strong&gt;Redirection &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt; - &lt;a href=&quot;http://localhost/myapp&quot; class=&quot;urlextern&quot; title=&quot;http://localhost/myapp&quot; rel=&quot;ugc nofollow&quot;&gt;http://localhost/myapp&lt;/a&gt; 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В &lt;strong&gt;Certificates &amp;amp; Secrets&lt;/strong&gt; добавляем &lt;strong&gt;Secret&lt;/strong&gt; и сохраняем его &lt;strong&gt;ID&lt;/strong&gt; и &lt;strong&gt;Secret&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В &lt;strong&gt;&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; Permissions&lt;/strong&gt; жмем &lt;strong&gt;Add Permission&lt;/strong&gt; → &lt;strong&gt;Microsoft Graph&lt;/strong&gt; и добавляем &lt;strong&gt;Delegated&lt;/strong&gt; → &lt;strong&gt;ChannelMessage.Send&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Немного пояснений:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;MS Graph &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/strong&gt; не позволяет отправлять сообщения от имени приложения (то есть использовать статичный секрет для аутентификации). В итоге - используется &lt;strong&gt;Delegated&lt;/strong&gt; привилегия &lt;strong&gt;ChannelMessage.Send&lt;/strong&gt;, то есть приложение от имени пользователя получает токен и отправляет сообщения. Если живой пользователь не должен быть в этой схеме, то MS предлягает использовать служебные учетки - то есть фактически виртуальных бесправных пользователей.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1110-2556&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;получение_authorization_code&quot;&gt;Получение Authorization Code&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Это происходит в интерактивном режиме в браузере. &lt;br/&gt;

ВНИМАНИЕ - примерно в середтне июля 2025 у MS сменился алгоритм и теперь вместо &lt;strong&gt;group_id&lt;/strong&gt; нужно использовать &lt;strong&gt;tenant_id&lt;/strong&gt; &lt;br/&gt;

Получаем нужные данные:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;tenant_id&lt;/strong&gt; - напротив любого канала в &lt;strong&gt;MS Teams&lt;/strong&gt; нажимаем три точки и жмем &lt;strong&gt;Get link to channel&lt;/strong&gt;. В этой ссылке будет параметр - &lt;strong&gt;tenantId&lt;/strong&gt;. Это он.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;client_id&lt;/strong&gt; - это идентификатор приложения &lt;strong&gt;Application (client) ID&lt;/strong&gt;, который мы взяли из &lt;strong&gt;Overview&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 УСТАРЕЛО &lt;strong&gt;group_id&lt;/strong&gt; (когда-то он назывался &lt;strong&gt;team_id&lt;/strong&gt;) - напротив любого канала в &lt;strong&gt;MS Teams&lt;/strong&gt; нажимаем три точки и жмем &lt;strong&gt;Get link to channel&lt;/strong&gt;. В этой ссылке будет параметр - &lt;strong&gt;groupId&lt;/strong&gt;. Это он.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Формируем &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;: &lt;pre class=&quot;code&quot;&gt;https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize?client_id={client_id}&amp;amp;response_type=code&amp;amp;response_mode=query&amp;amp;scope=offline_access%20ChannelMessage.Send&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Вводим этот &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt; в браузере, нас перекидывает на страницу аутентификации, а после успешной аутентификации - на &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt; вида 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;https://localhost/myapp?code=1......&amp;amp;session_state=0021c0b9-68fb-6cd3-c0ce-49a54fd54a9a&lt;/pre&gt;

&lt;p&gt;
 так вот параметр code в этом &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt; и есть одноразовый &lt;strong&gt;authorization code&lt;/strong&gt;, пригодный для получения токена.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Важно обратить внимание на параметр &lt;strong&gt;scope&lt;/strong&gt;. Он определяет круг привилегий (через пробел), доступный токену, полученному с помощью этого кода. В scope присутствует &lt;strong&gt;offline_access&lt;/strong&gt;, а это значит что с помощью этого &lt;strong&gt;authorization code&lt;/strong&gt; помимо короткоживущего  &lt;strong&gt;access token&lt;/strong&gt; можно запросить долгоиграющий &lt;strong&gt;refresh token&lt;/strong&gt;, который можно рассматривать как многоразовый &lt;strong&gt;authorization code&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 Authorization Code&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435_authorization_code&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2557-4982&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;получение_access_token_и_refresh_token&quot;&gt;Получение Access Token и Refresh Token&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Дальше все просто - получаем токены:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;MS_GRAPH_API_TOKENS_JSON=`curl -s --location --request POST &amp;quot;https://login.microsoftonline.com/${MS_TENANT}/oauth2/v2.0/token&amp;quot; \
    --header &amp;#039;Content-Type: application/x-www-form-urlencoded&amp;#039; \
    --data-urlencode &amp;quot;client_id=${MS_APPLICATION_ID}&amp;quot; \
    --data-urlencode &amp;quot;code=${AUTHORIZATION_CODE}&amp;quot; \
    --data-urlencode &amp;quot;scope=offline_access ChannelMessage.Send&amp;quot; \
    --data-urlencode &amp;quot;http://localhost/myapp&amp;quot; \
    --data-urlencode &amp;quot;grant_type=authorization_code&amp;quot; 2&amp;gt;/dev/null`
MS_GRAPH_API_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk &amp;#039;{gsub(/\,/,&amp;quot;\n&amp;quot;)}1&amp;#039; 2&amp;gt;/dev/null | grep access_token | cut -d&amp;#039;:&amp;#039; -f2 | tr -cd &amp;#039;[:alnum:]._-&amp;#039;`
MS_GRAPH_API_REFRESH_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk &amp;#039;{gsub(/\,/,&amp;quot;\n&amp;quot;)}1&amp;#039; 2&amp;gt;/dev/null | grep refresh_token | cut -d&amp;#039;:&amp;#039; -f2 | tr -cd &amp;#039;[:alnum:]._-&amp;#039;`&lt;/pre&gt;

&lt;p&gt;
Тут &lt;strong&gt;MS_TENANT&lt;/strong&gt; - это все тот же &lt;strong&gt;team_id&lt;/strong&gt; или &lt;strong&gt;group_id&lt;/strong&gt; - Это синонимичные значения в терминологии MS Teams. &lt;br/&gt;

Refresh Token - валиден 90 дней, но лучше его периодически обновлять, получая тот же JSON о свежими с токенами уже с помощью имеющегося refresh token:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;MS_GRAPH_API_TOKENS_JSON=`curl -s --location --request POST &amp;quot;https://login.microsoftonline.com/${MS_TENANT}/oauth2/v2.0/token&amp;quot; \
        --header &amp;#039;Content-Type: application/x-www-form-urlencoded&amp;#039; \
        --data-urlencode &amp;quot;client_id=${MS_APPLICATION_ID}&amp;quot; \
        --data-urlencode &amp;#039;scope=offline_access ChannelMessage.Send&amp;#039; \
        --data-urlencode &amp;#039;grant_type=refresh_token&amp;#039; \
        --data-urlencode &amp;quot;refresh_token=${MS_GRAPH_API_REFRESH_TOKEN}&amp;quot; 2&amp;gt;/dev/null`
MS_GRAPH_API_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk &amp;#039;{gsub(/\,/,&amp;quot;\n&amp;quot;)}1&amp;#039; 2&amp;gt;/dev/null | grep access_token | cut -d&amp;#039;:&amp;#039; -f2 | tr -cd &amp;#039;[:alnum:]._-&amp;#039;`
MS_GRAPH_API_REFRESH_TOKEN=`echo ${MS_GRAPH_API_TOKENS_JSON} | awk &amp;#039;{gsub(/\,/,&amp;quot;\n&amp;quot;)}1&amp;#039; 2&amp;gt;/dev/null | grep refresh_token | cut -d&amp;#039;:&amp;#039; -f2 | tr -cd &amp;#039;[:alnum:]._-&amp;#039;`&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 Access Token \u0438 Refresh Token&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435_access_token_\u0438_refresh_token&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;4983-7135&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;отправка_сообщения_в_канал_ms_teams_через_ms_graph_api&quot;&gt;Отправка сообщения в канал MS Teams через MS Graph API&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;MESSAGE=&amp;quot;{
  \&amp;quot;body\&amp;quot;: {
  \&amp;quot;contentType\&amp;quot;: \&amp;quot;html\&amp;quot;,
  \&amp;quot;content\&amp;quot;: \&amp;quot;Hello World!\&amp;quot;
  }
}&amp;quot;
curl -s -X POST &amp;quot;https://graph.microsoft.com/v1.0/teams/${MS_TEAMS_GROUP_ID}/channels/${MS_TEAMS_CHANNEL_ID}/messages&amp;quot; \
    -H &amp;quot;Authorization: Bearer ${MS_GRAPH_API_TOKEN}&amp;quot; \
    -H &amp;quot;Content-Type: application/json&amp;quot; \
    -d &amp;quot;${MESSAGE}&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u043d\u0430\u043b MS Teams \u0447\u0435\u0440\u0435\u0437 MS Graph API&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430_\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f_\u0432_\u043a\u0430\u043d\u0430\u043b_ms_teams_\u0447\u0435\u0440\u0435\u0437_ms_graph_api&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;7136-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 23 Jul 2025 08:03:33 +0000</pubDate>
        </item>
        <item>
            <title>ms_teams_search_messages_in_a_channel</title>
            <link>https://wiki.autosys.tk/devops/ms_teams_search_messages_in_a_channel</link>
            <description>
&lt;p&gt;
Мне нужно получить тексты сообщений из канала MS Teams с помощью &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;. &lt;br/&gt;

Оказалось, что из GraphQL (&lt;a href=&quot;https://developer.microsoft.com/en-us/graph/graph-explorer&quot; class=&quot;urlextern&quot; title=&quot;https://developer.microsoft.com/en-us/graph/graph-explorer&quot; rel=&quot;ugc nofollow&quot;&gt;https://developer.microsoft.com/en-us/graph/graph-explorer&lt;/a&gt;) сделать это можно только со специтальными разрешениями от админа (&lt;strong&gt;Chat.Read&lt;/strong&gt; или &lt;strong&gt;Chat.ReadWrite&lt;/strong&gt;, &lt;strong&gt;ChannelMessage.Read.All&lt;/strong&gt;). &lt;br/&gt;

Однако, закрытый &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;, который испольузет приложение - позволяет как минимум получить список сообщений и &lt;strong&gt;preview&lt;/strong&gt;. &lt;br/&gt;

В итоге, я сделал так:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 идем в web-интерфейс Teams, нажимаем в браузере F11 и выполняем поиск в нужном канале.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В network находим запрос методом POST на адрес  &lt;strong&gt;&lt;a href=&quot;https://substrate.office.com/searchservice/api/v2/query&quot; class=&quot;urlextern&quot; title=&quot;https://substrate.office.com/searchservice/api/v2/query&quot; rel=&quot;ugc nofollow&quot;&gt;https://substrate.office.com/searchservice/api/v2/query&lt;/a&gt;&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В заголовках этого запроса берем заголовок &lt;strong&gt;Authorization&lt;/strong&gt; и подставляем в этот скрипт:
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;#!/bin/bash

export MS_GRAPH_API_TOKEN=&amp;quot;Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6Im53WG5YbG9PdndrUUEyN0FiVWV3czd4X2pscDRETzFBX1Uyb1FCUEVSWjgiLCJhbGciOiJSUzI1NiIsIng1dCI6InJ0c0ZULWItN0x1WTdEVlllU05LY0lKN1ZuYyIsImtpZCI6InJ0c0ZULWItN0x1WTdEVlllU05LY0lKN1ZuYyJ9.eyJhdWQiOiJodHRwczovL291dGxvb2s...&amp;quot;

function search_ms_teams_messages {
    curl --silent -X POST &amp;quot;https://substrate.office.com/searchservice/api/v2/query&amp;quot; \
    -H &amp;quot;Authorization: ${MS_GRAPH_API_TOKEN}&amp;quot; \
    -H &amp;quot;Content-Type: application/json&amp;quot; \
    -d &amp;#039;{
  &amp;quot;entityRequests&amp;quot;: [
    {
      &amp;quot;entityType&amp;quot;: &amp;quot;Message&amp;quot;,
      &amp;quot;contentSources&amp;quot;: [
        &amp;quot;Teams&amp;quot;
      ],
      &amp;quot;fields&amp;quot;: [],
      &amp;quot;propertySet&amp;quot;: &amp;quot;Optimized&amp;quot;,
      &amp;quot;query&amp;quot;: {
        &amp;quot;queryString&amp;quot;: &amp;quot;Mikhail Usik AND sent &amp;gt;= 2025-12-01T00:00:00.000Z AND sent &amp;lt; 2025-12-31T00:00:00.000Z AND clientthreadid:19:b89271071f5a4a52b675758165469040@thread.skype AND NOT (isClientSoftDeleted:TRUE)&amp;quot;,
        &amp;quot;displayQueryString&amp;quot;: &amp;quot;Mikhail Usik&amp;quot;
      },
      &amp;quot;from&amp;quot;: 0,
      &amp;quot;size&amp;quot;: 100,
      &amp;quot;topResultsCount&amp;quot;: 10,
      &amp;quot;filter&amp;quot;: {
        &amp;quot;Term&amp;quot;: {
          &amp;quot;GroupId&amp;quot;: &amp;quot;c0f53b2a-78cd-4722-a378-f2c439c612cb&amp;quot;
        }
      }
    }
  ],
  &amp;quot;QueryAlterationOptions&amp;quot;: {
    &amp;quot;EnableAlteration&amp;quot;: true,
    &amp;quot;EnableSuggestion&amp;quot;: true,
    &amp;quot;SupportedRecourseDisplayTypes&amp;quot;: [
      &amp;quot;Suggestion&amp;quot;
    ]
  },
  &amp;quot;cvid&amp;quot;: &amp;quot;237bca94-000f-4634-90d4-78207e267d79&amp;quot;,
  &amp;quot;logicalId&amp;quot;: &amp;quot;c7e32b39-af2f-4dae-a670-80d4df18fd80&amp;quot;,
  &amp;quot;scenario&amp;quot;: {
    &amp;quot;Dimensions&amp;quot;: [
      {
        &amp;quot;DimensionName&amp;quot;: &amp;quot;QueryType&amp;quot;,
        &amp;quot;DimensionValue&amp;quot;: &amp;quot;Messages&amp;quot;
      },
      {
        &amp;quot;DimensionName&amp;quot;: &amp;quot;FormFactor&amp;quot;,
        &amp;quot;DimensionValue&amp;quot;: &amp;quot;general.web.reactSearch&amp;quot;
      }
    ],
    &amp;quot;Name&amp;quot;: &amp;quot;powerbar&amp;quot;
  },
  &amp;quot;Context&amp;quot;: {
    &amp;quot;EntityContext&amp;quot;: [
      {
        &amp;quot;@odata.type&amp;quot;: &amp;quot;Microsoft.OutlookServices.Message&amp;quot;,
        &amp;quot;Id&amp;quot;: &amp;quot;c0f53b2a-78cd-4722-a378-f2c439c612cb&amp;quot;,
        &amp;quot;ClientThreadId&amp;quot;: &amp;quot;19:b89271071f5a4a52b675758165469040@thread.skype&amp;quot;
      }
    ]
  }
}&amp;#039; 2&amp;gt;/dev/null | jq &amp;#039;.EntitySets[].ResultSets[].Results[].Source.Preview&amp;#039; | tac &amp;gt;&amp;gt; previews.txt
}

search_ms_teams_messages&lt;/pre&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;полный_текст_сообщений&quot;&gt;Полный текст сообщений&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Полный текст сообщений можно получить с помощью &lt;strong&gt;InternetMessageId&lt;/strong&gt; и запросов в &lt;strong&gt;GraphQL&lt;/strong&gt; вида:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -X GET \
  -H &amp;quot;Authorization: ${MS_GRAPH_API_TOKEN}&amp;quot; \
  -H &amp;quot;Accept: application/json&amp;quot; \
  &amp;quot;https://graph.microsoft.com/v1.0/teams/${MS_TEAMS_TEAM_ID}/channels/${MS_TEAMS_CHANNEL_ID}/messages/${MESSAGE_ID}&amp;quot;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043b\u043d\u044b\u0439_\u0442\u0435\u043a\u0441\u0442_\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;3185-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 04 Dec 2025 14:31:14 +0000</pubDate>
        </item>
        <item>
            <title>nexus</title>
            <link>https://wiki.autosys.tk/devops/nexus</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;pypi&quot;&gt;PyPI&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://help.sonatype.com/repomanager3/formats/pypi-repositories&quot; class=&quot;urlextern&quot; title=&quot;https://help.sonatype.com/repomanager3/formats/pypi-repositories&quot; rel=&quot;ugc nofollow&quot;&gt;https://help.sonatype.com/repomanager3/formats/pypi-repositories&lt;/a&gt; &lt;br/&gt;

У меня задача - создать локальный репозитрий, куда загрузить необходимые проектам зависимости. &lt;br/&gt;

Итак. Я создал в nexus репозитрий &lt;strong&gt;pypi hosted&lt;/strong&gt; и назвал его &lt;strong&gt;pypi-local&lt;/strong&gt;. &lt;br/&gt;

В итоге - он доступен по адресу: &lt;a href=&quot;http://repos.rdleas.ru/repository/pypi-local/&quot; class=&quot;urlextern&quot; title=&quot;http://repos.rdleas.ru/repository/pypi-local/&quot; rel=&quot;ugc nofollow&quot;&gt;http://repos.rdleas.ru/repository/pypi-local/&lt;/a&gt;  &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;PyPI&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;pypi&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-487&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;использование_созданного_репозитория&quot;&gt;Использование созданного репозитория&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Для того, чтобы использовать созданный репозиторий нужно прописать его в файле &lt;strong&gt;pip.conf&lt;/strong&gt;. В засисимости от обстоятельств, расположение этого файла может быть различным: &lt;a href=&quot;https://pip.pypa.io/en/stable/user_guide/#config-file&quot; class=&quot;urlextern&quot; title=&quot;https://pip.pypa.io/en/stable/user_guide/#config-file&quot; rel=&quot;ugc nofollow&quot;&gt;https://pip.pypa.io/en/stable/user_guide/#config-file&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[global]
index = http://repos.rdleas.ru/repository/pypi-local/pypi
index-url = http://repos.rdleas.ru/repository/pypi-local/simple
#cert = nexus.pem&lt;/pre&gt;

&lt;p&gt;
Если репозитрий защищен паролем, то учестные данные можно прописать в файле &lt;strong&gt;.pypirc&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[distutils]
index-servers = pypi
[pypi]
repository: http://repos.rdleas.ru/repository/pypi-local/
username: admin
password: admin123&lt;/pre&gt;

&lt;p&gt;
Если репозиторий http (не https), то нужно прописать его в trusted hosts:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;[global]
trusted-host = repos.rdleas.ru
index = http://repos.rdleas.ru/repository/pypi-local/pypi
index-url = http://repos.rdleas.ru/repository/pypi-local/simple&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435_\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e_\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;488-1677&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;как_загружать_пакеты_в_репозиторий_pypi&quot;&gt;Как загружать пакеты в репозиторий pypi&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives&quot; class=&quot;urlextern&quot; title=&quot;https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives&quot; rel=&quot;ugc nofollow&quot;&gt;https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives&lt;/a&gt; &lt;br/&gt;

Для того чтобы запушить пакет в созданный репозиторий воспользуемся &lt;strong&gt;twine&lt;/strong&gt;. &lt;br/&gt;

Установим его:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo pip3 install twine&lt;/pre&gt;

&lt;p&gt;
Теперь можно аплоадить. Ключ &lt;strong&gt;-r&lt;/strong&gt; (или &lt;strong&gt;–repository&lt;/strong&gt;) указывает на репозитрий, прописанный в &lt;strong&gt;.pypirc&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;twine upload -r pypi &amp;lt;filename&amp;gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 pypi&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u0430\u043a_\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c_\u043f\u0430\u043a\u0435\u0442\u044b_\u0432_\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439_pypi&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1678-2258&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;скрипт&quot;&gt;Скрипт&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
set +e
packages=&amp;quot;./packages&amp;quot;
proxy_user=&amp;quot;user&amp;quot;
proxy_pass=&amp;quot;pass&amp;quot;
sudo bash -c &amp;quot;pip3 install --proxy http://$proxy_user:$proxy_pass@10.77.70.6:3128 twine&amp;quot;

while read -r package
do
  echo &amp;quot;+++++++++++++++++++++++ $package +++++++++++++++++++++++++&amp;quot;
  bash -c &amp;quot;pip3 download --proxy http://$proxy_user:$proxy_pass@10.77.70.6:3128 $package&amp;quot;
done &amp;lt; &amp;quot;$packages&amp;quot;

for f in ./*.whl ./*.tar.gz
do
 echo &amp;quot;Uploading $f&amp;quot;
 twine upload -r pypi $f
done&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043a\u0440\u0438\u043f\u0442&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043a\u0440\u0438\u043f\u0442&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2259-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 15 Mar 2021 09:46:36 +0000</pubDate>
        </item>
        <item>
            <title>nginx-ingress-backends-debug</title>
            <link>https://wiki.autosys.tk/devops/nginx-ingress-backends-debug</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;проблема&quot;&gt;Проблема&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Нужно посмотреть - какие бекенды попадают в конфиг &lt;strong&gt;Nginx Ingress Controller&lt;/strong&gt;. &lt;br/&gt;

Если мы просто выведем текущий конфиг контроллера с помощью
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;nginx -T&lt;/pre&gt;

&lt;p&gt;
То увидим, что список бекендов апстрима генерируется динамически - &lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/how-it-works/&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.github.io/ingress-nginx/how-it-works/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kubernetes.github.io/ingress-nginx/how-it-works/&lt;/a&gt; &lt;br/&gt;

Однако, есть способ посмотреть что же там генерируется - это &lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/kubectl-plugin/&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.github.io/ingress-nginx/kubectl-plugin/&quot; rel=&quot;ugc nofollow&quot;&gt;плагин ingress-nginx для kubectl&lt;/a&gt;. &lt;br/&gt;

Для этого:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://krew.sigs.k8s.io/docs/user-guide/setup/install/&quot; class=&quot;urlextern&quot; title=&quot;https://krew.sigs.k8s.io/docs/user-guide/setup/install/&quot; rel=&quot;ugc nofollow&quot;&gt;Устанавливаем krew&lt;/a&gt;, если он еще не установлен. Для этого в &lt;strong&gt;bash&lt;/strong&gt; запускаем такое: &lt;pre class=&quot;code&quot;&gt;(
  set -x; cd &amp;quot;$(mktemp -d)&amp;quot; &amp;amp;&amp;amp;
  OS=&amp;quot;$(uname | tr &amp;#039;[:upper:]&amp;#039; &amp;#039;[:lower:]&amp;#039;)&amp;quot; &amp;amp;&amp;amp;
  ARCH=&amp;quot;$(uname -m | sed -e &amp;#039;s/x86_64/amd64/&amp;#039; -e &amp;#039;s/\(arm\)\(64\)\?.*/\1\2/&amp;#039; -e &amp;#039;s/aarch64$/arm64/&amp;#039;)&amp;quot; &amp;amp;&amp;amp;
  KREW=&amp;quot;krew-${OS}_${ARCH}&amp;quot; &amp;amp;&amp;amp;
  curl -fsSLO &amp;quot;https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz&amp;quot; &amp;amp;&amp;amp;
  tar zxvf &amp;quot;${KREW}.tar.gz&amp;quot; &amp;amp;&amp;amp;
  ./&amp;quot;${KREW}&amp;quot; install krew
)&lt;/pre&gt;

&lt;p&gt;
Затем в &lt;strong&gt;~/.bashrc&lt;/strong&gt; дописываем 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export PATH=&amp;quot;${KREW_ROOT:-$HOME/.krew}/bin:$PATH&amp;quot;&lt;/pre&gt;

&lt;p&gt;
выполняем
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;source ~/.bashrc&lt;/pre&gt;

&lt;p&gt;
и проверяем, что плагин &lt;strong&gt;krew&lt;/strong&gt; установился
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl krew&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Устанавливаем плагин &lt;strong&gt;ingress-nginx&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl krew install ingress-nginx&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 И теперь - смотрим что там с бекендами:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl ingress-nginx backends&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Если вылезает сообщение типа 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;no pods for deployment ingress-nginx-controller found in namespace &lt;/pre&gt;

&lt;p&gt;
 - это значит, что плагин пытается найти деплоймент, которым развернут ingress-контроллер, но не может найти этот деплоймент, потому что он называется как-то иначе. Тогда делаем так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl ingress-nginx backends -n ingress --deployment nginx-ingress-nginx-controller&lt;/pre&gt;

&lt;p&gt;
 то есть указываем неймспейс где развернут ингресс-контроллер и актуальное имя деплоймента. 
&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 21 Apr 2022 12:25:17 +0000</pubDate>
        </item>
        <item>
            <title>npm_codeartifacts_auth_proxy</title>
            <link>https://wiki.autosys.tk/devops/npm_codeartifacts_auth_proxy</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;что_это&quot;&gt;ЧТо это??&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;strong&gt;AWS Codeartifacts&lt;/strong&gt; не позволяют использовать свои репозитриии без аутентификации, что может быть неудобно. &lt;br/&gt;

Эти скрипты позволяют настроить прокси, который будет автоматически получать, обновлять и подставлять в заголовки запросов свежие токены. &lt;br/&gt;

Таким образом - клиенты могут использовать &lt;strong&gt;AWS CodeArtifacts NPM repo&lt;/strong&gt; без аутентификации (вернее - с пустым токеном). &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0427\u0422\u043e \u044d\u0442\u043e??&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0447\u0442\u043e_\u044d\u0442\u043e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-678&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;openresty_lua_based_setup&quot;&gt;Openresty LUA based Setup&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;server {
    listen       $PORT;
    location / {
        access_by_lua_block {
            --ngx.log(ngx.ERR, &amp;#039;################ HEADERS BEFORE AUTH #####################&amp;#039;);
            --local h = ngx.req.get_headers();
            --for k, v in pairs(h) do
            --  ngx.log(ngx.ERR, k..&amp;#039; - &amp;#039;..v);
            --end
            --ngx.log(ngx.ERR, &amp;#039;### REQUEST BODY ###&amp;#039;);
            --ngx.log(ngx.ERR, ngx.req.get_body_data());
            --ngx.log(ngx.ERR, &amp;#039;###################### AUTH #######################&amp;#039;);
            command = [[aws codeartifact get-authorization-token --domain ${CODEARTIFACTS_DOMAIN} --domain-owner ${CODEARTIFACTS_OWNER} --query authorizationToken --output text]];
            local handle = io.popen(command);
            local token = handle:read(&amp;quot;*a&amp;quot;):gsub(&amp;quot;\n$&amp;quot;, &amp;quot;&amp;quot;);
            handle:close();
            --ngx.log(ngx.ERR, &amp;#039;Token - &amp;#039;..token);
            ngx.req.set_header(&amp;#039;authorization&amp;#039;, &amp;#039;Bearer &amp;#039;..token);
            ngx.req.set_header(&amp;#039;host&amp;#039;, &amp;#039;${BACKEND_HOST}&amp;#039;);
            --ngx.log(ngx.ERR, &amp;#039;################ HEADERS BEFORE PROXYPASS #####################&amp;#039;);
            --local h = ngx.req.get_headers()
            --for k, v in pairs(h) do
            --    ngx.log(ngx.ERR, k..&amp;#039; - &amp;#039;..v);
            --end
        }
        proxy_redirect off;
        proxy_pass ${BACKEND_URL}:${BACKEND_PORT};
    }
}&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;version: &amp;#039;3.9&amp;#039;

services:
  npm-proxy:
    restart: always
    image: openresty/openresty:1.21.4.1-alpine-fat
    container_name: proxy
    volumes:
    - ./proxy-conf.template:/etc/nginx/conf.d/proxy-conf.template:ro
    ports:
    - &amp;quot;8088:8088&amp;quot;
    environment:
    - CODEARTIFACTS_DOMAIN=artifats-domain
    - BACKEND_URL=https://artifacts-domain-1234567.d.codeartifact.eu-west-1.amazonaws.com
    - BACKEND_PORT=443
    - BACKEND_HOST=artifacts-domain-1234567.d.codeartifact.eu-west-1.amazonaws.com
    - PORT=8088
    command: &amp;gt;
      /bin/bash -c &amp;quot;
      apk add --no-cache aws-cli &amp;amp;&amp;amp;
      export CODEARTIFACTS_OWNER=`aws sts get-caller-identity | grep Account | cut -d&amp;#039;:&amp;#039; -f2 | tr -d &amp;#039;\&amp;quot; ,&amp;#039;` &amp;amp;&amp;amp;
      envsubst &amp;lt; /etc/nginx/conf.d/proxy-conf.template &amp;gt; /etc/nginx/conf.d/default.conf &amp;amp;&amp;amp;
      cat /etc/nginx/conf.d/default.conf &amp;amp;&amp;amp;
      openresty -g &amp;#039;daemon off;&amp;#039;&amp;quot;
  node:
    restart: always
    image: node:18
    container_name: node
    command: &amp;gt;
      /bin/bash -c &amp;quot;sleep infinity&amp;quot;&lt;/pre&gt;

&lt;p&gt;
проверка
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;git clone https://github.com/wix-incubator/empty-package
cd empty-package/
sed -i &amp;#039;s/https\:\/\/registry\.npmjs\.org\//http\:\/\/proxy\:8088\/npm\/anima-npm\//&amp;#039; ./package.json
npm config set registry=http://proxy:8088/npm/anima-npm/
npm config set //proxy:8088/npm/anima-npm/:_authToken=e30=
#### npm config set //proxy:8088/npm/anima-npm/:_authToken=`echo -n &amp;#039;{}&amp;#039; | base64`&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Openresty LUA based Setup&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;openresty_lua_based_setup&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;679-3515&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;plain_nginx_setup&quot;&gt;Plain Nginx setup&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Plain Nginx setup&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;plain_nginx_setup&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;3516-3547&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;docker-composeyml&quot;&gt;docker-compose.yml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;version: &amp;#039;3.9&amp;#039;

services:
  npm-proxy:
    restart: always
    image: ubuntu/nginx:1.18-22.04_edge
    container_name: proxy
    volumes:
    - ./npm-proxy-entrypoint.sh:/start.sh:ro
    - ./npm-proxy-conf.template:/etc/nginx/conf.d/npm-proxy-conf.template:ro
    ports:
    - &amp;quot;8088:8088&amp;quot;
    environment:
    - SERVER_NAME=npm-proxy.domain.com
    - CODEARTIFACTS_DOMAIN=artifacts-domain
    - BACKEND_URL=https://artifacts-domain-1234567.d.codeartifact.eu-west-1.amazonaws.com
    - BACKEND_PORT=443
    - BACKEND_HOST=artifacts-domain-1234567.d.codeartifact.eu-west-1.amazonaws.com
    - PORT=8088
    - REGION=eu-west-1
    command: &amp;gt;
      /bin/bash /start.sh&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;docker-compose.yml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;docker-composeyml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;3548-4258&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;npm-proxy-entrypointsh&quot;&gt;npm-proxy-entrypoint.sh&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
set -e
echo &amp;quot;Installing AWS CLI...&amp;quot;
apt-get update 2&amp;gt;&amp;amp;1&amp;gt;/dev/null
apt-get install -y awscli 2&amp;gt;&amp;amp;1&amp;gt;/dev/null
echo &amp;quot;AWS CLI Installed!!!&amp;quot;
export CODEARTIFACTS_OWNER=`aws sts get-caller-identity | grep Account | cut -d&amp;#039;:&amp;#039; -f2 | tr -d &amp;#039;\&amp;quot; ,&amp;#039;`
ln -sf /dev/stdout /var/log/nginx/access.log &amp;amp;&amp;amp; ln -sf /dev/stderr /var/log/nginx/error.log
nginx -g &amp;#039;daemon off;&amp;#039; &amp;amp;
while true; do
    export AUTH_TOKEN=`aws codeartifact get-authorization-token --region ${REGION} --domain ${CODEARTIFACTS_DOMAIN} --domain-owner ${CODEARTIFACTS_OWNER} --query authorizationToken --output text | tr -d &amp;#039;\n&amp;#039;` 
    envsubst &amp;lt; /etc/nginx/conf.d/npm-proxy-conf.template &amp;gt; /etc/nginx/conf.d/default.conf
    nginx -s reload
    sleep 800
done&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;npm-proxy-entrypoint.sh&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;npm-proxy-entrypointsh&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;4259-5030&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;npm-proxy-conftemplate&quot;&gt;npm-proxy-conf.template&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;server {
    listen       $PORT;
    server_name  $SERVER_NAME;
    gzip_static off;
    default_type application/octet-stream;
    location = /health {
        access_log off;
        add_header &amp;#039;Content-Type&amp;#039; &amp;#039;application/json&amp;#039;;
        return 200 &amp;#039;{&amp;quot;status&amp;quot;:&amp;quot;UP&amp;quot;}&amp;#039;;
    }
    location / {
        proxy_method GET;
        sub_filter &amp;#039;$BACKEND_HOST&amp;#039; &amp;#039;$SERVER_NAME&amp;#039;;
        sub_filter_types application/json;
        sub_filter_once off;

        proxy_http_version 1.1;
        proxy_set_header Host $BACKEND_HOST;
        proxy_set_header Authorization &amp;#039;Bearer $AUTH_TOKEN&amp;#039;;
        proxy_pass_request_headers off;

        proxy_pass $BACKEND_URL:$BACKEND_PORT;
    }
}&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;npm-proxy-conf.template&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;npm-proxy-conftemplate&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;5031-5758&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit7&quot; id=&quot;npm_nginx-based_caching_proxy&quot;&gt;NPM Nginx-based caching proxy&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://gist.github.com/dctrwatson/5785675&quot; class=&quot;urlextern&quot; title=&quot;https://gist.github.com/dctrwatson/5785675&quot; rel=&quot;ugc nofollow&quot;&gt;https://gist.github.com/dctrwatson/5785675&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;user www-data;
worker_processes 4;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
  worker_connections 1024;
}

http {
  include /etc/nginx/mime.types;

  access_log off;

  default_type application/octet-stream;

  sendfile on;
  tcp_nodelay on;
  tcp_nopush off;

  reset_timedout_connection on;

  server_tokens off;

  # Cache 10G worth of packages for up to 1 month
  proxy_cache_path /var/lib/nginx/npm levels=1:2 keys_zone=npm:16m inactive=1M max_size=10G;

  # Multiple server definitions makes nginx retry
  upstream registry_npm {
    server registry.npmjs.org;
    server registry.npmjs.org;
    keepalive 16;
  }

  gzip on;
  gzip_types application/json text/css text/javascript;
  gzip_proxied any;
  gzip_vary on;

  server {
    listen 80 default_server;
    server_name npm.example.com;

    root /var/www;

    proxy_cache npm;
    proxy_cache_key $uri;
    proxy_cache_lock on;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

    proxy_http_version 1.1;
    proxy_pass_request_headers off;
    proxy_set_header Host registry.npmjs.org;

    location / {
      proxy_cache_valid any 5m;

      add_header X-Cache $upstream_cache_status;

      proxy_pass http://registry_npm;
    }

    location ~ ^/.+/-/.+ {
      proxy_cache_valid any 1M;

      add_header X-Cache $upstream_cache_status;

      proxy_pass http://registry_npm;
    }
  }
}&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;NPM Nginx-based caching proxy&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;npm_nginx-based_caching_proxy&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;5759-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 25 Jul 2023 07:41:02 +0000</pubDate>
        </item>
        <item>
            <title>openebs</title>
            <link>https://wiki.autosys.tk/devops/openebs</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;openebs&quot;&gt;OpenEBS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Тут я буду собирать какие-то заметки по поводу работы с &lt;strong&gt;OpenEBS&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;OpenEBS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;openebs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-137&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;расширение_томов_localpv&quot;&gt;Расширение томов LocalPV&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/&lt;/a&gt; &lt;br/&gt;

Допустим, для какого-то приложения у меня создан StorageClass LocalPV, который привязан к выделенной ноде и на ней приложение хранит данные:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nexus-storage
  annotations:
    openebs.io/cas-type: local
    cas.openebs.io/config: |
      - name: StorageType
        value: hostpath
      - name: BasePath
        value: /storage/nexus
      - name: NodeAffinityLabel
        value: &amp;quot;openebs.io/nexus&amp;quot;
provisioner: openebs.io/local
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer&lt;/pre&gt;

&lt;p&gt;
Том был создан при разворачивании приложения helm-чартом, в котором указано использование данного StorageClass. &lt;br/&gt;

Приложение работало и сожрало все место. Как расширить том? &lt;br/&gt;

Делаем так:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 увеличиваем место под данным томом (в директории /storage/nexus) на уровне хоста (lvresize, resize2fs…)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Прямо на ходу разрешаем StorageClass&amp;#039;у делать расширяемые тома (&lt;strong&gt;allowVolumeExpansion: true&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 редактируем том и увеличиваем его -   &lt;strong&gt;&lt;abbr title=&quot;specification&quot;&gt;spec&lt;/abbr&gt;.capacity.storage&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Редактируем и увеличиваем &lt;strong&gt;&lt;abbr title=&quot;specification&quot;&gt;spec&lt;/abbr&gt;.resources.requests.storage&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0442\u043e\u043c\u043e\u0432 LocalPV&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435_\u0442\u043e\u043c\u043e\u0432_localpv&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;138-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 30 Mar 2021 08:39:11 +0000</pubDate>
        </item>
        <item>
            <title>otus_course_final</title>
            <link>https://wiki.autosys.tk/devops/otus_course_final</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;сертификат_otus&quot;&gt;Сертификат OTUS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://otus.ru/certificate/a3bb5b94f88e4582a53f606a1f1ab0ae/&quot; class=&quot;urlextern&quot; title=&quot;https://otus.ru/certificate/a3bb5b94f88e4582a53f606a1f1ab0ae/&quot; rel=&quot;ugc nofollow&quot;&gt;https://otus.ru/certificate/a3bb5b94f88e4582a53f606a1f1ab0ae/&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 OTUS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442_otus&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-103&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;проектная_работа_по_курсу_otus_kubernetes&quot;&gt;Проектная работа по курсу otus kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Разворачивание кластера в GCP:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://medium.com/technopanti/deploy-kubernetes-load-balancer-service-with-terraform-on-gcp-6538c5be7f83&quot; class=&quot;urlextern&quot; title=&quot;https://medium.com/technopanti/deploy-kubernetes-load-balancer-service-with-terraform-on-gcp-6538c5be7f83&quot; rel=&quot;ugc nofollow&quot;&gt;Deploy Kubernetes Load Balancer Service with Terraform on GCP&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://cloud.google.com/community/tutorials/modular-load-balancing-with-terraform&quot; class=&quot;urlextern&quot; title=&quot;https://cloud.google.com/community/tutorials/modular-load-balancing-with-terraform&quot; rel=&quot;ugc nofollow&quot;&gt;Modular Load Balancing with Terraform&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Как вручную запустить кластер (можно делать из ansible) в GCP - &lt;a href=&quot;https://docs.projectcalico.org/getting-started/kubernetes/self-managed-public-cloud/gce&quot; class=&quot;urlextern&quot; title=&quot;https://docs.projectcalico.org/getting-started/kubernetes/self-managed-public-cloud/gce&quot; rel=&quot;ugc nofollow&quot;&gt;https://docs.projectcalico.org/getting-started/kubernetes/self-managed-public-cloud/gce&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Как создавать машинки из terraform: &lt;a href=&quot;https://www.nebulaworks.com/blog/2019/04/22/simplify-your-gce-instance-bootstrapping-with-terraform/&quot; class=&quot;urlextern&quot; title=&quot;https://www.nebulaworks.com/blog/2019/04/22/simplify-your-gce-instance-bootstrapping-with-terraform/&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.nebulaworks.com/blog/2019/04/22/simplify-your-gce-instance-bootstrapping-with-terraform/&lt;/a&gt;  &lt;a href=&quot;https://linux-notes.org/rabota-s-google-cloud-platform-compute-instance-i-terraform-v-unix-linux/&quot; class=&quot;urlextern&quot; title=&quot;https://linux-notes.org/rabota-s-google-cloud-platform-compute-instance-i-terraform-v-unix-linux/&quot; rel=&quot;ugc nofollow&quot;&gt;https://linux-notes.org/rabota-s-google-cloud-platform-compute-instance-i-terraform-v-unix-linux/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Как запустить &lt;strong&gt;managed&lt;/strong&gt; кластер GKE - &lt;a href=&quot;https://www.padok.fr/en/blog/kubernetes-google-cloud-terraform-cluster&quot; class=&quot;urlextern&quot; title=&quot;https://www.padok.fr/en/blog/kubernetes-google-cloud-terraform-cluster&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.padok.fr/en/blog/kubernetes-google-cloud-terraform-cluster&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Какое-то самописное решение - &lt;a href=&quot;https://medium.com/searce/kubernetes-deployment-on-google-compute-engine-using-terraform-8d6075cf4d3f&quot; class=&quot;urlextern&quot; title=&quot;https://medium.com/searce/kubernetes-deployment-on-google-compute-engine-using-terraform-8d6075cf4d3f&quot; rel=&quot;ugc nofollow&quot;&gt;https://medium.com/searce/kubernetes-deployment-on-google-compute-engine-using-terraform-8d6075cf4d3f&lt;/a&gt; &lt;br/&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Специальный модуль для terraform: &lt;a href=&quot;https://github.com/terraform-google-modules/terraform-google-k8s-gce&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/terraform-google-modules/terraform-google-k8s-gce&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/terraform-google-modules/terraform-google-k8s-gce&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; Самописное решение Terraform + Ansible &lt;a href=&quot;https://medium.zenika.com/a-custom-kubernetes-cluster-on-gcp-in-7-minutes-with-terraform-and-ansible-75875f89309e&quot; class=&quot;urlextern&quot; title=&quot;https://medium.zenika.com/a-custom-kubernetes-cluster-on-gcp-in-7-minutes-with-terraform-and-ansible-75875f89309e&quot; rel=&quot;ugc nofollow&quot;&gt;https://medium.zenika.com/a-custom-kubernetes-cluster-on-gcp-in-7-minutes-with-terraform-and-ansible-75875f89309e&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0435\u043a\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 otus kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0435\u043a\u0442\u043d\u0430\u044f_\u0440\u0430\u0431\u043e\u0442\u0430_\u043f\u043e_\u043a\u0443\u0440\u0441\u0443_otus_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;104-1600&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;подготовка&quot;&gt;Подготовка&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;wget https://releases.hashicorp.com/terraform/0.13.1/terraform_0.13.1_linux_amd64.zip
unzip ./terraform_0.13.1_linux_amd64.zip 
sudo mv ./terraform /usr/local/bin/terraform

echo &amp;quot;deb https://packages.cloud.google.com/apt cloud-sdk main&amp;quot; | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get -y upgrade &amp;amp;&amp;amp; sudo apt-get -y install google-cloud-sdk kubectl

gcloud init&lt;/pre&gt;

&lt;p&gt;
&lt;strong&gt;gcloud&lt;/strong&gt; выдаст ссылку, которую надо будет открыть в браузере, согласиться выдать разрешения и скопировать &lt;strong&gt;verification code&lt;/strong&gt;. &lt;br/&gt;

Выбираем зону 1 (&lt;strong&gt;us-east1-b&lt;/strong&gt;) и тип машин будем юзать &lt;strong&gt;e2-standard-2&lt;/strong&gt; (2vCPU, 8GB RAM). &lt;br/&gt;

Включаем необходимые APIшки:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gcloud services enable compute.googleapis.com
gcloud services enable servicenetworking.googleapis.com
#gcloud services enable cloudresourcemanager.googleapis.com
#gcloud services enable container.googleapis.com&lt;/pre&gt;

&lt;p&gt;
Теперь можно получить токен, с которым будем ходить в GCP. 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gcloud auth print-access-token&lt;/pre&gt;

&lt;p&gt;
И в дальнейшем полученную строку будем юзать в качестве значения параметра &lt;strong&gt;access_token&lt;/strong&gt; в конфиге terraform-провайдера &lt;strong&gt;google&lt;/strong&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1601-3109&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;текущий_статус&quot;&gt;Текущий статус&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Поднимаются виртуалки с помощью terraform по списку.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Между виртуалками есть сеть и у каждой есть внешний IP.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Формируется inventory-файл для kubespray и нормально разворачивается кластер.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Цепляются пара дисков (один монтируется в /var/lib/docker, а второй - /var/lib/data - для PersistentVolumes)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Протестировал провижининг &lt;a href=&quot;https://docs.openebs.io/docs/next/uglocalpv-hostpath.html&quot; class=&quot;urlextern&quot; title=&quot;https://docs.openebs.io/docs/next/uglocalpv-hostpath.html&quot; rel=&quot;ugc nofollow&quot;&gt;OpenEBS Local PV Hostpath&lt;/a&gt;. Вроде работает &lt;a href=&quot;https://blog.mayadata.io/openebs/dynamic-provisioning-of-kubernetes-local-pvs-using-openebs&quot; class=&quot;urlextern&quot; title=&quot;https://blog.mayadata.io/openebs/dynamic-provisioning-of-kubernetes-local-pvs-using-openebs&quot; rel=&quot;ugc nofollow&quot;&gt;OpenEBS - хороший вариант&lt;/a&gt; В итоге - включил провижининг, который идет в комплекте с &lt;strong&gt;kubespray&lt;/strong&gt; - &lt;strong&gt;rancher/local-path-provisioner&lt;/strong&gt; (&lt;strong&gt;local_path_provisioner_enabled: true&lt;/strong&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Развернул ELK (с помощью оператора и чартика).
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0442\u0430\u0442\u0443\u0441&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0442\u0435\u043a\u0443\u0449\u0438\u0439_\u0441\u0442\u0430\u0442\u0443\u0441&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;3110-4228&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;задачи&quot;&gt;Задачи&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настроить &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-зону &lt;a href=&quot;https://cloud.google.com/dns/docs/zones&quot; class=&quot;urlextern&quot; title=&quot;https://cloud.google.com/dns/docs/zones&quot; rel=&quot;ugc nofollow&quot;&gt;https://cloud.google.com/dns/docs/zones&lt;/a&gt; Зону ucent.ru завел в GCP.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настроить ingress. По дефолту ставится istio, который и может быть ingress&amp;#039;ом. &lt;a href=&quot;https://habr.com/ru/company/southbridge/blog/441616/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/company/southbridge/blog/441616/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/company/southbridge/blog/441616/&lt;/a&gt; &lt;a href=&quot;https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/&quot; class=&quot;urlextern&quot; title=&quot;https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/&quot; rel=&quot;ugc nofollow&quot;&gt;https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настроить CertManager
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настроить выгрузку в docker registry собранных образов. Выгрузка работает (в docker registry в кластере). Нужно приделать сертификат для registry. &lt;a href=&quot;https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/&quot; rel=&quot;ugc nofollow&quot;&gt;https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/&lt;/a&gt; 
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создать &lt;a href=&quot;https://www.terraform.io/docs/providers/gitlab/r/pipeline_trigger.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.terraform.io/docs/providers/gitlab/r/pipeline_trigger.html&quot; rel=&quot;ugc nofollow&quot;&gt;pipeline trigger&lt;/a&gt;, для того, чтобы можно было &lt;a href=&quot;https://docs.gitlab.com/ee/ci/triggers/&quot; class=&quot;urlextern&quot; title=&quot;https://docs.gitlab.com/ee/ci/triggers/&quot; rel=&quot;ugc nofollow&quot;&gt;запустить пайплайн из terraform&lt;/a&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Разобраться с ингрессом.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://cloud.google.com/solutions/partners/deploying-gitlab-anthos-gke-on-prem-cicd-pipeline&quot; class=&quot;urlextern&quot; title=&quot;https://cloud.google.com/solutions/partners/deploying-gitlab-anthos-gke-on-prem-cicd-pipeline&quot; rel=&quot;ugc nofollow&quot;&gt;https://cloud.google.com/solutions/partners/deploying-gitlab-anthos-gke-on-prem-cicd-pipeline&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;a href=&quot;https://medium.com/@Joachim8675309/building-gke-with-terraform-869df1cd3f41&quot; class=&quot;urlextern&quot; title=&quot;https://medium.com/@Joachim8675309/building-gke-with-terraform-869df1cd3f41&quot; rel=&quot;ugc nofollow&quot;&gt;https://medium.com/@Joachim8675309/building-gke-with-terraform-869df1cd3f41&lt;/a&gt; ; &lt;a href=&quot;https://github.com/darkn3rd/blog_tutorials/tree/master/kubernetes/gke_2_provision_terraform&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/darkn3rd/blog_tutorials/tree/master/kubernetes/gke_2_provision_terraform&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/darkn3rd/blog_tutorials/tree/master/kubernetes/gke_2_provision_terraform&lt;/a&gt; &lt;a href=&quot;https://habr.com/ru/post/352644/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/post/352644/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/post/352644/&lt;/a&gt; &lt;a href=&quot;https://habr.com/ru/post/352644/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/post/352644/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/post/352644/&lt;/a&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Развернуть Prometheus
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
По сетевой части нашлось вот что: &lt;a href=&quot;https://github.com/Wi3ard/k8s-nginx-ingress/blob/gke-gdns-certmgr-wildcard/main.tf&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/Wi3ard/k8s-nginx-ingress/blob/gke-gdns-certmgr-wildcard/main.tf&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/Wi3ard/k8s-nginx-ingress/blob/gke-gdns-certmgr-wildcard/main.tf&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Нужно сделать между ними балансировщик. &lt;a href=&quot;https://linux-notes.org/rabota-s-google-cloud-platform-compute-forwarding-rule-i-terraform-v-unix-linux/&quot; class=&quot;urlextern&quot; title=&quot;https://linux-notes.org/rabota-s-google-cloud-platform-compute-forwarding-rule-i-terraform-v-unix-linux/&quot; rel=&quot;ugc nofollow&quot;&gt;https://linux-notes.org/rabota-s-google-cloud-platform-compute-forwarding-rule-i-terraform-v-unix-linux/&lt;/a&gt;  
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;a href=&quot;https://www.terraform.io/docs/providers/google/r/compute_global_forwarding_rule.html#&quot; class=&quot;urlextern&quot; title=&quot;https://www.terraform.io/docs/providers/google/r/compute_global_forwarding_rule.html#&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.terraform.io/docs/providers/google/r/compute_global_forwarding_rule.html#&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Нужно прописывать &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-записи для всех сервисов
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Развернуть Ingress (&lt;a href=&quot;https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#over-a-nodeport-service&quot; class=&quot;urlextern&quot; title=&quot;https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#over-a-nodeport-service&quot; rel=&quot;ugc nofollow&quot;&gt;NodePort&lt;/a&gt;)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Развернуть CertManager
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;del&gt;Нужно забрать оттуда admin.conf от кластера кубера. Сделал, но наверное не надо. api-сервер слушает на локальном адресе.&lt;/del&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0434\u0430\u0447\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0434\u0430\u0447\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;4229-6558&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;лишнее_и_пока_не_очен_понятное&quot;&gt;ЛИШНЕЕ и пока не очен понятное&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Создадим Service Account:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gcloud iam service-accounts create otus-course-project --display-name &amp;quot;Otus Course Project Service Account&amp;quot;&lt;/pre&gt;

&lt;p&gt;
И посмотрим какие с ней связаны ключи:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gcloud iam service-accounts keys list --iam-account=otus-course-project@otus-kuber-course.iam.gserviceaccount.com&lt;/pre&gt;

&lt;p&gt;
Сгенерируем новый (&lt;a href=&quot;https://cloud.google.com/sdk/gcloud/reference/iam/service-accounts/keys/create&quot; class=&quot;urlextern&quot; title=&quot;https://cloud.google.com/sdk/gcloud/reference/iam/service-accounts/keys/create&quot; rel=&quot;ugc nofollow&quot;&gt;https://cloud.google.com/sdk/gcloud/reference/iam/service-accounts/keys/create&lt;/a&gt;):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gcloud iam service-accounts keys create ./otus-kubernetes-course.yaml --iam-account=otus-course-project@otus-kuber-course.iam.gserviceaccount.com&lt;/pre&gt;

&lt;p&gt;
В результате - получим файлик &lt;strong&gt;otus-kubernetes-course.yaml&lt;/strong&gt;, который уже может быть использован &lt;strong&gt;terraform&lt;/strong&gt;. &lt;br/&gt;

И потом активируем его:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gcloud auth activate-service-account otus-course-project@otus-kuber-course.iam.gserviceaccount.com --key-file=./otus-kubernetes-course.yaml&lt;/pre&gt;

&lt;p&gt;
Также можно привязать уже имеющийся файлик примерно вот так: &lt;a href=&quot;https://cloud.google.com/sdk/gcloud/reference/auth/activate-service-account&quot; class=&quot;urlextern&quot; title=&quot;https://cloud.google.com/sdk/gcloud/reference/auth/activate-service-account&quot; rel=&quot;ugc nofollow&quot;&gt;https://cloud.google.com/sdk/gcloud/reference/auth/activate-service-account&lt;/a&gt; . &lt;br/&gt;

В дальнейшем переключаться между аккаунтами можно так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;gcloud config set account otus-course-project@otus-kuber-course.iam.gserviceaccount.com&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041b\u0418\u0428\u041d\u0415\u0415 \u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0447\u0435\u043d \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043b\u0438\u0448\u043d\u0435\u0435_\u0438_\u043f\u043e\u043a\u0430_\u043d\u0435_\u043e\u0447\u0435\u043d_\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;6559-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 15 Nov 2021 16:04:08 +0000</pubDate>
        </item>
        <item>
            <title>php-fmp-nginx-performance-diags</title>
            <link>https://wiki.autosys.tk/devops/php-fmp-nginx-performance-diags</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://gist.github.com/holmberd/44fa5c2555139a1a46e01434d3aaa512?permalink_comment_id=3143513&quot; class=&quot;urlextern&quot; title=&quot;https://gist.github.com/holmberd/44fa5c2555139a1a46e01434d3aaa512?permalink_comment_id=3143513&quot; rel=&quot;ugc nofollow&quot;&gt;https://gist.github.com/holmberd/44fa5c2555139a1a46e01434d3aaa512?permalink_comment_id=3143513&lt;/a&gt;
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;диагностика_и_настройка_параметров_php-fpm_в_связке_с_nginx&quot;&gt;Диагностика и настройка параметров php-fpm в связке с nginx&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Текущие значения можно увидеть так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;php-fpm -tt&lt;/pre&gt;

&lt;p&gt;
Определяем - не упирамся ли мы в лимит &lt;strong&gt;max_children&lt;/strong&gt; ??
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  sudo grep max_children /var/log/php?.?-fpm.log.1 /var/log/php?.?-fpm.log&lt;/pre&gt;

&lt;p&gt;
Определяем - не упирамся ли мы в память:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  free -h&lt;/pre&gt;

&lt;p&gt;
Для всех процессов php:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ps -ylC php-fpm7.0 --sort:rss&lt;/pre&gt;

&lt;p&gt;
Средняя загрузка:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ps --no-headers -o &amp;quot;rss,cmd&amp;quot; -C php-fpm7.0 | awk &amp;#039;{ sum+=$1 } END { printf (&amp;quot;%d%s\n&amp;quot;, sum/NR/1024,&amp;quot;M&amp;quot;) }&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Суммарная загрузка памяти процессами php:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ps -eo size,pid,user,command --sort -size | awk &amp;#039;{ hr=$1/1024 ; printf(&amp;quot;%13.2f Mb &amp;quot;,hr) } { for ( x=4 ; x&amp;lt;=NF ; x++ ) { printf(&amp;quot;%s &amp;quot;,$x) } print &amp;quot;&amp;quot; }&amp;#039; | grep php-fpm&lt;/pre&gt;

&lt;p&gt;
Вычисляем оптимальный размер &lt;strong&gt;max_children&lt;/strong&gt;
Based on RAM
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  pm.max_children = Total RAM dedicated to the web server / Max child process size&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  System RAM: 2GB&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  Average Pool size: 85Mb&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;  pm.max_children = 1500MB / 85MB = 17&lt;/pre&gt;

&lt;p&gt;
Based on average script execution time
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  max_children = (average PHP script execution time) * (PHP requests per second)
  visitors = max_children * (seconds between page views) / (avg. execution time)&lt;/pre&gt;

&lt;p&gt;
Configure
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo vim /etc/php/7.0/fpm/pool.d/www.conf

pm.max_children = 17
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_request = 1000

; Choose how the process manager will control the number of child processes.
; Possible Values:
;   static  - a fixed number (pm.max_children) of child processes;
;   dynamic - the number of child processes are set dynamically based on the
;             following directives:
;             pm.max_children      - the maximum number of children that can
;                                    be alive at the same time.
;
;             pm.start_servers     - the number of children created on startup.
;                                    this value must not be less than min_spare_servers 
;                                    and not greater than max_spare_servers.
;
;             pm.min_spare_servers - the minimum number of children in &amp;#039;idle&amp;#039;
;                                    state (waiting to process). If the number
;                                    of &amp;#039;idle&amp;#039; processes is less than this
;                                    number then some children will be created.
;
;             pm.max_spare_servers - the maximum number of children in &amp;#039;idle&amp;#039;
;                                    state (waiting to process). If the number
;                                    of &amp;#039;idle&amp;#039; processes is greater than this
;                                    number then some children will be killed.
; Note: This value is mandatory.&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 php-fpm \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 nginx&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430_\u0438_\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432_php-fpm_\u0432_\u0441\u0432\u044f\u0437\u043a\u0435_\u0441_nginx&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;96-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 21 Jul 2023 10:46:26 +0000</pubDate>
        </item>
        <item>
            <title>postgres_investigating_slowness</title>
            <link>https://wiki.autosys.tk/devops/postgres_investigating_slowness</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://www.cockroachlabs.com/blog/high-cpu-usage-postgres/&quot; class=&quot;urlextern&quot; title=&quot;https://www.cockroachlabs.com/blog/high-cpu-usage-postgres/&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.cockroachlabs.com/blog/high-cpu-usage-postgres/&lt;/a&gt;
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;top_five_queries_by_total_execution_time&quot;&gt;Top five queries by total execution time&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
To enable &lt;strong&gt;pg_stat_statements&lt;/strong&gt;, add &lt;strong&gt;pg_stat_statements&lt;/strong&gt; to &lt;strong&gt;shared_preload_libraries&lt;/strong&gt; in the DB parameter group
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;SELECT
	query,
	calls,
	total_exec_time,
	rows
FROM
	pg_stat_statements
ORDER BY
	total_exec_time DESC
LIMIT
	5;&lt;/pre&gt;

&lt;p&gt;
в RDS Aurora нужно включить предварительно &lt;strong&gt;pg_stat_statements&lt;/strong&gt;, добавив в группе параметров &lt;strong&gt;pg_stat_statements&lt;/strong&gt; в список &lt;strong&gt;shared_preload_libraries&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;SELECT
	query,
	calls,
	total_exec_time,
	rows
FROM
	aurora_stat_statements()
ORDER BY
	total_exec_time DESC
LIMIT
	5;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Top five queries by total execution time&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;top_five_queries_by_total_execution_time&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;61-708&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;current_active_connections&quot;&gt;Current active connections&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;SELECT * FROM pg_stat_activity WHERE state = ‘active’;
SHOW max_connections;&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;SELECT
  pid,
  now() - pg_stat_activity.query_start AS duration,
  query,
  state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) &amp;gt; interval &amp;#039;5 minutes&amp;#039;;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Current active connections&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;current_active_connections&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;709-1025&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;список_таблиц_к_которым_много_обращений&quot;&gt;Список таблиц, к которым много обращений&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://aws.amazon.com/blogs/database/determining-the-optimal-value-for-shared_buffers-using-the-pg_buffercache-extension-in-postgresql/&quot; class=&quot;urlextern&quot; title=&quot;https://aws.amazon.com/blogs/database/determining-the-optimal-value-for-shared_buffers-using-the-pg_buffercache-extension-in-postgresql/&quot; rel=&quot;ugc nofollow&quot;&gt;https://aws.amazon.com/blogs/database/determining-the-optimal-value-for-shared_buffers-using-the-pg_buffercache-extension-in-postgresql/&lt;/a&gt; &lt;br/&gt;

Оценить загруженность таблиц можно по тому, сколько памяти для них используется в shared buffers. 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;CREATE EXTENSION pg_buffercache;
SELECT c.relname,
pg_size_pretty(count(*)*8192) AS buffer_size,
pg_size_pretty(pg_relation_size(c.oid)) as relation_size,
Round(100.0 * Count(*) / (SELECT setting
FROM pg_settings
WHERE name = &amp;#039;shared_buffers&amp;#039;) :: INTEGER, 2) AS buffers_percent,
ROUND(count(*)*8192*100/ pg_relation_size(c.oid)::numeric, 2 ) AS relation_percent,
CASE
WHEN c.relkind = &amp;#039;r&amp;#039; THEN &amp;#039;table&amp;#039;
WHEN c.relkind = &amp;#039;i&amp;#039; THEN &amp;#039;index&amp;#039;
WHEN c.relkind = &amp;#039;S&amp;#039; THEN &amp;#039;sequence&amp;#039;
WHEN c.relkind = &amp;#039;t&amp;#039; THEN &amp;#039;TOAST table&amp;#039;
WHEN c.relkind = &amp;#039;v&amp;#039; THEN &amp;#039;view&amp;#039;
WHEN c.relkind = &amp;#039;m&amp;#039; THEN &amp;#039;materialized view&amp;#039;
WHEN c.relkind = &amp;#039;c&amp;#039; THEN &amp;#039;composite type&amp;#039;
WHEN c.relkind = &amp;#039;f&amp;#039; THEN &amp;#039;foreign table&amp;#039;
WHEN c.relkind = &amp;#039;p&amp;#039; THEN &amp;#039;partitioned table&amp;#039;
WHEN c.relkind = &amp;#039;I&amp;#039; THEN &amp;#039;partitioned index&amp;#039;
ELSE &amp;#039;Unexpected relkind&amp;#039;
END as relation_type
FROM pg_class c
INNER JOIN pg_buffercache b
ON b.relfilenode = c.relfilenode
INNER JOIN pg_database d
ON ( b.reldatabase = d.oid
AND d.datname = Current_database() )
GROUP BY c.relname, c.oid
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 10;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043f\u0438\u0441\u043e\u043a_\u0442\u0430\u0431\u043b\u0438\u0446_\u043a_\u043a\u043e\u0442\u043e\u0440\u044b\u043c_\u043c\u043d\u043e\u0433\u043e_\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1026-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 26 May 2025 10:46:08 +0000</pubDate>
        </item>
        <item>
            <title>prometheus_federation</title>
            <link>https://wiki.autosys.tk/devops/prometheus_federation</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;задача&quot;&gt;Задача&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Нужно настроить:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Выделенный сервер логирования Prometheus + Grafanana
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настроить сбор метрик из подов, работающих в двух кластерах k8s.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настроить дашборды в Grafana.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Сделать это всё все в соответствии с &lt;strong&gt;IaC&lt;/strong&gt;, чтобы можно было быстро реплицировать и масштабировать.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0417\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0437\u0430\u0434\u0430\u0447\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-498&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;настройки_в_кластере_k8s_с_опубликованными_приложениями&quot;&gt;Настройки в кластере k8s с опубликованными приложениями&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Я предполагаю, что работы идут в уже настроенном кластере, в котором есть &lt;strong&gt;Ingress Controller&lt;/strong&gt; и из которого можно публиковать сервисы (prometheus) наружу. &lt;br/&gt;

В кластере в котором работают приложения нужно:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Развернуть оператор &lt;strong&gt;Prometheus&lt;/strong&gt;, который будет управлять объектами &lt;strong&gt;Prometheus&lt;/strong&gt; и &lt;strong&gt;ServiceMonitor&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создать необходимые для работы объекты (сервис-аккаунт, роль, rolebinding)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Опубликовать &lt;strong&gt;Prometheus&lt;/strong&gt; через &lt;strong&gt;Ingress&lt;/strong&gt; (в том числе настроить &lt;strong&gt;basic&lt;/strong&gt;-аутентифкацию для доступа к метрикам)
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создать &lt;strong&gt;ServiceMonitor&lt;/strong&gt;&amp;#039;ы для сбора метрик
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 k8s \u0441 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435_k8s_\u0441_\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438_\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;499-1513&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;установка_оператора_prometheus&quot;&gt;Установка оператора prometheus&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://grafana.com/docs/grafana-cloud/kubernetes/prometheus/prometheus_operator/&quot; class=&quot;urlextern&quot; title=&quot;https://grafana.com/docs/grafana-cloud/kubernetes/prometheus/prometheus_operator/&quot; rel=&quot;ugc nofollow&quot;&gt;https://grafana.com/docs/grafana-cloud/kubernetes/prometheus/prometheus_operator/&lt;/a&gt; &lt;br/&gt;

Создаем CRD&amp;#039;s и устанавливаем оператора:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;NS=monitoring
kubectl create ns $NS
wget https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
sed -i &amp;quot;s/  namespace: default/  namespace: $NS/g&amp;quot; ./bundle.yaml
kubectl create -f ./bundle.yaml&lt;/pre&gt;

&lt;p&gt;
Создаем сервис-аккаунт, роль и даем права:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -n $NS -f -&amp;lt;&amp;lt;EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [&amp;quot;&amp;quot;]
  resources:
  - nodes
  - nodes/metrics
  - services
  - endpoints
  - pods
  verbs: [&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;, &amp;quot;watch&amp;quot;]
- apiGroups: [&amp;quot;&amp;quot;]
  resources:
  - configmaps
  verbs: [&amp;quot;get&amp;quot;]
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  verbs: [&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;, &amp;quot;watch&amp;quot;]
- nonResourceURLs: [&amp;quot;/metrics&amp;quot;]
  verbs: [&amp;quot;get&amp;quot;]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: $NS
EOF&lt;/pre&gt;

&lt;p&gt;
Создаем &lt;strong&gt;Prometheus&lt;/strong&gt;: &lt;br/&gt;

&lt;a href=&quot;https://github.com/prometheus-operator/prometheus-operator/issues/2382&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/prometheus-operator/prometheus-operator/issues/2382&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/prometheus-operator/prometheus-operator/issues/2382&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -n monitoring -f - &amp;lt;&amp;lt;EOF
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
  labels:
    app: prometheus
spec:
  externalUrl: https://ingress.domain.com/prometheus/
  routePrefix: /prometheus
  image: quay.io/prometheus/prometheus:v2.22.1
  nodeSelector:
    kubernetes.io/os: linux
  replicas: 2
  resources:
    requests:
      memory: 400Mi
  securityContext:
    fsGroup: 2000
    runAsNonRoot: true
    runAsUser: 1000
  serviceAccountName: prometheus
  version: v2.22.1
  ruleNamespaceSelector:
    matchLabels:
      monitoring: prometheus
  serviceMonitorNamespaceSelector:
    matchLabels:
      monitoring: prometheus
  serviceMonitorSelector: {}
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-web
  labels:
    prometheus: prometheus
spec:
  ports:
  - name: web
    port: 9090
    targetPort: web
  selector:
    prometheus: prometheus
  sessionAffinity: ClientIP
  type: ClusterIP
EOF&lt;/pre&gt;

&lt;p&gt;
Тут важно обратить внимание на параметры &lt;strong&gt;externalUrl&lt;/strong&gt; и &lt;strong&gt;routePrefix&lt;/strong&gt;. Они должны соответветствовать тому, что будет прописано в &lt;strong&gt;Ingress&lt;/strong&gt;. Они же параметры командной строки prometheus - &lt;strong&gt;–web.external-url&lt;/strong&gt; и &lt;strong&gt;–web.route-prefix&lt;/strong&gt; соответственно. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 prometheus&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430_prometheus&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1514-4331&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;пометим_неймспйесы_которые_должны_мониториться_этим_прометиусом&quot;&gt;Пометим неймспйесы, которые должны мониториться этим прометиусом&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl label ns monitoring monitoring=prometheus&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u043e\u043c\u0435\u0442\u0438\u043c \u043d\u0435\u0439\u043c\u0441\u043f\u0439\u0435\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0443\u0441\u043e\u043c&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u043e\u043c\u0435\u0442\u0438\u043c_\u043d\u0435\u0439\u043c\u0441\u043f\u0439\u0435\u0441\u044b_\u043a\u043e\u0442\u043e\u0440\u044b\u0435_\u0434\u043e\u043b\u0436\u043d\u044b_\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c\u0441\u044f_\u044d\u0442\u0438\u043c_\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0443\u0441\u043e\u043c&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;4332-4520&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;публикация_prometheus_через_ingress&quot;&gt;Публикация prometheus через Ingress&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;strong&gt;Prometheus&lt;/strong&gt; будет опубликован наружу через &lt;strong&gt;Ingress&lt;/strong&gt; и защищен &lt;strong&gt;basic&lt;/strong&gt;-аутентификацией. &lt;br/&gt;

&lt;br/&gt;

Создадим секрет для basic-аутентификации: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create -n monitoring secret generic prometheus-basic-auth --from-literal=auth=username:$(openssl passwd -5 superpassword)&lt;/pre&gt;

&lt;p&gt;
И теперь можем создать ингресс: &lt;br/&gt;

&lt;a href=&quot;https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/exposing-prometheus-and-alertmanager.md#ingress&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/exposing-prometheus-and-alertmanager.md#ingress&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/exposing-prometheus-and-alertmanager.md#ingress&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -n monitoring -f - &amp;lt;&amp;lt;EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prometheus-metrics
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: prometheus-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: &amp;#039;Authentication Required&amp;#039;
spec:
  rules:
  - host: ingress.domain.com
    http:
      paths:
      - backend:
          service:
            name: prometheus-web
            port:
              number: 9090
        path: /prometheus
        pathType: Prefix
  tls:
  - hosts:
    - ingress.domain.com
    secretName: ingress-domain-com-tls
EOF&lt;/pre&gt;

&lt;p&gt;
Тут важно - path должен быть таким же как и в настройках &lt;strong&gt;prometheus&lt;/strong&gt;, имя секрета в аннотации - соответствовать имени созданного серкрета с учеткой basic-auth.
Можно проверить:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -u &amp;#039;username:superpassword&amp;#039; https://ingress.domain.com/prometheus/metrics&lt;/pre&gt;

&lt;p&gt;
Или какие-то более осмысленные метрики:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -u &amp;#039;username:superpassword&amp;#039; -g &amp;#039;https://ai-eu-1.voximplant.com/prometheus/federate?match[]={container=&amp;quot;gateway-container&amp;quot;}&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f prometheus \u0447\u0435\u0440\u0435\u0437 Ingress&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f_prometheus_\u0447\u0435\u0440\u0435\u0437_ingress&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;4521-6428&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;настройка_servicemonitors&quot;&gt;Настройка ServiceMonitors&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://docs.openshift.com/container-platform/4.9/rest_api/monitoring_apis/servicemonitor-monitoring-coreos-com-v1.html&quot; class=&quot;urlextern&quot; title=&quot;https://docs.openshift.com/container-platform/4.9/rest_api/monitoring_apis/servicemonitor-monitoring-coreos-com-v1.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://docs.openshift.com/container-platform/4.9/rest_api/monitoring_apis/servicemonitor-monitoring-coreos-com-v1.html&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -n monitoring -f -&amp;lt;&amp;lt;EOF
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: gateway
spec:
  selector:
    matchLabels:
      app: gateway
  namespaceSelector:
    matchNames:
    - nlu-prod
  endpoints:
  - targetPort: 8080
    path: /metrics
    scheme: http
    interval: 10s
EOF&lt;/pre&gt;

&lt;p&gt;
Траблшутинг проблем с сервис-мониторами: &lt;a href=&quot;https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/troubleshooting.md#troubleshooting-servicemonitor-changes&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/troubleshooting.md#troubleshooting-servicemonitor-changes&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/troubleshooting.md#troubleshooting-servicemonitor-changes&lt;/a&gt;
Что тут важно:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 У сервисов должны быть прописаны метки, которые затем прописываются в селектор сервисмониторов.  
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Эндпоинт с метриками задаем с помощью либо по имени порта (параметр &lt;strong&gt;port&lt;/strong&gt;), либо - по номеру порта (параметр &lt;strong&gt;targetPort&lt;/strong&gt;) в конфиге сервиса.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 ServiceMonitors&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_servicemonitors&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;6429-7604&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit7&quot; id=&quot;настройки_на_основном_сервере_логирования&quot;&gt;Настройки на основном сервере логирования&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
На основоном сервере логирования но настроить &lt;strong&gt;federation&lt;/strong&gt; &lt;br/&gt;

Примерно так: &lt;a href=&quot;https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config&quot; class=&quot;urlextern&quot; title=&quot;https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config&quot; rel=&quot;ugc nofollow&quot;&gt;https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config
- job_name: &amp;#039;kubernetes-pods-aws&amp;#039;
  scrape_interval: 15s

  honor_labels: true
  metrics_path: &amp;#039;/prometheus/federate&amp;#039;

  basic_auth:
    username: username
    password: superpassword

  scheme: https

  params:
    match[]:
      - &amp;#039;{job=~&amp;quot;.+&amp;quot;}&amp;#039;

  static_configs:
    - targets:
      - &amp;#039;remote.prometheus.domain.com:443&amp;#039;
      labels:
        cluster: remote_prometheus_domain_com&lt;/pre&gt;

&lt;p&gt;
И на основном сервере логирования можно выполнить запрос какого-либо значения, указав в качестве параметра фильтрации - метку для данного таргета:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;curl -g &amp;#039;http://127.0.0.1:9090/api/v1/query?query=system_cpu_usage{container=&amp;quot;container_name&amp;quot;,cluster=&amp;quot;remote_prometheus_domain_com&amp;quot;}&amp;#039;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438_\u043d\u0430_\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c_\u0441\u0435\u0440\u0432\u0435\u0440\u0435_\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;7605-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 11 Mar 2022 09:45:42 +0000</pubDate>
        </item>
        <item>
            <title>proxy_pass_auth</title>
            <link>https://wiki.autosys.tk/devops/proxy_pass_auth</link>
            <description>
&lt;p&gt;
Иногда бывает нужно обеспечить аутентификацию для запускаемых микросервисов при их обращении к внешним источникам данных. &lt;br/&gt;

Для этого можно использовать &lt;strong&gt;istio&lt;/strong&gt;, а можно - делать это с помощью вспомогательных контейнеров &lt;strong&gt;nginx&lt;/strong&gt;. &lt;br/&gt;

Тут я собираю различные варианты конфигов для nginx, подходящие для аутентификации в разных ситуациях.
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;proxy_pass_с_аутентификацией_по_сертификату&quot;&gt;proxy_pass с аутентификацией по сертификату&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;    server {
        listen      8011;

        location / {
            proxy_pass                    https://api.domain.local:8443;
            proxy_ssl_certificate         /etc/nginx/ssl/api.domain.local/client.pem;
            proxy_ssl_certificate_key     /etc/nginx/ssl/api.domain.local/key_nopasswd.pem;
            proxy_ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
            proxy_ssl_ciphers             HIGH:!aNULL:!MD5;
            proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;

            proxy_ssl_verify        on;
            proxy_ssl_verify_depth  2;
            proxy_ssl_session_reuse on;
        }
    }&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;proxy_pass \u0441 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0443&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;proxy_pass_\u0441_\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439_\u043f\u043e_\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0443&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;605-1358&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;proxy_pass_с_kerberos-аутентификацией_на_upstream&quot;&gt;proxy_pass с kerberos-аутентификацией на upstream&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://blog.inf.ed.ac.uk/squinney/2018/03/29/easy-gssapi-authentication/&quot; class=&quot;urlextern&quot; title=&quot;https://blog.inf.ed.ac.uk/squinney/2018/03/29/easy-gssapi-authentication/&quot; rel=&quot;ugc nofollow&quot;&gt;https://blog.inf.ed.ac.uk/squinney/2018/03/29/easy-gssapi-authentication/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://stackoverflow.com/a/38664954&quot; class=&quot;urlextern&quot; title=&quot;https://stackoverflow.com/a/38664954&quot; rel=&quot;ugc nofollow&quot;&gt;https://stackoverflow.com/a/38664954&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://www.ibm.com/support/knowledgecenter/en/SSPT3X_3.0.0/com.ibm.swg.im.infosphere.biginsights.admin.doc/doc/kerberos_webconsole.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.ibm.com/support/knowledgecenter/en/SSPT3X_3.0.0/com.ibm.swg.im.infosphere.biginsights.admin.doc/doc/kerberos_webconsole.html&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.ibm.com/support/knowledgecenter/en/SSPT3X_3.0.0/com.ibm.swg.im.infosphere.biginsights.admin.doc/doc/kerberos_webconsole.html&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;http://www.unstructureddatatips.com/hadoop-rest-api-webhdfs-on-onefs/&quot; class=&quot;urlextern&quot; title=&quot;http://www.unstructureddatatips.com/hadoop-rest-api-webhdfs-on-onefs/&quot; rel=&quot;ugc nofollow&quot;&gt;http://www.unstructureddatatips.com/hadoop-rest-api-webhdfs-on-onefs/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;p&gt;
С реализацией аутентификации kerberos всё несколько сложнее. Я не нашел готовой реализации этого функционала, поэтому  - сделал из подручных средств. &lt;br/&gt;

Нужно:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 иметь &lt;strong&gt;nginx&lt;/strong&gt; с поддержкой &lt;strong&gt;lua&lt;/strong&gt; - &lt;strong&gt;openresty&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 установить билиотеки &lt;strong&gt;kerberos&lt;/strong&gt; и настроить &lt;strong&gt;krb5.conf&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;curl&lt;/strong&gt;, &lt;strong&gt;nslookup&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
В моей реализации при попытке ображения к заданному &lt;strong&gt;location&lt;/strong&gt; будет запускаться curl с заданными параметрами (логином, паролем и &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;) и возвращать ответ. &lt;br/&gt;

То есть весь функционал по реализации аутентификации переездает в &lt;strong&gt;curl&lt;/strong&gt;. &lt;br/&gt;

Список переменных среды будет такой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;DOMAIN=domain.local
DOMAIN_USER=&amp;quot;username&amp;quot;
DOMAIN_USER_PASS=&amp;quot;userpassword&amp;quot;
KRB5_CLIENT_KTNAME=/keytab
KRB5CCNAME=/krb5cc
CURL_CA_BUNDLE=/etc/ssl/certs/ca.pem
CURL_OPTS=&amp;#039;--http1.1 -H &amp;quot;Content-Type: application/xml; charset=utf-8&amp;quot; -X POST -v --negotiate -u :&amp;#039;
URL=&amp;#039;https://krb-protected-server.domain.local:1111/location/method&amp;#039;
PORT=8088&lt;/pre&gt;

&lt;p&gt;
А стартовый скрипт контейнера такой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
DOMAIN_CONTROLLERS=`nslookup -query=any _ldap._tcp.dc._msdcs.$DOMAIN | grep &amp;quot;_ldap._tcp.dc._msdcs.$DOMAIN&amp;quot; | grep 389 | awk &amp;#039;{print $7}&amp;#039;`
DEFAULT_REALM=&amp;quot;${DOMAIN^^}&amp;quot;
#########################################
### Setup Kerberos /etc/krb5.conf
#########################################
LIBDEFAULTS=$(cat &amp;lt;&amp;lt;EOF
[libdefaults]
dns_lookup_kdc = true
dns_lookup_realm = false
default_realm = $DEFAULT_REALM
clockskew = 300
#default_ccache_name = FILE:/tmp/krb5cc_%{uid}
EOF
)

REALMS_KDC=$(for i in $DOMAIN_CONTROLLERS; do echo &amp;quot;kdc = $i&amp;quot;;done)

REALMS=$(cat &amp;lt;&amp;lt;EOF

[realms]
$DEFAULT_REALM = {
$REALMS_KDC
default_domain = $DEFAULT_REALM
}
EOF
)

DOMAIN_REALM=$(cat &amp;lt;&amp;lt;EOF

[domain_realm]
.$DOMAIN = $DEFAULT_REALM
$DOMAIN = $DEFAULT_REALM

[appdefaults]
pam = {
        ticket_lifetime = 1d
        renew_lifetime = 1d
        forwardable = true
        proxiable = false
        minimum_uid = 1
}
EOF
)

echo &amp;quot;$LIBDEFAULTS&amp;quot; &amp;gt; /etc/krb5.conf
echo &amp;quot;$REALMS&amp;quot; &amp;gt;&amp;gt; /etc/krb5.conf
echo &amp;quot;$DOMAIN_REALM&amp;quot; &amp;gt;&amp;gt; /etc/krb5.conf

#####################################
### Create keytab and kcc
#####################################
{
printf &amp;quot;%b&amp;quot; &amp;quot;addent -password -p $DOMAIN_USER -k 1 -e aes256-cts-hmac-sha1-96\n&amp;quot; 
sleep 3
printf &amp;quot;%b&amp;quot; &amp;quot;$DOMAIN_USER_PASS\nwrite_kt /$KRB5_CLIENT_KTNAME&amp;quot;
} | ktutil 
kinit -k -t $KRB5_CLIENT_KTNAME $DOMAIN_USER


########################################
### Создаем файл конфига для openresty
########################################
cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/nginx/conf.d/default.conf:

server {
    listen       $PORT;


    location / {
      content_by_lua_block {
        ngx.req.read_body()
        local request_body = ngx.req.get_body_data()
        command = &amp;quot;curl $CURL_OPTS -d &amp;#039;&amp;quot;..request_body..&amp;quot;&amp;#039; $URL&amp;quot;;
        local handle = io.popen(command);
        local result = handle:read(&amp;quot;*a&amp;quot;);
        handle:close();
        ngx.print(result);
      } 
    }
}
EOF&lt;/pre&gt;

&lt;p&gt;
Иногда бывает нужно обеспечить аутентификацию для запускаемых микросервисов при их обращении к внешним источникам данных.&lt;br/&gt;

Для этого можно использовать &lt;strong&gt;istio&lt;/strong&gt;, а можно - делать это с помощью вспомогательных контейнеров &lt;strong&gt;nginx&lt;/strong&gt;.&lt;br/&gt;

Тут я собираю различные варианты конфигов для nginx, подходящие для аутентификации в разных ситуациях.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;proxy_pass \u0441 kerberos-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043d\u0430 upstream&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;proxy_pass_\u0441_kerberos-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439_\u043d\u0430_upstream&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;1359-5666&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;dockerfile&quot;&gt;Dockerfile&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;FROM openresty/openresty:buster
RUN set -ex \
  &amp;amp;&amp;amp; apt-get update \
  &amp;amp;&amp;amp; apt-get upgrade -y \
  &amp;amp;&amp;amp; apt-get install -y \
  curl \
  krb5-user \
  gss-ntlmssp \
  libsasl2-modules-gssapi-mit \
  ca-certificates
&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Dockerfile&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;dockerfile&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;5667-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 11 Feb 2021 16:31:12 +0000</pubDate>
        </item>
        <item>
            <title>rebrain_devops_course</title>
            <link>https://wiki.autosys.tk/devops/rebrain_devops_course</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;что_это&quot;&gt;Что это&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
На этой страничке я фиксировал свое прохождение курса &lt;strong&gt;DevOps&lt;/strong&gt; от &lt;a href=&quot;https://rebrainme.com/&quot; class=&quot;urlextern&quot; title=&quot;https://rebrainme.com/&quot; rel=&quot;ugc nofollow&quot;&gt;https://rebrainme.com/&lt;/a&gt;. &lt;br/&gt;

Тут были спойлеры с ответами :) &lt;br/&gt;

Однако, вероятный правообладатель Илья вежливо попросил меня удалить её, ссылаясь на условия оферты (которые я и не читал)… &lt;br/&gt;

Учитесь теперь сами :)
&lt;/p&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Sun, 12 Jan 2020 16:51:29 +0000</pubDate>
        </item>
        <item>
            <title>setup_jenkins_on_kubernetes</title>
            <link>https://wiki.autosys.tk/devops/setup_jenkins_on_kubernetes</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;установка_jenkins_с_помощью_helm&quot;&gt;Установка Jenkins с помощью helm&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns jenkins
helm install --name jenkins --namespace jenkins stable/jenkins -f ./values-autosys.yaml&lt;/pre&gt;

&lt;p&gt;
В результате в неймспейсе &lt;strong&gt;jenkins&lt;/strong&gt; создадутся все нужные объекты, однако &lt;strong&gt;pod&lt;/strong&gt; будет в состоянии &lt;strong&gt;pending&lt;/strong&gt;, потому что у него отсутсвует &lt;strong&gt;PersistentVolume&lt;/strong&gt;, запрашиваемый при помощи &lt;strong&gt;PersistentVolumeClaim&lt;/strong&gt;. &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Jenkins \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e helm&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_jenkins_\u0441_\u043f\u043e\u043c\u043e\u0449\u044c\u044e_helm&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-519&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;values-autosysyaml&quot;&gt;values-autosys.yaml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;master:
  Name: jenkins-master
  overwriteConfig: true
  # hostNetworking: true
  ingress:
    enabled: true
    # For Kubernetes v1.14+, use &amp;#039;networking.k8s.io/v1beta1&amp;#039;
    apiVersion: &amp;quot;extensions/v1beta1&amp;quot;
    labels: {}
    annotations:
      cert-manager.io/cluster-issuer: letsencrypt
      kubernetes.io/ingress.class: nginx
    hostName: jenkins.autosys.tk
    tls:
    - hosts:
      - jenkins.autosys.tk
      secretName: jenkins-autosys-tk-tls

persistence:
  enabled: true
  storageClass: jenkins&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;values-autosys.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;values-autosysyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;520-1074&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;jenkins_pod_init01&quot;&gt;jenkins pod Init:0/1&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Сразу после разворачивания &lt;strong&gt;pod jenkins&lt;/strong&gt; у меня находился в состоянии &lt;strong&gt;Init:0/1&lt;/strong&gt;, а в статусе &lt;strong&gt;pod&lt;/strong&gt;&amp;#039;а можно обнаружить такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;message: &amp;#039;containers with incomplete status: [copy-default-config]&amp;#039;&lt;/pre&gt;

&lt;p&gt;
В это время в поде &lt;strong&gt;jenkins&lt;/strong&gt;&amp;#039;а работает контейнер &lt;strong&gt;copy-default-config&lt;/strong&gt;, который скачивает с &lt;strong&gt;jenkins.io&lt;/strong&gt; различные компоненты, необходимые для работы (плагины). 
Ход этого процесса можно наблюдать так:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl logs -n jenkins jenkins-.... -c copy-default-config -f&lt;/pre&gt;

&lt;p&gt;
В контейнере этот процесс выполняется скриптом: &lt;strong&gt;/var/jenkins_config/apply_config.sh&lt;/strong&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;jenkins pod Init:0\/1&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;jenkins_pod_init01&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1075-1918&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;создадим_storageclass_и_persistentvolume&quot;&gt;Создадим StorageClass и PersistentVolume&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: jenkins
  namespace: jenkins
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
   name: jenkins-pv
   namespace: jenkins
   labels:
     app: jenkins
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: jenkins
  hostPath:
    path: &amp;quot;/kubernetes_volumes/jenkins-home&amp;quot;
    type: Directory
  persistentVolumeReclaimPolicy: Retain&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c StorageClass \u0438 PersistentVolume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c_storageclass_\u0438_persistentvolume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1919-2535&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;пароль_учетки_admin&quot;&gt;Пароль учетки admin&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;printf $(kubectl get secret --namespace jenkins jenkins -o jsonpath=&amp;quot;{.data.jenkins-admin-password}&amp;quot; | base64 --decode);echo&lt;/pre&gt;

&lt;p&gt;
Jenkins &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export SERVICE_IP=$(kubectl get svc --namespace default jenkins --template &amp;quot;{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}&amp;quot;)
echo http://$SERVICE_IP:8080/login&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0447\u0435\u0442\u043a\u0438 admin&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0430\u0440\u043e\u043b\u044c_\u0443\u0447\u0435\u0442\u043a\u0438_admin&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2536-2905&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit6&quot; id=&quot;дадим_права_на_создание_pod_ов&quot;&gt;Дадим права на создание pod&amp;#039;ов&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:default&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0414\u0430\u0434\u0438\u043c \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 pod&amp;#039;\u043e\u0432&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0434\u0430\u0434\u0438\u043c_\u043f\u0440\u0430\u0432\u0430_\u043d\u0430_\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435_pod_\u043e\u0432&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;2906-3077&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit7&quot; id=&quot;конфигурация_после_установки&quot;&gt;Конфигурация после установки&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
После установки нужно как минимум сконфигурировать параметры &lt;strong&gt;Jenkins Location&lt;/strong&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;Jenkins &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;System Admin e-mail address&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f_\u043f\u043e\u0441\u043b\u0435_\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;3078-3344&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit8&quot; id=&quot;ссылки&quot;&gt;Ссылки&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
&lt;a href=&quot;https://habr.com/ru/post/442614/&quot; class=&quot;urlextern&quot; title=&quot;https://habr.com/ru/post/442614/&quot; rel=&quot;ugc nofollow&quot;&gt;https://habr.com/ru/post/442614/&lt;/a&gt; &lt;br/&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0421\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0441\u0441\u044b\u043b\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;3345-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 23 Apr 2020 10:51:58 +0000</pubDate>
        </item>
        <item>
            <title>setup_pgadmin_on_kubernetes</title>
            <link>https://wiki.autosys.tk/devops/setup_pgadmin_on_kubernetes</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://hub.helm.sh/charts/cetic/pgadmin&quot; class=&quot;urlextern&quot; title=&quot;https://hub.helm.sh/charts/cetic/pgadmin&quot; rel=&quot;ugc nofollow&quot;&gt;https://hub.helm.sh/charts/cetic/pgadmin&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;helm repo add cetic https://cetic.github.io/helm-charts
helm repo update
helm install cetic/pgadmin --name pgadmin --namespace pgadmin --set image.repository=dpage/pgadmin4:4.15 --set service.type=ClusterIP --set image.pullPolicy=IfNotPresent&lt;/pre&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;persistentvolume&quot;&gt;PersistentVolume&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: v1
kind: PersistentVolume
metadata:
   name: pgadmin-pv
   namespace: pgadmin
   labels:
     app: pgadmin
spec:
  capacity:
    storage: 4Gi
  accessModes:
  - ReadWriteOnce
  hostPath:
    path: &amp;quot;/kubernetes_volumes/pgadmin-data&amp;quot;
    type: Directory
  persistentVolumeReclaimPolicy: Retain&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;PersistentVolume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;persistentvolume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;291-641&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;ingress&quot;&gt;Ingress&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt
  name: pgadmin-ingress
  namespace: pgadmin
spec:
  rules:
  - host: pgadmin.autosys.tk
    http:
      paths:
      - backend:
          serviceName: pgadmin
          servicePort: 80
        path: /
  tls:
  - hosts:
    - pgadmin.autosys.tk
    secretName:  pgadmin-autosys-tk-tls&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Ingress&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;ingress&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;642-1123&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;ошибки&quot;&gt;Ошибки&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
После апгрейда docker-образа с версии 4.15 до 4.17 под не смог запуститься с ошибкой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;WARNING: Failed to set ACL on the directory containing the configuration database: [Errno 1] Operation not permitted: &amp;#039;/var/lib/pgadmin&amp;#039;
PermissionError: [Errno 1] Operation not permitted: &amp;#039;/var/lib/pgadmin/sessions&amp;#039;&lt;/pre&gt;

&lt;p&gt;
Это произошло потому, что у пользователь, от имени которого исполняется &lt;strong&gt;pgadmin&lt;/strong&gt;, не является владельцем директории, которая смонтирована как &lt;strong&gt;persistentVolume&lt;/strong&gt;. Поэтому, когда контейнер запускается (но еще не упал с Error) нужно найти процесс &lt;strong&gt;pgadmin&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;#ps -aux | grep pgadmin
5050     16492  0.0  0.1  24720 22892 ?        Ss   16:07   0:00 /usr/local/bin/python /usr/local/bin/gunicorn --timeout 86400 --bind [::]:80 -w 1 --threads 25 --access-logfile - run_pgadmin:app&lt;/pre&gt;

&lt;p&gt;
И сделать &lt;strong&gt;owner&lt;/strong&gt;&amp;#039;ом папки пользователя с указанным &lt;strong&gt;id&lt;/strong&gt;. В хостовой системе, на которой исполняется контейнер, такого пользователя может и не быть. Главное, чтобы в &lt;abbr title=&quot;Access Control List&quot;&gt;ACL&lt;/abbr&gt; директории был прописан правильный &lt;strong&gt;id&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chown 5050:5050 /kubernetes_volumes/pgadmin-data/ -R&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041e\u0448\u0438\u0431\u043a\u0438&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043e\u0448\u0438\u0431\u043a\u0438&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1124-2606&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;проблемы&quot;&gt;Проблемы&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Если нужно, чтобы при входе в &lt;strong&gt;PGAdmin&lt;/strong&gt; сразу подключался сервер, то нужно сделать две вещи - заполнить файл с определениями серверов &lt;strong&gt;/pgadmin4/servers.json&lt;/strong&gt; и заполнить файл &lt;strong&gt;pgpass&lt;/strong&gt;, который хранит пароли для заданных серверов/бд/пользовтелей. &lt;br/&gt;

Если с заполнением файла &lt;strong&gt;/pgadmin4/servers.json&lt;/strong&gt; всё более-менее понятно (за исключением того, что путь &lt;strong&gt;PassFile&lt;/strong&gt; задается относительно директории пользователя, что само по себе нетривиально), то вот с файлом &lt;strong&gt;pgpass&lt;/strong&gt; всё не очень просто. &lt;br/&gt;

В &lt;a href=&quot;https://www.postgresql.org/docs/9.3/libpq-pgpass.html&quot; class=&quot;urlextern&quot; title=&quot;https://www.postgresql.org/docs/9.3/libpq-pgpass.html&quot; rel=&quot;ugc nofollow&quot;&gt;документации написано&lt;/a&gt;, что права на этот файл должны быть строго не шире, чем &lt;strong&gt;0600&lt;/strong&gt;, то есть права на чтение должен иметь только владелец файла. &lt;br/&gt;

Однако, если &lt;strong&gt;pgadmin&lt;/strong&gt; работает в кластере &lt;strong&gt;kubernetes&lt;/strong&gt;, содержимое файла &lt;strong&gt;pgpass&lt;/strong&gt; монтируется из секрета а для пода задан &lt;strong&gt;securityContext&lt;/strong&gt;, то &lt;strong&gt;defaultMod&lt;/strong&gt; для файла смонтированного из секрета не применяется (так написано тут: &lt;a href=&quot;https://github.com/kubernetes/kubernetes/issues/89153&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/kubernetes/kubernetes/issues/89153&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/kubernetes/kubernetes/issues/89153&lt;/a&gt; и тут: &lt;a href=&quot;https://github.com/kubernetes/kubernetes/issues/57923&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/kubernetes/kubernetes/issues/57923&quot; rel=&quot;ugc nofollow&quot;&gt;https://github.com/kubernetes/kubernetes/issues/57923&lt;/a&gt;). 
В итоге - всё оказывается сложнее, но выход есть! &lt;br/&gt;

Итак, я использую чарт &lt;strong&gt;pgadmin&lt;/strong&gt; в качестве сабчарта (наряду с чартом &lt;strong&gt;postgresql&lt;/strong&gt;) и хочу, чтобы в конфиг PGAdmin автоматически попадали параметры развернутого &lt;strong&gt;postgresql&lt;/strong&gt;. &lt;br/&gt;

Для этого мне понадобилось
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Секрет с содержимым файла &lt;strong&gt;pgpass&lt;/strong&gt; &lt;pre class=&quot;code&quot;&gt;{{- if .Values.pgadmin4.enabled -}}
apiVersion: v1
kind: Secret
metadata:
  name: pgpassfile
  labels:
data:
  pgpassfile: {{ include &amp;quot;pgadmin4.pgpassfile&amp;quot; . | b64enc | quote }}
{{- end}}&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Содержимое файла &lt;strong&gt;pgpass&lt;/strong&gt; формируется хелпером 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;{{- define &amp;quot;pgadmin4.pgpassfile&amp;quot; -}}
{{ .Values.global.postgresql.fullnameOverride }}:{{ .Values.global.postgresql.service.port }}:*:{{ .Values.global.postgresql.postgresqlUsername }}:{{ .Values.global.postgresql.postgresqlPassword }}
{{ end }}&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Хелпер для формирования  файла &lt;strong&gt;/pgadmin4/servers.json&lt;/strong&gt; (хелпер родительского чарта переопределяет хелпер сабчарта pgadmin4)
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;{{/*
Определение сервера для PGAdmin
*/}}
{{- define &amp;quot;pgadmin.serverDefinitions&amp;quot; }}
{
    &amp;quot;Servers&amp;quot;: {
        &amp;quot;1&amp;quot;: {
            &amp;quot;Name&amp;quot;: &amp;quot;PostgeSql-{{ .Values.global.environment }}&amp;quot;,
            &amp;quot;Group&amp;quot;: &amp;quot;Servers&amp;quot;,
            &amp;quot;Host&amp;quot;: &amp;quot;{{ .Values.global.postgresql.fullnameOverride }}&amp;quot;,
            &amp;quot;Port&amp;quot;: &amp;quot;{{ .Values.global.postgresql.service.port }}&amp;quot;,
            &amp;quot;MaintenanceDB&amp;quot;: &amp;quot;{{ .Values.global.postgresql.postgresqlDatabase }}&amp;quot;,
            &amp;quot;Username&amp;quot;: &amp;quot;{{ .Values.global.postgresql.postgresqlUsername }}&amp;quot;,
            &amp;quot;SSLMode&amp;quot;: &amp;quot;prefer&amp;quot;,
            &amp;quot;Comment&amp;quot;: &amp;quot;Preconfigured PostgreSQL Server&amp;quot;,
            &amp;quot;DBRestriction&amp;quot;: &amp;quot;{{ .Values.global.postgresql.postgresqlDatabase }}&amp;quot;,
            &amp;quot;PassFile&amp;quot;: &amp;quot;/pgpass&amp;quot;
        }
    }
}
{{- end -}}&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Проблему с правами на файл &lt;strong&gt;pgpass&lt;/strong&gt; решаем с помощью &lt;strong&gt;init&lt;/strong&gt;-контейнера, который монтирует секрет в файл, а затем - копирует этот файл в нужную папку и задает ему нужные права:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;  extraSecretMounts:
  - name: pgpassfile
    secret: pgpassfile
    subPath: pgpassfile
    mountPath: &amp;quot;/pgpass&amp;quot;
    readOnly: true
  extraInitContainers: |
    - name: pgpass-permissions-init
      image: &amp;quot;docker.rdleas.ru/dpage/pgadmin4:4.29&amp;quot;
      command:
      - &amp;quot;/bin/ash&amp;quot;
      - &amp;quot;-c&amp;quot;
      - &amp;quot;/bin/mkdir -p /var/lib/pgadmin/storage/pgadmin &amp;amp;&amp;amp; /bin/cp /pgpass /var/lib/pgadmin/storage/pgadmin/pgpass &amp;amp;&amp;amp; /bin/chmod 0600 /var/lib/pgadmin/storage/pgadmin/pgpass&amp;quot;
      securityContext:
        runAsUser: 0
      volumeMounts:
      - mountPath: /pgpass
        name: pgpassfile
        readOnly: false
        subPath: pgpassfile
      - mountPath: /var/lib/pgadmin
        name: pgadmin-data&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В файле values родительского чарта записи такие:
&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;code&quot;&gt;global:
  environment: dev
  postgresql: 
    fullnameOverride: postgresql
    postgresqlUsername: api-user
    postgresqlPassword: tvJk3XrqM3d7xX6b
    postgresqlDatabase: sbl-mobile-api
    service:
      port: 5432
...
postgresql:
  enabled: true
  fullnameOverride: postgresq
...
pgadmin4:
  serverDefinitions:
  #defined in _helpers.tpl - &amp;quot;pgadmin.serverDefinitions&amp;quot;
    enabled: true
  extraSecretMounts:
  - name: pgpassfile
    secret: pgpassfile
    subPath: pgpassfile
    mountPath: &amp;quot;/pgpass&amp;quot;
    readOnly: true
  extraInitContainers: |
    - name: pgpass-permissions-init
      image: &amp;quot;docker.rdleas.ru/dpage/pgadmin4:4.29&amp;quot;
      command:
      - &amp;quot;/bin/ash&amp;quot;
      - &amp;quot;-c&amp;quot;
      - &amp;quot;/bin/mkdir -p /var/lib/pgadmin/storage/pgadmin &amp;amp;&amp;amp; /bin/cp /pgpass /var/lib/pgadmin/storage/pgadmin/pgpass &amp;amp;&amp;amp; /bin/chmod 0600 /var/lib/pgadmin/storage/pgadmin/pgpass&amp;quot;
      securityContext:
        runAsUser: 0
      volumeMounts:
      - mountPath: /pgpass
        name: pgpassfile
        readOnly: false
        subPath: pgpassfile
      - mountPath: /var/lib/pgadmin
        name: pgadmin-data
  persistentVolume:
    enabled: false
  securityContext:
    runAsUser: 0
    runAsGroup: 0
    fsGroup: 0&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;2607-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Wed, 10 Feb 2021 21:16:22 +0000</pubDate>
        </item>
        <item>
            <title>skaffold</title>
            <link>https://wiki.autosys.tk/devops/skaffold</link>
            <description>
&lt;p&gt;
&lt;a href=&quot;https://skaffold.dev/&quot; class=&quot;urlextern&quot; title=&quot;https://skaffold.dev/&quot; rel=&quot;ugc nofollow&quot;&gt;https://skaffold.dev/&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://www.youtube.com/watch?v=0XXICbh9Bqs&quot; class=&quot;urlextern&quot; title=&quot;https://www.youtube.com/watch?v=0XXICbh9Bqs&quot; rel=&quot;ugc nofollow&quot;&gt;https://www.youtube.com/watch?v=0XXICbh9Bqs&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://softchris.github.io/pages/dotnet-dockerize.html#create-a-dockerfile&quot; class=&quot;urlextern&quot; title=&quot;https://softchris.github.io/pages/dotnet-dockerize.html#create-a-dockerfile&quot; rel=&quot;ugc nofollow&quot;&gt;https://softchris.github.io/pages/dotnet-dockerize.html#create-a-dockerfile&lt;/a&gt; &lt;br/&gt;

&lt;a href=&quot;https://intellitect.com/docker-scaffold/&quot; class=&quot;urlextern&quot; title=&quot;https://intellitect.com/docker-scaffold/&quot; rel=&quot;ugc nofollow&quot;&gt;https://intellitect.com/docker-scaffold/&lt;/a&gt; &lt;br/&gt;

У меня есть три кластера (соотвествующие трем средам - &lt;strong&gt;dev, test, prod&lt;/strong&gt;). В &lt;strong&gt;dev&lt;/strong&gt; кластере должна происходить сборка и первичное тестирование сборок из ветки &lt;strong&gt;dev&lt;/strong&gt;. В кластеры &lt;strong&gt;test&lt;/strong&gt; и &lt;strong&gt;prod&lt;/strong&gt; - должны выкатываться сборки из веток &lt;strong&gt;TEST&lt;/strong&gt; и &lt;strong&gt;PROD&lt;/strong&gt; соответственно.
&lt;/p&gt;

&lt;h1 class=&quot;sectionedit1&quot; id=&quot;установка_shared-раннера_gitlab_в_кластере_kubernetes&quot;&gt;Установка Shared-раннера GitLab в кластере kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Проще всего установить &lt;strong&gt;shared runner&lt;/strong&gt; (то есть тот, который может использоваться любым проектом данной инсталляции &lt;strong&gt;GitLab&lt;/strong&gt;) с помощью &lt;strong&gt;helm&lt;/strong&gt;-чарта. &lt;br/&gt;

Создадим неймспейс:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns gitlab&lt;/pre&gt;

&lt;p&gt;
Создадим секрет с корневым сертификатом, чтобы доверять инсталляции &lt;strong&gt;GitLab&lt;/strong&gt;. Имя записи в секрете должна быть &lt;strong&gt;hostname.crt&lt;/strong&gt;, где &lt;strong&gt;hostname&lt;/strong&gt; - это имя хоста &lt;strong&gt;GitLab&lt;/strong&gt; (gitlab.domain.local):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create secret generic -n gitlab ca-cert --from-file=gitlab.domain.local.crt=./CA.cer&lt;/pre&gt;

&lt;p&gt;
Для того, чтобы раннер смог взаимодействовать с &lt;strong&gt;GitLab&lt;/strong&gt; ему нужно передать пару параметров - адрес инсталляции &lt;strong&gt;GitLab&lt;/strong&gt; и &lt;strong&gt;registration token&lt;/strong&gt;. &lt;br/&gt;

Чтобы получить &lt;strong&gt;registration token&lt;/strong&gt; идем в &lt;strong&gt;Admin Area&lt;/strong&gt; → &lt;strong&gt;Runners&lt;/strong&gt; и там берем строчку &lt;strong&gt;registration token&lt;/strong&gt;, а затем подствляем в файл с &lt;strong&gt;values&lt;/strong&gt; для чарта:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; ./gitlab-runner-settings.yaml
image: gitlab/gitlab-runner:alpine-v13.8.0
runnerRegistrationToken: &amp;quot;dqjNDHQsum1zW1gVmtXc&amp;quot;
logLevel: debug
runners:
  privileged: true
  config: |
    [[runners]]
      [runners.kubernetes]
        image = &amp;quot;docker:dind&amp;quot;
  helpers:
    image: &amp;quot;gitlab/gitlab-runner-helper:x86_64-bleeding&amp;quot;
gitlabUrl: https://gitlab.domain.local/
certsSecretName: ca-cert
EOF&lt;/pre&gt;

&lt;p&gt;
Устанавливаем &lt;strong&gt;GitLabRunner&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;helm repo add gitlab https://charts.gitlab.io
helm upgrade --install gitlab-runner-shared  -n gitlab -f ./gitlab-runner-settings.yaml gitlab/gitlab-runner&lt;/pre&gt;

&lt;p&gt;
Дадим прав раннеру в кластере (то есть дадим прав дефолтной &lt;strong&gt;ServiceAccount&lt;/strong&gt; в неймспейсе &lt;strong&gt;gitlab&lt;/strong&gt;):
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: &amp;quot;ClusterRoleBinding&amp;quot;
metadata:
  name: gitlab-runner-admin
  namespace: gitlab
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: &amp;quot;ClusterRole&amp;quot;
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: default
  namespace: gitlab
EOF&lt;/pre&gt;

&lt;p&gt;
В итоге - данная конфигурация позволит запускать раннер в кластере и позволит раннеру деплоить собранное. Не забываем, что речь иде о dev-кластере.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Shared-\u0440\u0430\u043d\u043d\u0435\u0440\u0430 GitLab \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430_shared-\u0440\u0430\u043d\u043d\u0435\u0440\u0430_gitlab_\u0432_\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;640-3299&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;настройка_cicd_на_базе_gitlab_и_skaffold&quot;&gt;Настройка CI/CD на базе GitLab и Skaffold&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 CI\/CD \u043d\u0430 \u0431\u0430\u0437\u0435 GitLab \u0438 Skaffold&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_cicd_\u043d\u0430_\u0431\u0430\u0437\u0435_gitlab_\u0438_skaffold&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;3300-3371&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;настройка_проекта_в_gitlab&quot;&gt;Настройка проекта в GitLab&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Включаем CI/CD для проекта - &lt;strong&gt;Settings → General → Visibility, project features, permissions → Pipelines&lt;/strong&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Настраиваем переменные - &lt;strong&gt;Settings → CI/CD → Variables&lt;/strong&gt;. Нужно добавить &lt;strong&gt;DOCKER_REGISTRY_&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt; и конфиги для кластеров (переменные &lt;strong&gt;KUBECONFIG_PROD&lt;/strong&gt; и &lt;strong&gt;KUBECONFIG_TEST&lt;/strong&gt;), отличных от того, где работает раннер (в своем кластере раннер имеет права). Если &lt;strong&gt;docker registry&lt;/strong&gt; требует аутентифиуации, то добавляем переменные &lt;strong&gt;DOCKER_REGISTRY_LOGIN&lt;/strong&gt; и &lt;strong&gt;DOCKER_REGISTRY_PASS&lt;/strong&gt; и расскоментируем в &lt;strong&gt;.gitlab-ci.yaml&lt;/strong&gt; соответствующие строчки.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 GitLab&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u043f\u0440\u043e\u0435\u043a\u0442\u0430_\u0432_gitlab&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;3372-4225&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;gitlab-ciyml&quot;&gt;.gitlab-ci.yml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;services:
#  - name: docker.rdleas.ru/docker:dind
# Последнюю версию dind (20+) не удается использовать из-за ошибки: https://github.com/containerd/containerd/issues/4837
# Нужно обновлять container.d на хостах
# В остальном - всё уже готово. 
  - name: docker.rdleas.ru/docker:19-dind
    command: 
      - /bin/sh
      - -c
      - |
        openssl s_client -showcerts -connect docker.rdleas.ru:443 &amp;lt;/dev/null 2&amp;gt;/dev/null | awk &amp;#039;/BEGIN/ { i++; } /BEGIN/, /END/ { print }&amp;#039; &amp;gt; /usr/local/share/ca-certificates/ca.crt
        update-ca-certificates
        unset DOCKER_TLS_CERTDIR
        dockerd-entrypoint.sh

stages:
  - build

variables:
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: &amp;quot;&amp;quot;
  DOCKER_HOST: tcp://0.0.0.0:2375

build:
  image:
    name: docker.rdleas.ru/k8s-skaffold/skaffold:v1.19.0
  stage: build
#  before_script:
#    - docker login -u `echo $DOCKER_REGISTRY_LOGIN` -p `echo $DOCKER_REGISTRY_PASS` `echo $DOCKER_REGISTRY_URL`
#https://skaffold.dev/docs/references/cli/
  script:
    - | 
      openssl s_client -showcerts -connect ${DOCKER_REGISTRY_URL}:443 &amp;lt;/dev/null 2&amp;gt;/dev/null | awk &amp;#039;/BEGIN/ { i++; } /BEGIN/, /END/ { print }&amp;#039; &amp;gt; /usr/local/share/ca-certificates/ca.crt
      update-ca-certificates
      env
      echo &amp;quot;waiting for the DinD...&amp;quot;
      timeout 60 bash -c &amp;#039;until printf &amp;quot;&amp;quot; 2&amp;gt;&amp;gt;/dev/null &amp;gt;&amp;gt;/dev/tcp/$0/$1; do sleep 1; done&amp;#039; 0.0.0.0 2375
      if [ &amp;quot;$CI_COMMIT_BRANCH&amp;quot; = &amp;quot;DEV&amp;quot; ]; then
        skaffold run -f skaffold-run.yaml --default-repo ${DOCKER_REGISTRY_URL}/vrm
      else
        skaffold build -f skaffold-build.yaml
      fi&lt;/pre&gt;

&lt;p&gt;
Что тут прроисходит? &lt;br/&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;service:&lt;/strong&gt; - эта инструкция запускает некую сущность (доступную по сети из скрипта для сборки). У &lt;a href=&quot;https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-a-service&quot; class=&quot;urlextern&quot; title=&quot;https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-a-service&quot; rel=&quot;ugc nofollow&quot;&gt;гитлаба написано&lt;/a&gt;, что изначально так запускали БД. Теперь так запускаем &lt;strong&gt;docker&lt;/strong&gt; и в дальнейшем передаем ему &lt;strong&gt;Dockerfile&lt;/strong&gt; для сборки. Для того, чтобы этот сервис доверял нашим сертификатам - мы сначала добавляем сертификат в доверенные, а затем стартуем штатный &lt;strong&gt;Entrypoint&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;stages:&lt;/strong&gt; - список этапов конвейера, которые будут объявлены позднее.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 &lt;strong&gt;variables:&lt;/strong&gt; - список переменных среды, которые будут добавлены к другим переменным и доступны в контейнерах, которые будут запускаться в дальнейшем.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
  &lt;strong&gt;build:&lt;/strong&gt; - собственно описание на данный момент единственной стадии конвейера. В ней мы стартуем контейнер &lt;strong&gt;skaffold&lt;/strong&gt;, выполняем &lt;strong&gt;before_script&lt;/strong&gt;, который логинится в приватный &lt;strong&gt;Docker Registry&lt;/strong&gt;. Логин, пароль и &lt;strong&gt;url&lt;/strong&gt; этого &lt;strong&gt;registry&lt;/strong&gt; заданны в настройках проекта &lt;strong&gt;GitLab&lt;/strong&gt; в виде &lt;strong&gt;Variables&lt;/strong&gt;. Конструкции вида &lt;pre class=&quot;code&quot;&gt;`echo $DOCKER_REGISTRY_LOGIN`&lt;/pre&gt;

&lt;p&gt;
 сделаны для того, чтобы избежать ошибки: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cannot perform an interactive login from a non TTY device&lt;/pre&gt;

&lt;p&gt;
 Дальше - сам скрипт &lt;strong&gt;script&lt;/strong&gt;. В нем тоже добавляется в доверенные сертификат нашего &lt;strong&gt;registry&lt;/strong&gt;, а затем запускается &lt;strong&gt;skaffold&lt;/strong&gt; с параметром &lt;strong&gt;run&lt;/strong&gt;, который выполняет все стадии конвейера - сборку (а в процессе сборки запускается и тестирование) и деплой с помощью чарта.
&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;.gitlab-ci.yml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;gitlab-ciyml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;4226-8267&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;skaffoldyaml&quot;&gt;skaffold.yaml&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Тут происходит вот что. &lt;br/&gt;

Как понятно из манифеста - это &lt;strong&gt;Config&lt;/strong&gt; для &lt;strong&gt;skaffold&lt;/strong&gt;. Полное описание всего этого доступно &lt;a href=&quot;https://wiki.autosys.tk/devops/%D0%B2%D0%BE%D1%82_%D1%82%D1%83%D1%82&quot; class=&quot;wikilink2&quot; title=&quot;devops:вот_тут&quot; rel=&quot;nofollow&quot; data-wiki-id=&quot;devops:вот_тут&quot;&gt;https://skaffold.dev/docs/references/yaml/&lt;/a&gt;. &lt;br/&gt;

Итак. С точки зрения &lt;strong&gt;skaffold&lt;/strong&gt;, работающего в контейнере, мы выполняем сборку  локально, на что указывает тег &lt;strong&gt;local: {}&lt;/strong&gt;. &lt;br/&gt;

Мы собраем артефакт с помощью клиента докера (тег &lt;strong&gt;docker&lt;/strong&gt;), который будет общаться с сервером &lt;strong&gt;Docker&lt;/strong&gt;, который является запущенным ранее &lt;strong&gt;service:&lt;/strong&gt; и доступен нам благодаря объявленной переменной среды &lt;strong&gt;DOCKER_HOST&lt;/strong&gt;. &lt;br/&gt;

Так вот этому докеру будет передан &lt;strong&gt;Dockerfile&lt;/strong&gt;, путь к которому задан с помощью тега &lt;strong&gt;dockerfile:&lt;/strong&gt; относительно пути &lt;strong&gt;context:&lt;/strong&gt;. &lt;br/&gt;

А после сборки мы выкатываем релиз с помощью &lt;strong&gt;helm&lt;/strong&gt; (который будет запущен из контейнера &lt;strong&gt;skaffold&lt;/strong&gt;) в тот кластер на котором работает наш &lt;strong&gt;runner&lt;/strong&gt;.
Подробнее о том как скаффолд работат с кластером - тут &lt;a href=&quot;https://skaffold.dev/docs/environment/kube-context/#kubeconfig-selection&quot; class=&quot;urlextern&quot; title=&quot;https://skaffold.dev/docs/environment/kube-context/#kubeconfig-selection&quot; rel=&quot;ugc nofollow&quot;&gt;https://skaffold.dev/docs/environment/kube-context/#kubeconfig-selection&lt;/a&gt;
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;apiVersion: skaffold/v2beta11
kind: Config
build:
  local: {}
  tagPolicy:
    envTemplate:
      template: &amp;quot;{{.CI_COMMIT_BRANCH}}&amp;quot;
  artifacts:
  - image: vrm
    context: .
    docker:
      dockerfile: Dockerfile
      buildArgs:
        CI_COMMIT_SHORT_SHA: &amp;#039;{{.CI_COMMIT_SHORT_SHA}}&amp;#039;
deploy:
  helm:
    releases: 
    - name: vrm
      chartPath: chart/
      namespace: vrm
      valuesFiles:
        - &amp;#039;{{.VALUES}}&amp;#039;
      artifactOverrides:
        image: vrm&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;skaffold.yaml&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;skaffoldyaml&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;8268-10271&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;dockerfile&quot;&gt;Dockerfile&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;#https://docs.docker.com/engine/examples/dotnetcore/
FROM docker.rdleas.ru/amd64/maven:3.6.3-jdk-11 as builder
WORKDIR /app
COPY . .
RUN mvn -gs /app/.m2/settings.xml -Pnexus clean compile test-compile \
 &amp;amp;&amp;amp; mvn -gs /app/.m2/settings.xml -Pnexus package

FROM docker.rdleas.ru/openjdk:11.0.10-jre-buster
ENV CI_COMMIT_SHORT_SHA=$CI_COMMIT_SHORT_SHA
WORKDIR /app
COPY --from=builder /app/. ./
CMD [&amp;quot;/usr/local/openjdk-11/bin/java&amp;quot;, &amp;quot;-jar&amp;quot;, &amp;quot;/app/target/vrm-1.0.0-SNAPSHOT.jar&amp;quot;]&lt;/pre&gt;

&lt;p&gt;
Тут у нас двухстадийная сборка (&lt;strong&gt;multistage&lt;/strong&gt;). &lt;br/&gt;

Сначала мы запускаем контейнер &lt;strong&gt;maven&lt;/strong&gt;, который получает псевдоним &lt;strong&gt;builder&lt;/strong&gt;, который выкачивает зависимости из локальной &lt;strong&gt;proxy&lt;/strong&gt;-репы &lt;strong&gt;maven-central&lt;/strong&gt; на базе &lt;strong&gt;nexus&lt;/strong&gt; (директория &lt;strong&gt;.m2&lt;/strong&gt; с файлом &lt;strong&gt;settings.xml&lt;/strong&gt; лежит в репозитории проекта).
А далее мы собираем второй контейнер на базе образа &lt;strong&gt;OpenJDK JRE&lt;/strong&gt;, в который копируем файлики, полученные в результате работы первого контейнера-билдера.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Dockerfile&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;dockerfile&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;10272-11528&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit7&quot; id=&quot;настройка_деплоя_во_внешний_кластер&quot;&gt;Настройка деплоя во внешний кластер&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
План такой:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 создаем неймспейс, в который будем деплоить релиз с помощью &lt;strong&gt;helm&lt;/strong&gt;-чарта
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 создаем &lt;strong&gt;ServiceAccount&lt;/strong&gt;, который будет иметь права на все объекты в данном неймспейсе.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Создаем фалик &lt;strong&gt;KUBECONFIG&lt;/strong&gt;, который мы передадим &lt;strong&gt;skaffold&lt;/strong&gt; и с помощью которого будем обращаться к кластеру.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Созданный файлик &lt;strong&gt;KUBECONFIG&lt;/strong&gt; кодируем в &lt;strong&gt;base64&lt;/strong&gt; и помещаем в переменную окружения проекта, чтобы передать его &lt;strong&gt;skaffold&lt;/strong&gt;.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
переключаемся на контекст тестового кластера:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl config use-context test&lt;/pre&gt;

&lt;p&gt;
Создаем неймспейс:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create ns vrm&lt;/pre&gt;

&lt;p&gt;
Создаем &lt;strong&gt;ServiceAccount&lt;/strong&gt;. Я создам его в неймспейсе &lt;strong&gt;kube-system&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl create sa -n kube-system vrm-ns-admin&lt;/pre&gt;

&lt;p&gt;
Дадим этой &lt;strong&gt;SA&lt;/strong&gt; права в неймспейсе &lt;strong&gt;vrm&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: vrm-ns-admin
  namespace: vrm
rules:
- apiGroups: [&amp;quot;*&amp;quot;]
  resources: [&amp;quot;*&amp;quot;]
  verbs: [&amp;quot;*&amp;quot;]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: &amp;quot;RoleBinding&amp;quot;
metadata:
  name: vrm-ns-admin
  namespace: vrm
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: &amp;quot;Role&amp;quot;
  name: vrm-ns-admin
subjects:
- kind: ServiceAccount
  name: vrm-ns-admin
  namespace: kube-system
EOF&lt;/pre&gt;

&lt;p&gt;
Дальше получаем имя токена:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;TOKEN_NAME=`kubectl get secret -n kube-system -o name | grep vrm-ns-admin-token`&lt;/pre&gt;

&lt;p&gt;
и его содержимое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;TOKEN=`kubectl get $TOKEN_NAME -n kube-system -o &amp;quot;jsonpath={.data.token}&amp;quot; | base64 -d`&lt;/pre&gt;

&lt;p&gt;
а также корневой сертификат кластера:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;TOKEN_CA=`kubectl get $TOKEN_NAME -n kube-system -o &amp;quot;jsonpath={.data[&amp;#039;ca\.crt&amp;#039;]}&amp;quot;`&lt;/pre&gt;

&lt;p&gt;
и &lt;strong&gt;&lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt;&lt;/strong&gt; для &lt;strong&gt;control plane&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;CONTROL_PLANE=`kubectl cluster-info | grep &amp;#039;Kubernetes control plane&amp;#039; | awk &amp;#039;{print $NF}&amp;#039; | sed -r &amp;quot;s/[[:cntrl:]]\[([0-9]{1,3};)*[0-9]{1,3}m//g&amp;quot;`&lt;/pre&gt;

&lt;p&gt;
И, наконец, генерируем собственно сам &lt;strong&gt;KUBECONFIG&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; ./vrm-admin-kubeconfig
apiVersion: v1
kind: Config
preferences: {}
# Define the cluster
clusters:
- cluster:
    certificate-authority-data: $TOKEN_CA
    server: $CONTROL_PLANE
  name: cluster

# Define the user
users:
- name: vrm-ns-admin
  user:
    as-user-extra: {}
    client-key-data: $TOKEN_CA
    token: $TOKEN

# Define the context: linking a user to a cluster
contexts:
- context:
    cluster: cluster
    namespace: vrm
    user: vrm-ns-admin
  name: vrm

# Define current context
current-context: vrm
EOF&lt;/pre&gt;

&lt;p&gt;
Проверяем, что полученный &lt;strong&gt;kubeconfig&lt;/strong&gt; работает:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;KUBECONFIG=./vrm-admin-kubeconfig kubectl get po -n vrm&lt;/pre&gt;

&lt;p&gt;
Теперь - добавляем содержимое этого файла в свойтсвах проекта в переменную типа &lt;strong&gt;File&lt;/strong&gt;. В итоге -содержимое файла будет доставлено в контейнер &lt;strong&gt;skaffold&lt;/strong&gt;  в виде временного файла, а её значение будет указать на расположение этого файла.
А gitlab-ci.yml станет такой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;services:
#  - name: docker.rdleas.ru/docker:dind
# Последнюю версию dind (20+) не удается использовать из-за ошибки: https://github.com/containerd/containerd/issues/4837
# Нужно обновлять container.d на хостах
# В остальном - всё уже готово. 
  - name: docker.rdleas.ru/docker:19-dind
    command: 
      - /bin/sh
      - -c
      - |
        openssl s_client -showcerts -connect docker.rdleas.ru:443 &amp;lt;/dev/null 2&amp;gt;/dev/null | awk &amp;#039;/BEGIN/ { i++; } /BEGIN/, /END/ { print }&amp;#039; &amp;gt; /usr/local/share/ca-certificates/ca.crt
        update-ca-certificates
        unset DOCKER_TLS_CERTDIR
        dockerd-entrypoint.sh

stages:
  - build

variables:
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: &amp;quot;&amp;quot;
  DOCKER_HOST: tcp://0.0.0.0:2375

build:
  image:
    name: docker.rdleas.ru/k8s-skaffold/skaffold:v1.19.0
  stage: build
  before_script:
    - docker login -u `echo $DOCKER_REGISTRY_LOGIN` -p `echo $DOCKER_REGISTRY_PASS` `echo $DOCKER_REGISTRY_URL`
#https://skaffold.dev/docs/references/cli/
  script:
    - | 
      openssl s_client -showcerts -connect ${DOCKER_REGISTRY_URL}:443 &amp;lt;/dev/null 2&amp;gt;/dev/null | awk &amp;#039;/BEGIN/ { i++; } /BEGIN/, /END/ { print }&amp;#039; &amp;gt; /usr/local/share/ca-certificates/ca.crt
      update-ca-certificates
      env
      echo &amp;quot;waiting for the DinD...&amp;quot;
      timeout 60 bash -c &amp;#039;until printf &amp;quot;&amp;quot; 2&amp;gt;&amp;gt;/dev/null &amp;gt;&amp;gt;/dev/tcp/$0/$1; do sleep 1; done&amp;#039; 0.0.0.0 2375
      case $CI_COMMIT_BRANCH in
        DEV)      
          VALUES=&amp;quot;chart/values_dev.yaml&amp;quot; skaffold run -f skaffold-run.yaml --default-repo ${DOCKER_REGISTRY_URL}/vrm
        ;;
        TEST)
          VALUES=&amp;quot;chart/values_test.yaml&amp;quot; \
          KUBECONFIG=$KUBECONFIG_TEST \
          skaffold run -f skaffold-run.yaml \
          --default-repo ${DOCKER_REGISTRY_URL}/vrm
        ;;
        PROD)
          KUBECONFIG=$KUBECONFIG_PROD \
          VALUES=&amp;quot;chart/values_prod.yaml&amp;quot; \
          skaffold run -f skaffold-run.yaml \
          --default-repo ${DOCKER_REGISTRY_URL}/vrm
        ;;
        *)
          skaffold build -f skaffold-build.yaml
        ;;
      esac&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u0435\u043f\u043b\u043e\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0434\u0435\u043f\u043b\u043e\u044f_\u0432\u043e_\u0432\u043d\u0435\u0448\u043d\u0438\u0439_\u043a\u043b\u0430\u0441\u0442\u0435\u0440&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;11529-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 22 Apr 2021 09:44:05 +0000</pubDate>
        </item>
        <item>
            <title>teamcity_gitlab_merge_pull_requests</title>
            <link>https://wiki.autosys.tk/devops/teamcity_gitlab_merge_pull_requests</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;проблема&quot;&gt;Проблема&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Мне необходимо реализовать интеграцию Merge Requests из GitLab с билдами Тимсити. &lt;br/&gt;

Нужно чтобы:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 при создании MR в GitLab билдился собственно код из Merge Request&amp;#039;а
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 При удачном/неудачном билде Teamcity оповещал GitLab и красил кнопочку в зеленый или красный цвет - разрешая или запрещая собственно Merge.
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-541&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;что_я_делаю&quot;&gt;Что я делаю&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 VCSRoot в проекте со следующим &lt;strong&gt;branchSpecs&lt;/strong&gt;: &lt;pre class=&quot;code&quot;&gt;+:refs/(merge-requests/*)/head
-:refs/heads/develop&lt;/pre&gt;

&lt;p&gt;
 То есть - собираем все ветки MR, но не собираем дефолтную.
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 В &lt;strong&gt;buildType&lt;/strong&gt; прописываю параметр, чтобы номер &lt;strong&gt;MR&lt;/strong&gt; был доступен в билде в виде env-переменной со значением &lt;strong&gt;merge-requests/X&lt;/strong&gt;: 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;param(&amp;quot;env.CI_MR_BRANCH&amp;quot;, &amp;quot;%teamcity.build.branch%&amp;quot;)&lt;/pre&gt;

&lt;p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 И дальше, сборочный скрипт должен выполнить &lt;strong&gt;Approve&lt;/strong&gt; с помощью &lt;a href=&quot;https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request&quot; class=&quot;urlextern&quot; title=&quot;https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request&quot; rel=&quot;ugc nofollow&quot;&gt;https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request&lt;/a&gt; . 
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;CI_PROJECT_ID=`curl -s -XGET -H &amp;quot;Content-Type: application/json&amp;quot; --header &amp;quot;PRIVATE-TOKEN: $GITLAB_TOKEN&amp;quot; https://gitlab.com/api/v4/projects/&amp;lt;YOUR-NAMESPACE&amp;gt;%2F&amp;lt;YOUR-PROJECT-NAME&amp;gt; | jq &amp;#039;.id&amp;#039;`
MERGE_REQUEST_IID=`echo ${CI_MR_BRANCH} | cut -d&amp;#039;/&amp;#039; -f2`
curl -f -s -XPOST -H &amp;quot;Content-Type: application/json&amp;quot; --header &amp;quot;PRIVATE-TOKEN: $GITLAB_TOKEN&amp;quot; https://gitlab.example.com/api/v4/projects/${CI_PROJECT_ID}/merge_requests/${MERGE_REQUEST_IID}/approve&lt;/pre&gt;

&lt;p&gt;
Альтернативный вариант - &lt;strong&gt;GitLab External Status Check&lt;/strong&gt; - &lt;a href=&quot;https://about.gitlab.com/blog/2021/10/04/how-to-status-checks/&quot; class=&quot;urlextern&quot; title=&quot;https://about.gitlab.com/blog/2021/10/04/how-to-status-checks/&quot; rel=&quot;ugc nofollow&quot;&gt;https://about.gitlab.com/blog/2021/10/04/how-to-status-checks/&lt;/a&gt;  
&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u0427\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u044e&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u0447\u0442\u043e_\u044f_\u0434\u0435\u043b\u0430\u044e&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;542-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 18 Sep 2023 12:39:38 +0000</pubDate>
        </item>
        <item>
            <title>terrafrom</title>
            <link>https://wiki.autosys.tk/devops/terrafrom</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;error_-_key_unmarshal_fail&quot;&gt;Error - key unmarshal fail&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;Error: key unmarshal fail: invalid character &amp;#039;-&amp;#039; in numeric literal&lt;/pre&gt;

&lt;p&gt;
При извользовании провайдера &lt;strong&gt;yandex-cloud&lt;/strong&gt; столкнулся с такой ошибкой, которая указывала на строку в файлике, где объявлен сам провайдер:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;provider &amp;quot;yandex&amp;quot; {
  cloud_id   = var.yc_cloud_id
  folder_id  = var.yc_folder_id
} &lt;/pre&gt;

&lt;p&gt;
Но не ведителсь!! Это глюк терраформа! Проблема была в авторизационном ключе! Он просто не подходил!
&lt;/p&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 12 Dec 2022 11:12:53 +0000</pubDate>
        </item>
        <item>
            <title>tools_bash_completition</title>
            <link>https://wiki.autosys.tk/devops/tools_bash_completition</link>
            <description>&lt;pre class=&quot;code&quot;&gt;helm completion bash | sudo tee /etc/bash_completion.d/helm
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl&lt;/pre&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Mon, 31 Aug 2020 08:04:38 +0000</pubDate>
        </item>
        <item>
            <title>инструменты</title>
            <link>https://wiki.autosys.tk/devops/%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;трассировка&quot;&gt;Трассировка&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Zipkin
&lt;/div&gt;&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt;
 Jaeger
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Требуется доработка приложений
&lt;/p&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 28 May 2020 08:21:15 +0000</pubDate>
        </item>
        <item>
            <title>настройка_оболочки_для_удобной_работы</title>
            <link>https://wiki.autosys.tk/devops/%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8_%D0%B4%D0%BB%D1%8F_%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%D0%B9_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;настройка_редактора_секретов_kubernetes&quot;&gt;Настройка редактора секретов kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt-get -y install python3-pip python-pip
sudo pip install PyYaml
sudo pip3 install PyYaml
sudo wget https://raw.githubusercontent.com/lbolla/kube-secret-editor/master/kube-secret-editor.py -O /usr/local/bin/kube-secret-editor.py
sudo chmod a+x /usr/local/bin/kube-secret-editor.py
alias kedit-secret=&amp;quot;EDITOR=nano KUBE_EDITOR=/usr/local/bin/kube-secret-editor.py kubectl edit secret&amp;quot;
sudo awk -v line=&amp;#039;alias kedit-secret=&amp;quot;EDITOR=nano KUBE_EDITOR=/usr/local/bin/kube-secret-editor.py kubectl edit secret&amp;quot;&amp;#039; &amp;#039;FNR==NR &amp;amp;&amp;amp; line==$0{f=1; exit} END{if (!f) print line &amp;gt;&amp;gt; FILENAME}&amp;#039; /etc/bash.bashrc&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430_\u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-690&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit2&quot; id=&quot;настройка_дефолтного_редактора_kubernetes&quot;&gt;Настройка дефолтного редактора kubernetes&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;sudo awk -v line=&amp;#039;export KUBE_EDITOR=&amp;quot;/bin/nano&amp;quot;&amp;#039; &amp;#039;FNR==NR &amp;amp;&amp;amp; line==$0{f=1; exit} END{if (!f) print line &amp;gt;&amp;gt; FILENAME}&amp;#039; /etc/bash.bashrc&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 kubernetes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e_\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430_kubernetes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;691-912&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit3&quot; id=&quot;настройка_автозавршения_команд_kubectl&quot;&gt;Настройка автозавршения команд kubectl&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;sudo awk -v line=&amp;#039;source &amp;lt;(kubectl completion bash)&amp;#039; &amp;#039;FNR==NR &amp;amp;&amp;amp; line==$0{f=1; exit} END{if (!f) print line &amp;gt;&amp;gt; FILENAME}&amp;#039; /etc/bash.bashrc&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0430\u0432\u0442\u043e\u0437\u0430\u0432\u0440\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 kubectl&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430_\u0430\u0432\u0442\u043e\u0437\u0430\u0432\u0440\u0448\u0435\u043d\u0438\u044f_\u043a\u043e\u043c\u0430\u043d\u0434_kubectl&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;913-1137&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit4&quot; id=&quot;название_ветки_git_в_комндной_строке&quot;&gt;Название ветки git в комндной строке&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
В &lt;strong&gt;~/.bashrc&lt;/strong&gt; добавляем такое:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;parse_git_branch() {
     git branch 2&amp;gt; /dev/null | sed -e &amp;#039;/^[^*]/d&amp;#039; -e &amp;#039;s/* \(.*\)/(\1)/&amp;#039;
}
export PS1=&amp;quot;\u@\h \[\e[32m\]\w \[\e[91m\]\$(parse_git_branch)\[\e[00m\]$ &amp;quot;&lt;/pre&gt;

&lt;p&gt;
Или одной строкой:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;grep parse_git_branch ~/.bashrc || cat &amp;gt;&amp;gt; ~/.bashrc &amp;lt;&amp;lt;EOF

parse_git_branch() {
     git branch 2&amp;gt; /dev/null | sed -e &amp;#039;/^[^*]/d&amp;#039; -e &amp;#039;s/* \(.*\)/(\1)/&amp;#039;
}
export PS1=&amp;quot;\u@\h \[\e[32m\]\w \[\e[91m\]\\\$(parse_git_branch)\[\e[00m\]$ &amp;quot;
EOF&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0442\u043a\u0438 git \u0432 \u043a\u043e\u043c\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435_\u0432\u0435\u0442\u043a\u0438_git_\u0432_\u043a\u043e\u043c\u043d\u0434\u043d\u043e\u0439_\u0441\u0442\u0440\u043e\u043a\u0435&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1138-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Fri, 01 Dec 2023 08:54:11 +0000</pubDate>
        </item>
        <item>
            <title>почитать</title>
            <link>https://wiki.autosys.tk/devops/%D0%BF%D0%BE%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C</link>
            <description>
&lt;p&gt;
Team Topologies &lt;br/&gt;

&lt;/p&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Tue, 21 Apr 2020 17:41:27 +0000</pubDate>
        </item>
    </channel>
</rss>
