Перейти к содержанию

Продвинутая конфигурация Kubernetes

🔹 Этап 4: Продвинутая конфигурация Kubernetes


✅ 4.1 ConfigMap и Secret — конфигурация и чувствительные данные

🔸 ConfigMap

Используется для хранения конфигурационных данных, которые не являются секретными (например, настройки приложения).

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  ENV: "production"
  LOG_LEVEL: "debug"

Монтируется в контейнер как переменные окружения:

env:
  - name: ENV
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: ENV

🔸 Secret

Хранит чувствительные данные: пароли, токены, ключи и т.д. Данные кодируются в base64.

apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  PASSWORD: cGFzc3dvcmQ=   # "password" в base64

Монтируется как переменные окружения или файлы.


✅ 4.2 Volumes и хранилище

🔸 Основные понятия

  • Volume — способ подключения диска/папки к Pod'у

  • Persistent Volume (PV) — абстракция реального хранилища

  • Persistent Volume Claim (PVC) — запрос на хранилище от приложения

🔸 Пример PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Монтирование в Pod:

volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: app-pvc
containers:
  - name: app
    image: nginx
    volumeMounts:
      - mountPath: "/data"
        name: data-volume

✅ 4.3 Probes (проверки состояния)

  • Liveness Probe — проверяет, живо ли приложение. Если нет — перезапускает Pod.

  • Readiness Probe — определяет, готов ли Pod принимать трафик.

  • Startup Probe — полезно для долгих стартов.

🔸 Пример:

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10

✅ 4.4 ServiceAccount и RBAC (права доступа)

🔸 ServiceAccount

Pod может запускаться от имени ServiceAccount, у которого ограничены права.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: read-only-sa

🔸 Role и RoleBinding (внутри namespace)

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-binding
subjects:
  - kind: ServiceAccount
    name: read-only-sa
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

✅ 4.5 Подсказка: структурируй всё в Helm-чарт

Все эти элементы (ConfigMap, Secret, PVC, Probes, RBAC) можно сделать переменными Helm-чарта — это сделает деплой удобным и параметризуемым.


Что такое Helm и Helm-чарт?


Helm

Helm — это пакетный менеджер для Kubernetes. Он позволяет легко упаковывать, настраивать и разворачивать приложения в кластере Kubernetes, похожим образом, как apt или yum делают это для Linux.

Helm облегчает работу с большими и сложными конфигурациями, избавляя тебя от рукописного копирования YAML-манифестов.


Helm-чарт (Helm Chart)

Helm-чарт — это структура каталогов и файлов, которая описывает Kubernetes-ресурсы для приложения или сервиса. В нем находятся шаблоны YAML с возможностью параметризации.


Основные компоненты Helm-чарта:

Файл / папка Назначение
Chart.yaml Метаинформация о чарте: имя, версия, описание
values.yaml Значения по умолчанию для параметров шаблонов
templates/ Папка с шаблонами Kubernetes YAML-файлов
charts/ Подчарты — зависимости вашего чарта
README.md Документация к чарту

Как работает Helm-чарт

  • В шаблонах (templates/) используются переменные из файла values.yaml и других источников.

  • При установке чарта Helm подставляет нужные значения и генерирует полный набор YAML-манифестов.

  • Эти манифесты потом применяются в кластер через Kubernetes API.


Пример простого шаблона из Helm-чарта

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-nginx
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: 80

В этом шаблоне:

  • {{ .Release.Name }} — имя релиза, которое ты задаешь при установке чарта

  • {{ .Values.replicaCount }} — значение параметра из values.yaml

  • {{ .Values.image.repository }}, {{ .Values.image.tag }} — параметры образа контейнера


Почему Helm полезен?

  • Повторяемость — можно разворачивать одинаковую конфигурацию в разных окружениях

  • Параметризация — легко менять параметры, не правя YAML вручную

  • Обновления и откаты — Helm умеет обновлять установленные приложения и откатывать изменения

  • Расширяемость — можно использовать готовые чарты из публичных репозиториев (например, bitnami)


Основные команды Helm

Команда Описание
helm repo add <name> <url> Добавить репозиторий чартов
helm search repo <term> Поиск чартов в репозиториях
helm install <release> <chart> Установить чарт в кластер
helm upgrade <release> <chart> Обновить релиз
helm rollback <release> <revision> Откатить релиз к предыдущей версии
helm uninstall <release> Удалить релиз из кластера
helm template <chart> Сгенерировать YAML из чарта без установки