Назад к вопросам
Middle+
102
questionbank

Как Kubernetes будет обновлять секреты, если у меня есть шесть реплик подов с одним и тем же секретом?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Kubernetes не обновляет секреты прямо во время работы пода. Поды используют точную копию секрета, существовавшую на момент их запуска.

Чтобы поды "увидели" обновленный секрет, нужно их перезапустить или пересоздать. Популярные стратегии развертывания для этого:

  • Rolling Update: Старые поды постепенно заменяются новыми с обновленным секретом. Это стандартная стратегия для Deployments.

  • Recreate: Все старые поды удаляются одновременно, а затем создаются новые. Это приводит к короткому простою сервиса.

  • Blue/Green Deployment: Развертывают полностью новую версию приложения (с обновленным секретом) параллельно со старой. После проверки весь трафик переключается на новую версию, а старая удаляется.

  • Canary Release: Развертывают новую версию приложения (с обновленным секретом) на небольшой подмножество пользователей, постепенно увеличивая на нее трафик.

При использовании ConfigMaps и Secrets, которые смонтированы как файлы, изменения в секрете могут быть автоматически обновлены внутри уже запущенного пода, но это происходит с некоторой задержкой (kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod). Однако, для использования секрета, например, в переменных среды окружения, требуется перезапуск пода.

Пример обновления Deployment с использованием Rolling Update:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 6
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: RollingUpdate # Стандартная стратегия
    rollingUpdate:
      maxUnavailable: 1 # Максимальное количество недоступных подов во время обновления
      maxSurge: 1       # Максимальное количество новых подов, создаваемых сверх желаемого количества реплик
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image:latest
        env:
        - name: MY_SECRET_VALUE
          valueFrom:
            secretKeyRef:
              name: my-secret #  Имя секрета
              key: my-key     #  Ключ секрета

После изменения секрета my-secret, необходимо обновить Deployment (например, изменив версию образа или добавив аннотацию), чтобы триггернуть Rolling Update:

kubectl apply -f deployment.yaml

Kubernetes увидит изменения в спеке Deployment и начнет создавать новые поды, которые получат доступ к обновленному секрету. Старые поды будут завершены.