Что такое Kubernetes? Как оркестрировать PHP-приложения?php-63

Что такое Kubernetes?

Kubernetes (K8s) — это система оркестрации контейнеризированных приложений с открытым исходным кодом, разработанная Google. Она обеспечивает автоматическое развертывание, масштабирование и управление контейнерными приложениями.

Ключевые концепции Kubernetes:

  1. Pod - минимальная единица развертывания (1+ контейнеров)
  2. Deployment - декларативное описание желаемого состояния приложения
  3. Service - абстракция для доступа к группе Pod'ов
  4. Ingress - управление внешним доступом к сервисам
  5. ConfigMap/Secret - управление конфигурацией и секретами

Оркестрация PHP-приложений в Kubernetes

1. Подготовка Docker-образа

Перед развертыванием в K8s нужен оптимизированный Docker-образ:

FROM php:8.2-fpm-alpine

RUN apk add --no-cache \
    nginx \
    supervisor \
    && docker-php-ext-install opcache pdo_mysql

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY . /var/www/html
RUN composer install --no-dev --optimize-autoloader

COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 8080
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

2. Базовые манифесты Kubernetes

Deployment :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: php-app
  template:
    metadata:
      labels:
        app: php-app
    spec:
      containers:
      - name: php-app
        image: your-registry/php-app:1.0.0
        ports:
        - containerPort: 8080
        envFrom:
        - configMapRef:
            name: php-app-config
        - secretRef:
            name: php-app-secrets
        resources:
          requests:
            cpu: "100m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"

Service :

apiVersion: v1
kind: Service
metadata:
  name: php-app-service
spec:
  selector:
    app: php-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Ingress :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: php-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: your-app.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: php-app-service
            port:
              number: 80

3. Особенности PHP в Kubernetes

Горизонтальное масштабирование:

  • PHP требует shared nothing архитектуры
  • Сессии хранить в Redis/Memcached
env:
- name: SESSION_DRIVER
  value: "redis"

Миграции БД:

apiVersion: batch/v1
kind: Job
metadata:
  name: php-migrations
spec:
  template:
    spec:
      containers:
      - name: migrate
        image: your-registry/php-app:1.0.0
        command: ["php", "artisan", "migrate", "--force"]
      restartPolicy: Never

4. Конфигурация и секреты

ConfigMap (configmap.yaml):

apiVersion: v1
kind: ConfigMap
metadata:
  name: php-app-config
data:
  APP_ENV: "production"
  APP_DEBUG: "false"
  CACHE_DRIVER: "redis"

Secret (secret.yaml):

apiVersion: v1
kind: Secret
metadata:
  name: php-app-secrets
type: Opaque
data:
  DB_PASSWORD: base64-encoded-password
  APP_KEY: base64-encoded-key

5. Автомасштабирование

HPA (Horizontal Pod Autoscaler):

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

6. Мониторинг и логи

Liveness/Readiness пробы:

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

7. CI/CD интеграция

Пример шага деплоя в GitHub Actions:

- name: Deploy to Kubernetes
  run: |
    kubectl apply -f k8s/
    kubectl rollout status deployment/php-app

Best Practices для PHP в Kubernetes

  1. Stateless приложение: Не храните состояние в Pod'ах
  2. Graceful shutdown: Обрабатывайте SIGTERM
  3. Оптимизированные образы: Используйте alpine-базу
  4. Ресурсные ограничения: Задавайте requests/limits
  5. Распределенные логи: Интегрируйте с ELK или Loki
  6. Canary-деплой: Постепенный rollout новых версий

Резюмируем:

Kubernetes предоставляет мощный инструментарий для оркестрации PHP-приложений, обеспечивая масштабируемость, отказоустойчивость и удобство управления. Правильно настроенный кластер K8s позволяет PHP-приложениям работать в продакшене с высокой доступностью и эффективно использовать ресурсы.