Вы можете рассмотреть подход с использованием ловушки preStop .
Согласно документации Состояния контейнера , Определить обработчики postStart и preStop :
Перед входом контейнера в Termination выполняется preStop hook (если есть).
Таким образом, вы можете использовать в своем развертывании:
lifecycle:
preStop:
exec:
command: ["your script"]
###
обновление :
Я хотел бы предоставить больше информации в связи с некоторыми исследованиями: существует интересный проект :
KEDA позволяет выполнять мелкозернистое автоматическое масштабирование (в том числе до нуля) для управляемых событиями рабочих нагрузок Kubernetes.KEDA служит сервером метрик Kubernetes и позволяет пользователям определять правила автоматического масштабирования с использованием специального определения ресурса Kubernetes.KEDA может работать как в облаке, так и на периферии, изначально интегрируется с компонентами Kubernetes, такими как горизонтальный модуль автоматического масштабирования, и не имеет внешних зависимостей.
По основному вопросу "Kubernetesможет завершить модуль, который все еще выполняет обработку своего собственного сообщения ".
Согласно документации:
"Развертывание - это концепция более высокого уровня, которая управляет ReplicaSets и предоставляет декларативные обновления для модулей вместе с множеством других полезных функций"
Развертывание поддерживается Replicaset.Согласно этому коду контроллера существует функция " getPodsToDelete ".В сочетании с « FilterPods » это дает результат: « Это гарантирует, что мы удаляем стручки на более ранних этапах, когда это возможно. »
Так как подтверждение концепции:
Вы можете создать развертывание с помощью init container .Контейнер Init должен проверить, есть ли сообщение в очереди, и завершить работу, когда появится хотя бы одно сообщение.Это позволит основному контейнеру запускать, принимать и обрабатывать это сообщение.В этом случае у нас будет два вида модулей - те, которые обрабатывают сообщение и потребляют процессор, а те, кто находится в начальном состоянии , находятся в режиме ожидания и ожидаютследующее сообщение.В этом случае начальные контейнеры будут удалены в первую очередь , когда HPA решит уменьшить количество реплик в развертывании.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: complete
name: complete
spec:
replicas: 5
revisionHistoryLimit: 10
selector:
matchLabels:
app: complete
template:
metadata:
creationTimestamp: null
labels:
app: complete
spec:
hostname: c1
containers:
- name: complete
command:
- "bash"
args:
- "-c"
- "wa=$(shuf -i 15-30 -n 1)&& echo $wa && sleep $wa"
image: ubuntu
imagePullPolicy: IfNotPresent
resources: {}
initContainers:
- name: wait-for
image: ubuntu
command: ['bash', '-c', 'sleep 30']
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
Надеюсь, эта помощь.