Что такое конфигурационный файл в Kubernetes?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Конфигурационный файл в 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 Compose | Kubernetes |
|---|---|---|
| Назначение | Локальная разработка | Production кластер |
| Масштабирование | Ручное | Автоматическое |
| Высокая доступность | Нет | Есть (replicas) |
| Storage | Volumes | PersistentVolumes |
| 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
Лучшие практики
-
Используй namespace'ы для разделения окружений
metadata: namespace: production -
Устанавливай requests/limits для контроля ресурсов
-
Используй liveness и readiness probes для здоровья
-
Secrets вместо ConfigMap для пароли (безопаснее)
-
Версионируй конфиги в git как код
-
Используй labels для выбора pod'ов
-
Разбивай большие конфиги на файлы по типам ресурсов
Связь с 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) позволяют полностью контролировать развёртывание в кластере.