我在kube群集上创建一个 问题是,我希望在应用程序的自删除过程中删除Namespace
,然后在该命名空间中安装我的应用。该应用程序向服务器发送常规的心跳请求,并且如果它从服务器收到“ remove self”]]响应,它将通过在整个kube命名空间上调用delete来删除自身。我还通过创建ClusterRoleBinding
,使ServiceAccount
服从ClusterRoleBinding
并使用此ServiceAccount
运行Pod,来为应用集群提供广泛的访问权限。ClusterRoleBinding
(如果可能的话)。如果我之前删除了ClusterRoleBinding
,则该应用程序将无法在Namespace
上执行删除操作,因此这似乎是鸡与蛋的问题。有办法吗?
这是我已经尝试无济于事的东西:
在应用容器中添加了PreStop处理程序。因此,现在当应用程序在整个命名空间上调用delete时,kube会在杀死容器之前调用此处理程序。在此PreStop处理程序中,如果我睡了5秒钟以上,然后在ClusterRoleBinding
上调用delete,我会从kubernetes返回“ Unauthorized”
这使我认为也许链接到ServiceAccount
的ClusterRoleBinding
在应用程序有机会在PreStop处理程序中删除ClusterRoleBinding
之前就被删除了。因此,为了测试这一点,在对命名空间发出delete之前,我向ServiceAccount
添加了终结器,然后在PreStop处理程序中等待5秒钟,对ClusterRoleBinding
再次发出delete(再次返回“未经授权”的错误) ,
ServiceAccount
对象,从ServiceAccount
(获得错误的“ error =” finalizer对象不存在”“),因为它无法删除空对象上的终结器。当我使用kubectl时,我发现ServiceAccount
存在但处于” Terminated“状态,而终结器仍处于设置状态。 ServiceAccount
处于"Terminating"
状态,即使尚未硬删除,kube也会撤消访问吗?
是否可以从需要删除的ClusterRoleBinding
中运行的同一进程中删除Namespace
和Namespace
? (鉴于我们要删除的ClusterRoleBinding
授予了应用程序删除Namespace
的权限)
任何帮助将不胜感激!
ClusterRoleBinding
和ServiceAccount
的YAML定义如下:
### ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: creationTimestamp: null name: xyz-myapp-cluster-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: xyz namespace: xyz-myapp ### ServiceAccount apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: null name: xyz namespace: 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 ''"
我在kube群集上创建一个名称空间,然后在该名称空间中安装我的应用程序。该应用程序向服务器发送常规的心跳请求,如果它从服务器收到“删除自己”的响应,则它会...
深入研究kubernetes文档之后,我发现最可靠的方法是: