← Назад к вопросам

Что такое конфигурационный файл в Kubernetes?

2.2 Middle🔥 201 комментариев
#SOLID и паттерны проектирования#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Конфигурационный файл в Kubernetes

Конфигурационный файл в Kubernetes — это YAML-файл, который описывает ресурсы (контейнеры, сервисы, хранилища и т.д.) для развёртывания приложения в кластере Kubernetes. Это Infrastructure as Code (IaC) — вся конфигурация хранится в коде, что позволяет версионировать и воспроизводить развёртывание.

Основной формат

Kubernetes конфиги — это YAML файлы с полями:

apiVersion: apps/v1              # версия API
kind: Deployment                 # тип ресурса
metadata:                        # метаданные
  name: my-app
  namespace: default
spec:                            # спецификация (конфигурация)
  # ... конфигурация ресурса

Основные типы ресурсов

1. Deployment (самый частый)

Описывает, как развёртывать приложение:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3                 # 3 копии приложения
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: app
        image: myregistry/myapp:1.0    # Docker образ
        ports:
        - containerPort: 8080          # порт приложения
        env:
        - name: DATABASE_URL
          value: "jdbc:postgresql://postgres:5432/mydb"
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"

Что это описывает:

  • Создать 3 pod'а с приложением
  • Каждый pod запускает Docker контейнер myapp:1.0
  • Приложение слушает port 8080
  • Окружение: DATABASE_URL для подключения к БД
  • Ресурсы: минимум 256Mi памяти, максимум 512Mi

2. Service (для доступа к приложению)

Expose контейнеры во внутренней сети или снаружи:

apiVersion: v1
kind: Service
metadata:
  name: web-app-service
spec:
  type: LoadBalancer              # тип сервиса
  selector:
    app: web                       # выбрать pod'ы с label app=web
  ports:
  - protocol: TCP
    port: 80                       # port снаружи (в интернете)
    targetPort: 8080               # port внутри контейнера

Что это описывает:

  • Создать LoadBalancer (видим в интернете)
  • Он маршрутизирует трафик с port 80 на pod'ы с label app=web
  • Внутри контейнера приложение слушает 8080

3. ConfigMap (для конфигурации)

Хранит неконфиденциальные данные конфигурации:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  LOG_LEVEL: "INFO"
  CACHE_SIZE: "1000"
  config.properties: |
    app.name=MyApp
    app.version=1.0

Применение в Deployment:

spec:
  containers:
  - name: app
    image: myapp:1.0
    env:
    - name: LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: LOG_LEVEL
    volumeMounts:
    - name: config
      mountPath: /etc/config
  volumes:
  - name: config
    configMap:
      name: app-config

4. Secret (для пароли и токены)

Хранит конфиденциальные данные (base64 encoded):

apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
stringData:
  username: postgres
  password: secretpassword123

Применение в Deployment:

spec:
  containers:
  - name: app
    env:
    - name: DB_USER
      valueFrom:
        secretKeyRef:
          name: db-credentials
          key: username
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-credentials
          key: password

5. PersistentVolume и PersistentVolumeClaim (для хранилища)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db-storage
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi              # 10 гигабайт
  storageClassName: fast-ssd

Применение в Deployment (например, для PostgreSQL):

spec:
  containers:
  - name: postgres
    image: postgres:14
    volumeMounts:
    - name: data
      mountPath: /var/lib/postgresql/data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: db-storage

Практический пример: Полное приложение

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: java-app
  template:
    metadata:
      labels:
        app: java-app
    spec:
      containers:
      - name: app
        image: myregistry/java-app:1.0.0
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_DATASOURCE_URL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: database_url
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: password
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        livenessProbe:          # для проверки здоровья
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: java-app-service
spec:
  type: LoadBalancer
  selector:
    app: java-app
  ports:
  - port: 80
    targetPort: 8080
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_url: "jdbc:postgresql://postgres:5432/mydb"
---
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
stringData:
  password: mySecurePassword123

Применение конфигов в Kubernetes

# Применить конфиг
kubectl apply -f deployment.yaml

# Просмотреть созданные ресурсы
kubectl get deployments
kubectl get pods
kubectl get services

# Просмотреть логи
kubectl logs deployment/java-app

# Описание pod'а
kubectl describe pod java-app-xyz123

# Удалить ресурс
kubectl delete -f deployment.yaml

Отличия от docker-compose

АспектDocker ComposeKubernetes
НазначениеЛокальная разработкаProduction кластер
МасштабированиеРучноеАвтоматическое
Высокая доступностьНетЕсть (replicas)
StorageVolumesPersistentVolumes
NetworkingПростоеПродвинутое (Service, Ingress)
Rolling updatesНетВстроено

Проверка конфига

# Синтаксис YAML
kubectl apply -f deployment.yaml --dry-run=client

# Просмотреть что будет применено
kubectl apply -f deployment.yaml --dry-run=client -o yaml

# Валидация
kubectl apply --validate=true -f deployment.yaml

Лучшие практики

  1. Используй namespace'ы для разделения окружений

    metadata:
      namespace: production
    
  2. Устанавливай requests/limits для контроля ресурсов

  3. Используй liveness и readiness probes для здоровья

  4. Secrets вместо ConfigMap для пароли (безопаснее)

  5. Версионируй конфиги в git как код

  6. Используй labels для выбора pod'ов

  7. Разбивай большие конфиги на файлы по типам ресурсов

Связь с Java приложением

Для Java приложения в Kubernetes:

# Dockerfile
FROM openjdk:17-slim
COPY target/myapp.jar /app/myapp.jar
CMD ["java", "-jar", "/app/myapp.jar"]
# Kubernetes конфиг
apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-app
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: app
        image: myregistry/java-app:latest
        ports:
        - containerPort: 8080
        env:
        - name: JAVA_OPTS
          value: "-Xmx512m -Xms256m"

Вывод: Kubernetes конфигурационные файлы — это способ декларативно описывать, как развёртывать приложения. YAML синтаксис, различные типы ресурсов (Deployment, Service, ConfigMap, Secret) позволяют полностью контролировать развёртывание в кластере.