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