diff --git a/00_manifest.csv b/00_manifest.csv index 3fd6e96..504252e 100644 --- a/00_manifest.csv +++ b/00_manifest.csv @@ -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, diff --git a/01_reports/VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md b/01_reports/VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md new file mode 100644 index 0000000..58b95b0 --- /dev/null +++ b/01_reports/VKC_PR_M05_02_k8s_REPORT_РемизовКЛ_20260615.md @@ -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 = `. | Это нормальное поведение для облачного провайдера: требуется время на автоматическое создание облачного балансировщика нагрузки (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 микросервисных архитектур в облаке. diff --git a/02_evidence/VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png b/02_evidence/VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png new file mode 100644 index 0000000..6667663 Binary files /dev/null and b/02_evidence/VKC_PR_M05_02_k8s_my-k8s_РемизовКЛ_20260615.png differ diff --git a/02_evidence/VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log b/02_evidence/VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log new file mode 100644 index 0000000..231c672 --- /dev/null +++ b/02_evidence/VKC_PR_M05_02_k8s_stage2log_РемизовКЛ_20260615.log @@ -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 31m v1.34.2 +my-k8s-default-group-1 Ready 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 diff --git a/02_evidence/VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log b/02_evidence/VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log new file mode 100644 index 0000000..5b36b73 --- /dev/null +++ b/02_evidence/VKC_PR_M05_02_k8s_stage3log_РемизовКЛ_20260615.log @@ -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 443/TCP 35m +nginx-service LoadBalancer 10.254.219.88 80:31119/TCP 0s +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +nginx-service LoadBalancer 10.254.219.88 80:31119/TCP 0s +nginx-service LoadBalancer 10.254.219.88 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 43m v1.34.2 +my-k8s-default-group-1 Ready 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 diff --git a/02_evidence/VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png b/02_evidence/VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png new file mode 100644 index 0000000..6d85e79 Binary files /dev/null and b/02_evidence/VKC_PR_M05_02_k8s_stage3pruf_РемизовКЛ_20260615.png differ diff --git a/03_code/VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml b/03_code/VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml new file mode 100644 index 0000000..f6213d6 --- /dev/null +++ b/03_code/VKC_PR_M05_02_k8s_deployment_РемизовКЛ_20260615.yaml @@ -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