Translating and fixing the interactive tutorials in Russian (#42530)

Co-authored-by: Kirill Kononovich <41591254+kirkonru@users.noreply.github.com>
pull/42587/head
Dmitry Shurupov 2023-08-16 21:04:27 +07:00 committed by GitHub
parent 5d5ba138a0
commit 4d8feb6765
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 646 additions and 363 deletions

View File

@ -338,27 +338,6 @@ On-premises | On-premises or On-prem rather than On-premise or other variations.
Острожно.
{{< /warning >}}
### Встраиваемая среда выполнения Katacoda
С помощью этой кнопки пользователи могут запустить Minikube в своём браузере с помощью [терминала Katacoda](https://www.katacoda.com/embed/panel).
Таким образом снижается порог входа, позволяя пользователям попробовать Minikube с помощью одного щелчка мыши, вместо того, чтобы устанавливать Minikube и Kubectl локально.
Встроенная среда выполнения сконфигурирована для выполнения команды `minikube start` и позволяет пользователям пройти руководство в той же самой вкладке, что и документация.
{{< caution >}}
Сессия ограничена 15 минутами.
{{< /caution >}}
Например:
```
{{</* kat-button */>}}
```
Результат:
{{< kat-button >}}
## Распространённые проблемы с шорткодами
### Упорядоченные списки

View File

@ -7,7 +7,7 @@ menu:
title: "Начало"
weight: 10
post: >
<p>Готовы испачкать руки? Создайте простой кластер Kubernetes с запуском "Hello World" на Node.js</p>
<p>Готовы приступить к делу? Создайте простой кластер Kubernetes и запустите в нём тестовое приложение.</p>
card:
name: tutorials
weight: 10
@ -15,118 +15,145 @@ card:
<!-- overview -->
Это руководство покажет вам, как запустить простое Hello World Node.js приложение
на Kubernetes используя [Minikube](/docs/getting-started-guides/minikube) и Katacoda.
Katacoda предоставляет бесплатную, встроенную в браузер Kubernetes среду.
{{< note >}}
Вы также можете следовать этому руководству, если вы установили [Minikube locally](/docs/tasks/tools/install-minikube/).
{{< /note >}}
Это руководство демонстрирует, как запустить простое приложение в Kubernetes
с помощью minikube. Для этого используется образ контейнера с NGINX, который
выводит обратно текст всех запросов.
## {{% heading "objectives" %}}
* Разверните hello world приложение в Minikube.
* Запустите приложение.
* Посмотрите логи приложения.
* Развернуть простое приложение в minikube.
* Запустить приложение.
* Посмотреть логи приложения.
## {{% heading "prerequisites" %}}
Для этого примера создан образ контейнера, собранный на основе следующих файлов:
{{% codenew language="js" file="minikube/server.js" %}}
{{% codenew language="conf" file="minikube/Dockerfile" %}}
Чтобы получить больше информации по запуску команды `docker build`, ознакомьтесь с [документацией по Docker](https://docs.docker.com/engine/reference/commandline/build/).
Руководство подразумевает, что вы уже настроили `minikube`.
См. документацию [minikube start](https://minikube.sigs.k8s.io/docs/start/) для инструкций по его установке.
Вам также потребуется установить `kubectl`.
См. [Установку и настройку kubectl](/ru/docs/tasks/tools/install-kubectl/) для инструкций по его установке.
<!-- lessoncontent -->
## Создание кластера Minikube
## Создание кластера minikube
1. Нажмите **Запуск Терминала**
```shell
minikube start
```
{{< kat-button >}}
## Запуск панели (dashboard)
{{< note >}}Если у вас локально установлен Minikube, выполните `minikube start`.{{< /note >}}
Откройте панель Kubernetes. Это можно сделать двумя способами:
2. Откройте веб-панель Kubernetes в браузере:
{{< tabs name="dashboard" >}}
{{% tab name="Запуск в браузере" %}}
Откройте **новый** терминал и запустите:
```shell
# Запустите в новом терминале и не закрывайте его.
minikube dashboard
```
Теперь можно вернуться к терминалу, где вы запускали `minikube start`.
{{< note >}}
Команда `dashboard` активирует дополнение dashboard и открывает прокси в веб-браузере по умолчанию.
В этой панели можно создавать такие Kubernetes-ресурсы, как Deployment и Service.
Если вы работаете в окружении с правами root, см. вкладку «Копирование URL для запуска».
По умолчанию панель доступна только из внутренней виртуальной сети Kubernetes.
Команда `dashboard` создаёт временный прокси, чтобы панель была доступна извне внутренней виртуальной сети Kubernetes.
Чтобы остановить работу прокси, выполните `Ctrl+C` для завершения процесса.
Когда команда завершит работу, панель останется запущенной внутри кластера Kubernetes.
Вы можете снова выполнить команду `dashboard`, чтобы создать новую прокси для доступа к панели.
{{< /note >}}
{{% /tab %}}
{{% tab name="Копирование URL для запуска" %}}
Если вы не хотите, чтобы minikube запускал веб-браузер, выполните команду `dashboard` с флагом
`--url`. В этом случае `minikube` выведет URL, который вы можете открыть в любом браузере.
Откройте **новый** терминал и запустите:
```shell
# Запустите в новом терминале и не закрывайте его.
minikube dashboard --url
```
Теперь можно вернуться к терминалу, где вы запускали `minikube start`.
{{% /tab %}}
{{< /tabs >}}
## Создание деплоймента
[*Под*](/docs/concepts/workloads/pods/pod/) Kubernetes — это группа из одного или более контейнеров, связанных друг с другом для удобного администрирования и организации сети. В данном руководстве под включает в себя один контейнер. Деплоймент ([*Deployment*](/docs/concepts/workloads/controllers/deployment/)) в Kubernetes проверяет здоровье пода и перезагружает контейнер пода в случае, если он прекратил работу. Деплойменты — рекомендуемый способ создания и масштабирования подов.
1. Используйте команду `kubectl create` для создания деплоймента, который будет управлять подом. Под запустит контейнер с указанным Docker-образом.
```shell
minikube dashboard
# Запуск тестового образа контейнера с веб-сервером
kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
```
3. Только для окружения Katacoda: В верхней части панели нажмите знак "плюс", а затем на **Select port to view on Host 1** (**Выберите порт для отображения на хосте 1**).
4. Только для окружения Katacoda: введите `30000`, а затем нажмите **Display Port** (**Показать порт**).
## Создание Deployment
[*Под*](/docs/concepts/workloads/pods/pod/) Kubernetes - это группа из одного или более контейнеров, связанных друг с другом с целью адмистрирования и организации сети. В данном руководстве под включает в себя один контейнер. [*Deployment*](/docs/concepts/workloads/controllers/deployment/) в Kubernetes проверяет здоровье пода и перезагружает контейнер пода в случае его отказа. Deployment-ы являются рекоммендуемым способом организации создания и масштабирования подов.
1. Используйте команду `kubectl create` для создание деплоймента для управления подом. Под запускает контейнер на основе предоставленного Docker образа.
```shell
kubectl create deployment hello-node --image=registry.k8s.io/echoserver:1.4
```
2. Посмотреть информацию о Deployment:
1. Посмотреть информацию о Deployment:
```shell
kubectl get deployments
```
Вывод:
Вывод будет примерно следующим:
```shell
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-node 1 1 1 1 1m
```
3. Посмотреть информацию о поде:
1. Посмотреть информацию о поде:
```shell
kubectl get pods
```
Вывод:
Вывод будет примерно следующим:
```shell
NAME READY STATUS RESTARTS AGE
hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m
```
4. Посмотреть события кластера:
1. Посмотреть события кластера:
```shell
kubectl get events
```
5. Посмотреть `kubectl` конфигурацию:
1. Посмотреть конфигурацию `kubectl`:
```shell
kubectl config view
```
{{< note >}}Больше информации о командах `kubectl` можно найти по ссылке [обзор kubectl](/docs/user-guide/kubectl-overview/).{{< /note >}}
{{< note >}}
Больше информации о командах `kubectl` см. в [обзоре kubectl](/ru/docs/reference/kubectl/).
{{< /note >}}
## Создание сервиса
По-умолчанию под доступен только при обращении по его внутреннему IP адресу внутри кластера Kubernetes. Чтобы сделать контейнер `hello-node` доступным вне виртульной сети Kubernetes, необходимо представить под как [*сервис*](/docs/concepts/services-networking/service/) Kubernetes.
По умолчанию под доступен только при обращении по его внутреннему IP-адресу внутри кластера Kubernetes. Чтобы сделать контейнер `hello-node` доступным вне виртуальной сети Kubernetes, необходимо представить под как сервис [*Service*](/docs/concepts/services-networking/service/) Kubernetes.
1. Сделать под доступным для публичной сети Интернет можно с помощью команды `kubectl expose`:
1. Сделать под доступным для публичного интернета можно с помощью команды `kubectl expose`:
```shell
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
```
Флаг `--type=LoadBalancer` показывает, что сервис должен быть виден вне кластера.
Код приложения в тестовом образе прослушивает только TCP-порт 8080. Если вы сделали приложение доступным по другому порту командой `kubectl expose`, клиенты не смогут подключиться к этому порту.
2. Посмотреть только что созданный сервис:
@ -134,7 +161,7 @@ Katacoda предоставляет бесплатную, встроенную
kubectl get services
```
Вывод:
Вывод будет примерно следующим:
```shell
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
@ -150,15 +177,11 @@ Katacoda предоставляет бесплатную, встроенную
minikube service hello-node
```
4. Только для окружения Katacoda: Нажмите на знак "Плюс", затем нажмите **Select port to view on Host 1**.
Откроется окно браузера, в котором запущено ваше приложение и выводится его ответ.
5. Только для окружения Katacoda: Введите `30369` (порт указан рядом с `8080` в выводе сервиса), затем нажмите ???.
## Активация дополнений
Откроется окно браузера, в котором запущено ваше приложение и будет отображено сообщение "Hello World".
## Добавление дополнений
В Minikube есть набор встроенных дополнений, которые могут быть включены, выключены и открыты в локальном окружении Kubernetes.
В minikube есть набор встроенных дополнений ({{< glossary_tooltip text="addons" term_id="addons" >}}), которые могут быть включены, выключены и открыты в локальном окружении Kubernetes.
1. Отобразить текущие поддерживаемые дополнения:
@ -166,9 +189,9 @@ Katacoda предоставляет бесплатную, встроенную
minikube addons list
```
Вывод:
Вывод будет примерно следующим:
```shell
```
addon-manager: enabled
dashboard: enabled
default-storageclass: enabled
@ -207,7 +230,7 @@ Katacoda предоставляет бесплатную, встроенную
kubectl get pod,svc -n kube-system
```
Вывод:
Вывод будет примерно следующим:
```shell
NAME READY STATUS RESTARTS AGE
@ -236,40 +259,40 @@ Katacoda предоставляет бесплатную, встроенную
minikube addons disable metrics-server
```
Вывод:
Вывод будет примерно следующим:
```shell
```
metrics-server was successfully disabled
```
## Освобождение ресурсов
## Очистка
Теперь вы можете освободить ресурсы созданного вами кластера:
Теперь вы можете освободить ресурсы, созданные в кластере:
```shell
kubectl delete service hello-node
kubectl delete deployment hello-node
```
Остановите выполнение виртуальной машины Minikube (опционально):
Остановите кластер minikube:
```shell
minikube stop
```
Удалите виртуальную машину Minikube (опционально):
Удалите виртуальную машину minikube (опционально):
```shell
minikube delete
```
Если вы планируете использовать minikube в дальнейшем, чтобы больше узнать про Kubernetes, удалять инструмент не нужно.
## {{% heading "whatsnext" %}}
* Больше об [объектах деплоймента](/docs/concepts/workloads/controllers/deployment/).
* Руководство по _[деплою первого приложения в Kubernetes с kubectl](/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/)_.
* Больше об [объектах Deployment](/docs/concepts/workloads/controllers/deployment/).
* Больше о [развёртывании приложения](/docs/user-guide/deploying-applications/).
* Больше об [объектах сервиса](/docs/concepts/services-networking/service/).
* Больше об [объектах Service](/docs/concepts/services-networking/service/).

View File

@ -1,6 +1,7 @@
---
title: Основы Kubernetes
linkTitle: Основы Kubernetes
no_list: true
weight: 10
card:
name: tutorials
@ -8,14 +9,14 @@ card:
title: Краткий обзор основ
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
@ -31,7 +32,7 @@ card:
<li>обновить контейнеризированное приложение на новую версию ПО;</li>
<li>отлаживать контейнеризированное приложение.</li>
</ul>
<p>Все руководства используют сервис Katacoda, поэтому в вашем браузере будет показан виртуальный терминал с запущенным Minikube — небольшой локальной средой Kubernetes, которая может работать где угодно. Вам не потребуется устанавливать дополнительное ПО или вообще что-либо настраивать. Каждый интерактивный урок запускается непосредственно в вашем браузере.</p>
</div>
</div>

View File

@ -1,37 +1,34 @@
---
title: Интерактивный урок - Создание кластера
weight: 20
headless: true
toc_hide: true
_build:
list: never
publishResources: false
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<link href="/docs/tutorials/kubernetes-basics/public/css/overrides.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script>
<main class="content">
<div class="layout" id="top">
<main class="content katacoda-content">
<div class="katacoda">
<div class="katacoda__alert">
Данный экран слишком маленький, чтобы работать с терминалом, пожалуйста, используйте компьютер или планшет.
</div>
<div class="katacoda__box" id="inline-terminal-1" data-katacoda-id="kubernetes-bootcamp/1" data-katacoda-color="326de6" data-katacoda-secondary="273d6d" data-katacoda-hideintro="false" data-katacoda-prompt="Kubernetes Bootcamp Terminal" style="height: 600px;"></div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/" role="button">Перейти ко второму модулю<span class="btn__next"></span></a>
</div>
<div>
<h2 class="katacoda-gone">
Контент недоступен
</h2>
<p>
Интерактивный урок по созданию кластера недоступен.
Подробнее читайте в
<a href="https://kubernetes.io/blog/2023/02/14/kubernetes-katacoda-tutorials-stop-from-2023-03-31/">
анонсе закрытия Katacoda</a> (на английском языке).
</p>
</div>
</main>
</div>
</body>
</html>

View File

@ -1,16 +1,18 @@
---
title: Использование Minikube для создания кластера
title: Использование minikube для создания кластера
weight: 10
description: |-
Узнайте, что такое кластер Kubernetes.
Узнайте, что такое minikube.
Запустите Kubernetes-кластер.
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
@ -18,11 +20,11 @@ weight: 10
<div class="row">
<div class="col-md-8">
<h3>Темы</h3>
<h3>Цели</h3>
<ul>
<li>Узнать, что такое кластер Kubernetes.</li>
<li>Узнать, что такое Minikube.</li>
<li>Запуск кластера Kubernetes через онлайн-терминал.</li>
<li>Узнать, что такое кластер Kubernetes</li>
<li>Узнать, что такое minikube</li>
<li>Запустить кластер Kubernetes</li>
</ul>
</div>
@ -85,17 +87,15 @@ weight: 10
<div class="col-md-8">
<p>При развертывании приложений в Kubernetes вы сообщаете ведущему узлу запускать контейнеры приложений. Ведущий узел планирует выполнение контейнеров на узлах кластера. <b>Узлы взаимодействуют с ведущим узлом посредством <a href="/docs/concepts/overview/kubernetes-api/">API Kubernetes</a></b>, который предлагает ведущий узел. Кроме этого, конечные пользователи могут напрямую использовать API Kubernetes для работы с кластером.</p>
<p>Kubernetes-кластер может быть развернут на физических или виртуальных машинах. Чтобы начать работать с Kubernetes, можно использовать Minikube. Minikube — это упрощённая реализация Kubernetes, которая создает виртуальную машину на вашем локальном компьютере и разворачивает простой кластер с одним узлом. Minikube доступен для Linux, macOS и Windows. В CLI-инструменте Minikube есть основные операции для инициализации кластера, включая запуск, завершение, просмотра состояния и удаления кластера. Однако в этом уроке вы будете использовать онлайн-терминал с уже установленным Minikube.</p>
<p>Kubernetes-кластер может быть развернут на физических или виртуальных машинах. Чтобы начать работать с Kubernetes, можно использовать minikube. Minikube — это упрощённая реализация Kubernetes, которая создает виртуальную машину на вашем локальном компьютере и разворачивает простой кластер с одним узлом. Minikube доступен для Linux, macOS и Windows. В CLI-инструмент minikube встроены все необходимые функции для инициализации кластера и работы с ним, включая запуск, остановку, просмотр состояния и удаление кластера.</p>
<p>Теперь, когда вы знаете больше о том, что такое Kubernetes, перейдите к руководству <a href="/ru/docs/tutorials/hello-minikube/">Привет, minikube</a> на своём компьютере.</p>
<p>Теперь, когда вы знаете, что такое Kubernetes, можно перейти к онлайн-уроку, где вы запустите ваш первый кластер!</p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive/" role="button">Начать интерактивный урок <span class="btn__next"></span></a>
</div>
<p>А после этого переходите к <a href="/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/">Использованию <tt>kubectl</tt> для развёртывания приложения</a>.</p>
</div>
</main>

View File

@ -1,49 +1,34 @@
---
title: Интерактивный урок - Развёртывание приложения
weight: 20
headless: true
toc_hide: true
_build:
list: never
publishResources: false
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<link href="/docs/tutorials/kubernetes-basics/public/css/overrides.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script>
<main class="content">
<div class="layout" id="top">
<main class="content katacoda-content">
<div class="row">
<div class="col-md-12">
<p>
Под — основной ресурс приложения Kubernetes. Каждый под представляет собой часть рабочей нагрузки, выполняемой в кластере. <a href="/docs/concepts/workloads/pods/pod-overview/#understanding-pods">Узнать подробнее про поды</a>.
</p>
</div>
</div>
<br>
<div class="katacoda">
<div class="katacoda__alert">
Для работы с терминалом, пожалуйста, используйте компьютер или планшет.
</div>
<div class="katacoda__box" id="inline-terminal-1" data-katacoda-id="kubernetes-bootcamp/7" data-katacoda-color="326de6" data-katacoda-secondary="273d6d" data-katacoda-hideintro="false" data-katacoda-prompt="Kubernetes Bootcamp Terminal" style="height: 600px;">
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/explore/explore-intro/" role="button">Перейти к третьему модулю<span class="btn__next"></span></a>
</div>
<div>
<h2 class="katacoda-gone">
Контент недоступен
</h2>
<p>
Интерактивный урок по развёртыванию приложения недоступен.
Подробнее читайте в
<a href="https://kubernetes.io/blog/2023/02/14/kubernetes-katacoda-tutorials-stop-from-2023-03-31/">
анонсе закрытия Katacoda</a> (на английском языке).
</p>
</div>
</main>
</div>
</body>
</html>

View File

@ -1,16 +1,17 @@
---
title: Использование kubectl для развёртывания приложения
weight: 10
description: |-
Узнайте про деплойменты приложения.
Разверните первое приложение в Kubernetes с помощью kubectl.
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
@ -18,21 +19,21 @@ weight: 10
<div class="row">
<div class="col-md-8">
<h3>Темы</h3>
<h3>Цели</h3>
<ul>
<li>Узнать про развёртывания приложения.</li>
<li>Развернуть первое приложение на Kubernetes с помощью kubectl.</li>
<li>Узнать про деплойменты приложения</li>
<li>Развернуть первое приложение в Kubernetes с помощью kubectl</li>
</ul>
</div>
<div class="col-md-8">
<h3>Развёртывания Kubernetes</h3>
<h3>Deployments в Kubernetes</h3>
<p>Как только вы запустили кластер Kubernetes, вы можете развернуть на нём свои контейнеризированные приложения. Для этого вам нужно создать конфигурацию <b>развёртывания (Deployment)</b> в Kubernetes. Развёртывание сообщает Kubernetes, как создавать и обновлять экземпляры вашего приложения. После создания развёртывания ведущий узел Kubernetes планирует запустить экземпляры приложения на отдельных узлах в кластере.</p>
<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 будет непрерывно отслеживать их. Если узел, на котором размещен экземпляр, вышёл из строя или был удалён, контроллер деплойментов заменит этот экземпляр экземпляром на другом узле в кластере. <b>Этот процесс представляет собой механизм самовосстановления, обеспечивающий работу кластера в случае возникновения аппаратных неисправностей либо технических работ.</b>
<p>До того, как появились системы оркестровки, для запуска приложений обычно использовались установочные скрипты, которые не перезапускались после сбоя компьютера. Создавая экземпляры приложений и поддерживая их работу на нескольких узлах, развёртывания Kubernetes коренным образом отличаются в плане управления приложениями.</p>
<p>До того, как появились системы оркестровки, для запуска приложений обычно использовались установочные скрипты, которые не перезапускались после сбоя компьютера. Создавая экземпляры приложений и поддерживая их работу на нескольких узлах, деплойменты Kubernetes используют принципиально другой подход к управлению приложениями.</p>
</div>
@ -40,13 +41,13 @@ weight: 10
<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>
Развёртывание отвечает за создание и обновление экземпляров приложения
Deployment отвечает за создание и обновление экземпляров приложения
</i></p>
</div>
</div>
@ -68,9 +69,9 @@ weight: 10
<div class="row">
<div class="col-md-8">
<p>Вы можете создавать и управлять развёртыванием через командный инструмент Kubernetes под названием <b>Kubectl</b>. Kubectl использует API Kubernetes для работы с кластером. В этом модуле вы узнаете про наиболее используемые команды Kubectl, необходимые для создания развёртываний, которые будут запускать приложения в кластере Kubernetes.</p>
<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>
<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">
@ -82,19 +83,71 @@ weight: 10
<div class="row">
<div class="col-md-8">
<p>
В качестве первого развёртывания будем использовать приложение на Node.js, упакованное в Docker-контейнер. Следуя инструкциям в <a href="/ru/docs/tutorials/hello-minikube/">руководстве "Привет, Minikube"</a> вы сможете создать такое приложение Node.js и поместить его в контейнер.
<p>
<p>Теперь, когда познакомились с развёртываниями, можно начать онлайн-урок, где вы развернёте своё первое приложение!</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-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-interactive/" role="button">Начать интерактивный урок <span class="btn__next"></span></a>
<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>

View File

@ -1,41 +1,35 @@
---
title: Интерактивный урок - Изучение приложения
weight: 20
headless: true
toc_hide: true
_build:
list: never
publishResources: false
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<link href="/docs/tutorials/kubernetes-basics/public/css/overrides.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script>
<main class="content">
<div class="layout" id="top">
<main class="content katacoda-content">
<br>
<div class="katacoda">
<div class="katacoda__alert">
Для работы с терминалом, пожалуйста, используйте компьютер или планшет.
</div>
<div class="katacoda__box" id="inline-terminal-1" data-katacoda-id="kubernetes-bootcamp/4" data-katacoda-color="326de6" data-katacoda-secondary="273d6d" data-katacoda-hideintro="false" data-katacoda-prompt="Kubernetes Bootcamp Terminal" style="height: 600px;">
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/expose/expose-intro/" role="button">Перейти к четвёртому модулю<span class="btn__next"></span></a>
</div>
<div>
<h2 class="katacoda-gone">
Контент недоступен
</h2>
<p>
Интерактивный урок по изучению приложения недоступен.
Подробнее читайте в
<a href="https://kubernetes.io/blog/2023/02/14/kubernetes-katacoda-tutorials-stop-from-2023-03-31/">
анонсе закрытия Katacoda</a> (на английском языке).
</p>
</div>
</main>
</div>
</body>
</html>

View File

@ -1,17 +1,18 @@
---
title: Изучение подов и узлов
title: Просмотр подов и узлов
weight: 10
description: |-
Узнайте, как диагностировать проблемы с Kubernetes-приложениями
с помощью kubectl get, kubectl describe, kubectl logs и
kubectl exec.
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
@ -19,26 +20,26 @@ weight: 10
<div class="row">
<div class="col-md-8">
<h3>Темы</h3>
<h3>Цели</h3>
<ul>
<li>Узнать про поды Kubernetes.</li>
<li>Узнать про узлы Kubernetes.</li>
<li>Диагностика развёрнутых приложений.</li>
<li>Узнать про поды Kubernetes</li>
<li>Узнать про узлы Kubernetes</li>
<li>Научиться диагностировать развёрнутые приложения</li>
</ul>
</div>
<div class="col-md-8">
<h2>Поды Kubernetes</h2>
<p>После того, как вы создали развёртывание в модуле <a href="/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/">2</a>, Kubernetes создал <b>под (Pod)</b>, в котором был размещён экземпляр вашего приложения. Под — это абстрактный объект Kubernetes, представляющий собой группу из одного или нескольких контейнеров приложения (например, Docker или rkt) и совместно используемых ресурсов для этих контейнеров. Ресурсами могут быть:</p>
<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>
<li> общее хранилище (тома);</li>
<li> сеть (уникальный IP-адрес кластера);</li>
<li> информация о том, как запускать каждый контейнер, например, версия образа контейнера или используемые номера портов.</li>
</ul>
<p>Под представляет специфичный для приложения "логический хост" и может содержать разные контейнеры приложений, которые в общем и целом тесно связаны. Например, в поде может размещаться как контейнер с приложением на Node.js, так и другой контейнер, который использует данные от веб-сервера Node.js. Все контейнеры в поде имеют одни и те же IP-адрес и пространство порта, выполняющиеся в общем контексте на одном и том же узле.</p>
<p>Под представляет специфичный для приложения "логический хост" и может содержать разные контейнеры приложений, которые в общем и целом тесно связаны. Например, в поде может размещаться как контейнер с приложением на Node.js, так и другой контейнер, который получает некоторые данные для их дальнейшей публикации на веб-сервере Node.js. Все контейнеры в поде имеют одни и те же IP-адрес и пространство портов, всегда размещаются и планируются для выполнения на одном и том же узле.</p>
<p>Поды — неделимая единица в платформе Kubernetes. При создании развёртывания в Kubernetes, создаются поды с контейнерами внутри (в отличие от непосредственного создания контейнеров). Каждый Pod-объект связан с узлом, на котором он размещён, и остаётся там до окончания работы (согласно стратегии перезапуска) либо удаления. В случае неисправности узла такой же под будет распределён на другие доступные узлы в кластере.</p>
<p>Поды — неделимая единица в платформе Kubernetes. При создании деплоймента в Kubernetes создаются поды с контейнерами внутри (вместо того, чтобы непосредственно создавать контейнеры). Каждый объект Pod связан с узлом (Node), на котором он размещён, и остаётся там до окончания работы (согласно стратегии перезапуска) либо удаления. В случае неисправности узла такой же под будет запланирован для запуска на других доступных узлах кластера.</p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
@ -46,12 +47,12 @@ weight: 10
<ul>
<li>Поды</li>
<li>Узлы</li>
<li>Основные команды Kubectl</li>
<li>Основные команды kubectl</li>
</ul>
</div>
<div class="content__box content__box_fill">
<p><i>
Под — группа из одного или нескольких контейнеров приложений (например, Docker или rkt), включающая общие используемые хранилище (тома), IP-адрес и информацию по их запуску.
Под (Pod) — группа из одного или нескольких контейнеров приложений (например, Docker) и их общих хранилищ (томов), IP-адреса и информации о том, как их запускать.
</i></p>
</div>
</div>
@ -75,18 +76,18 @@ weight: 10
<div class="col-md-8">
<h2>Узлы</h2>
<p>Под всегда работает в <b>узле</b>. Узел — это рабочая машина в Kubernetes, которая в зависимости от кластера может быть либо виртуальной, либо физической. Каждый узел управляется мастером (ведущим узлом). Узел может содержать несколько подов, которые мастер Kubernetes автоматически размещает на разные узлы кластера. Ведущий узел при автоматическом планировании (распределении подов по узлам) учитывает доступные ресурсы на каждом узле.</p>
<p>Под всегда работает в <b>узле</b> (Node). Узел — это рабочая машина в Kubernetes, которая в зависимости от кластера может быть либо виртуальной, либо физической. Каждый узел управляется компонентом под названием control plane. Узел может содержать несколько подов, которые control plane автоматически размещает ("планирует" для запуска) на разные узлы кластера. Автоматическое планирование (распределение подов по узлам) control plane учитывает доступные ресурсы на каждом узле.</p>
<p>В каждом узле Kubernetes как минимум работает:</p>
<ul>
<li>Kubelet — процесс, отвечающий за взаимодействие между мастером Kubernetes и узлом; он управляет подами и запущенными контейнерами на рабочей машине.</li>
<li>Среда выполнения контейнера (например, Docker или rkt), отвечающая за получение (загрузку) образа контейнера из реестра, распаковку контейнера и запуск приложения.</li>
<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>
<p><i>Контейнеры должны запускаться вместе в пределах одного пода только в случаях, когда они тесно связаны и должны совместно использовать ресурсы (например, диск).</i></p>
</div>
</div>
</div>
@ -110,33 +111,89 @@ weight: 10
<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>
<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>
<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>
<p>Теперь, когда вы познакомились поближе с компонентами кластера и командами, давайте изучим приложение.</p>
<p>Теперь, когда вы познакомились поближе с компонентами кластера и командами, давайте исследуем приложение.</p>
</div>
<div class="col-md-4">
<div class="content__box content__box_fill">
<p><i>Узел — рабочая машина в Kubernetes, которая может быть как виртуальной, так и физической (в зависимости от используемого кластера). В одном узле могут быть запущены несколько подов</i></p>
<p><i>Узел — рабочая машина в Kubernetes, которая может быть как виртуальной, так и физической (в зависимости от используемого кластера). На одном узле могут быть запущены несколько подов.</i></p>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/explore/explore-interactive/" role="button">Начать интерактивный урок <span class="btn__next"></span></a>
<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/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>

View File

@ -1,38 +1,34 @@
---
title: Интерактивный урок - Открытие доступа к приложению
weight: 20
headless: true
toc_hide: true
_build:
list: never
publishResources: false
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<link href="/docs/tutorials/kubernetes-basics/public/css/overrides.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script>
<main class="content">
<div class="layout" id="top">
<main class="content katacoda-content">
<div class="katacoda">
<div class="katacoda__alert">
Для работы с терминалом, пожалуйста, используйте компьютер или планшет.
</div>
<div class="katacoda__box" id="inline-terminal-1" data-katacoda-id="kubernetes-bootcamp/8" data-katacoda-color="326de6" data-katacoda-secondary="273d6d" data-katacoda-hideintro="false" data-katacoda-prompt="Kubernetes Bootcamp Terminal" style="height: 600px;">
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/scale/scale-intro/" role="button">Перейти к пятому модулю<span class="btn__next"></span></a>
</div>
<div>
<h2 class="katacoda-gone">
Контент недоступен
</h2>
<p>
Интерактивный урок по открытию доступа к приложению недоступен.
Подробнее читайте в
<a href="https://kubernetes.io/blog/2023/02/14/kubernetes-katacoda-tutorials-stop-from-2023-03-31/">
анонсе закрытия Katacoda</a> (на английском языке).
</p>
</div>
</main>
</div>
</body>
</html>

View File

@ -1,45 +1,47 @@
---
title: Создание сервиса для открытия доступа к приложению
weight: 10
description: |-
Узнайте о сервисах в Kubernetes.
Разберитесь, какое отношение к сервисам имеют лейблы и селекторы.
Сделайте приложение доступным вне кластера Kubernetes.
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-8">
<h3>Темы</h3>
<h3>Цели</h3>
<ul>
<li>Узнать о сервисах в Kubernetes</li>
<li>Разобраться с тем, как метки и объекты LabelSelector связаны с сервисом</li>
<li>Открыть доступ к приложению вне кластера Kubernetes через сервис</li>
<li>Разобраться, какое отношение к сервисам имеют лейблы и селекторы</li>
<li>Сделать приложение доступным вне кластера Kubernetes</li>
</ul>
</div>
<div class="col-md-8">
<h3>Обзор сервисов Kubernetes</h3>
<p><a href="/docs/concepts/workloads/pods/pod-overview/">Под</a> — это расходный материал в Kubernetes. У подов есть <a href="/docs/concepts/workloads/pods/pod-lifecycle/">жизненный цикл</a>. Когда рабочий узел завершается, запущенные поды в узле также уничтожаются. После этого <a href="/docs/concepts/workloads/controllers/replicaset/">ReplicaSet</a> попытается автоматически вернуть кластер обратно в требуемое состояние, создавая новые поды, чтобы поддержать работоспособность приложения. Другой пример — бэкенд для обработки изображений с 3 репликами. Поскольку это взаимозаменяемые реплики, то они не влияют на фронтенд-часть, даже если под был уничтожен и пересоздан. Тем не менее, каждый под в кластере Kubernetes имеет уникальный IP-адрес, даже под на одном и том же узле, поэтому должен быть способ автоматической координации изменений между подами, чтобы приложения продолжали функционировать.</p>
<p><a href="/docs/concepts/workloads/pods/pod-overview/">Под</a> — это расходный материал в Kubernetes. У них есть свой <a href="/docs/concepts/workloads/pods/pod-lifecycle/">жизненный цикл</a>. Когда рабочий узел прекращает работу, запущенные поды в узле также уничтожаются. После этого <a href="/docs/concepts/workloads/controllers/replicaset/">ReplicaSet</a> попытается автоматически вернуть кластер обратно в требуемое состояние, создавая новые поды, чтобы поддержать работоспособность приложения. Другим примером жизни и смерти подов может служить бэкенд для обработки изображений с 3 репликами. Поскольку это взаимозаменяемые реплики, они не влияют на фронтенд-часть, даже если под был уничтожен и пересоздан. Тем не менее, каждый под в кластере Kubernetes имеет уникальный IP-адрес — даже под на одном и том же узле. Поэтому необходим способ автоматической координации изменений между подами, чтобы приложения продолжали функционировать.</p>
<p>Сервис в Kubernetes — это абстрактный объект, который определяет логический набор подов и политику доступа к ним. Сервисы создают слабую связь между подами, которые от них зависят. Сервис создаётся в формате YAML <a href="/docs/concepts/configuration/overview/#general-configuration-tips">(рекомендуемый формат)</a> или JSON, как и все остальные объекты в Kubernetes. Как правило, набор подов для сервиса определяется <i>LabelSelector</i> (ниже описано, в каких случаях понадобится сервис без указания <code>selector</code> в спецификации).</p>
<p>Сервис (Service) в Kubernetes — это абстрактный объект, который определяет логический набор подов и политику доступа к ним. Сервисы создают слабую связь между подами, которые от них зависят. Сервис создаётся в формате YAML <a href="/docs/concepts/configuration/overview/#general-configuration-tips">(рекомендуемый формат)</a> или JSON, как и все остальные объекты в Kubernetes. Как правило, набор подов для сервиса определяется <i>селектором лейблов</i> (label selector) — ниже будет описано, в каких случаях может понадобиться сервис без указания селектора (<code>selector</code>) в его спецификации.</p>
<p>Хотя у каждого пода есть уникальный IP-адрес, эти IP-адреса не доступны за пределами кластера без использования сервиса. Сервисы позволяют приложениям принимать трафик. Сервисы могут быть по-разному открыты, в зависимости от указанного поля <code>type</code> в ServiceSpec:</p>
<p>Хотя у каждого пода есть уникальный IP-адрес, эти IP-адреса не доступны за пределами кластера без использования сервиса. Сервисы позволяют приложениям принимать трафик. Сервисы могут быть по-разному открыты, в зависимости от значения поля <code>type</code>, указанного в спецификации сервиса:</p>
<ul>
<li><i>ClusterIP</i> (по умолчанию) - открывает доступ к сервису по внутреннему IP-адресу в кластере. Этот тип делает сервис доступным только внутри кластера.</li>
<li><i>NodePort</i> - открывает сервис на одном и том же порту каждого выбранного узла в кластере с помощью NAT. Делает сервис доступным вне кластера, используя <code>&lt;NodeIP&gt;:&lt;NodePort&gt;</code>. Является надмножеством ClusterIP.</li>
<li><i>LoadBalancer</i> - создает внешний балансировщик нагрузки в текущем облаке (если это поддерживается) и назначает фиксированный внешний IP-адрес для сервиса. Является надмножеством NodePort.</li>
<li><i>ExternalName</i> - открывает доступ к сервису с указанным именем (определённое в поле <code>externalName </code> в спецификации) и возвращает запись CNAME. Прокси не используется. Для этого типа требуется версия <code>kube-dns</code> 1.7 или выше.</li>
<li><i>ClusterIP</i> (по умолчанию) открывает доступ к сервису по внутреннему IP-адресу в кластере. Этот тип делает сервис доступным только внутри кластера;</li>
<li><i>NodePort</i> — открывает сервис на том же порту каждого выбранного узла в кластере с помощью NAT. Делает сервис доступным вне кластера через <code>&lt;NodeIP&gt;:&lt;NodePort&gt;</code>. Является надмножеством ClusterIP.</li>
<li><i>LoadBalancer</i> создает внешний балансировщик нагрузки в текущем облаке (если это поддерживается) и назначает фиксированный внешний IP-адрес для сервиса. Является надмножеством NodePort.</li>
<li><i>ExternalName</i> — открывает доступ к сервису по содержимому поля <code>externalName</code> (например, <code>foo.bar.example.com</code>), возвращая запись <code>CNAME</code> с его значением. При этом прокси не используется. Для этого типа требуется версия <code>kube-dns</code> 1.7+ или CoreDNS 0.0.8+.</li>
</ul>
<p>Более подробно узнать о различных типах сервисах можно в руководстве <a href="/docs/tutorials/services/source-ip/">Использование IP-порта источника</a>. Также изучите <a href="/docs/concepts/services-networking/connect-applications-service">Подключение приложений к сервисам</a>.</p>
<p>Кроме этого, обратите внимание, что в некоторых случаях в сервисах не определяется <code>selector</code> в спецификации. Сервис без <code>selector</code> не будет создавать соответствующий объект конечной точки (Endpoint). Таким образом, пользователь может вручную назначить сервис определённым конечным точкам. Использование <code>type: ExternalName</code> — это другой вариант использования, когда не нужно определять селектор в сервисе.</p>
<p>Кроме этого, обратите внимание, что в некоторых случаях в сервисах не определяется <code>selector</code> в спецификации. Сервис без <code>selector</code> не будет создавать соответствующий эндпоинт (Endpoint). Таким образом, пользователь может вручную определить эндпоинты для сервиса. Ещё один возможный сценарий создания сервиса без селектора — это строгое использование <code>type: ExternalName</code>.</p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
@ -47,11 +49,11 @@ weight: 10
<ul>
<li>Открытие внешнего трафика для подов</li>
<li>Балансировка нагрузки трафика между подов</li>
<li>Использование метки</li>
<li>Использование лейблов</li>
</ul>
</div>
<div class="content__box content__box_fill">
<p><i>Сервис Kubernetes — это уровень абстракции, который определяет логический набор подов, перенаправляет внешний трафик, балансирует нагрузку и реализует паттерн Service Discovery для этих подов.</i></p>
<p><i>Сервис Kubernetes (Service) — это уровень абстракции, который определяет логический набор подов, перенаправляет внешний трафик, балансирует нагрузку и реализует service discovery для этих подов.</i></p>
</div>
</div>
</div>
@ -59,7 +61,7 @@ weight: 10
<div class="row">
<div class="col-md-8">
<h3>Сервисы и метки</h3>
<h3>Сервисы и лейблы</h3>
</div>
</div>
@ -71,12 +73,12 @@ weight: 10
<div class="row">
<div class="col-md-8">
<p>Сервис направляет трафик через набор подов. Сервисы — это абстракция, позволяющая взаимозаменять поды Kubernetes без ущерба для приложения. Сервисы в Kubernetes находят и маршрутизируют трафик между зависимыми подами (это могут быть фронтенд- и бэкенд-компоненты приложения).</p>
<p>Сервисы для выбора набора подов используют <a href="/docs/concepts/overview/working-with-objects/labels">метки и селекторы</a>. Метки — пары ключ-значение, добавленные к объектам; например, они могут использоваться чтобы:</p>
<p>Сервис направляет трафик через набор подов. Сервисы — это абстракция, позволяющая взаимозаменять поды Kubernetes без ущерба для работы приложения. Сервисы в Kubernetes находят и маршрутизируют трафик между зависимыми подами (это могут быть фронтенд- и бэкенд-компоненты приложения).</p>
<p>Сервисы для выбора набора подов используют <a href="/docs/concepts/overview/working-with-objects/labels">лейблы и селекторы</a>. Лейблы — пары ключ-значение, добавленные к объектам; например, они могут использоваться чтобы:</p>
<ul>
<li>Идентифицировать объекты для окружений разработки, тестирования и продакшена</li>
<li>Добавить теги версии</li>
<li>Классифицировать объекты через теги</li>
<li> идентифицировать объекты для окружений разработки, тестирования и production;</li>
<li> встроить теги версии;</li>
<li> классифицировать объекты через теги.</li>
</ul>
</div>
@ -92,15 +94,81 @@ weight: 10
<br>
<div class="row">
<div class="col-md-8">
<p>Метки могут добавляться во время создания объектов или после этого. Они также могут быть изменены в любое время. Теперь давайте откроем доступ к приложению путём создания сервиса и добавление меток.</p>
<p>Лейблы могут добавляться во время создания объектов или после этого. Они также могут быть изменены в любое время. Теперь давайте откроем доступ к приложению с помощью создания сервиса и добавим лейблы.</p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/expose/expose-interactive/" role="button">Начать интерактивный урок <span class="btn__next"></span></a>
<h3>Создание нового сервиса</h3>
<p>Давайте убедимся, что приложение работает. Воспользуемся командой <code>kubectl get</code> и посмотрим на существующие поды:</p>
<p><code><b>kubectl get pods</b></code></p>
<p>Если работающих подов нет, объекты из предыдущих разделов руководства была удалены. В таком случае вернитесь и повторно создайте деплоймент по инструкциям из раздела <a href="/ru/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro#deploy-an-app">Использование kubectl для развёртывания приложения</a>.
После этого подождите несколько секунд и повторно запросите список подов. Как только увидите работающий под, можно следовать инструкциям ниже.</p>
<p>Далее посмотрим на список уже имеющихся сервисов в кластере:</p>
<p><code><b>kubectl get services</b></code></p>
<p>У нас есть сервис под названием <tt>kubernetes</tt>. Его по умолчанию создаёт minikube при запуске кластера.
Чтобы создать новый сервис и сделать его доступным для внешних пользователей, воспользуемся командой <code>expose</code> с указанием типа сервиса NodePort в качестве параметра.</p>
<p><code><b>kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080</b></code></p>
<p>Попробуем подкоманду <code>get services</code> ещё раз:</p>
<p><code><b>kubectl get services</b></code></p>
<p>Теперь у нас есть сервис под названием <tt>kubernetes-bootcamp</tt>. Мы можем увидеть, что у этого сервиса уникальный cluster-IP, внутренний порт и external-IP (IP соответствующего узла).</p>
<p>Чтобы выяснить, какой порт был открыт для внешнего мира (для сервиса со спецификацией <tt>type: NodePort</tt>), выполним подкоманду <code>describe service</code>:</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 />
<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></code></p>
<p>Получим ответ от сервера. Сервис доступен внешнему миру.</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h3>Шаг 2: использование лейблов</h3>
<div class="content">
<p>Deployment автоматически создаёт лейбл для пода. Подкоманда <code>describe deployment</code> покажет его название (<em>key</em>):</p>
<p><code><b>kubectl describe deployment</b></code></p>
<p>Воспользуемся этим лейблом при выводе списка подов. Для этого вызовем команду <code>kubectl get pods</code> с флагом <tt>-l</tt> и нужными значениями лейблов в качестве параметра:</p>
<p><code><b>kubectl get pods -l app=kubernetes-bootcamp</b></code></p>
<p>То же самое можно делать при выводе списка сервисов:</p>
<p><code><b>kubectl get services -l app=kubernetes-bootcamp</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>label</code>, для которой укажем тип объекта, имя объекта и значение нового лейбла:</p>
<p><code><b>kubectl label pods "$POD_NAME" version=v1</b></code></p>
<p>Новый лейбл добавится к поду (мы зафиксировали версию приложения для этого пода), а мы сможем убедиться в этом с помощью команды <code>describe pod</code>:</p>
<p><code><b>kubectl describe pods "$POD_NAME"</b></code></p>
<p>Как видно, лейбл добавился к нашему поду. Теперь мы можем получить список всех подов, использующих новый лейбл:</p>
<p><code><b>kubectl get pods -l version=v1</b></code></p>
<p>Наш под будет в этом списке.</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h3>Удаление сервиса</h3>
<p>Чтобы удалить сервис, воспользуйтесь подкомандой <code>delete service</code>. В ней могут указываться и лейблы:</p>
<p><code><b>kubectl delete service -l app=kubernetes-bootcamp</b></code></p>
<p>Убедитесь, что сервис удалился:</p>
<p><code><b>kubectl get services</b></code></p>
<p>Вывод подтвердит, что сервис был удалён. Убедиться в том, что удалился соответствующий маршрут для внешнего трафика, можно через <tt>curl</tt> к доступному ранее IP и порту:</p>
<p><code><b>curl http://"$(minikube ip):$NODE_PORT"</b></code></p>
<p>Так можно убедиться, что приложение более недоступно снаружи кластера.
Проверить, что приложение всё ещё работает, можно через <tt>curl</tt>, который будет выполнен внутри пода:</p>
<p><code><b>kubectl exec -ti $POD_NAME -- curl http://localhost:8080</b></code></p>
<p>Мы увидим, что приложение запущено. Оно функционирует, потому что за его работу отвечает деплоймент (Deployment). Чтобы остановить приложение, потребуется также удалить и его деплоймент.</p>
</div>
</div>
<div class="row">
<p>
Когда всё готово, переходите к разделу <a href="/ru/docs/tutorials/kubernetes-basics/scale/scale-intro/" title="Запуск нескольких экземпляров приложения">Запуск нескольких экземпляров приложения</a>.</p>
</p>
</div>
</div>
</main>
</div>

View File

@ -1,40 +1,34 @@
---
title: Интерактивный урок - Масштабирование приложения
weight: 20
headless: true
toc_hide: true
_build:
list: never
publishResources: false
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<link href="/docs/tutorials/kubernetes-basics/public/css/overrides.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script>
<main class="content">
<div class="layout" id="top">
<main class="content katacoda-content">
<div class="katacoda">
<div class="katacoda__alert">
Для работы с терминалом, пожалуйста, используйте компьютер или планшет
</div>
<div class="katacoda__box" id="inline-terminal-1" data-katacoda-id="kubernetes-bootcamp/5" data-katacoda-color="326de6" data-katacoda-secondary="273d6d" data-katacoda-hideintro="false" data-katacoda-prompt="Kubernetes Bootcamp Terminal" style="height: 600px;">
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/update/update-intro/" role="button">Перейти к шестому модулю <span class="btn__next"></span></a>
</div>
<div>
<h2 class="katacoda-gone">
Контент недоступен
</h2>
<p>
Интерактивный урок по масштабированию приложения недоступен.
Подробнее читайте в
<a href="https://kubernetes.io/blog/2023/02/14/kubernetes-katacoda-tutorials-stop-from-2023-03-31/">
анонсе закрытия Katacoda</a> (на английском языке).
</p>
</div>
</main>
<a class="scrolltop" href="#top"></a>
</div>
</body>
</html>

View File

@ -1,16 +1,16 @@
---
title: Запуск нескольких экземпляров приложения
weight: 10
description: |-
Отмасштабируйте существующее приложение вручную с помощью kubectl.
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
@ -18,29 +18,30 @@ weight: 10
<div class="row">
<div class="col-md-8">
<h3>Темы</h3>
<h3>Цели</h3>
<ul>
<li>Масштабирование приложения с помощью kubectl.</li>
<li>Научиться масштабировать приложение с kubectl</li>
</ul>
</div>
<div class="col-md-8">
<h3>Масштабирование приложения</h3>
<h3>Масштабирование приложения</h3>
<p>В предыдущих модулях мы создали <a href="/docs/concepts/workloads/controllers/deployment/">развёртывание</a>, а затем открыли к нему публичный доступ через <a href="/docs/concepts/services-networking/service/">сервис</a>. Развёртывание создало только один под, в котором работает наше приложение. По мере увеличения трафика необходимо будет промасштабировать приложение, чтобы оно могло справиться с возросшим потоком пользователей.</p>
<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>
<p><b>Масштабирование</b> осуществляется за счёт изменения количества реплик в развёртывании.</p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>Краткое содержание:</h3>
<ul>
<li>Масштабирование развёртывания</li>
<li>Масштабирование деплоймента</li>
</ul>
</div>
<div class="content__box content__box_fill">
<p><i>Количество экземпляров можно указать прямо при создании развёртывания, используя параметр --replicas команды kubectl run</i></p>
<p><i>Количество экземпляров можно указать прямо при создании деплоймента, используя параметр <code>--replicas<code> команды <code>kubectl create deployment</code></i></p>
</div>
</div>
</div>
@ -48,7 +49,7 @@ weight: 10
<div class="row">
<div class="col-md-8">
<h2 style="color: #3771e3;">Обзор масштабирования</h2>
<h2 style="color: #3771e3;">Обзор темы масштабирования</h2>
</div>
</div>
@ -85,14 +86,15 @@ weight: 10
<div class="row">
<div class="col-md-8">
<p>В случае масштабирования развёртывания создаются новые поды, которые распределяются по узлам с доступными ресурсами. Масштабирование увеличит количество подов в соответствии с указанным требуемым состоянием. Kubernetes также поддерживает <a href="/docs/user-guide/horizontal-pod-autoscaling/">автоматическое масштабирование</a> подов (не рассматривается в данном уроке). Кроме этого, возможно масштабирование до нуля, тогда завершается работа всех подов в развертывании.</p>
<p>В случае масштабирования деплоймента создаются новые поды, которые распределяются по узлам с доступными ресурсами. Масштабирование увеличит количество подов в соответствии с новым требуемым состоянием. Kubernetes также поддерживает <a href="/docs/user-guide/horizontal-pod-autoscaling/">автоматическое масштабирование</a> подов, но эта тема не рассматривается в данном уроке. Кроме этого, возможно масштабирование до нуля: в таком случае завершается работа всех подов в деплойменте.</p>
<p>При запуске нескольких экземпляров приложения нужно правильно распределить трафик между ними. У сервисов есть встроенный балансировщик нагрузки, который распределяет сетевой трафик всех подов в открытом извне развертывания. Сервисы постоянно отслеживают запущенные поды через их конечные точки, чтобы направлять трафик только на доступные поды.</p>
<p>При запуске нескольких экземпляров приложения нужно правильно распределить трафик между ними. У сервисов есть встроенный балансировщик нагрузки, который распределяет сетевой трафик на все поды деплоймента, доступного извне. Сервисы постоянно отслеживают запущенные поды через их эндпоинты (endpoints), чтобы направлять трафик только на доступные поды.</p>
</div>
<div class="col-md-4">
<div class="content__box content__box_fill">
<p><i>Масштабирование выполняется с помощью изменения количества реплик в развертывании.</i></p>
<p><i>Масштабирование выполняется с помощью изменения количества реплик в деплойменте.</i></p>
</div>
</div>
</div>
@ -101,17 +103,81 @@ weight: 10
<div class="row">
<div class="col-md-8">
<p>Имея несколько работающих экземпляров приложения можно выполнять плавающие обновления (rolling updates) без простоев. С ними мы познакомимся в следующем модуле. А пока перейдём к онлайн-терминалу и промасштабируем наше приложение.</p>
<p>Если у вас есть несколько работающих экземпляров приложения, можно выполнять плавающие обновления (rolling updates) без простоев. С ними мы познакомимся в следующем модуле. А пока перейдём к терминалу и промасштабируем наше приложение.</p>
</div>
</div>
<br>
</div></code>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/scale/scale-interactive/" role="button">Начать интерактивный урок <span class="btn__next"></span></a>
<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>

View File

@ -1,37 +1,34 @@
---
title: Интерактивный урок - Обновление приложения
weight: 20
headless: true
toc_hide: true
_build:
list: never
publishResources: false
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<link href="/docs/tutorials/kubernetes-basics/public/css/overrides.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script>
<main class="content">
<div class="layout" id="top">
<main class="content katacoda-content">
<div class="katacoda">
<div class="katacoda__alert">
Для работы с терминалом, пожалуйста, используйте компьютер или планшет
</div>
<div class="katacoda__box" id="inline-terminal-1" data-katacoda-id="kubernetes-bootcamp/6" data-katacoda-color="326de6" data-katacoda-secondary="273d6d" data-katacoda-hideintro="false" data-katacoda-prompt="Kubernetes Bootcamp Terminal" style="height: 600px;">
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/" role="button">Вернуться на главную страницу с основами по Kubernetes<span class="btn__next"></span></a>
</div>
<div>
<h2 class="katacoda-gone">
Контент недоступен
</h2>
<p>
Интерактивный урок по обновлению приложения недоступен.
Подробнее читайте в
<a href="https://kubernetes.io/blog/2023/02/14/kubernetes-katacoda-tutorials-stop-from-2023-03-31/">
анонсе закрытия Katacoda</a> (на английском языке).
</p>
</div>
</main>
</div>
</body>
</html>

View File

@ -1,17 +1,16 @@
---
title: Выполнение плавающего обновления
weight: 10
description: |-
Выполнение плавающего обновления с помощью kubectl.
---
<!DOCTYPE html>
<html lang="en">
<html lang="ru">
<body>
<link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
@ -19,18 +18,19 @@ weight: 10
<div class="row">
<div class="col-md-8">
<h3>Темы</h3>
<h3>Цели</h3>
<ul>
<li>Выполнение плавающего обновления с помощью kubectl.</li>
<li>Выполнить плавающее обновление с помощью kubectl</li>
</ul>
</div>
<div class="col-md-8">
<h3>Обновление приложения</h3>
<p>Пользователи надеются, что приложения будут работать круглосуточно, а разработчики в свою очередь ожидают развёртывать новые версии приложений по нескольку раз в день. В Kubernetes это возможно благодаря механизму плавающих обновлений (rolling updates). <b>Плавающие обновления</b> позволяют обновить развёртывания без простоев, шаг за шагом заменяя старые поды на новые. Новые поды будут запущены на узлах, имеющих достаточно ресурсов.</p>
<p>В предыдущем модуле мы промасштабировали приложение до нескольких экземпляров. Это необходимо сделать, чтобы иметь возможность обновлять приложение, не влияя на его доступность. По умолчанию максимальное количество подов, которое может быть недоступно во время обновления, и максимальное количество новых подов, которое можно создать, равны 1. Эти две опции могут быть определены в абсолютном (числа) или относительном соотношении (проценты).
В Kubernetes обновления версионируются, поэтому любое обновление развёртывания можно откатить до предыдущей (стабильной) версии.</p>
<p>Пользователи надеются, что приложения будут работать круглосуточно, а разработчики в свою очередь хотят развёртывать новые версии приложений по несколько раз в день. В Kubernetes это возможно благодаря механизму плавающих обновлений (rolling updates). <b>Плавающие обновления</b> позволяют обновить деплойменты без простоев, шаг за шагом заменяя старые поды на новые. Новые поды будут запущены на узлах, имеющих достаточно ресурсов.</p>
<p>В предыдущем модуле мы промасштабировали приложение до нескольких экземпляров. Это необходимо сделать, чтобы иметь возможность обновлять приложение, не влияя на его доступность. По умолчанию максимальное количество подов, которое может быть недоступно во время обновления, и максимальное количество новых подов, которое можно создать, равны 1. Эти две опции могут быть определены в абсолютном значении (числа) или относительном соотношении (проценты).
В Kubernetes обновления версионируются, поэтому любое обновление деплоймента можно откатить до предыдущей (стабильной) версии.</p>
</div>
<div class="col-md-4">
@ -41,7 +41,7 @@ weight: 10
</ul>
</div>
<div class="content__box content__box_fill">
<p><i>Плавающие обновления последовательно заменяют экземпляры подов на новые, тем самым позволяя обновить развёртывания без простоев</i></p>
<p><i>Плавающие обновления последовательно заменяют экземпляры подов на новые, тем самым позволяя обновить деплойменты без простоев</i></p>
</div>
</div>
</div>
@ -94,20 +94,20 @@ weight: 10
<div class="row">
<div class="col-md-8">
<p>Подобно масштабированию приложения, если развёртывание доступно извне, при обновлении сервис будет балансировать трафик только между доступными подами. Доступный под — это экземпляр, который может быть запущен для пользователей приложения.</p>
<p>Подобно масштабированию приложения, если деплоймент доступен извне, при обновлении сервис будет балансировать трафик только между доступными подами. Доступный под — это экземпляр, который может быть запущен для пользователей приложения.</p>
<p>С помощью плавающих обновлений можно:</p>
<ul>
<li>Переводить приложение из одного окружения в другое (через обновления образа контейнера)</li>
<li>Откатываться к предыдущим версиям</li>
<li>Осуществлять непрерывную интеграцию и непрерывную доставку приложений без простоев</li>
<li> переводить приложение из одного окружения в другое (через обновления образа контейнера);</li>
<li> откатываться к предыдущим версиям;</li>
<li> осуществлять непрерывную интеграцию и непрерывную доставку приложений без простоев.</li>
</ul>
</div>
<div class="col-md-4">
<div class="content__box content__box_fill">
<p><i>Если развёртывание было открыто наружу, в процессе обновления сервис будет балансировать нагрузку трафика только на доступные поды.</i></p>
<p><i>Если деплоймент был открыт наружу, в процессе обновления сервис будет балансировать трафик только на доступные поды.</i></p>
</div>
</div>
</div>
@ -116,16 +116,75 @@ weight: 10
<div class="row">
<div class="col-md-8">
<p>В следующем интерактивном уроке мы обновим приложение до новой версии, а потом выполним откат, т.е. вернёмся к предыдущей версии</p>
<p> В инструкциях ниже мы обновим приложение до новой версии и потом откатим его обратно.</p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/ru/docs/tutorials/kubernetes-basics/update/update-interactive/" role="button">Начать интерактивный урок <span class="btn__next"></span></a>
<h3>Обновление версии приложения</h3>
<p>Чтобы получить список деплойментов, выполните подкоманду <code>get deployments</code>:
<code><b>kubectl get deployments</b></code></p>
<p>Для списка подов — подкоманду <code>get pods</code>:</p>
<p><code><b>kubectl get pods</b></code></p>
<p>Чтобы увидеть версию текущего образа в приложении, воспользуйтесь подкомандой <code>describe pods</code> и посмотрите на поле <code>Image</code>:</p>
<p><code><b>kubectl describe pods</b></code></p>
<p>Чтобы обновить версию образа приложения до v2, воспользуемся подкомандой <code>set image</code>, для которой укажем имя деплоймента и новую версию нужного образа:</p>
<p><code><b>kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2</b></code></p>
<p>Эта команда перевела деплоймент на использование другого образа для приложения и инициировала плавающее обновление. Статус новых и старых подов (т. е. тех, которые будут остановлены) можно проверить с помощью подкоманды <code>get pods</code>:</p>
<p><code><b>kubectl get pods</b></code></p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h3>Шаг 2: валидация обновления</h3>
<p>Во-первых, убедимся, что приложение работает. Доступный извне IP-адрес и порт узнаем с помощью команды <code>describe service</code>:</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 />
<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></code></p>
<p>Каждый раз при вызове этой команды <code>curl</code> вам будет попадаться другой под. Обратите внимание, что все поды теперь работают с последней версией приложения (v2).</p>
<p>Проверить статус обновления можно также с помощью подкоманды <code>rollout status</code>:</p>
<p><code><b>kubectl rollout status deployments/kubernetes-bootcamp</b></code></p>
<p>Увидеть текущую версию образа приложения можно подкомандой <code>describe pods</code>:</p>
<p><code><b>kubectl describe pods</b></code></p>
<p>В поле <code>Image</code> у этого вывода убедитесь, что запущена последняя версия образа (v2).</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h3>Откат обновления</h3>
<p>Выполним ещё одно обновление и попробуем развернуть образ, тегированный как <code>v10</code>:</p>
<p><code><b>kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10</b></code></p>
<p>Вызовем <code>get deployments</code>, чтобы увидеть статус деплоймента:</p>
<p><code><b>kubectl get deployments</b></code></p>
<p>Обратите внимание, что вывод показывает недостаток желаемого количества доступных подов. Обратимся к подкоманде <code>get pods</code>, чтобы вывести полный список подов:</p>
<p><code><b>kubectl get pods</b></code></p>
<p>Здесь обратите внимание, что некоторые поды перешли в статус <tt>ImagePullBackOff</tt>.</p>
<p>Чтобы получить больше информации о проблеме, выполните подкоманду <code>describe pods</code>:</p>
<p><code><b>kubectl describe pods</b></code></p>
<p>В разделе <code>Events</code> вывода по проблемным подам можно увидеть, что новая версия образа (<code>v10</code>) не существует в репозитории.</p>
<p>Чтобы откатить деплоймент к последней работающей версии, воспользуйтесь подкомандой <code>rollout undo</code>:</p>
<p><code><b>kubectl rollout undo deployments/kubernetes-bootcamp</b></code></p>
<p>Команда <code>rollout undo</code> откатывает деплоймент к предыдущему известному состоянию (к образу v2). Обновления версионируются, поэтому можно откатиться к любому предыдущему известному состоянию деплоймента.</p>
<p>С помощью подкоманды <code>get pods</code> выведем список подов еще раз:</p>
<p><code><b>kubectl get pods</b></code></p>
<p>Четыре пода работают. Проверить, какие версии образа развёрнуты в этих подах, можно подкомандой <code>describe pods</code>:</p>
<p><code><b>kubectl describe pods</b></code></p>
<p>Деплоймент снова использует стабильную версию приложения (v2). Откат произошёл успешно.</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<p>Не забудьте очистить содержимое вашего локального кластера:</p>
<p><code><b>kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp</b></code></p>
</div>
</div>
</main>

View File

@ -96,6 +96,20 @@ other = "адрес электронной почты"
[javascript_required]
other = "Для просмотра этого содержимого необходимо [включить](https://www.enable-javascript.com/) JavaScript"
[katacoda_message]
other = """<h4>Отключение интерактивных руководств</h4>
<p>Интерактивные руководства на этом сайте перестали функционировать. Участники
проекта Kubernetes надеются, что в долгосрочной перспективе подобная интерактивная
возможность для обучения появится вновь.</p>
<p>Отключение стало следствием <a
href="https://www.oreilly.com/content/oreilly-acquires-katacoda-and-a-new-way-for-2-5m-customers-to-learn/">приобретения</a>
Katacoda компанией O'Reilly Media в 2019 году.</p>
<p>Сообщество Kubernetes благодарит O'Reilly и Katacoda за долгие годы помощи
пользователям, которые делали свои первые шаги в обучении Kubernetes.</p>
<p>Руководства перестали функционировать <b>31 марта 2023 года</b>. Больше
информации можно найти в публикации в блоге под названием
"<a href="/blog/2023/02/14/kubernetes-katacoda-tutorials-stop-from-2023-03-31/">Free Katacoda Kubernetes Tutorials Are Shutting Down</a>."</p>"""
[latest_release]
other = "Последний релиз:"