website/content/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html

158 lines
15 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Использование kubectl для развёртывания приложения
weight: 10
description: |-
Узнайте про деплойменты приложения.
Разверните первое приложение в Kubernetes с помощью kubectl.
---
<!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>Узнать про деплойменты приложения</li>
<li>Развернуть первое приложение в Kubernetes с помощью kubectl</li>
</ul>
</div>
<div class="col-md-8">
<h3>Deployments в Kubernetes</h3>
<p>Как только вы <a href="/ru/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/">запустили кластер Kubernetes</a>, вы можете развернуть на нём свои контейнеризированные приложения. Для этого вам нужно создать <b>деплоймент (Deployment)</b>. Deployment в Kubernetes определяет, как создавать и обновлять экземпляры вашего приложения. После создания деплоймента control plane в Kubernetes запланирует запуск экземпляров приложения на отдельных узлах в кластере.</p>
<p>После того, как экземпляры приложения были созданы, контроллер деплойментов Kubernetes будет непрерывно отслеживать их. Если узел, на котором размещен экземпляр, вышёл из строя или был удалён, контроллер деплойментов заменит этот экземпляр экземпляром на другом узле в кластере. <b>Этот процесс представляет собой механизм самовосстановления, обеспечивающий работу кластера в случае возникновения аппаратных неисправностей либо технических работ.</b>
<p>До того, как появились системы оркестровки, для запуска приложений обычно использовались установочные скрипты, которые не перезапускались после сбоя компьютера. Создавая экземпляры приложений и поддерживая их работу на нескольких узлах, деплойменты Kubernetes используют принципиально другой подход к управлению приложениями.</p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>Краткое содержание:</h3>
<ul>
<li>Деплойменты</li>
<li>Kubectl</li>
</ul>
</div>
<div class="content__box content__box_fill">
<p><i>
Deployment отвечает за создание и обновление экземпляров приложения
</i></p>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-8">
<h2 style="color: #3771e3;">Развёртывание вашего первого приложения на Kubernetes</h2>
</div>
</div>
<div class="row">
<div class="col-md-8">
<p><img src="/docs/tutorials/kubernetes-basics/public/images/module_02_first_app.svg"></p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-8">
<p>Вы можете создавать и управлять деплойментами через консольный инструмент Kubernetes под названием <b>kubectl</b>. Kubectl использует Kubernetes API для работы с кластером. В этом модуле вы узнаете про наиболее используемые команды kubectl, необходимые для создания деплойментов, которые будут запускать приложения в кластере Kubernetes.</p>
<p>При создании развертывания нужно указать образ контейнера приложения и количество запущенных реплик. Впоследствии эти параметры можно изменить. В модулях <a href="/ru/docs/tutorials/kubernetes-basics/scale/scale-intro/">5</a> и <a href="/ru/docs/tutorials/kubernetes-basics/update/update-intro/">6</a> рассказывается про масштабирование и обновление деплойментов.</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-8">
<p>
Для своего первого деплоймента возьмём приложение hello-node, упакованное в Docker-контейнер и использующее NGINX, чтобы выводить на экран все запросы. (Если вы ещё не пробовали создавать приложение hello-node и деплоить контейнер с ним, можете сначала выполнить инструкции из <a href="/ru/docs/tutorials/hello-minikube/">руководства "Привет, Minikube"</a>).
<p>Вам также потребуется установленная утилита kubectl. По вопросам её инсталляции см. <a href="/ru/docs/tasks/tools/#kubectl">Установку инструментов</a>.</p>
<p>Теперь, когда понятие деплойментов вам знакомо, давайте задеплоим первое приложение!</p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-8">
<h3>Основы kubectl</h3>
<p>Общий формат команд kubectl выглядит так: <code>kubectl <i>действие ресурс</i></code></p>
<p>Эта команда выполнит указанное <em>действие</em> (например, <tt>create</tt>, <tt>describe</tt> или <tt>delete</tt>) с указанным <em>ресурсом</em> (например, <tt>node</tt> или <tt>deployment</tt>). Можно воспользоваться справкой через флаг <code>-<span />-help</code> после подкоманды, чтобы получить дополнительные сведения о возможных параметрах (например: <code>kubectl get nodes --help</code>).</p>
<p>Убедитесь, что kubectl настроена на подключение к вашему кластеру, выполнив команду <b><code>kubectl version</code></b>.</p>
<p>Убедитесь, что kubectl установлена и вы можете увидеть версию и у клиента, и у сервера.</p>
<p>Чтобы увидеть список узлов кластера, выполните команду <b><code>kubectl get nodes</code></b>.</p>
<p>Вы увидите доступные узлы. Позже Kubernetes выберет, куда задеплоить ваше приложение, руководствуясь данными о доступных узлах.</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a id="deploy-an-app"></a>
<h3>Деплой приложения</h3>
<p>Давайте развернём первое приложение в Kubernetes с помощью команды <code>kubectl create deployment</code>. Для этого потребуется указать имя деплоймента и путь к образу приложения (используйте полный URL репозитория для образов, которые располагаются вне Docker Hub).</p>
<p><b><code>kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1</code></b></p>
<p>Отлично! Создав этот Deployment, вы только что развернули первое приложение. Команда привела к выполнению следующих действий:</p>
<ul>
<li>поиск подходящего узла, на котором можно запустить экземпляр приложения (у нас доступен только 1 узел);</li>
<li>планирование (размещение) приложения для запуска на этом узле;</li>
<li>настройка кластера на повторное размещение экземпляра на новом узле, когда это потребуется.</li>
</ul>
<p>Чтобы увидеть список деплойментов, выполните команду <code>kubectl get deployments</code>:</p>
<p><b><code>kubectl get deployments</code></b></p>
<p>Вы увидите, что есть 1 деплоймент, в котором запущен единственный экземпляр приложения. Этот экземпляр работает в контейнере на узле кластера.</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h3>Просмотр приложения</h3>
<p>Поды, которые запущены внутри Kubernetes, работают в частной, изолированной сети.
По умолчанию они видны для других подов и сервисов того же Kubernetes-кластера, однако не за пределами этой сети.
Когда мы используем утилиту <code>kubectl</code>, мы взаимодействуем с нашим приложением через API-эндпоинт.</p>
<p>О других возможностях сделать приложение доступным вне кластера Kubernetes мы расскажем позже, в разделе <a href="/ru/docs/tutorials/kubernetes-basics/expose/">Открытие доступа к приложению</a>.</p>
<p>Команда <code>kubectl proxy</code> создаст прокси, который перенаправляет взаимодействие в частную сеть, доступную в рамках кластера. Во время своей работы прокси не выводит никаких сообщений, а остановить его можно нажатием на control-C.</p>
<p><strong>Для запуска прокси потребуется открыть второе окно с терминалом.</strong></p>
<p><b><code>kubectl proxy</b></code>
<p>Теперь у нас есть соединение между хостом (терминалом) и Kubernetes-кластером. Прокси обеспечивает прямой доступ к API из терминала.</p>
<p>Через эндпоинт от прокси можно увидеть все API. Например, с помощью <code>curl</code> мы можем напрямую через API узнать версию:</p>
<p><b><code>curl http://localhost:8001/version</code></b></p>
<div class="alert alert-info note callout" role="alert"><strong>Примечание:</strong> если порт 8001 недоступен, убедитесь, что выполенная вами ранее команда <code>kubectl proxy</code> была запущена во втором терминале.</div>
<p>Сервер API автоматически создаст эндпоинт для каждого пода в соответствии с именем пода, который будет также доступен через прокси.</p>
<p>Для начала узнаем имя пода и сохраним его в переменной окружения <tt>POD_NAME</tt>:</p>
<p><b><code>export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')</code></b><br />
<b><code>echo Name of the Pod: $POD_NAME</code></b></p>
<p>Теперь получим доступ к поду через проксированный API, выполнив команду:</p>
<p><b><code>curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/</code></b></p>
<p>Чтобы новый деплоймент был доступен без использования прокси, потребуется сервис (объект Service), о котором будет рассказано в следующих разделах.</p>
</div>
</div>
<div class="row">
<p>
Когда всё готово, переходите к разделу <a href="/ru/docs/tutorials/kubernetes-basics/explore/explore-intro/" title="Просмотр подов и узлов">Просмотр подов и узлов</a>.</p>
</p>
</div>
</main>
</div>
</body>
</html>