<?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</title>
        <description></description>
        <link>https://wiki.autosys.tk/</link>
        <lastBuildDate>Sun, 31 May 2026 03:23:01 +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>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>
    </channel>
</rss>
