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

187 lines
14 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: Запуск нескольких экземпляров приложения
weight: 10
description: |-
Отмасштабируйте существующее приложение вручную с помощью 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>Научиться масштабировать приложение с kubectl</li>
</ul>
</div>
<div class="col-md-8">
<h3>Масштабирование приложения</h3>
<p>В предыдущих модулях мы создали <a href="/docs/concepts/workloads/controllers/deployment/">деплоймент (Deployment)</a>, а затем открыли к нему публичный доступ через <a href="/docs/concepts/services-networking/service/">сервис (Service)</a>. Деплоймент создал только один под, в котором работает наше приложение. По мере увеличения трафика необходимо будет промасштабировать приложение, чтобы оно могло справиться с возросшим потоком пользователей.</p>
<p>Если вы не работали с предыдущими разделами документации, начните с <a href="/ru/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/">использования minikube для создания кластера</a>.</p>
<p><b>Масштабирование</b> осуществляется за счёт изменения количества реплик в развёртывании.</p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>Краткое содержание:</h3>
<ul>
<li>Масштабирование деплоймента</li>
</ul>
</div>
<div class="content__box content__box_fill">
<p><i>Количество экземпляров можно указать прямо при создании деплоймента, используя параметр <code>--replicas</code> команды <code>kubectl create deployment</code></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-1"></div>
<div class="col-md-8">
<div id="myCarousel" class="carousel" data-ride="carousel" data-interval="3000">
<ol class="carousel-indicators">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myCarousel" data-slide-to="1"></li>
</ol>
<div class="carousel-inner" role="listbox">
<div class="item carousel-item active">
<img src="/docs/tutorials/kubernetes-basics/public/images/module_05_scaling1.svg">
</div>
<div class="item carousel-item">
<img src="/docs/tutorials/kubernetes-basics/public/images/module_05_scaling2.svg">
</div>
</div>
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
<span class="sr-only ">Предыдущая картинка</span>
</a>
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
<span class="sr-only">Следующая картинка</span>
</a>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-8">
<p>В случае масштабирования деплоймента создаются новые поды, которые распределяются по узлам с доступными ресурсами. Масштабирование увеличит количество подов в соответствии с новым требуемым состоянием. Kubernetes также поддерживает <a href="/docs/user-guide/horizontal-pod-autoscaling/">автоматическое масштабирование</a> подов, но эта тема не рассматривается в данном уроке. Кроме этого, возможно масштабирование до нуля: в таком случае завершается работа всех подов в деплойменте.</p>
<p>При запуске нескольких экземпляров приложения нужно правильно распределить трафик между ними. У сервисов есть встроенный балансировщик нагрузки, который распределяет сетевой трафик на все поды деплоймента, доступного извне. Сервисы постоянно отслеживают запущенные поды через их эндпоинты (endpoints), чтобы направлять трафик только на доступные поды.</p>
</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">
<p>Если у вас есть несколько работающих экземпляров приложения, можно выполнять плавающие обновления (rolling updates) без простоев. С ними мы познакомимся в следующем модуле. А пока перейдём к терминалу и промасштабируем наше приложение.</p>
</div>
</div></code>
<div class="row">
<div class="col-md-12">
<h3>Масштабирование деплоймента</h3>
<p>Для вывода списка депойментов воспользуйтесь подкомандой <code>get deployments</code>:
<code><b>kubectl get deployments</b></code></p>
<p>Вывод будет примерно следующим:</p>
<pre>
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 11m
</pre>
<p>У нас должен быть 1 под. Если его нет, выполните команду ещё раз. Вывод показывает следующую информацию:</p>
<ul>
<li><em>NAME</em> — названия деплойментов (Deployments) в кластере.</li>
<li><em>READY</em> — соотношение CURRENT/DESIRED для его экземпляров (реплик).</li>
<li><em>UP-TO-DATE</em> — количество реплик, которые были обновлены до желаемого состояния.</li>
<li><em>AVAILABLE</em> — количество реплик, доступных для пользователей.</li>
<li><em>AGE</em> — сколько времени приложение было запущено.</li>
</ul>
<p>Чтобы увидеть ReplicaSet, созданные деплойментом, выполните:
<code><b>kubectl get rs</b></code></p>
<p>Обратите внимание, что название ReplicaSet всегда форматируется как <tt>[DEPLOYMENT-NAME]-[RANDOM-STRING]</tt>. Последний фрагмент генерируется случайным образом и использует <em>pod-template-hash</em> в качестве seed-значения.</p>
<p>Этот вывод будет содержать два важных столбца:</p>
<ul>
<li><em>DESIRED</em> — желаемое количество экземпляров (реплик) приложения. Это значение вы определяете, когда создаёте деплоймент.</li>
<li><em>CURRENT</em> — количество реплик, которые работают в настоящий момент.</li>
</ul>
<p>Далее отмасштабируем деплоймент до 4 реплик. Для этого воспользуемся командой <code>kubectl scale</code>, для которой укажем тип объекта (деплоймент), его название и количество желаемых экземпляров:</p>
<p><code><b>kubectl scale deployments/kubernetes-bootcamp --replicas=4</b></code></p>
<p>Снова выведем список деплойментов с помощью <code>get deployments</code>:</p>
<p><code><b>kubectl get deployments</b></code></p>
<p>Изменение применилось: теперь доступны 4 экземпляра приложения. Далее проверим, изменилось ли количество подов:</p>
<p><code><b>kubectl get pods -o wide</b></code></p>
<p>Теперь у нас 4 пода с разными IP-адресами. Это изменение было зафиксировано в логе событий деплоймента. Убедиться в этом можно подкомандой <code>describe</code>:</p>
<p><code><b>kubectl describe deployments/kubernetes-bootcamp</b></code></p>
<p>В выводе этой команды тоже видно, что теперь у нас 4 реплики.</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h3>Балансировка нагрузки</h3>
<p>Проверим, что сервис балансирует трафик. Чтобы узнать внешний IP-адрес и порт, воспользуемся командой <code>describe service</code>, с которой уже познакомились в <a href="/ru/docs/tutorials/kubernetes-basics/expose/expose-intro/">предыдущем модуле</a>:</p>
<p><code><b>kubectl describe services/kubernetes-bootcamp</b></code></p>
<p>Объявим переменную окружения <tt>NODE_PORT</tt> со значением порта нашего узла:</p>
<p><code><b>export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"</b></code><br />
<p><code><b>echo NODE_PORT=$NODE_PORT</b></code></p>
<p>Далее обратимся через <code>curl</code> к проброшенному IP-адресу и порту. Выполните эту команду много раз:</p>
<p><code><b>curl http://"$(minikube ip):$NODE_PORT"</b></b></b></code></p>
<p>Каждый раз мы будем попадать на разный под. Это означает, что балансировка нагрузки работает.</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h3>Масштабирование вниз</h3>
<p>Чтобы уменьшить деплоймент до 2 реплик, снова обратимся к подкоманде <code>scale</code>:</p>
<p><code><b>kubectl scale deployments/kubernetes-bootcamp --replicas=2</b></code></p>
<p>С помощью подкоманды <code>get deployments</code> выведем список деплойментов, чтобы убедиться, что изменение применилось:</p>
<p><code><b>kubectl get deployments</b></code></p>
<p>Количество реплик уменьшилось до 2. Выведем список подов с <code>get pods</code>:</p>
<p><code><b>kubectl get pods -o wide</b></code></p>
<p>Так мы убедимся, что работа 2 подов была остановлена.</p>
</div>
</div>
<div class="row">
<p>
Когда всё готово, переходите к разделу <a href="/ru/docs/tutorials/kubernetes-basics/update/update-intro/" title="Выполнение плавающего обновления">Выполнение плавающего обновления</a>.</p>
</p>
</div>
</main>
</div>
</body>
</html>