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

Читал ли документацию по Kubernetes

1.0 Junior🔥 181 комментариев
#Docker, Kubernetes и DevOps#JVM и управление памятью

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

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

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

Читал ли документацию по Kubernetes

Да, я изучал документацию Kubernetes и имею практический опыт работы с ней. Kubernetes — это критически важный инструмент в современной разработке, особенно для Java приложений.

Основные компоненты Kubernetes

1. Pods (подсы)

# Pod — самый маленький deployable unit в K8s
apiVersion: v1
kind: Pod
metadata:
  name: java-app-pod
spec:
  containers:
  - name: java-container
    image: myapp:1.0
    ports:
    - containerPort: 8080

Pod обычно содержит один контейнер (в нашем случае Java приложение).

2. Deployments (развёртывания)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: java-app
  template:
    metadata:
      labels:
        app: java-app
    spec:
      containers:
      - name: java-app
        image: myapp:1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "256Mi"
            cpu: "100m"
          limits:
            memory: "512Mi"
            cpu: "500m"

Deployment управляет жизненным циклом подсов (создание, обновление, удаление).

3. Services (сервисы)

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

Service обеспечивает сетевой доступ к подсам.

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

Докеризация Java приложения:

FROM openjdk:21-slim

WORKDIR /app

COPY target/myapp.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

Команды kubectl для управления:

# Создание deployment
kubectl apply -f deployment.yaml

# Просмотр подсов
kubectl get pods

# Просмотр логов
kubectl logs pod-name

# Масштабирование
kubectl scale deployment java-app --replicas=5

# Обновление образа
kubectl set image deployment/java-app java-app=myapp:2.0

# Удаление deployment
kubectl delete deployment java-app

Конфигурация Java приложения в K8s

1. Environment variables:

apiVersion: v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: java-app
        image: myapp:1.0
        env:
        - name: DB_HOST
          value: "postgres.default.svc.cluster.local"
        - name: JAVA_OPTS
          value: "-Xmx512m -Xms256m"

2. ConfigMaps (для конфигураций):

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  application.properties: |
    server.port=8080
    logging.level.root=INFO
---
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: java-app
        volumeMounts:
        - name: config
          mountPath: /etc/config
      volumes:
      - name: config
        configMap:
          name: app-config

3. Secrets (для чувствительных данных):

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  password: cGFzc3dvcmQxMjM=  # base64
---
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: java-app
        env:
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password

Проверки здоровья (Health Checks)

Liveness Probe (перезагрузить контейнер, если мёртв):

spec:
  containers:
  - name: java-app
    livenessProbe:
      httpGet:
        path: /actuator/health
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10

Readiness Probe (готов ли обрабатывать трафик):

spec:
  containers:
  - name: java-app
    readinessProbe:
      httpGet:
        path: /actuator/health/readiness
        port: 8080
      initialDelaySeconds: 10
      periodSeconds: 5

Для Java приложений часто используется Spring Boot Actuator с /actuator/health.

Управление ресурсами

Запросы (requests) и лимиты (limits):

resources:
  requests:  # Минимум, который нужен приложению
    cpu: "200m"      # 0.2 CPU cores
    memory: "512Mi"  # 512 megabytes
  limits:    # Максимум, который может использовать
    cpu: "1000m"     # 1 CPU core
    memory: "1Gi"    # 1 gigabyte

Правильная настройка ресурсов критична для стабильности Java приложений (которые обычно требуют больше памяти).

Rolling Updates и Zero-Downtime Deployment

apiVersion: apps/v1
kind: Deployment
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # Дополнительный под при обновлении
      maxUnavailable: 0  # 0 подсов недоступно (zero-downtime)

Persisten Volume (для базы данных)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-database
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  hostPath:
    path: "/data/db"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-database
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Networking в K8s

ClusterIP (внутренний доступ):

type: ClusterIP  # Доступен только внутри кластера

NodePort (доступ извне):

type: NodePort
ports:
- port: 8080
  nodePort: 30123  # Доступен на NodeIP:30123

LoadBalancer (облачный балансировщик):

type: LoadBalancer  # AWS, Azure, GCP создают внешний LB

Практические примеры из опыта

1. Graceful shutdown:

Java приложение должно корректно завершаться:

@Configuration
public class GracefulShutdownConfig {
    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return container -> container.setShutdownTimeout(Duration.ofSeconds(30));
    }
}

2. Начальная задержка для livenessProbe:

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 60  # Дать времени на запуск JVM
  periodSeconds: 10

3. Масштабирование на основе CPU:

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

Инструменты, которые использую

  • kubectl — командная строка для управления
  • Helm — пакетный менеджер для K8s
  • Docker — контейнеризация приложений
  • Prometheus + Grafana — мониторинг
  • ELK Stack — логирование

Заключение

Kubernetes — это мощный инструмент для управления контейнеризованными приложениями. Для Java разработчика особенно важны:

  1. Правильная конфигурация ресурсов — Java приложения требуют много памяти
  2. Health checks — для надёжного мониторинга
  3. Graceful shutdown — для корректного выключения
  4. Управление конфигурацией — ConfigMaps и Secrets
  5. Rolling updates — для zero-downtime deployment

Я постоянно изучаю новые возможности K8s и следую best practices в управлении Java приложениями в контейнерах.

Читал ли документацию по Kubernetes | PrepBro