Почему «kubectl apply» объединяет дескрипторы развертывания после отката

kubernetes #deployment #kubectl

#kubernetes #развертывание #kubectl

Вопрос:

Я использую службы Azure Kubernetes с версией K8S 1.20.9 и выполняю следующее развертывание K8S

Версия 1:

 apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: busybox-deployment
  labels:
    app: busybox
spec:
  replicas: 1
  strategy: 
    type: RollingUpdate
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ['sh', '-c', 'echo Container 1 is Running ; sleep 3600']
        env:
          - name: KEY_1
            value: VALUE_1
 

Я развертываю с kubectl apply его помощью и проверяю значение KEY_1 переменной среды — оно правильно установлено VALUE_1 .

Затем я развертываю еще 2 версии (снова через kubectl apply ), где я меняю пару ключ-значение в разделе env следующим образом, эффективно удаляя старую переменную среды и создавая новую:

Версия 2:

         env:
          - name: KEY_2
            value: VALUE_2
 

Версия 3:

         env:
          - name: KEY_3
            value: VALUE_3
 

После каждого развертывания я проверяю переменные среды, и они в порядке — версия 2 содержит KEY_2:VALUE_2 пару, а версия 3 содержит KEY_3:VALUE_3 пару.

Теперь я возвращаюсь к версии 2, вызывая

 kubectl rollout undo deployment ...
 

Это также работает правильно, и теперь у нас есть KEY_2:VALUE_2 пара в качестве переменных среды.

Однако, если я снова разверну версию 3, контейнер и дескриптор развертывания будут иметь как KEY_2:VALUE_2 переменные среды, так и KEY_3:VALUE переменные среды as. Это не соответствует ни одному из развернутых дескрипторов, потому что они всегда содержат только одну переменную среды. Последующие развертывания приводят к тому же поведению, пока я вручную не отредактирую и не удалю ненужное свойство.

Я прочитал некоторые объяснения, подобные этой хорошей статье, где объясняется, что kubectl apply старые свойства будут удалены, а исправление — нет.

Однако этого не происходит при выполнении «отмены». Есть идеи, почему?

Спасибо.

Комментарии:

1. Какую версию K8s вы используете?

2. @p10l это 1.20.9 для AKS (т.Е. управляемого сервиса). Я тоже добавил это в вопрос.

Ответ №1:

Это известная проблема rollout undo , о которой сообщалось здесь # 94698, здесь # 25236 и здесь # 22512 .

С точки зрения непрофессионала — kubectl неправильно вычисляет различия и объединяет изменения, потому undo что неправильно загружает предыдущую конфигурацию.

Подробнее о том, как K8s вычисляет различия, можно найти в документации.

Обходным путем является обновление вручную последней примененной конфигурации перед повторным применением другого развертывания из файла конфигурации

 kubectl apply set-last-applied -f Deployment_v2.yaml -o yaml