В настоящее время это невозможно напрямую с API-интерфейсом Kubernetes. Контейнеры могут быть прекращены в любом порядке. Модуль Cloud SQL может погибнуть быстрее, чем ваше приложение, например, если он требует меньше очистки для выполнения или требует меньше запросов в полете.
С Завершение стручков :
Когда пользователь запрашивает удаление модуля, система записывает предполагаемый льготный период до принудительного уничтожения модуля, и сигнал TERM отправляется главному процессу в каждом контейнере.
Вы можете обойти это в некоторой степени, поместив Cloud SQL и основные контейнеры в разные точки входа, которые сообщают друг другу о своем состоянии выхода, используя общую файловую систему уровня pod.
Оболочка, подобная следующей, может помочь с этим:
containers:
- command: ["/bin/bash", "-c"]
args:
- |
trap "touch /lifecycle/main-terminated" EXIT
<your entry point goes here>
volumeMounts:
- name: lifecycle
mountPath: /lifecycle
- name: cloudsql_proxy
image: gcr.io/cloudsql-docker/gce-proxy
command: ["/bin/bash", "-c"]
args:
- |
/cloud_sql_proxy <your flags> &
PID=$!
function stop {
while true; do
if [[ -f "/lifecycle/main-terminated" ]]; then
kill $PID
fi
sleep 1
done
}
trap stop EXIT
# We explicitly call stop to ensure the sidecar will terminate
# if the main container exits outside a request from Kubernetes
# to kill the Pod.
stop &
wait $PID
volumeMounts:
- name: lifecycle
mountPath: /lifecycle
Вам также понадобится локальное пустое место, чтобы использовать его для передачи событий жизненного цикла:
volumes:
- name: lifecycle
emptyDir:
Конечно, это зависит от того, какие контейнеры у вас работают, и им доступна оболочка; это верно для прокси-сервера Cloud SQL, но вам может потребоваться внести изменения в ваши сборки, чтобы убедиться, что это верно для ваших собственных контейнеров приложений.