从Kubernetes中运行在同一命名空间中的进程中删除ClusterRoleBinding和命名空间

从Kubernetes中运行在同一命名空间中的进程中删除ClusterRoleBinding和命名空间,kubernetes,rbac,Kubernetes,Rbac,我在kube集群上创建一个名称空间,并在该名称空间中安装我的应用程序。应用程序向服务器发送常规心跳请求,如果它从服务器获得remove yourself响应,它将通过调用整个kube命名空间上的delete来删除自身。我还通过创建ClusterRoleBinding,将ServiceAccount设置为ClusterRoleBinding的主体,并使用此ServiceAccount运行pod,为应用程序集群范围提供访问权限 问题是,如果可能的话,我想删除ClusterRoleBinding作为应

我在kube集群上创建一个名称空间,并在该名称空间中安装我的应用程序。应用程序向服务器发送常规心跳请求,如果它从服务器获得remove yourself响应,它将通过调用整个kube命名空间上的delete来删除自身。我还通过创建ClusterRoleBinding,将ServiceAccount设置为ClusterRoleBinding的主体,并使用此ServiceAccount运行pod,为应用程序集群范围提供访问权限

问题是,如果可能的话,我想删除ClusterRoleBinding作为应用程序自删除过程的一部分。如果我在之前删除ClusterRoleBinding,那么应用程序将无法对名称空间发出删除命令,因此这似乎是一个鸡和蛋的问题。有办法做到这一点吗

这是我已经尝试过但没有用的:

在应用程序容器中添加了预停止处理程序。因此,现在当应用程序在整个命名空间上调用delete时,kube会在终止容器之前调用此处理程序。在这个预停止处理程序中,如果我在调用ClusterRoleBinding上的delete之前睡眠超过5秒,我会从kubernetes那里得到未经授权的响应

这让我想到,可能是链接到ClusterRoleBinding的ServiceAccount在应用程序有机会在PreStop处理程序中删除ClusterRoleBinding之前被删除了。为了测试这一点,在对命名空间发出delete之前,我向ServiceAccount添加了一个终结器,然后在PreStop处理程序中等待5秒,对ClusterRoleBinding发出delete,再次返回未授权错误,然后按名称返回ServiceAccount对象get Unauthorized error,从ServiceAccount中删除终结器get error=对象的终结器不存在,因为它无法删除空对象上的终结器。当我使用kubectl时,我发现ServiceAccount存在,但正如预期的那样处于终止状态,终结器仍然设置

当ServiceAccount处于终止状态时,即使其尚未硬删除,kube是否会撤销访问权限

是否有方法从需要删除的命名空间中运行的同一进程中删除ClusterRoleBinding和命名空间?考虑到我们要删除的ClusterRoleBinding首先给予应用程序删除名称空间的权限

任何帮助都将不胜感激

ClusterRoleBinding和ServiceAccount的YAML定义如下:

堆芯滚压成形 apiVersion:rbac.authorization.k8s.io/v1 种类:簇状卷边 元数据: creationTimestamp:空 名称:xyz myapp群集管理 roleRef: apiGroup:rbac.authorization.k8s.io 种类:ClusterRole 名称:群集管理 学科: -种类:服务帐户 姓名:xyz 名称空间:xyz myapp 服务帐户 版本:v1 种类:服务帐户 元数据: creationTimestamp:空 姓名:xyz 名称空间:xyz myapp 相关应用程序日志:

time="2020-02-18T16:08:33Z" level=info msg="App instructed to remove itself"
time="2020-02-18T16:08:33Z" level=info msg="Created finalizer 'xyz.myapp.com/my-finalizer' on ServiceAccount"
time="2020-02-18T16:08:33Z" level=info msg="Called delete on Namespace"
time="2020-02-18T16:08:38Z" level=info msg="PreStop handler called"
time="2020-02-18T16:08:38Z" level=info msg="----- sleeping for 5 sec -----"
time="2020-02-18T16:08:43Z" level=info msg="Deleting ClusterRoleBinding"
time="2020-02-18T16:08:43Z" level=warning msg="Failed to delete ClusterRoleBinding" error="Unexpected error removing ClusterRolebinding: Unauthorized"
time="2020-02-18T16:08:43Z" level=warning msg="Failed to get ServiceAccount" error=Unauthorized
time="2020-02-18T16:08:43Z" level=warning msg="Failed to remove finalizer from ServiceAccount" error="finalizer 'xyz.myapp.com/my-finalizer' doesn't exist for object ''"

