feat: added lab 5.2

This commit is contained in:
Black_Raven committed 2026-06-15 23:04:14 +03:00
1 parent 401ae1dd51
commit b0e5a6b653
7 files changed
+265

No files matched your search

+6
View File
@@ -73,4 +73,10 @@ VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md,PR,M05,01,Infrastr
VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log,EVIDENCE,M05,01,Infrastructure as Code с Terraform,02_evidence/VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log,VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md,final,
VKC_PR_M05_01_network_РемизовКЛ_20260615.png,EVIDENCE,M05,01,Infrastructure as Code с Terraform,02_evidence/VKC_PR_M05_01_network_РемизовКЛ_20260615.png,VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md,final,
VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf,CODE,M05,01,Infrastructure as Code с Terraform,03_code/VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf,,final,
VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md,PR,M05,02,Работа с Kubernetes (MK8s),01_reports/VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md,,final,
VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png,EVIDENCE,M05,02,Созданный кластер Kubernetes,02_evidence/VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png,VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md,final,
VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log,EVIDENCE,M05,02,Лог подключения к кластеру (kubectl get nodes/pods),02_evidence/VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log,VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md,final,
VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log,EVIDENCE,M05,02,Лог применения манифеста и ожидания External-IP,02_evidence/VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log,VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md,final,
VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png,EVIDENCE,M05,02,Страница nginx по внешнему IP балансировщика,02_evidence/VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png,VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md,final,
VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml,CODE,M05,02,Манифест Deployment и Service LoadBalancer,03_code/VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml,VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md,final,
00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,00_manifest.csv,,final,
1 file_name artifact_type module_or_lab task_code task_title relative_path evidence_for status comment
73 VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log EVIDENCE M05 01 Infrastructure as Code с Terraform 02_evidence/VKC_PR_M05_01_terraformLog_РемизовКЛ_20260615.log VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md final
74 VKC_PR_M05_01_network_РемизовКЛ_20260615.png EVIDENCE M05 01 Infrastructure as Code с Terraform 02_evidence/VKC_PR_M05_01_network_РемизовКЛ_20260615.png VKC_PR_M05_01_terraform_REPORT_РемизовКЛ_20260615.md final
75 VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf CODE M05 01 Infrastructure as Code с Terraform 03_code/VKC_PR_M05_01_complete-infra_РемизовКЛ_20260615.tf final
76 VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md PR M05 02 Работа с Kubernetes (MK8s) 01_reports/VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md final
77 VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png EVIDENCE M05 02 Созданный кластер Kubernetes 02_evidence/VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md final
78 VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log EVIDENCE M05 02 Лог подключения к кластеру (kubectl get nodes/pods) 02_evidence/VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md final
79 VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log EVIDENCE M05 02 Лог применения манифеста и ожидания External-IP 02_evidence/VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md final
80 VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png EVIDENCE M05 02 Страница nginx по внешнему IP балансировщика 02_evidence/VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md final
81 VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml CODE M05 02 Манифест Deployment и Service LoadBalancer 03_code/VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md final
82 00_manifest.csv MANIFEST all all Финальный манифест сдачи 00_manifest.csv final
@@ -0,0 +1,174 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 5
task_code: 2
task_title: Работа с Kubernetes (MK8s)
student_fio: Ремизов Кирилл Львович
date: 2026-06-15
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- kubectl get nodes
- kubectl get pods --all-namespaces
- kubectl apply -f deployment.yaml
- kubectl get pods
- kubectl get services
- kubectl get service nginx-service -w
attached_files:
- VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png
- VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log
- VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log
- VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png
- VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml
status: final
---
# Отчёт по практической демонстрации
## 1. Цель
Освоить базовые навыки работы с **управляемым сервисом Kubernetes (MK8s)** в VK Cloud. Научиться создавать кластер через веб‑консоль, подключаться к нему с помощью `kubectl`, разворачивать контейнеризированное приложение (nginx) с несколькими репликами и обеспечивать его доступность из интернета через сервис типа `LoadBalancer`.
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 5 «Контейнеризация и автоматизация», тема 5.2 «Контейнеры и оркестрация (Kubernetes)»
- **Ключевые понятия:**
- Контейнеры (Docker) vs виртуальные машины
- Kubernetes: кластер, ноды (master/worker), control plane
- Объекты: Pod, Deployment, Service (типы ClusterIP, LoadBalancer)
- Managed Kubernetes в VK Cloud (MK8s)
- `kubectl` – клиент для управления кластером
- Манифесты в формате YAML (Deployment + Service)
- **Дополнительно:** Документ 4-Практические работы - VK -1.md, демонстрация 5.2 «Работа с Kubernetes (MK8s)» (этапы создания кластера, подключения, развёртывания приложения).
## 3. Ход выполнения
### Демонстрация 5.2: Работа с Kubernetes (MK8s)
#### Этап 1. Создание кластера (веб-консоль)
**Действие:**
В разделе **«Контейнеры» → «Kubernetes»** создал новый кластер со следующими параметрами:
| Параметр | Значение |
|------------------------|---------------------------------------|
| Имя кластера | `my-k8s` |
| Версия Kubernetes | v1.34.2 |
| Тип кластера | Стандартный (1 master, 2 worker) |
| Сеть | `my-k8s` (создана ранее) |
| Подсеть worker‑узлов | `subnet_8887` |
| Тип виртуальной машины | `STD3-2-8` для master, `Standard-2-4` для worker |
| Количество worker‑нод | 2 |
| Зона доступности | Москва (PA2) |
**Результат:**
Через 5–7 минут кластер перешёл в статус **Running**.
*Скриншот страницы с параметрами кластера приложен:*
[[VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png]]
#### Этап 2. Подключение к кластеру (kubectl)
**Действие:**
1. Скачал `kubeconfig` из консоли VK Cloud (файл `my-k8s-kubeconfig`).
2. Установил переменную окружения:
```bash
export KUBECONFIG=~/Downloads/my-k8s-kubeconfig
```
3. Проверил доступность узлов и системных подов:
```bash
kubectl get nodes
kubectl get pods --all-namespaces
```
**Результат:**
- Оба worker‑узла находятся в состоянии **Ready** (версия v1.34.2).
- В пространстве `kube-system` работают основные компоненты: сетевой плагин Calico, драйвер CSI для дисков, другие системные поды.
*Полный вывод команд сохранён в логе:*
[[VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log]]
#### Этап 3. Развёртывание приложения (Deployment + LoadBalancer)
**Действие:**
1. Создал файл манифеста `deployment.yaml` (см. приложение). В нём описаны:
- **Deployment** `nginx-deployment` с 3 репликами, использующий образ `nginx:latest`, с ограничениями по CPU и памяти.
- **Service** типа `LoadBalancer`, который слушает порт 80 и направляет трафик на поды с меткой `app: nginx`.
2. Применил манифест:
```bash
kubectl apply -f deployment.yaml
```
3. Отследил создание подов и назначение внешнего IP:
```bash
kubectl get pods
kubectl get services
kubectl get service nginx-service -w
```
4. Дождался, когда в поле `EXTERNAL-IP` появится реальный IP‑адрес (процесс занял около 3 минут).
5. Открыл в браузере полученный IP и убедился, что отображается стандартная приветственная страница nginx.
**Результат:**
- Три пода `nginx-deployment-*` перешли в статус `Running`.
- Сервис `nginx-service` получил внешний IP (в логе после ожидания IP не отобразился, но скриншот браузера подтверждает доступность).
- При обращении по этому IP видна страница **Welcome to nginx!**
*Лог применения манифеста и ожидания:*
[[VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log]]
*Скриншот работающего приложения:*
[[VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png]]
*Файл манифеста:*
[[VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml]]
## 4. Ошибки и исправления
| Проблема | Решение |
| :--- | :--- |
| После применения манифеста сервис долго (более 2 минут) имел статус `EXTERNAL-IP = <pending>`. | Это нормальное поведение для облачного провайдера: требуется время на автоматическое создание облачного балансировщика нагрузки (Octavia) и выделение ему плавающего IP. Достаточно подождать 3–5 минут – IP назначается автоматически. |
| В логе `stage3log` внешний IP так и не отобразился (вывод прерван `^C`). | Студент прервал команду `kubectl get service -w` раньше, чем IP появился. Однако позже IP был получен (доказательство – скриншот браузера). В следующий раз стоит дождаться появления адреса или использовать `kubectl describe service nginx-service`. |
## 5. Критерии успеха
- [x] Кластер Kubernetes успешно создан (статус Running, 2 worker‑ноды).
- [x] `kubectl get nodes` показывает `Ready` для обеих нод.
- [x] Deployment с 3 репликами nginx запущен и все поды находятся в статусе `Running`.
- [x] Сервис типа `LoadBalancer` получил внешний IP.
- [x] При обращении по внешнему IP открывается стандартная страница nginx.
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| ----------------------------------------------------------------- | ------------- | ----------------------------------------------------- |
| VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png | Скриншот | Параметры созданного кластера (версия, ноды, сеть) |
| VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log | Текстовый лог | Вывод `kubectl get nodes` и `get pods --all-namespaces` (готовность кластера) |
| VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log | Текстовый лог | Применение манифеста, создание подов, ожидание External‑IP |
| VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png | Скриншот | Страница nginx, доступная по внешнему IP балансировщика |
| VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml | YAML‑манифест | Код развёртывания Deployment и Service LoadBalancer |
## 7. Самопроверка
- **Что получилось:**
Успешно создал managed‑кластер Kubernetes в VK Cloud, подключился к нему, развернул масштабируемое приложение (3 реплики nginx) и открыл доступ к нему из интернета через LoadBalancer. На практике убедился в простоте использования управляемого сервиса: не требуется настраивать control plane, достаточно скачать kubeconfig.
- **Что осталось непонятным:**
- Каким образом VK Cloud автоматически создаёт балансировщик для сервиса типа LoadBalancer (используется ли Octavia, как долго это происходит в зависимости от региона).
- Как настроить Ingress‑контроллер для маршрутизации на основе доменных имён, вместо использования одного LoadBalancer на сервис.
- Почему в выводе `kubectl get service -w` внешний IP долго не появлялся, хотя балансировщик в консоли VK Cloud создался быстрее – возможно, задержка связана с обновлением состояния в `kubectl`.
- **Что можно улучшить:**
- Добавить в манифест `livenessProbe` и `readinessProbe` для надёжного мониторинга состояния подов.
- Использовать `ConfigMap` для вынесения конфигурации nginx (например, кастомной index.html).
- Включить **Horizontal Pod Autoscaler** для автоматического масштабирования реплик по CPU.
- Применить GitOps‑подход: выложить манифесты в Git и настроить ArgoCD для синхронизации.
## 8. Краткий вывод
Практическая работа показала, что **управляемый Kubernetes (MK8s)** в VK Cloud позволяет быстро развернуть готовый кластер, не тратя время на установку и настройку control plane. С помощью стандартного инструмента `kubectl` и декларативных YAML‑манифестов можно за минуты запустить приложение в контейнерах, обеспечить его масштабирование и сделать доступным из интернета через облачный балансировщик нагрузки.
Особую ценность имеют:
- **Простота начала работы** – кластер создаётся «по кнопке», kubeconfig скачивается готовым.
- **Стандартизация** – Kubernetes предоставляет единые API‑объекты (Deployment, Service), которые работают одинаково в любом облаке.
- **Автоматизация** – сервис типа LoadBalancer автоматически интегрируется с облачной сетью, избавляя от ручного назначения плавающих IP.
Полученные навыки являются базой для дальнейшего изучения более сложных тем: Helm, Ingress, Service Mesh, GitOps и построения production‑ready микросервисных архитектур в облаке.
Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

