Files
DevOpsLab/docs/kubernetes-full-guide.md
Сергей Антропов d8e1052e7b refactor: переименование проекта AnsibleLab -> DevOpsLab
- Заменено название проекта во всех файлах проекта
- Обновлены:
  * 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)
2025-10-26 12:28:05 +03:00

23 KiB
Raw Permalink Blame History

Полное руководство по работе с Kubernetes кластерами

Автор: Сергей Антропов
Сайт: https://devops.org.ru

Содержание

Введение

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