gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:01:56 25 4
gpt4 key购买 nike

我在 kube 集群上创建了一个 Namespace 并在该 Namespace 中安装我的应用程序。该应用程序定期向服务器发送心跳请求,如果它收到来自服务器的“删除您自己” 响应,它会通过在整个 kube 命名空间上调用 delete 来删除自己。我还通过创建 ClusterRoleBinding、使 ServiceAccount 服从 ClusterRoleBinding 并使用此 运行 pod 来为应用程序集群提供广泛的访问权限服务帐号

问题是我想在应用程序的 self 删除过程中删除 ClusterRoleBinding(如果可能的话)。如果我在此之前删除 ClusterRoleBinding,应用将无法在 Namespace 上执行删除操作,因此这似乎是先有鸡还是先有蛋的问题。有办法做到这一点吗?

这是我已经尝试过但无济于事的方法:

  • 在应用容器中添加了 PreStop 处理程序。所以现在当应用程序在整个命名空间上调用 delete 时,kube 会在终止容器之前调用此处理程序。在此 PreStop 处理程序中,如果我在 ClusterRoleBinding 上调用 delete 之前 sleep 超过 5 秒,我会从 kubernetes 返回“未经授权”响应。

  • 这让我想到,在应用程序有机会删除 ClusterRoleBinding 之前,链接到 ClusterRoleBindingServiceAccount 可能被删除了 在 PreStop 处理程序中。因此,为了对此进行测试,在命名空间上发出删除之前,我向 ServiceAccount 添加了一个终结器,然后在 PreStop 处理程序中等待 5 秒,在 ClusterRoleBinding 上发出删除 < em>(再次返回“未授权”错误), 然后我按名称获取 ServiceAccount 对象(返回“未授权”错误),删除终结器来自 ServiceAccount (get error "error="finalizer doesn't exist for object ''") 因为它无法删除空对象上的终结器。当我使用 kubectl 我发现 ServiceAccount 存在但处于 “终止” 状态,正如预期的那样,终结器仍处于设置状态。

ServiceAccount 处于“终止” 状态时,kube 是否会撤销访问权限,即使它尚未被硬删除?

有没有办法从需要的 Namespace 中运行的同一进程中删除 ClusterRoleBindingNamespace被删除? (鉴于我们要删除的 ClusterRoleBinding 首先授予应用程序删除 Namespace 的权限)

如有任何帮助,我们将不胜感激!

ClusterRoleBindingServiceAccount 的 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 ''"

最佳答案

在深入了解 kubernetes 文档后,我发现最可靠的方法是:

  1. 当应用程序从服务器收到“删除自己”响应时,它使 ClusterRoleBinding 成为应用程序在其中运行的 Namespace 的所有者.
  2. 这可以通过使用补丁在命名空间的 medatadata.owerReferences 下添加 ClusterRoleBinding 来完成。
  3. 一旦 ClusterRoleBinding 成功添加为 Namespace 的所有者,应用程序就可以使用 DeletePropagationBackground< 在 ClusterRoleBinding 上调用 delete/

下面是一个示例,说明如何(在 Golang 中)应用将 ClusterRoleBinding 添加到 NamespaceownerReferences 的补丁。

import (
"encoding/json"
"k8s.io/client-go/kubernetes"
v1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type ownerReferencePatch struct {
Op string `json:"op"`
Path string `json:"path"`
Value []metav1.OwnerReference `json:"value"`
}

func AddClusterRoleBindingOwnerReferenceToNamespace(client kubernetes.Interface, crb *rbacv1.ClusterRoleBinding, ns *v1.Namespace) (*v1.Namespace, error) {
patch, err := json.Marshal([]ownerReferencePatch{
{
Op: "add",
Path: "/metadata/ownerReferences",
Value: []metav1.OwnerReference{
{
APIVersion: crb.RoleRef.APIGroup,
BlockOwnerDeletion: func(in bool) *bool {return &in}(true),
Kind: "ClusterRoleBinding",
Name: crb.GetName(),
UID: crb.GetUID(),
},
},
},
})
if err != nil {
return nil, err
}

return client.CoreV1().Namespaces().Patch(ns.GetName(), types.JSONPatchType, patch)
}

关于kubernetes - 从在 Kubernetes 的同一命名空间中运行的进程中删除 ClusterRoleBinding 和命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60287582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com