[python]如何使用 kopf 从 kubernetes secret 中删除 ownerRef

· 收录于 2024-01-06 17:09:06 · source URL

问题详情

你能帮我解决我面临的问题吗?我使用基于 python 和 kopf 的 kubernetes 运算符,根据注释将密钥从命名空间复制到一个或多个其他命名空间。代码按预期工作,除非机密具有 ownerRef。在这种情况下,垃圾回收器会将其删除,原因为 OwnerRefInvalidNamespace

我正在研究用kopf.remove_owner_reference或kopf.adopt解决这个问题,但没有运气。 parse_target_namespaces只返回要复制密钥的目标命名空间列表。

    @kopf.on.create('', 'v1', 'secrets', annotations={'synator/sync': 'yes'}, when=watch_namespace)
    @kopf.on.update('', 'v1', 'secrets', annotations={'synator/sync': 'yes'}, when=watch_namespace)
    def update_secret(body, meta, spec, status, old, new, diff, **kwargs):
        api = kubernetes.client.CoreV1Api()
        namespace_response = api.list_namespace()
        namespaces = [nsa.metadata.name for nsa in namespace_response.items]
        namespaces.remove(meta.namespace)

        secret = api.read_namespaced_secret(meta.name, meta.namespace)
        secret.metadata.annotations.pop('synator/sync')
        secret.metadata.resource_version = None
        secret.metadata.uid = None
        for ns in parse_target_namespaces(meta, namespaces):
            secret.metadata.namespace = ns
            # try to pull the Secret object then patch it, try creating it if we can't
            try:
                api.read_namespaced_secret(meta.name, ns)
                #kopf.remove_owner_reference(secret, owner=None)
                api.patch_namespaced_secret(meta.name, ns, secret)
            except kubernetes.client.rest.ApiException as e:
                print(e.args)
                #kopf.remove_owner_reference(secret, owner=None)
                #kopf.adopt(secret, strict=True, forced=True, nested='spec.template')
                api.create_namespaced_secret(ns, secret)

我正在研究用kopf.remove_owner_reference或kopf.adopt解决这个问题,但没有运气。 如果可以,请帮忙。谢谢

最佳回答

暂无回答