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

Кто решал проблемы в конфигурации Kubernetes

2.0 Middle🔥 141 комментариев
#Основы Java

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

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

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

Решение проблем конфигурации Kubernetes

В моей практике

Проблемы конфигурации Kubernetes решал в команде с DevOps инженерами и SRE специалистами, однако как Java разработчик я активно участвовал в отладке и понимании причин проблем. Вот типичные сценарии и решения:

Основные проблемы и решение

1. Контейнер не стартует

# Диагностика
kubectl describe pod my-app-pod-abc123
kubectl logs my-app-pod-abc123
kubectl logs my-app-pod-abc123 --previous  # Логи перезагрузившегося пода

# Частые причины:
# - Java heap слишком большой для контейнера
# - Неверная переменная окружения JAVA_OPTS
# - Отсутствуют зависимости в Docker образе

Решение:

apiVersion: v1
kind: Pod
metadata:
  name: java-app
spec:
  containers:
  - name: app
    image: my-app:1.0
    resources:
      requests:
        memory: "512Mi"
        cpu: "250m"
      limits:
        memory: "1Gi"
        cpu: "500m"
    env:
    - name: JAVA_OPTS
      value: "-Xms256m -Xmx512m"  # Меньше, чем limits
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 10
      periodSeconds: 5

2. Проблемы с сетевой коммуникацией

# Проверить DNS
kubectl run -it --rm debug --image=busybox:1.28 -- nslookup postgres-service

# Проверить доступность сервиса
kubectl run -it --rm debug --image=curlimages/curl -- curl http://postgres-service:5432

# Посмотреть endpoints сервиса
kubectl get endpoints postgres-service

Решение с корректной конфигурацией Service:

apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 5432
    targetPort: 5432

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: java-app
  template:
    metadata:
      labels:
        app: java-app
    spec:
      containers:
      - name: app
        image: my-app:1.0
        env:
        - name: SPRING_DATASOURCE_URL
          value: "jdbc:postgresql://postgres-service:5432/mydb"  # Используем DNS имя
        - name: SPRING_DATASOURCE_USERNAME
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: username
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: password

3. Проблемы с ConfigMap и Secrets

# Проверить содержимое
kubectl get configmap app-config -o yaml
kubectl get secret db-credentials -o yaml

# Пересоздать ConfigMap
kubectl delete configmap app-config
kubectl create configmap app-config --from-file=config/

# Пересоздать Secret
kubectl delete secret db-credentials
kubectl create secret generic db-credentials --from-literal=username=admin --from-literal=password=secret

# Перезапустить pods чтобы подхватили новые значения
kubectl rollout restart deployment java-app

4. PersistentVolume и PersistentVolumeClaim

# Проверить статус
kubectl get pv
kubectl get pvc
kubectl describe pvc postgres-storage

Решение:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-storage
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast  # Убедитесь, что класс хранилища существует

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: "postgres"
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:15
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: postgres-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: fast
      resources:
        requests:
          storage: 10Gi

5. Проблемы с ingress и маршрутизацией

# Проверить ingress
kubectl get ingress
kubectl describe ingress my-app-ingress

# Проверить правила
kubectl get ingress my-app-ingress -o yaml

Решение:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - api.example.com
    secretName: my-app-tls
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: java-app-service
            port:
              number: 8080

6. Resource Limits и OOMKilled

# Проверить причину гибели пода
kubectl describe pod <pod-name> | grep -A5 "Last State"

Если статус "OOMKilled" — Java приложение исчерпало памяти.

Решение:

resources:
  requests:
    memory: "1Gi"
    cpu: "500m"
  limits:
    memory: "2Gi"
    cpu: "1000m"

env:
- name: JAVA_OPTS
  value: "-Xms512m -Xmx1g"  # Меньше, чем limits

7. Проблемы с горячей перезагрузкой (Rolling Updates)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # Сколько дополнительных подов можно создать
      maxUnavailable: 0  # Сколько подов могут быть недоступны
  selector:
    matchLabels:
      app: java-app
  template:
    metadata:
      labels:
        app: java-app
    spec:
      containers:
      - name: app
        image: my-app:2.0
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          timeoutSeconds: 5
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 15"]  # Graceful shutdown

Роли в решении проблем

  • DevOps инженер: конфигурация кластера, storage, networking, CI/CD
  • SRE специалист: мониторинг, alerting, capacity planning
  • Java разработчик (я): debug приложения, настройка JVM, диагностика логов

Инструменты для диагностики

# Смотреть логи в real-time
kubectl logs -f deployment/java-app

# Запустить временный контейнер для debug
kubectl debug node/<node-name> -it --image=ubuntu

# Port-forward для локального тестирования
kubectl port-forward pod/java-app-abc123 8080:8080
kubectl port-forward service/java-app 8080:8080

# Exec в контейнер
kubectl exec -it <pod-name> -- /bin/sh

# Top для мониторинга ресурсов
kubectl top pods
kubectl top nodes

Вывод

Проблемы конфигурации Kubernetes решал в сотрудничестве с инженерами инфраструктуры, однако как Java разработчик активно участвовал в диагностике через логи, метрики и настройку JVM параметров. Ключевые инструменты: kubectl, описание pods/services, логирование и health checks.