Pulumi error during execute Helm chart:
File "../pulumi_kubernetes/apiextensions/v1/CustomResourceDefinition.py", line 126, in __init__
__self__._internal_init(resource_name, *args, **kwargs)
TypeError: _internal_init() got an unexpected keyword argument 'status'
Solution for Python:
Add function:
# Remove the .status field from CRDs
def remove_status(obj, opts):
if obj["kind"] == "CustomResourceDefinition":
del obj["status"]
and transformation parametr to function
Chart(
"chart",
ChartOpts(
transformations=[remove_status],
...,
...,
)
На данный момент (v1.20) такого хука не существует и единственным способом гарантированного запуска чего-либо перед запуском основного контейнера - init containers
Данный хук отправляется сразу после создания контейнера, в асинхронном режиме и нет никаких гарантий что он будет выполнен до entrypoint
.
К сожалению данный хук не подходит для таких вещей как миграции баз данных и тому подобных - которые должны быть гарантированно выполнены до старта основного приложения.
Но, приложение запущенное в рамках хука, уже имеет доступ к переменным среды и он отлично подходит для различных задач по регистрации контейнера в системе мониторинга или отправки каких либо запросов в различные API
и т.п. едино разовые задачи в жизни конкретно взятого контейнера.
Данный хук вызывается непосредственно перед остановкой контейнера и является “блокирующим” - контейнер не будет удалён до момента окончания выполнения задачи определённой в хуке.
На мой взгляд один из самых полезных хуков (исключая PreStart
которого не существует) - в рамках данного хука очень удобно выполнять такие задачи как выгрузка каких либо артефактов, перед завершением работы контейнера (дампы, логи и т.д.).
Но необходимо учитывать то, что у Kubernetes есть своеобразный механизм защиты от “вечно живущих” мёртвых контейнеров - terminationGracePeriodSeconds
, который по умолчанию равен 60сек. (может быть изменён конфигурацией кластера, уточняйте по месту). Если вы не уверены что задача в PreStop
будет завершена примерно за 50-55сек. то обязательно переназначьте данное значение в манифесте.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo Hello from the preSop"]
terminationGracePeriodSeconds: 600 #<-- ten minutes delay before send a forced SIGTERM signal
Два дня мучился с вопросом
“а почему я не вижу IP клиента в логах Nginx, а все запросы идут от адреса
cni0
интерфейса” (судя по твиттеру, я не один).
Так начался весёлый путь в недра Kubernetes, iptables
и остальных не очень весёлых вещей.
Массовый “гуглёж” выводил на решение проблем с облачными провайдерами и никак не работало на локальной Kubernetes инсталяции.
В резулетате, методом перебора, была найдена “магия” которая работает не понятно как но на удивление работает :)
И так, магия под катом :)