feat: added lab 5.2
This commit is contained in:
1 parent
401ae1dd51
commit
b0e5a6b653
7 files changed
+265
No files matched your search
@@ -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_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_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_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,
|
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
|
||||||
Reference in new issue
Block a user