docs: добавить полное руководство по работе с Kubernetes
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				Ansible Testing / lint (push) Has been cancelled
				
			
		
			
				
	
				Ansible Testing / test (default) (push) Has been cancelled
				
			
		
			
				
	
				Ansible Testing / test (minimal) (push) Has been cancelled
				
			
		
			
				
	
				Ansible Testing / test (performance) (push) Has been cancelled
				
			
		
			
				
	
				Ansible Testing / deploy-check (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	Ansible Testing / lint (push) Has been cancelled
				
			Ansible Testing / test (default) (push) Has been cancelled
				
			Ansible Testing / test (minimal) (push) Has been cancelled
				
			Ansible Testing / test (performance) (push) Has been cancelled
				
			Ansible Testing / deploy-check (push) Has been cancelled
				
			- Создано подробное руководство docs/kubernetes-full-guide.md - Описаны все аспекты работы с Kubernetes кластерами - Добавлены примеры использования манифестов, Helm, Ingress - Подробно описана работа с мониторингом (Prometheus, Grafana) - Документирована работа с Service Mesh (Istio, Kiali) - Добавлены примеры полных развертываний - Включены разделы по безопасности и отладке - Документация на русском языке с большим количеством примеров
This commit is contained in:
		
							
								
								
									
										906
									
								
								docs/kubernetes-full-guide.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										906
									
								
								docs/kubernetes-full-guide.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,906 @@ | |||||||
|  | # Полное руководство по работе с Kubernetes кластерами | ||||||
|  |  | ||||||
|  | Автор: Сергей Антропов   | ||||||
|  | Сайт: https://devops.org.ru | ||||||
|  |  | ||||||
|  | ## Содержание | ||||||
|  |  | ||||||
|  | - [Введение](#введение) | ||||||
|  | - [Создание кластера](#создание-кластера) | ||||||
|  | - [Управление кластером](#управление-кластером) | ||||||
|  | - [Работа с манифестами](#работа-с-манифестами) | ||||||
|  | - [Работа с Helm](#работа-с-helm) | ||||||
|  | - [Настройка Ingress](#настройка-ingress) | ||||||
|  | - [Мониторинг и аддоны](#мониторинг-и-аддоны) | ||||||
|  | - [Service Mesh с Istio](#service-mesh-с-istio) | ||||||
|  | - [Примеры полных развертываний](#примеры-полных-развертываний) | ||||||
|  |  | ||||||
|  | ## Введение | ||||||
|  |  | ||||||
|  | AnsibleLab предоставляет полную поддержку создания и управления локальными 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 | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Заключение | ||||||
|  |  | ||||||
|  | AnsibleLab предоставляет полный набор инструментов для работы с Kubernetes кластерами локально. Вы можете: | ||||||
|  |  | ||||||
|  | - Создавать и управлять кластерами | ||||||
|  | - Устанавливать и настраивать приложения | ||||||
|  | - Работать с мониторингом и Service Mesh | ||||||
|  | - Тестировать перед развертыванием в production | ||||||
|  |  | ||||||
|  | Все инструменты работают внутри Docker контейнеров, что обеспечивает изоляцию и переносимость. | ||||||
|  |  | ||||||
|  | ## Автор | ||||||
|  |  | ||||||
|  | Сергей Антропов   | ||||||
|  | Сайт: https://devops.org.ru | ||||||
		Reference in New Issue
	
	Block a user