- Заменено название проекта во всех файлах проекта - Обновлены: * 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)
		
			
				
	
	
	
		
			23 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	Полное руководство по работе с Kubernetes кластерами
Автор: Сергей Антропов
Сайт: https://devops.org.ru
Содержание
- Введение
- Создание кластера
- Управление кластером
- Работа с манифестами
- Работа с Helm
- Настройка Ingress
- Мониторинг и аддоны
- Service Mesh с Istio
- Примеры полных развертываний
Введение
DevOpsLab предоставляет полную поддержку создания и управления локальными Kubernetes кластерами на основе Kind (Kubernetes in Docker). Kind позволяет запускать Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки, тестирования и обучения.
Основные возможности
- Создание многоузловых Kubernetes кластеров
- Установка и управление Helm чартами
- Работа с манифестами YAML
- Настройка Ingress контроллеров
- Установка систем мониторинга (Prometheus, Grafana)
- Развертывание Service Mesh (Istio, Kiali)
- Изоляция сети и безопасность
Преимущества
- Не требует установки локального Kubernetes
- Быстрое создание и удаление кластеров
- Поддержка многоузловых конфигураций
- Полная совместимость с production окружениями
- Контейнеризация всех инструментов
Создание кластера
Базовое создание
Простое создание минимального кластера без дополнительных компонентов:
make k8s create
Создаст кластер с пресетом k8s-minimal - один control-plane узел без дополнительных компонентов.
Создание полнофункционального кластера
Создание кластера с предустановленными компонентами:
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/. Пример конфигурации:
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
Проверка статуса кластера
# Показать узлы кластера
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
Подключение к кластеру
# Получить kubeconfig
make k8s config kubernetes
# Использовать kubeconfig
export KUBECONFIG=$(pwd)/kubeconfig
kubectl get nodes
Управление кластером
Остановка и запуск
# Остановить кластер (без удаления)
make k8s stop kubernetes
# Запустить остановленный кластер
make k8s start kubernetes
# Перезапустить кластер
make k8s stop kubernetes && make k8s start kubernetes
Удаление кластера
# Полное удаление кластера и контейнера
make k8s destroy kubernetes
Получение shell в контейнере
# Открыть интерактивный shell
make k8s shell kubernetes
# Теперь доступны все команды kubectl, helm, kind внутри контейнера
kubectl get nodes
helm list
kind get clusters
Работа с манифестами
Применение манифеста
Применение манифеста из URL:
make k8s manifest apply kubernetes https://example.com/deploy.yaml
Применение локального манифеста:
# Создайте файл 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
Удаление ресурсов
make k8s manifest delete kubernetes https://example.com/deploy.yaml
Обновление ресурсов
make k8s manifest update kubernetes https://example.com/deploy.yaml
Работа с Helm
Добавление Helm репозиториев
Список популярных репозиториев:
# Официальный 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
Обновление репозиториев
make k8s helmrepo update kubernetes
Поиск чартов
# Просмотр всех чартов в репозитории
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
# Добавить репозиторий
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
make k8s helm apply kubernetes postgres bitnami/postgresql
make k8s helm status kubernetes postgres
Пример 3: Установка Nginx Ingress через Helm
# Добавить репозиторий (если еще не добавлен)
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 релизов
# Обновить релиз до последней версии
make k8s helm update kubernetes redis bitnami/redis
# Проверить после обновления
make k8s helm status kubernetes redis
Откат Helm релизов
# Откатить к предыдущей версии
make k8s helm rollback kubernetes redis
# Проверить статус после отката
make k8s helm status kubernetes redis
Удаление Helm релизов
# Удалить релиз
make k8s helm delete kubernetes redis
make k8s helm delete kubernetes postgres
Настройка Ingress
Установка NGINX Ingress Controller
Ingress контроллер обычно устанавливается при создании кластера с пресетом kubernetes. Если нужна переустановка:
# Через манифест
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:
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
Примените манифест:
make k8s manifest apply kubernetes ./example-ingress.yaml
Проверьте доступность:
# Добавьте запись в /etc/hosts
echo "127.0.0.1 hello.local" | sudo tee -a /etc/hosts
# Откройте в браузере или проверьте через curl
curl http://hello.local:8081
TLS Ingress
Создайте TLS сертификат и добавьте в Ingress:
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
# 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
# URL: http://localhost:9090
# Откройте в браузере для просмотра метрик
Просмотр метрик
# Получить список метрик
curl http://localhost:9090/api/v1/label/__name__/values
# Запрос конкретной метрики
curl 'http://localhost:9090/api/v1/query?query=up'
Установка дополнительных инструментов мониторинга
Loki для логов
# Добавить репозиторий 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 для трейсинга
# Добавить репозиторий 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
# Добавить репозиторий 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
# URL: http://localhost:20001
# Откройте в браузере для визуализации Service Mesh
# Настройки доступа
# Username: admin
# Password: admin (если используется анонимный доступ)
Ручная установка Kiali
# Добавить репозиторий 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:
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
Примените:
make k8s manifest apply kubernetes ./istio-app.yaml
Примеры полных развертываний
Пример 1: WordPress с MySQL
# 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: Многоуровневое приложение с мониторингом
# 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
# 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
Полезные команды и советы
Мониторинг ресурсов
# Просмотр использования ресурсов узлами
kubectl --kubeconfig kubeconfig top nodes
# Просмотр использования ресурсов подами
kubectl --kubeconfig kubeconfig top pods
# Детальная информация о узле
kubectl --kubeconfig kubeconfig describe node lab-control-plane
Отладка
# Просмотр логов пода
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>
Масштабирование
# Масштабировать 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
Экспорт конфигурации
# Экспортировать ресурс в 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
# Создать 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:
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
Примените:
make k8s manifest apply kubernetes ./network-policy.yaml
Заключение
DevOpsLab предоставляет полный набор инструментов для работы с Kubernetes кластерами локально. Вы можете:
- Создавать и управлять кластерами
- Устанавливать и настраивать приложения
- Работать с мониторингом и Service Mesh
- Тестировать перед развертыванием в production
Все инструменты работают внутри Docker контейнеров, что обеспечивает изоляцию и переносимость.
Автор
Сергей Антропов
Сайт: https://devops.org.ru