在翻阅kubernetes文档后,我发现最可靠的方法是:

当应用程序从服务器获得remove yourself响应时,它会使ClusterRoleBinding成为应用程序运行所在命名空间的所有者。 这可以通过使用补丁在命名空间的medatadata.owerReferences下添加ClusterRoleBinding来实现。 成功将ClusterRoleBinding添加为命名空间的所有者后,应用程序可以使用DeletePropagationBackground调用ClusterRoleBinding上的delete。 下面是一个示例,说明如何在Golang中应用向命名空间的OwnerReference添加ClusterRoleBinding的修补程序

进口 编码/json k8s.io/client-go/kubernetes v1 k8s.io/api/core/v1 rbacv1 k8s.io/api/rbac/v1 metav1 k8s.io/apimachineering/pkg/api/meta/v1 键入ownerReferencePatch结构{ Op字符串`json:Op` 路径字符串`json:Path` Value[]metav1.OwnerReference`json:Value` } func AddClusterRoleBindingOwnerReferenceToNamespaceclient kubernetes.Interface,crb*rbacv1.ClusterRoleBinding,ns*v1.Namespace*v1.Namespace,错误{ 补丁,err:=json.Marshal[]ownerReferencePatch{ { Op:add, 路径:/metadata/ownerReferences, 值:[]metav1.OwnerReference{ { APIVersion:crb.RoleRef.APIGroup, blockownerDelete:funcin bool*bool{return&in}true, 种类:ClusterRoleBinding, 名称:crb.GetName, UID:crb.GetUID, }, }, }, } 如果错误!=零{ 返回零,错误 } 返回client.CoreV1.Namespaces.Patchns.GetName,types.JSONPatchType,patch }
在翻阅kubernetes文档后,我发现最可靠的方法是:

当应用程序从服务器收到remove yourself响应时,它会使ClusterRoleBinding成为名称的所有者 应用程序运行的速度。 这可以通过使用补丁在命名空间的medatadata.owerReferences下添加ClusterRoleBinding来实现。 成功将ClusterRoleBinding添加为命名空间的所有者后,应用程序可以使用DeletePropagationBackground调用ClusterRoleBinding上的delete。 下面是一个示例,说明如何在Golang中应用向命名空间的OwnerReference添加ClusterRoleBinding的修补程序

进口 编码/json k8s.io/client-go/kubernetes v1 k8s.io/api/core/v1 rbacv1 k8s.io/api/rbac/v1 metav1 k8s.io/apimachineering/pkg/api/meta/v1 键入ownerReferencePatch结构{ Op字符串`json:Op` 路径字符串`json:Path` Value[]metav1.OwnerReference`json:Value` } func AddClusterRoleBindingOwnerReferenceToNamespaceclient kubernetes.Interface,crb*rbacv1.ClusterRoleBinding,ns*v1.Namespace*v1.Namespace,错误{ 补丁,err:=json.Marshal[]ownerReferencePatch{ { Op:add, 路径:/metadata/ownerReferences, 值:[]metav1.OwnerReference{ { APIVersion:crb.RoleRef.APIGroup, blockownerDelete:funcin bool*bool{return&in}true, 种类:ClusterRoleBinding, 名称:crb.GetName, UID:crb.GetUID, }, }, }, } 如果错误!=零{ 返回零,错误 } 返回client.CoreV1.Namespaces.Patchns.GetName,types.JSONPatchType,patch }
很好找到了!这是一个链接到很好地找到!这是一个链接到