- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 kube 集群上创建了一个 Namespace
并在该 Namespace 中安装我的应用程序。该应用程序定期向服务器发送心跳请求,如果它收到来自服务器的“删除您自己” 响应,它会通过在整个 kube 命名空间上调用 delete 来删除自己。我还通过创建 ClusterRoleBinding
、使 ServiceAccount
服从 ClusterRoleBinding
并使用此 运行 pod 来为应用程序集群提供广泛的访问权限服务帐号
。
问题是我想在应用程序的 self 删除过程中删除 ClusterRoleBinding
(如果可能的话)。如果我在此之前删除 ClusterRoleBinding
,应用将无法在 Namespace
上执行删除操作,因此这似乎是先有鸡还是先有蛋的问题。有办法做到这一点吗?
这是我已经尝试过但无济于事的方法:
在应用容器中添加了 PreStop 处理程序。所以现在当应用程序在整个命名空间上调用 delete 时,kube 会在终止容器之前调用此处理程序。在此 PreStop 处理程序中,如果我在 ClusterRoleBinding
上调用 delete 之前 sleep 超过 5 秒,我会从 kubernetes 返回“未经授权”响应。
这让我想到,在应用程序有机会删除 ClusterRoleBinding 之前,链接到
在 PreStop 处理程序中。因此,为了对此进行测试,在命名空间上发出删除之前,我向 ClusterRoleBinding
的 ServiceAccount
可能被删除了ServiceAccount
添加了一个终结器,然后在 PreStop 处理程序中等待 5 秒,在 ClusterRoleBinding
上发出删除 < em>(再次返回“未授权”错误), 然后我按名称获取 ServiceAccount
对象(返回“未授权”错误),删除终结器来自 ServiceAccount
(get error "error="finalizer doesn't exist for object ''") 因为它无法删除空对象上的终结器。当我使用 kubectl 我发现 ServiceAccount
存在但处于 “终止” 状态,正如预期的那样,终结器仍处于设置状态。
当 ServiceAccount
处于“终止”
状态时,kube 是否会撤销访问权限,即使它尚未被硬删除?
有没有办法从需要的 Namespace
中运行的同一进程中删除 ClusterRoleBinding
和 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 ''"
最佳答案
在深入了解 kubernetes 文档后,我发现最可靠的方法是:
ClusterRoleBinding
成为应用程序在其中运行的 Namespace
的所有者.medatadata.owerReferences
下添加 ClusterRoleBinding
来完成。ClusterRoleBinding
成功添加为 Namespace
的所有者,应用程序就可以使用 DeletePropagationBackground< 在 ClusterRoleBinding
上调用 delete/
。下面是一个示例,说明如何(在 Golang 中)应用将 ClusterRoleBinding
添加到 Namespace
的 ownerReferences
的补丁。
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/
I am getting the below error where i creating the kubernetes cluster on AWS below are the files a
我有以下内容: apiVersion: v1 kind: ServiceAccount metadata: name: SomeServiceAccount kind: ClusterRole a
我使用 Keycloak 作为我的 kubernetes 身份提供者。我正在使用 kubelogin 来获取 token 。 token 似乎有效,但我收到以下错误。我认为 ClusterRoleBi
我正在尝试使用 ClusterRoleBinding 授予 Kubernetes ServiceAccount 集群管理员角色: apiVersion: v1 kind: ServiceAccount
在 kubernetes 中,有没有办法找到 RoleBinding/ClusterRoleBinding与 serviceAccount 相关而不遍历所有绑定(bind)? 这在尝试解决与 Pod
我在 kube 集群上创建了一个 Namespace 并在该 Namespace 中安装我的应用程序。该应用程序定期向服务器发送心跳请求,如果它收到来自服务器的“删除您自己” 响应,它会通过在整个 k
这是我现有的集群角色绑定(bind) apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: nam
这是我现有的集群角色绑定(bind) apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: nam
为什么我们要在这个定义中一遍遍地写apiGroup键,如果每次都一样: kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metad
在 installation guide在 Google Kubernetes Engine 上设置 NGINX Ingress,您必须运行以下命令来生成 clusterrolebinding : k
我正在尝试部署 Kubernetes Web UI,如下所述:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-da
我是一名优秀的程序员,十分优秀!