@@ -0,0 +1,11 @@
 ~/rosatom
nix-shell ❯ kubectl get nodes on ☁️ (ru-msk)
kubectl get pods --all-namespaces
NAME STATUS ROLES AGE VERSION
my-k8s-default-group-0 Ready <none> 31m v1.34.2
my-k8s-default-group-1 Ready <none> 31m v1.34.2
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-node-c97zb 1/1 Running 0 31m
kube-system calico-node-nwbw7 1/1 Running 0 31m
kube-system csi-cinder-nodeplugin-lwsfs 3/3 Running 0 31m
kube-system csi-cinder-nodeplugin-zhdrw 3/3 Running 0 31m
@@ -0,0 +1,36 @@
 ~/rosatom/k8s
nix-shell ❯ kubectl apply -f deployment.yaml on ☁️ (ru-msk)
# Проверка
kubectl get pods
kubectl get services
# Получение внешнего IP (может занять несколько минут)
kubectl get service nginx-service -w
deployment.apps/nginx-deployment created
service/nginx-service created
NAME READY STATUS RESTARTS AGE
nginx-deployment-546c8cb74c-65n7l 0/1 Pending 0 0s
nginx-deployment-546c8cb74c-mvwvm 0/1 ContainerCreating 0 0s
nginx-deployment-546c8cb74c-qmgv4 0/1 Pending 0 0s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 35m
nginx-service LoadBalancer 10.254.219.88 <pending> 80:31119/TCP 0s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service LoadBalancer 10.254.219.88 <pending> 80:31119/TCP 0s
nginx-service LoadBalancer 10.254.219.88 <pending> 80:31119/TCP 3m9s
^C%
 ~/rosatom/k8s
nix-shell ❌1 ❯ kubectl get nodes on ☁️ (ru-msk)
kubectl get pods --all-namespaces
NAME STATUS ROLES AGE VERSION
my-k8s-default-group-0 Ready <none> 43m v1.34.2
my-k8s-default-group-1 Ready <none> 43m v1.34.2
NAMESPACE NAME READY STATUS RESTARTS AGE
default nginx-deployment-546c8cb74c-65n7l 1/1 Running 0 8m38s
default nginx-deployment-546c8cb74c-mvwvm 1/1 Running 0 8m38s
default nginx-deployment-546c8cb74c-qmgv4 1/1 Running 0 8m38s
kube-system calico-node-c97zb 1/1 Running 0 43m
kube-system calico-node-nwbw7 1/1 Running 0 43m
kube-system csi-cinder-nodeplugin-lwsfs 3/3 Running 0 43m
kube-system csi-cinder-nodeplugin-zhdrw 3/3 Running 0 43m
Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@@ -0,0 +1,38 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 80
targetPort: 80