- Заменено название проекта во всех файлах проекта - Обновлены: * README.md * Makefile * Все файлы документации (.md) * CI/CD конфигурации (Jenkins, GitLab, GitHub Actions, Azure DevOps) * Скрипты (setup-cicd.sh, test-custom-images.sh) * Файлы конфигурации Molecule - Изменена переменная PROJECT_NAME в Makefile на devops-lab - Docker образы inecs/ansible-lab:* оставлены без изменений (чтобы не затрагивать существующие образы в Docker Hub)
		
			
				
	
	
		
			907 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			907 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Полное руководство по работе с Kubernetes кластерами
 | ||
| 
 | ||
| Автор: Сергей Антропов  
 | ||
| Сайт: https://devops.org.ru
 | ||
| 
 | ||
| ## Содержание
 | ||
| 
 | ||
| - [Введение](#введение)
 | ||
| - [Создание кластера](#создание-кластера)
 | ||
| - [Управление кластером](#управление-кластером)
 | ||
| - [Работа с манифестами](#работа-с-манифестами)
 | ||
| - [Работа с Helm](#работа-с-helm)
 | ||
| - [Настройка Ingress](#настройка-ingress)
 | ||
| - [Мониторинг и аддоны](#мониторинг-и-аддоны)
 | ||
| - [Service Mesh с Istio](#service-mesh-с-istio)
 | ||
| - [Примеры полных развертываний](#примеры-полных-развертываний)
 | ||
| 
 | ||
| ## Введение
 | ||
| 
 | ||
| DevOpsLab предоставляет полную поддержку создания и управления локальными Kubernetes кластерами на основе Kind (Kubernetes in Docker). Kind позволяет запускать Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки, тестирования и обучения.
 | ||
| 
 | ||
| ### Основные возможности
 | ||
| 
 | ||
| - Создание многоузловых Kubernetes кластеров
 | ||
| - Установка и управление Helm чартами
 | ||
| - Работа с манифестами YAML
 | ||
| - Настройка Ingress контроллеров
 | ||
| - Установка систем мониторинга (Prometheus, Grafana)
 | ||
| - Развертывание Service Mesh (Istio, Kiali)
 | ||
| - Изоляция сети и безопасность
 | ||
| 
 | ||
| ### Преимущества
 | ||
| 
 | ||
| - Не требует установки локального Kubernetes
 | ||
| - Быстрое создание и удаление кластеров
 | ||
| - Поддержка многоузловых конфигураций
 | ||
| - Полная совместимость с production окружениями
 | ||
| - Контейнеризация всех инструментов
 | ||
| 
 | ||
| ## Создание кластера
 | ||
| 
 | ||
| ### Базовое создание
 | ||
| 
 | ||
| Простое создание минимального кластера без дополнительных компонентов:
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s create
 | ||
| ```
 | ||
| 
 | ||
| Создаст кластер с пресетом `k8s-minimal` - один control-plane узел без дополнительных компонентов.
 | ||
| 
 | ||
| ### Создание полнофункционального кластера
 | ||
| 
 | ||
| Создание кластера с предустановленными компонентами:
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s create kubernetes
 | ||
| ```
 | ||
| 
 | ||
| Этот пресет создает кластер со следующими компонентами:
 | ||
| - 1 control-plane узел
 | ||
| - 2 worker узла
 | ||
| - Ingress NGINX Controller
 | ||
| - Metrics Server
 | ||
| - Istio Service Mesh
 | ||
| - Kiali для визуализации Istio
 | ||
| - Prometheus Stack (Prometheus + Grafana)
 | ||
| 
 | ||
| ### Конфигурация пресета
 | ||
| 
 | ||
| Пресеты находятся в `molecule/presets/k8s/`. Пример конфигурации:
 | ||
| 
 | ||
| ```yaml
 | ||
| kind_clusters:
 | ||
|   - name: lab
 | ||
|     workers: 2
 | ||
|     api_port: 6443
 | ||
|     addons:
 | ||
|       ingress_nginx: true
 | ||
|       metrics_server: true
 | ||
|       istio: true
 | ||
|       kiali: true
 | ||
|       prometheus_stack: true
 | ||
|     ingress_host_http_port: 8081
 | ||
|     ingress_host_https_port: 8443
 | ||
|     addon_ports:
 | ||
|       prometheus: 9090
 | ||
|       grafana: 3000
 | ||
|       kiali: 20001
 | ||
| ```
 | ||
| 
 | ||
| ### Проверка статуса кластера
 | ||
| 
 | ||
| ```bash
 | ||
| # Показать узлы кластера
 | ||
| make k8s nodes kubernetes
 | ||
| 
 | ||
| # Вывод:
 | ||
| # NAME                STATUS   ROLES           AGE   VERSION
 | ||
| # lab-control-plane   Ready    control-plane   5m    v1.34.0
 | ||
| # lab-worker          Ready    <none>          4m    v1.34.0
 | ||
| # lab-worker2         Ready    <none>          4m    v1.34.0
 | ||
| 
 | ||
| # Показать подробный статус
 | ||
| make k8s status kubernetes
 | ||
| ```
 | ||
| 
 | ||
| ### Подключение к кластеру
 | ||
| 
 | ||
| ```bash
 | ||
| # Получить kubeconfig
 | ||
| make k8s config kubernetes
 | ||
| 
 | ||
| # Использовать kubeconfig
 | ||
| export KUBECONFIG=$(pwd)/kubeconfig
 | ||
| kubectl get nodes
 | ||
| ```
 | ||
| 
 | ||
| ## Управление кластером
 | ||
| 
 | ||
| ### Остановка и запуск
 | ||
| 
 | ||
| ```bash
 | ||
| # Остановить кластер (без удаления)
 | ||
| make k8s stop kubernetes
 | ||
| 
 | ||
| # Запустить остановленный кластер
 | ||
| make k8s start kubernetes
 | ||
| 
 | ||
| # Перезапустить кластер
 | ||
| make k8s stop kubernetes && make k8s start kubernetes
 | ||
| ```
 | ||
| 
 | ||
| ### Удаление кластера
 | ||
| 
 | ||
| ```bash
 | ||
| # Полное удаление кластера и контейнера
 | ||
| make k8s destroy kubernetes
 | ||
| ```
 | ||
| 
 | ||
| ### Получение shell в контейнере
 | ||
| 
 | ||
| ```bash
 | ||
| # Открыть интерактивный shell
 | ||
| make k8s shell kubernetes
 | ||
| 
 | ||
| # Теперь доступны все команды kubectl, helm, kind внутри контейнера
 | ||
| kubectl get nodes
 | ||
| helm list
 | ||
| kind get clusters
 | ||
| ```
 | ||
| 
 | ||
| ## Работа с манифестами
 | ||
| 
 | ||
| ### Применение манифеста
 | ||
| 
 | ||
| Применение манифеста из URL:
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s manifest apply kubernetes https://example.com/deploy.yaml
 | ||
| ```
 | ||
| 
 | ||
| Применение локального манифеста:
 | ||
| 
 | ||
| ```bash
 | ||
| # Создайте файл example-deployment.yaml
 | ||
| cat > example-deployment.yaml <<EOF
 | ||
| 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:1.21
 | ||
|         ports:
 | ||
|         - containerPort: 80
 | ||
| ---
 | ||
| apiVersion: v1
 | ||
| kind: Service
 | ||
| metadata:
 | ||
|   name: nginx-service
 | ||
| spec:
 | ||
|   selector:
 | ||
|     app: nginx
 | ||
|   ports:
 | ||
|   - protocol: TCP
 | ||
|     port: 80
 | ||
|     targetPort: 80
 | ||
|   type: NodePort
 | ||
| EOF
 | ||
| 
 | ||
| # Применить манифест
 | ||
| make k8s manifest apply kubernetes ./example-deployment.yaml
 | ||
| ```
 | ||
| 
 | ||
| ### Удаление ресурсов
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s manifest delete kubernetes https://example.com/deploy.yaml
 | ||
| ```
 | ||
| 
 | ||
| ### Обновление ресурсов
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s manifest update kubernetes https://example.com/deploy.yaml
 | ||
| ```
 | ||
| 
 | ||
| ## Работа с Helm
 | ||
| 
 | ||
| ### Добавление Helm репозиториев
 | ||
| 
 | ||
| Список популярных репозиториев:
 | ||
| 
 | ||
| ```bash
 | ||
| # Официальный Helm репозиторий
 | ||
| make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
 | ||
| 
 | ||
| # Bitnami (большая коллекция чартов)
 | ||
| make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
 | ||
| 
 | ||
| # NGINX Inc
 | ||
| make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
 | ||
| 
 | ||
| # Prometheus Community
 | ||
| make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
 | ||
| 
 | ||
| # Istio
 | ||
| make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
 | ||
| 
 | ||
| # Информация о репозиториях
 | ||
| make k8s helmrepo list kubernetes
 | ||
| ```
 | ||
| 
 | ||
| ### Обновление репозиториев
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s helmrepo update kubernetes
 | ||
| ```
 | ||
| 
 | ||
| ### Поиск чартов
 | ||
| 
 | ||
| ```bash
 | ||
| # Просмотр всех чартов в репозитории
 | ||
| make k8s helmrepo packages kubernetes bitnami
 | ||
| 
 | ||
| # Поиск конкретного чарта
 | ||
| make k8s helmrepo packages kubernetes bitnami | grep nginx
 | ||
| 
 | ||
| # Поиск в нескольких репозиториях
 | ||
| make k8s helmrepo packages kubernetes bitnami | grep redis
 | ||
| make k8s helmrepo packages kubernetes stable | grep postgresql
 | ||
| ```
 | ||
| 
 | ||
| ### Установка Helm чартов
 | ||
| 
 | ||
| #### Пример 1: Установка Redis
 | ||
| 
 | ||
| ```bash
 | ||
| # Добавить репозиторий
 | ||
| make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
 | ||
| 
 | ||
| # Обновить индекс
 | ||
| make k8s helmrepo update kubernetes
 | ||
| 
 | ||
| # Установить Redis
 | ||
| make k8s helm apply kubernetes redis bitnami/redis
 | ||
| 
 | ||
| # Проверить статус
 | ||
| make k8s helm status kubernetes redis
 | ||
| 
 | ||
| # Посмотреть список релизов
 | ||
| make k8s helm list kubernetes
 | ||
| ```
 | ||
| 
 | ||
| #### Пример 2: Установка PostgreSQL
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s helm apply kubernetes postgres bitnami/postgresql
 | ||
| make k8s helm status kubernetes postgres
 | ||
| ```
 | ||
| 
 | ||
| #### Пример 3: Установка Nginx Ingress через Helm
 | ||
| 
 | ||
| ```bash
 | ||
| # Добавить репозиторий (если еще не добавлен)
 | ||
| make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
 | ||
| 
 | ||
| # Обновить индекс
 | ||
| make k8s helmrepo update kubernetes
 | ||
| 
 | ||
| # Установить NGINX Ingress
 | ||
| make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
 | ||
| 
 | ||
| # Проверить
 | ||
| make k8s helm status kubernetes nginx-ingress
 | ||
| ```
 | ||
| 
 | ||
| ### Обновление Helm релизов
 | ||
| 
 | ||
| ```bash
 | ||
| # Обновить релиз до последней версии
 | ||
| make k8s helm update kubernetes redis bitnami/redis
 | ||
| 
 | ||
| # Проверить после обновления
 | ||
| make k8s helm status kubernetes redis
 | ||
| ```
 | ||
| 
 | ||
| ### Откат Helm релизов
 | ||
| 
 | ||
| ```bash
 | ||
| # Откатить к предыдущей версии
 | ||
| make k8s helm rollback kubernetes redis
 | ||
| 
 | ||
| # Проверить статус после отката
 | ||
| make k8s helm status kubernetes redis
 | ||
| ```
 | ||
| 
 | ||
| ### Удаление Helm релизов
 | ||
| 
 | ||
| ```bash
 | ||
| # Удалить релиз
 | ||
| make k8s helm delete kubernetes redis
 | ||
| make k8s helm delete kubernetes postgres
 | ||
| ```
 | ||
| 
 | ||
| ## Настройка Ingress
 | ||
| 
 | ||
| ### Установка NGINX Ingress Controller
 | ||
| 
 | ||
| Ingress контроллер обычно устанавливается при создании кластера с пресетом `kubernetes`. Если нужна переустановка:
 | ||
| 
 | ||
| ```bash
 | ||
| # Через манифест
 | ||
| make k8s manifest apply kubernetes \
 | ||
|   https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
 | ||
| 
 | ||
| # Или через Helm
 | ||
| make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
 | ||
| make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
 | ||
| ```
 | ||
| 
 | ||
| ### Создание Ingress ресурса
 | ||
| 
 | ||
| Создайте файл `example-ingress.yaml`:
 | ||
| 
 | ||
| ```yaml
 | ||
| apiVersion: v1
 | ||
| kind: Service
 | ||
| metadata:
 | ||
|   name: hello-service
 | ||
| spec:
 | ||
|   selector:
 | ||
|     app: hello
 | ||
|   ports:
 | ||
|   - port: 80
 | ||
|     targetPort: 8080
 | ||
| ---
 | ||
| apiVersion: apps/v1
 | ||
| kind: Deployment
 | ||
| metadata:
 | ||
|   name: hello-deployment
 | ||
| spec:
 | ||
|   replicas: 2
 | ||
|   selector:
 | ||
|     matchLabels:
 | ||
|       app: hello
 | ||
|   template:
 | ||
|     metadata:
 | ||
|       labels:
 | ||
|         app: hello
 | ||
|     spec:
 | ||
|       containers:
 | ||
|       - name: hello
 | ||
|         image: hashicorp/http-echo:latest
 | ||
|         args:
 | ||
|         - "-text=Hello from Kubernetes!"
 | ||
|         ports:
 | ||
|         - containerPort: 8080
 | ||
| ---
 | ||
| apiVersion: networking.k8s.io/v1
 | ||
| kind: Ingress
 | ||
| metadata:
 | ||
|   name: hello-ingress
 | ||
|   annotations:
 | ||
|     nginx.ingress.kubernetes.io/rewrite-target: /
 | ||
| spec:
 | ||
|   rules:
 | ||
|   - host: hello.local
 | ||
|     http:
 | ||
|       paths:
 | ||
|       - path: /
 | ||
|         pathType: Prefix
 | ||
|         backend:
 | ||
|           service:
 | ||
|             name: hello-service
 | ||
|             port:
 | ||
|               number: 80
 | ||
| ```
 | ||
| 
 | ||
| Примените манифест:
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s manifest apply kubernetes ./example-ingress.yaml
 | ||
| ```
 | ||
| 
 | ||
| Проверьте доступность:
 | ||
| 
 | ||
| ```bash
 | ||
| # Добавьте запись в /etc/hosts
 | ||
| echo "127.0.0.1 hello.local" | sudo tee -a /etc/hosts
 | ||
| 
 | ||
| # Откройте в браузере или проверьте через curl
 | ||
| curl http://hello.local:8081
 | ||
| ```
 | ||
| 
 | ||
| ### TLS Ingress
 | ||
| 
 | ||
| Создайте TLS сертификат и добавьте в Ingress:
 | ||
| 
 | ||
| ```yaml
 | ||
| apiVersion: networking.k8s.io/v1
 | ||
| kind: Ingress
 | ||
| metadata:
 | ||
|   name: hello-tls-ingress
 | ||
|   annotations:
 | ||
|     nginx.ingress.kubernetes.io/rewrite-target: /
 | ||
| spec:
 | ||
|   tls:
 | ||
|   - hosts:
 | ||
|     - hello.local
 | ||
|     secretName: tls-secret
 | ||
|   rules:
 | ||
|   - host: hello.local
 | ||
|     http:
 | ||
|       paths:
 | ||
|       - path: /
 | ||
|         pathType: Prefix
 | ||
|         backend:
 | ||
|           service:
 | ||
|             name: hello-service
 | ||
|             port:
 | ||
|               number: 80
 | ||
| ```
 | ||
| 
 | ||
| ## Мониторинг и аддоны
 | ||
| 
 | ||
| ### Prometheus Stack
 | ||
| 
 | ||
| Prometheus Stack устанавливается автоматически при создании кластера с пресетом `kubernetes`.
 | ||
| 
 | ||
| #### Доступ к Grafana
 | ||
| 
 | ||
| ```bash
 | ||
| # 1. Получите пароль администратора
 | ||
| kubectl --kubeconfig kubeconfig get secret monitoring-grafana \
 | ||
|   -n monitoring -o jsonpath="{.data.admin-password}" | base64 -d
 | ||
| 
 | ||
| # 2. Откройте браузер
 | ||
| # URL: http://localhost:3000
 | ||
| # Username: admin
 | ||
| # Password: [результат из команды выше]
 | ||
| ```
 | ||
| 
 | ||
| #### Доступ к Prometheus
 | ||
| 
 | ||
| ```bash
 | ||
| # URL: http://localhost:9090
 | ||
| # Откройте в браузере для просмотра метрик
 | ||
| ```
 | ||
| 
 | ||
| #### Просмотр метрик
 | ||
| 
 | ||
| ```bash
 | ||
| # Получить список метрик
 | ||
| curl http://localhost:9090/api/v1/label/__name__/values
 | ||
| 
 | ||
| # Запрос конкретной метрики
 | ||
| curl 'http://localhost:9090/api/v1/query?query=up'
 | ||
| ```
 | ||
| 
 | ||
| ### Установка дополнительных инструментов мониторинга
 | ||
| 
 | ||
| #### Loki для логов
 | ||
| 
 | ||
| ```bash
 | ||
| # Добавить репозиторий Grafana
 | ||
| make k8s helmrepo add kubernetes grafana https://grafana.github.io/helm-charts
 | ||
| 
 | ||
| # Установить Loki
 | ||
| make k8s helm apply kubernetes loki grafana/loki-stack
 | ||
| 
 | ||
| # Проверить статус
 | ||
| make k8s helm status kubernetes loki
 | ||
| ```
 | ||
| 
 | ||
| #### Jaeger для трейсинга
 | ||
| 
 | ||
| ```bash
 | ||
| # Добавить репозиторий Jaeger
 | ||
| make k8s helmrepo add kubernetes jaegertracing https://jaegertracing.github.io/helm-charts
 | ||
| 
 | ||
| # Установить Jaeger
 | ||
| make k8s helm apply kubernetes jaeger jaegertracing/jaeger
 | ||
| 
 | ||
| # Проверить статус
 | ||
| make k8s helm status kubernetes jaeger
 | ||
| ```
 | ||
| 
 | ||
| ## Service Mesh с Istio
 | ||
| 
 | ||
| ### Установка Istio
 | ||
| 
 | ||
| Istio устанавливается автоматически при создании кластера с пресетом `kubernetes`.
 | ||
| 
 | ||
| ### Ручная установка Istio
 | ||
| 
 | ||
| ```bash
 | ||
| # Добавить репозиторий Istio
 | ||
| make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
 | ||
| 
 | ||
| # Установить Istio base
 | ||
| make k8s helm apply kubernetes istio-base istio/base
 | ||
| 
 | ||
| # Установить Istiod (control plane)
 | ||
| make k8s helm apply kubernetes istiod istio/istiod \
 | ||
|   --set values.global.istiod.enableAnalysis=true
 | ||
| 
 | ||
| # Установить Istio Ingress Gateway
 | ||
| make k8s helm apply kubernetes istio-ingress istio/gateway
 | ||
| ```
 | ||
| 
 | ||
| ### Kiali для визуализации Istio
 | ||
| 
 | ||
| Kiali устанавливается автоматически с пресетом `kubernetes`.
 | ||
| 
 | ||
| #### Доступ к Kiali
 | ||
| 
 | ||
| ```bash
 | ||
| # URL: http://localhost:20001
 | ||
| # Откройте в браузере для визуализации Service Mesh
 | ||
| 
 | ||
| # Настройки доступа
 | ||
| # Username: admin
 | ||
| # Password: admin (если используется анонимный доступ)
 | ||
| ```
 | ||
| 
 | ||
| #### Ручная установка Kiali
 | ||
| 
 | ||
| ```bash
 | ||
| # Добавить репозиторий Kiali
 | ||
| make k8s helmrepo add kubernetes kiali https://kiali.org/helm-charts
 | ||
| 
 | ||
| # Установить Kiali
 | ||
| make k8s helm apply kubernetes kiali-server kiali/kiali-server \
 | ||
|   --set auth.strategy=anonymous \
 | ||
|   --set deployment.ingress.enabled=true \
 | ||
|   --set server.web_root="/"
 | ||
| 
 | ||
| # Проверить статус
 | ||
| make k8s helm status kubernetes kiali-server
 | ||
| ```
 | ||
| 
 | ||
| ### Пример приложения с Istio
 | ||
| 
 | ||
| Создайте файл `istio-app.yaml`:
 | ||
| 
 | ||
| ```yaml
 | ||
| apiVersion: v1
 | ||
| kind: Namespace
 | ||
| metadata:
 | ||
|   name: bookinfo
 | ||
|   labels:
 | ||
|     istio-injection: enabled
 | ||
| ---
 | ||
| apiVersion: v1
 | ||
| kind: Service
 | ||
| metadata:
 | ||
|   name: productpage
 | ||
|   namespace: bookinfo
 | ||
| spec:
 | ||
|   ports:
 | ||
|   - port: 9080
 | ||
|     name: http
 | ||
|     targetPort: 9080
 | ||
|   selector:
 | ||
|     app: productpage
 | ||
| ---
 | ||
| apiVersion: apps/v1
 | ||
| kind: Deployment
 | ||
| metadata:
 | ||
|   name: productpage
 | ||
|   namespace: bookinfo
 | ||
| spec:
 | ||
|   replicas: 1
 | ||
|   selector:
 | ||
|     matchLabels:
 | ||
|       app: productpage
 | ||
|   template:
 | ||
|     metadata:
 | ||
|       labels:
 | ||
|         app: productpage
 | ||
|     spec:
 | ||
|       containers:
 | ||
|       - name: productpage
 | ||
|         image: istio/examples-bookinfo-productpage-v1:latest
 | ||
|         ports:
 | ||
|         - containerPort: 9080
 | ||
| ```
 | ||
| 
 | ||
| Примените:
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s manifest apply kubernetes ./istio-app.yaml
 | ||
| ```
 | ||
| 
 | ||
| ## Примеры полных развертываний
 | ||
| 
 | ||
| ### Пример 1: WordPress с MySQL
 | ||
| 
 | ||
| ```bash
 | ||
| # 1. Установить MySQL через Helm
 | ||
| make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
 | ||
| make k8s helm apply kubernetes mysql bitnami/mysql \
 | ||
|   --set auth.rootPassword=secretpassword
 | ||
| 
 | ||
| # 2. Создать манифест для WordPress
 | ||
| cat > wordpress.yaml <<EOF
 | ||
| apiVersion: apps/v1
 | ||
| kind: Deployment
 | ||
| metadata:
 | ||
|   name: wordpress
 | ||
| spec:
 | ||
|   replicas: 2
 | ||
|   selector:
 | ||
|     matchLabels:
 | ||
|       app: wordpress
 | ||
|   template:
 | ||
|     metadata:
 | ||
|       labels:
 | ||
|         app: wordpress
 | ||
|     spec:
 | ||
|       containers:
 | ||
|       - name: wordpress
 | ||
|         image: wordpress:latest
 | ||
|         env:
 | ||
|         - name: WORDPRESS_DB_HOST
 | ||
|           value: mysql.default.svc.cluster.local
 | ||
|         - name: WORDPRESS_DB_USER
 | ||
|           value: root
 | ||
|         - name: WORDPRESS_DB_PASSWORD
 | ||
|           value: secretpassword
 | ||
|         ports:
 | ||
|         - containerPort: 80
 | ||
| ---
 | ||
| apiVersion: v1
 | ||
| kind: Service
 | ||
| metadata:
 | ||
|   name: wordpress
 | ||
| spec:
 | ||
|   selector:
 | ||
|     app: wordpress
 | ||
|   ports:
 | ||
|   - port: 80
 | ||
| ---
 | ||
| apiVersion: networking.k8s.io/v1
 | ||
| kind: Ingress
 | ||
| metadata:
 | ||
|   name: wordpress-ingress
 | ||
| spec:
 | ||
|   rules:
 | ||
|   - host: wordpress.local
 | ||
|     http:
 | ||
|       paths:
 | ||
|       - path: /
 | ||
|         pathType: Prefix
 | ||
|         backend:
 | ||
|           service:
 | ||
|             name: wordpress
 | ||
|             port:
 | ||
|               number: 80
 | ||
| EOF
 | ||
| 
 | ||
| # 3. Применить манифест
 | ||
| make k8s manifest apply kubernetes ./wordpress.yaml
 | ||
| ```
 | ||
| 
 | ||
| ### Пример 2: Многоуровневое приложение с мониторингом
 | ||
| 
 | ||
| ```bash
 | ||
| # 1. Установить Redis
 | ||
| make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
 | ||
| make k8s helm apply kubernetes redis bitnami/redis
 | ||
| 
 | ||
| # 2. Установить PostgreSQL
 | ||
| make k8s helm apply kubernetes postgres bitnami/postgresql
 | ||
| 
 | ||
| # 3. Создать приложение
 | ||
| cat > app.yaml <<EOF
 | ||
| apiVersion: apps/v1
 | ||
| kind: Deployment
 | ||
| metadata:
 | ||
|   name: api-server
 | ||
| spec:
 | ||
|   replicas: 3
 | ||
|   selector:
 | ||
|     matchLabels:
 | ||
|       app: api
 | ||
|   template:
 | ||
|     metadata:
 | ||
|       labels:
 | ||
|         app: api
 | ||
|         version: v1
 | ||
|     spec:
 | ||
|       containers:
 | ||
|       - name: api
 | ||
|         image: nginx:alpine
 | ||
|         ports:
 | ||
|         - containerPort: 80
 | ||
|         env:
 | ||
|         - name: REDIS_HOST
 | ||
|           value: redis-master.default.svc.cluster.local
 | ||
|         - name: POSTGRES_HOST
 | ||
|           value: postgresql-postgresql.default.svc.cluster.local
 | ||
| ---
 | ||
| apiVersion: v1
 | ||
| kind: Service
 | ||
| metadata:
 | ||
|   name: api-service
 | ||
| spec:
 | ||
|   selector:
 | ||
|     app: api
 | ||
|   ports:
 | ||
|   - port: 80
 | ||
| ---
 | ||
| apiVersion: networking.k8s.io/v1
 | ||
| kind: Ingress
 | ||
| metadata:
 | ||
|   name: api-ingress
 | ||
| spec:
 | ||
|   rules:
 | ||
|   - host: api.local
 | ||
|     http:
 | ||
|       paths:
 | ||
|       - path: /
 | ||
|         pathType: Prefix
 | ||
|         backend:
 | ||
|           service:
 | ||
|             name: api-service
 | ||
|             port:
 | ||
|               number: 80
 | ||
| EOF
 | ||
| 
 | ||
| # 4. Применить
 | ||
| make k8s manifest apply kubernetes ./app.yaml
 | ||
| ```
 | ||
| 
 | ||
| ### Пример 3: CI/CD с Jenkins в Kubernetes
 | ||
| 
 | ||
| ```bash
 | ||
| # 1. Установить Jenkins
 | ||
| make k8s helmrepo add kubernetes jenkins https://charts.jenkins.io
 | ||
| make k8s helm apply kubernetes jenkins jenkins/jenkins \
 | ||
|   --set persistence.enabled=true \
 | ||
|   --set controller.installPlugins.enabled=true
 | ||
| 
 | ||
| # 2. Получить пароль администратора
 | ||
| kubectl --kubeconfig kubeconfig exec \
 | ||
|   -n default svc/jenkins -c jenkins -- \
 | ||
|   cat /run/secrets/additional/chart-admin-password
 | ||
| ```
 | ||
| 
 | ||
| ## Полезные команды и советы
 | ||
| 
 | ||
| ### Мониторинг ресурсов
 | ||
| 
 | ||
| ```bash
 | ||
| # Просмотр использования ресурсов узлами
 | ||
| kubectl --kubeconfig kubeconfig top nodes
 | ||
| 
 | ||
| # Просмотр использования ресурсов подами
 | ||
| kubectl --kubeconfig kubeconfig top pods
 | ||
| 
 | ||
| # Детальная информация о узле
 | ||
| kubectl --kubeconfig kubeconfig describe node lab-control-plane
 | ||
| ```
 | ||
| 
 | ||
| ### Отладка
 | ||
| 
 | ||
| ```bash
 | ||
| # Просмотр логов пода
 | ||
| kubectl --kubeconfig kubeconfig logs <pod-name>
 | ||
| 
 | ||
| # Просмотр логов с follow
 | ||
| kubectl --kubeconfig kubeconfig logs -f <pod-name>
 | ||
| 
 | ||
| # Выполнить команду в поде
 | ||
| kubectl --kubeconfig kubeconfig exec -it <pod-name> -- /bin/sh
 | ||
| 
 | ||
| # Описание ресурса
 | ||
| kubectl --kubeconfig kubeconfig describe pod <pod-name>
 | ||
| kubectl --kubeconfig kubeconfig describe service <service-name>
 | ||
| ```
 | ||
| 
 | ||
| ### Масштабирование
 | ||
| 
 | ||
| ```bash
 | ||
| # Масштабировать Deployment
 | ||
| kubectl --kubeconfig kubeconfig scale deployment <deployment-name> --replicas=5
 | ||
| 
 | ||
| # Автомасштабирование (требует metrics-server)
 | ||
| kubectl --kubeconfig kubeconfig autoscale deployment <deployment-name> \
 | ||
|   --cpu-percent=70 --min=2 --max=10
 | ||
| ```
 | ||
| 
 | ||
| ### Экспорт конфигурации
 | ||
| 
 | ||
| ```bash
 | ||
| # Экспортировать ресурс в YAML
 | ||
| kubectl --kubeconfig kubeconfig get deployment <name> -o yaml > exported.yaml
 | ||
| 
 | ||
| # Экспортировать все ресурсы namespace
 | ||
| kubectl --kubeconfig kubeconfig get all -n <namespace> -o yaml > all-resources.yaml
 | ||
| ```
 | ||
| 
 | ||
| ## Безопасность
 | ||
| 
 | ||
| ### Использование Secrets
 | ||
| 
 | ||
| ```bash
 | ||
| # Создать Secret из файла
 | ||
| kubectl --kubeconfig kubeconfig create secret generic my-secret \
 | ||
|   --from-file=username=./username.txt \
 | ||
|   --from-file=password=./password.txt
 | ||
| 
 | ||
| # Создать Secret из литерала
 | ||
| kubectl --kubeconfig kubeconfig create secret generic my-secret \
 | ||
|   --from-literal=username=admin \
 | ||
|   --from-literal=password=secret123
 | ||
| ```
 | ||
| 
 | ||
| ### Network Policies
 | ||
| 
 | ||
| Создайте файл `network-policy.yaml`:
 | ||
| 
 | ||
| ```yaml
 | ||
| apiVersion: networking.k8s.io/v1
 | ||
| kind: NetworkPolicy
 | ||
| metadata:
 | ||
|   name: test-network-policy
 | ||
|   namespace: default
 | ||
| spec:
 | ||
|   podSelector:
 | ||
|     matchLabels:
 | ||
|       role: db
 | ||
|   policyTypes:
 | ||
|   - Ingress
 | ||
|   - Egress
 | ||
|   ingress:
 | ||
|   - from:
 | ||
|     - podSelector:
 | ||
|         matchLabels:
 | ||
|           role: api
 | ||
|     ports:
 | ||
|     - protocol: TCP
 | ||
|       port: 5432
 | ||
|   egress:
 | ||
|   - to:
 | ||
|     - podSelector:
 | ||
|         matchLabels:
 | ||
|           role: api
 | ||
|     ports:
 | ||
|     - protocol: TCP
 | ||
|       port: 5432
 | ||
| ```
 | ||
| 
 | ||
| Примените:
 | ||
| 
 | ||
| ```bash
 | ||
| make k8s manifest apply kubernetes ./network-policy.yaml
 | ||
| ```
 | ||
| 
 | ||
| ## Заключение
 | ||
| 
 | ||
| DevOpsLab предоставляет полный набор инструментов для работы с Kubernetes кластерами локально. Вы можете:
 | ||
| 
 | ||
| - Создавать и управлять кластерами
 | ||
| - Устанавливать и настраивать приложения
 | ||
| - Работать с мониторингом и Service Mesh
 | ||
| - Тестировать перед развертыванием в production
 | ||
| 
 | ||
| Все инструменты работают внутри Docker контейнеров, что обеспечивает изоляцию и переносимость.
 | ||
| 
 | ||
| ## Автор
 | ||
| 
 | ||
| Сергей Антропов  
 | ||
| Сайт: https://devops.org.ru
 |