Comments 2
Хорошая статья, спасибо. Приятно видеть что тема операторов стремительно набирает обороты — скоро будет k8s-оркестрация всего и вся, а не только контейнеров.
Немного отсутствует момент, где вызывается handle(specs) — чтоб понять как и что туда передаётся, и как он реагирует на изменения этих specs.
А если вам потребуется писать более сложные операторы, не обрастая при этом инфраструкторной логикой, а только лишь логикой предметной области, то рекомендую взглянуть на Kopf: https://github.com/zalando-incubator/kopf/ (документация: https://kopf.readthedocs.io/)
Мы тоже начинали с примерно того кода, который в статье. Но потом оно обрастало деталями, многими деталями, очень многими деталями, расползлось по паре-другой репозиториев, и в конце-концов вылилось во фреймворк.
Код задачи из примера выглядел бы как-то так:
import kopf
import kubernetes
rules = {}
@kopf.on.resume('flant.com', 'v1', 'copyrators')
@kopf.on.create('flant.com', 'v1', 'copyrators')
@kopf.on.update('flant.com', 'v1', 'copyrators')
def new_rule(name, spec, **kwargs):
rules[name] = spec
for namespace in _get_all_namespaces():
_ensure(namespace, spec)
@kopf.on.delete('flant.com', 'v1', 'copyrators')
def no_more_rule(name, spec, **kwargs):
for namespace in _get_all_namespaces():
_purge(namespace, spec)
if name in rules:
del rules[name]
@kopf.on.resume('', 'v1', 'namespaces')
@kopf.on.create('', 'v1', 'namespaces')
def ns_in_sight(name, **kwargs):
for rule in rules:
_ensure(name, rule)
def _ensure(namespace, rule_spec):
pass # создаём secrets/configmaps
def _purge(namespace, rule_spec):
pass # удаляем secrets/configmaps
def _get_all_namespaces():
api = kubernetes.client.CoreV1Api()
return [ns.metadata.name for ns in api.list_namespace()]
Не уверен, что я уловил всю логику, конечно. И не тестировал, конечно. Но примерно так выглядел бы оператор, который и на rules, и на namespaces реагирует.
Фреймворк, конечно, пока в версии 0.x. Но уже почти устаканился.
Kubernetes Operator на Python без фреймворков и SDK