Проблема
При дефолтном роллауте какое-то время одновременно доступны старый и новый деплоймент.
Для некоторых приложений это критично, если изменения в коде не обратносовместимые. (к примеру, используется CDN и имена файлов не меняются, а меняются только аргументы обращений к ним: /index.0.js?t=12G33s15c)
Такая стратегия обновления называется ramped.
Решение
Честный blue-green, когда переключение со старой версии софта на новую версию происходит одномоментно.
Пример
Необходимо в деплоймент добавить новый label (в нашем случае commitId ), по которому определять selector для сервиса.
apiVersion: v1
kind: Service
metadata:
name: my-app
labels:
app: my-app
spec:
type: NodePort
ports:
- name: http
port: 8080
targetPort: 8080
selector:
app: my-app
commitId: abcde123
Обновление конфигурации сервиса в CI необходимо выполнять после успешного деплоя деплоймента (проверяя успешность с помощью rollout status deployment). Чтобы успеть вовремя переключить сервис на новые поды, необходимо добавить sleep в prestop контейнера.