在 Helm delete 上删除 Kubernetes secret
Delete Kubernetes secret on Helm delete
当通过 pre-install
钩子执行 helm install
时,我正在创建一些秘密。
一切正常。然而,当执行 helm delete
时,创建的秘密不会被删除。这是因为使用 pre-install
安装的任何资源都被认为是自我管理的。所以我读到这可以使用 post-delete
钩子来完成。
所以问题是:
如何在 post 删除中删除密文?
如果我们删除 pre-install
钩子,那么删除就可以了。但是当我们执行 helm install
?
时,如何保证在 pods 甚至创建之前创建秘密
Tiller 按特定顺序创建资源(在此处的源代码中找到它:https://github.com/kubernetes/helm/blob/master/pkg/tiller/kind_sorter.go#L26)
因此对于这个特定的用户案例,不需要钩子或任何其他机制,只需包含您的秘密和您的 pods 魔法就会发生 ;)
也就是说,预安装 对象仍然存在问题。文档指出这是所需的行为:
Practically speaking, this means that if you create resources in a
hook, you cannot rely upon helm delete to remove the resources. To
destroy such resources, you need to either write code to perform this
operation in a pre-delete or post-delete hook or add
"helm.sh/hook-delete-policy" annotation to the hook template file.
唯一的解决方案是在图表中添加一个作业,使用 post-delete 挂钩,删除那些资源。
您可以使用任何安装了 kubectl 的图像通过预删除钩子删除它,就像提到的 @ignacio-millán 一样。为此,您还需要一个角色来 运行 此作业的特权,以便它可以删除机密。
或者您可以只使用 K8s REST API 并像这样卷曲它:
apiVersion: batch/v1
kind: Job
metadata:
labels:
annotations:
"helm.sh/hook": pre-delete # << run before delete (we still need the role)
...
spec:
template:
spec:
serviceAccountName: your-privileged-serviceaccount
automountServiceAccountToken: true
# this will mount var/run/secrets/kubernetes.io/serviceaccount/token
containers:
- name: pre-delete
image: "appropriate/curl" # alpine + curl (3 MB)
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
command:
- "/bin/sh"
- "-ec"
- |
curl -s -X DELETE -k https://kubernetes.default.svc/api/v1/namespaces/${NAMESPACE}/secrets/your-secret-name-nere \
-H "Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token )" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{ \"kind\": \"Secret\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"your-secret-name-nere\", \"namespace\": \"${NAMESPACE}\" } }" > /dev/null
{{- end }}
我们需要 "RoleBind" 一个具有 Role(或 clusterRole)的 ServiceAccount。使用 helm.sh/hook-weight 来订购所有这些。
该角色应该是这样的:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role # Roles works only in namespace vs ClusterRole works in all the cluster (warning!)
metadata:
namespace: {{ .Release.Namespace }}
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "20"
"helm.sh/hook-delete-policy": before-hook-creation
labels:
....
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list", "create", "update"]
请注意,我们使用 > /dev/null 将 curl 输出转发到 null,我们不希望在日志中出现这种情况。 ;) 对此进行评论并 "helm.sh/hook-delete-policy" 进行调试。
这里正在进行一项工作,这里应用了类似的东西:
https://github.com/Flag5/consul-helm/tree/tls-encryption/templates
查看 tls-*.yaml 文件。
希望对您有所帮助:)
您可以添加此行。
"helm.sh/hook-delete-policy": "hook-succeeded"
当通过 pre-install
钩子执行 helm install
时,我正在创建一些秘密。
一切正常。然而,当执行 helm delete
时,创建的秘密不会被删除。这是因为使用 pre-install
安装的任何资源都被认为是自我管理的。所以我读到这可以使用 post-delete
钩子来完成。
所以问题是:
如何在 post 删除中删除密文?
如果我们删除
pre-install
钩子,那么删除就可以了。但是当我们执行helm install
? 时,如何保证在 pods 甚至创建之前创建秘密
Tiller 按特定顺序创建资源(在此处的源代码中找到它:https://github.com/kubernetes/helm/blob/master/pkg/tiller/kind_sorter.go#L26)
因此对于这个特定的用户案例,不需要钩子或任何其他机制,只需包含您的秘密和您的 pods 魔法就会发生 ;)
也就是说,预安装 对象仍然存在问题。文档指出这是所需的行为:
Practically speaking, this means that if you create resources in a hook, you cannot rely upon helm delete to remove the resources. To destroy such resources, you need to either write code to perform this operation in a pre-delete or post-delete hook or add "helm.sh/hook-delete-policy" annotation to the hook template file.
唯一的解决方案是在图表中添加一个作业,使用 post-delete 挂钩,删除那些资源。
您可以使用任何安装了 kubectl 的图像通过预删除钩子删除它,就像提到的 @ignacio-millán 一样。为此,您还需要一个角色来 运行 此作业的特权,以便它可以删除机密。
或者您可以只使用 K8s REST API 并像这样卷曲它:
apiVersion: batch/v1
kind: Job
metadata:
labels:
annotations:
"helm.sh/hook": pre-delete # << run before delete (we still need the role)
...
spec:
template:
spec:
serviceAccountName: your-privileged-serviceaccount
automountServiceAccountToken: true
# this will mount var/run/secrets/kubernetes.io/serviceaccount/token
containers:
- name: pre-delete
image: "appropriate/curl" # alpine + curl (3 MB)
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
command:
- "/bin/sh"
- "-ec"
- |
curl -s -X DELETE -k https://kubernetes.default.svc/api/v1/namespaces/${NAMESPACE}/secrets/your-secret-name-nere \
-H "Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token )" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{ \"kind\": \"Secret\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"your-secret-name-nere\", \"namespace\": \"${NAMESPACE}\" } }" > /dev/null
{{- end }}
我们需要 "RoleBind" 一个具有 Role(或 clusterRole)的 ServiceAccount。使用 helm.sh/hook-weight 来订购所有这些。 该角色应该是这样的:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role # Roles works only in namespace vs ClusterRole works in all the cluster (warning!)
metadata:
namespace: {{ .Release.Namespace }}
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "20"
"helm.sh/hook-delete-policy": before-hook-creation
labels:
....
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list", "create", "update"]
请注意,我们使用 > /dev/null 将 curl 输出转发到 null,我们不希望在日志中出现这种情况。 ;) 对此进行评论并 "helm.sh/hook-delete-policy" 进行调试。
这里正在进行一项工作,这里应用了类似的东西:
https://github.com/Flag5/consul-helm/tree/tls-encryption/templates 查看 tls-*.yaml 文件。
希望对您有所帮助:)
您可以添加此行。
"helm.sh/hook-delete-policy": "hook-succeeded"