允许 helm hooks(作业)创建 k8s 资源

Allowing helm hooks (jobs) to create k8s resources

我想 运行 预安装 helm hook。

这将 运行 一个使用自定义图像的作业,其入口点将执行以下命令

kubectl create secret generic my-secret --from-literal=foo=bar

可以通过 RBAC 允许此操作吗?

如果是这样,执行此任务需要授予特定 pod/作业的最小权限是什么?

这是可能的,但可能不是最简单的事情。

您可以使用标准 Kubernetes RBAC system 来允许此操作,角色如

# templates/pre-install-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: {{ include "chart.name" . }}-pre-install
  annotations:
    helm.sh/hook: pre-install
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["create"]

但是,该 Role 需要附加到某些东西才能生效,这意味着您还需要创建一个 ServiceAccount 和一个 RoleBinding 以将两者附加在一起:

# templates/pre-install-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "chart.name" . }}-pre-install
  annotations:
    helm.sh/hook: pre-install
# templates/pre-install-service-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: {{ include "chart.name" . }}-pre-install
  annotations:
    helm.sh/hook: pre-install
subjects:
  - kind: ServiceAccount
    namespace: {{ .Release.Namespace }}
    name: {{ include "chart.name" . }}-pre-install
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: {{ include "chart.name" . }}-pre-install

最后,在您的预安装作业中,您需要参考

serviceAccountName: {{ include "chart.name" . }}-pre-install

注意Helm预装hooks 运行,好吧,在安装其他任何东西之前,这意味着我们需要这些辅助授权相关对象到运行 hook的地方,他们也需要标记为预安装挂钩。默认 deletion policy 它们将保持安装状态,直到图表被卸载。

如果您在部署时拥有所需数据,您可能会发现仅在 Helm 图表中创建 Secret 会更简单。