# Просмотр подов и узлов

> Узнайте, как диагностировать проблемы с Kubernetes-приложениями
> с помощью kubectl get, kubectl describe, kubectl logs и
> kubectl exec.

---

LLMS index: [llms.txt](/llms.txt)

---

<!DOCTYPE html>

<html lang="ru">

<body>

<div class="layout" id="top">

    <main class="content">

        <div class="row">

     <div class="col-md-8">
          <h3>Цели</h3>
                <ul>
                    <li>Узнать про поды Kubernetes</li>
                    <li>Узнать про узлы Kubernetes</li>
                    <li>Научиться диагностировать развёрнутые приложения</li>
                </ul>
            </div>

            <div class="col-md-8">
                <h2>Поды Kubernetes</h2>
              
              <blockquote>
                <p>
                    <b>Под (Pod)</b> — это группа из одного или нескольких контейнеров приложения
                    (например, Docker), а также общих ресурсов, таких как хранилище,
                    сетевой интерфейс и параметры запуска контейнеров.
                </p>
               </blockquote>

                <p>После того, как вы создали Deployment в модуле <a href="/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/">2</a>, Kubernetes создал <b>под (Pod)</b>, в котором был размещён экземпляр вашего приложения. Под — это абстрактный объект Kubernetes, представляющий собой группу из одного или нескольких контейнеров приложения (например, Docker) и совместно используемых ресурсов для этих контейнеров. Ресурсами могут быть:</p>
                <ul>
                    <li> общее хранилище (тома);</li>
                    <li> сеть (уникальный IP-адрес кластера);</li>
                    <li> информация о том, как запускать каждый контейнер, например, версия образа контейнера или используемые номера портов.</li>
                </ul>
                <p>Под представляет специфичный для приложения "логический хост" и может содержать разные контейнеры приложений, которые в общем и целом тесно связаны. Например, в поде может размещаться как контейнер с приложением на Node.js, так и другой контейнер, который получает некоторые данные для их дальнейшей публикации на веб-сервере Node.js. Все контейнеры в поде имеют одни и те же IP-адрес и пространство портов, всегда размещаются и планируются для выполнения на одном и том же узле.</p>

                <p>Поды — неделимая единица в платформе Kubernetes. При создании деплоймента в Kubernetes создаются поды с контейнерами внутри (вместо того, чтобы непосредственно создавать контейнеры). Каждый объект Pod связан с узлом (Node), на котором он размещён, и остаётся там до окончания работы (согласно стратегии перезапуска) либо удаления. В случае неисправности узла такой же под будет запланирован для запуска на других доступных узлах кластера.</p>
            </div>
            <div class="col-md-4">
                <div class="content__box content__box_lined">
                    <h3>Краткое содержание:</h3>
                    <ul>
                        <li>Поды</li>
                        <li>Узлы</li>
                        <li>Основные команды kubectl</li>
                    </ul>
                </div>
                <div class="content__box content__box_fill">
                        <p><i>
                          Под (Pod) — группа из одного или нескольких контейнеров приложений (например, Docker) и их общих хранилищ (томов), IP-адреса и информации о том, как их запускать.
                        </i></p>
                </div>
            </div>
        </div>
        <br>

        <div class="row">
            <div class="col-md-8">
                <h2 style="color: #3771e3;">Схема подов</h2>
            </div>
        </div>

        <div class="row">
            <div class="col-md-8">
                <p><img src="/docs/tutorials/kubernetes-basics/public/images/module_03_pods.svg"></p>
            </div>
        </div>
        <br>

        <div class="row">
            <div class="col-md-8">
                <h2>Узлы</h2>

                <p>Под всегда работает в <b>узле</b> (Node). Узел — это рабочая машина в Kubernetes, которая в зависимости от кластера может быть либо виртуальной, либо физической. Каждый узел управляется компонентом под названием control plane. Узел может содержать несколько подов, которые control plane автоматически размещает ("планирует" для запуска) на разные узлы кластера. Автоматическое планирование (распределение подов по узлам) control plane учитывает доступные ресурсы на каждом узле.</p>

                <p>В каждом узле Kubernetes как минимум работает:</p>
                <ul>
                    <li>Kubelet — процесс, отвечающий за взаимодействие между control plane и узлом; он управляет подами и запущенными контейнерами на рабочей машине.</li>
                    <li>Среда выполнения контейнера (вроде Docker), отвечающая за получение (загрузку) образа контейнера из реестра, распаковку контейнера и запуск приложения.</li>
                </ul>

            </div>
            <div class="col-md-4">
                <div class="content__box content__box_fill">
                    <p><i>Контейнеры должны запускаться вместе в пределах одного пода только в случаях, когда они тесно связаны и должны совместно использовать ресурсы (например, диск).</i></p>
                </div>
            </div>
        </div>

        <br>

        <div class="row">
            <div class="col-md-8">
                <h2 style="color: #3771e3;">Схема узла</h2>
            </div>
        </div>

        <div class="row">
            <div class="col-md-8">
                <p><img src="/docs/tutorials/kubernetes-basics/public/images/module_03_nodes.svg"></p>
            </div>
        </div>
        <br>

        <div class="row">
            <div class="col-md-8">
                <h2>Диагностика с помощью kubectl</h2>

                <p>В модуле <a href="/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/">2</a> вы использовали инструмент командной строки kubectl. В этом (третьем) модуле вы продолжите его использовать, но для получения информации о развернутых приложениях и окружениях, в которых они работают. Наиболее распространенные операции выполняются с использованием следующих команд kubectl:</p>
                <ul>
                    <li><b>kubectl get</b> — вывод списка ресурсов;</li>
                    <li><b>kubectl describe</b> — вывод подробной информации о ресурсе;</li>
                    <li><b>kubectl logs</b> — вывод логов контейнера в поде;</li>
                    <li><b>kubectl exec</b> — выполнение команды в контейнере пода.</li>
                </ul>

                <p>Перечисленные выше команды можно использовать, чтобы узнать, когда приложения были развернуты, их текущее состояние, где они запущены и их конфигурацию.</p>

                <p>Теперь, когда вы познакомились поближе с компонентами кластера и командами, давайте исследуем приложение.</p>

            </div>
            <div class="col-md-4">
                <div class="content__box content__box_fill">
                    <p><i>Узел — рабочая машина в Kubernetes, которая может быть как виртуальной, так и физической (в зависимости от используемого кластера). На одном узле могут быть запущены несколько подов.</i></p>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-12">
                <h3>Проверка конфигурации приложения</h3>
                <p>Давайте проверим, что приложение, которое мы развернули ранее, работает. Воспользуемся командой <code>kubectl get</code> и посмотрим на существующие поды:</p>
                <p><b><code>kubectl get pods</code></b></p>
                <p>Если работающих подов нет, подождите несколько секунд и выведите их список снова. Как только увидите работающий под, следуйте инструкциям ниже.</p>
                <p>Теперь, чтобы увидеть, какие контейнеры находятся внутри этого пода и какие образы использовались при сборке этих контейнеров, выполним команду <code>kubectl describe pods</code>:</p>
                <p><b><code>kubectl describe pods</code></b></p>
                <p>Здесь можно увидеть подробности о контейнере пода: IP-адрес, используемые порты и список событий, относящихся к жизненному циклу пода.</p>
                <p>У подкоманды <tt>describe</tt> подробный вывод. В частности, он затрагивает концепции, которые мы ещё не рассматривали, но не волнуйтесь — они станут понятнее в дальнейшем.</p>
                <p><em><strong>Примечание:</strong> подкоманду <tt>describe</tt> можно использовать для получения информации о многих примитивах Kubernetes, включая узлы (Nodes), поды (Pods) и деплойменты (Deployments). Вывод <tt>describe</tt> предназначен для чтения человеком, не для использования в скриптах.</em></p>
            </div>
        </div>

        <div class="row">
            <div class="col-md-12">
                <h3>Просмотр приложения в терминале</h3>
                <p>Вспомним, что поды работают в изолированной, частной сети, поэтому нам нужен прокси для доступа к ним — так мы сможем производить отладку и взаимодействовать с ними. Для этого мы <strong>во втором терминале</strong> воспользуемся командой <code>kubectl proxy</code>, чтобы запустить прокси. Откройте новое окно терминала и выполните:</p>
                <p><code><b>kubectl proxy</b></code></p>
                <p>Теперь мы снова получим имя пода и обратимся к нему через прокси.
                Чтобы получить имя пода и записать его в переменную окружения <tt>POD_NAME</tt>, выполним:</p>
                <p><code><b>export POD_NAME="$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')"</b></code><br />
                <code><b>echo Name of the Pod: $POD_NAME</b></code></p>
                <p>Чтобы увидеть вывод приложения, выполним запрос через <code>curl</code>:</p>
                <p><code><b>curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/</b></code></p>
                <p>Здесь URL указывает на маршрут к API пода.</p>
           </div>
        </div>

        <div class="row">
            <div class="col-md-12">
                <h3>Просмотр логов контейнера</h3>
                <p>Всё, что обычное приложение отправляет в стандартный вывод (standard output), становится логами контейнера в поде. Получить эти логи можно с помощью команды <code>kubectl logs</code>:</p>
                <p><code><b>kubectl logs "$POD_NAME"</b></code></p>
                <p><em><strong>Примечание:</strong> указывать название контейнера не требуется, потому что в данном поде у нас единственный контейнер.</em></p>
           </div>
        </div>

        <div class="row">
            <div class="col-md-12">
                <h3>Выполнение команд в контейнере</h3>
                <p>Когда под запущен и работает, в его контейнерах можно выполнять команды.
                Для этого воспользуемся подкомандой <code>exec</code> и передадим имя пода в качестве параметра. Выведем список переменных окружения в контейнере:</p>
                <p><code><b>kubectl exec "$POD_NAME" -- env</b></code></p>
                <p>Вновь отметим, что название контейнера можно не указывать, поскольку в этом поде у нас единственный контейнер.</p>
                <p>Далее запустим Bash-сессию в контейнере пода:</p>
                <p><code><b>kubectl exec -ti $POD_NAME -- bash</b></code></p>
                <p>Откроется консоль в контейнере, в котором работает NodeJS-приложение. Исходный код приложения находится в файле <tt>server.js</tt>:</p>
                <p><code><b>cat server.js</b></code></p>
                <p>Также можно убедиться, что приложение запущено и работает, обратившись к нему через <tt>curl</tt>:</p>
                <p><code><b>curl http://localhost:8080</b></code></p>
                <p><em><strong>Примечание:</strong> мы здесь использовали <tt>localhost</tt>, поскольку выполняли команду внутри пода NodeJS. Если у вас не получается подключиться к localhost:8080, проверьте, что запускали команду <code>kubectl exec</code>, а сейчас вызываете команду из пода.</em></p>
                <p>Чтобы закрыть подключение к контейнеру, введите <code><b>exit</b></code>.</p>
           </div>
        </div>


      <div class="row">
          <p>
            Когда всё готово, переходите к разделу <a href="/ru/docs/tutorials/kubernetes-basics/expose/expose-intro/" title="Создание сервиса для открытия доступа к приложению">Создание сервиса для открытия доступа к приложению</a>.</p>
          </p>
      </div>

    </main>

</div>

</body>
</html>
