Pulumi Helm chart execution error

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],
            ...,
            ...,
        )

Kubernetes PostStart and PreStop hooks

PreStart

На данный момент (v1.20) такого хука не существует и единственным способом гарантированного запуска чего-либо перед запуском основного контейнера - init containers

PostStart

Данный хук отправляется сразу после создания контейнера, в асинхронном режиме и нет никаких гарантий что он будет выполнен до entrypoint. К сожалению данный хук не подходит для таких вещей как миграции баз данных и тому подобных - которые должны быть гарантированно выполнены до старта основного приложения. Но, приложение запущенное в рамках хука, уже имеет доступ к переменным среды и он отлично подходит для различных задач по регистрации контейнера в системе мониторинга или отправки каких либо запросов в различные API и т.п. едино разовые задачи в жизни конкретно взятого контейнера.

PreStop

Данный хук вызывается непосредственно перед остановкой контейнера и является “блокирующим” - контейнер не будет удалён до момента окончания выполнения задачи определённой в хуке. На мой взгляд один из самых полезных хуков (исключая 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
  1. Container Lifecycle Hooks
  2. Init Containers

Nginx-Ingress magic

Два дня мучился с вопросом

“а почему я не вижу IP клиента в логах Nginx, а все запросы идут от адреса cni0 интерфейса” (судя по твиттеру, я не один).

Так начался весёлый путь в недра Kubernetes, iptables и остальных не очень весёлых вещей.
Массовый “гуглёж” выводил на решение проблем с облачными провайдерами и никак не работало на локальной Kubernetes инсталяции.
В резулетате, методом перебора, была найдена “магия” которая работает не понятно как но на удивление работает :)

И так, магия под катом :)

Далее