如何使用Kustomize或Helm提取K8s ServiceAccount token并创建新Secret
可行方案说明
以下分别提供优先选用的Kustomize方案,以及备选的Helm方案:
优先方案:Kustomize 实现
Kustomize v4.1+内置的ReplacementTransformer可以原生支持资源字段的跨资源引用,完全不需要额外工具,纯声明式即可实现需求。
- 操作步骤
- 首先定义ServiceAccount以及绑定的SA Token Secret(K8s 1.24+版本默认不会自动为SA生成Token Secret,需要显式声明;1.23及更早版本可跳过Secret定义,直接使用集群自动生成的Secret名称即可)
新建sa.yaml文件:
apiVersion: v1 kind: ServiceAccount metadata: name: custom-sa namespace: default --- # K8s 1.24+需要显式创建SA的Token Secret apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: custom-sa-token annotations: kubernetes.io/service-account.name: custom-sa- 新建
kustomization.yaml,使用替换器把SA Token的值注入到目标Secret中:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - sa.yaml # 定义要生成的目标Secret secretGenerator: - name: target-secret literals: - sa_token=PLACEHOLDER # 先写占位符,后续通过替换器注入真实值 replacements: - source: kind: Secret name: custom-sa-token fieldPath: data.token targets: - select: kind: Secret name: target-secret fieldPaths: - data.sa_token- 直接执行
kubectl apply -k .即可一次性完成所有资源创建。
- 首先定义ServiceAccount以及绑定的SA Token Secret(K8s 1.24+版本默认不会自动为SA生成Token Secret,需要显式声明;1.23及更早版本可跳过Secret定义,直接使用集群自动生成的Secret名称即可)
备选方案:Helm 实现
可以通过Helm内置的lookup函数在渲染阶段从集群中读取已经创建的SA Token值,注入到目标Secret中。
注意:
lookup函数依赖集群连接,仅在helm install/upgrade执行时生效,helm template本地渲染无法拿到真实数据。
- 操作步骤
- 在Helm chart的
templates目录下新建sa.yaml定义ServiceAccount:
apiVersion: v1 kind: ServiceAccount metadata: name: {{ .Values.serviceAccount.name }} namespace: {{ .Release.Namespace }} # 可选添加pre-install钩子,保证SA优先于Secret创建 annotations: helm.sh/hook: pre-install helm.sh/hook-weight: "-10" --- # K8s 1.24+需要显式创建SA的Token Secret apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: {{ .Values.serviceAccount.name }}-token namespace: {{ .Release.Namespace }} annotations: kubernetes.io/service-account.name: {{ .Values.serviceAccount.name }} helm.sh/hook: pre-install helm.sh/hook-weight: "-5"- 在
templates目录下新建target-secret.yaml,读取SA Token值注入:
{{- $saName := .Values.serviceAccount.name }} {{- $saToken := (lookup "v1" "Secret" .Release.Namespace (printf "%s-token" $saName)).data.token | default "" }} apiVersion: v1 kind: Secret metadata: name: target-secret namespace: {{ .Release.Namespace }} type: Opaque data: sa_token: {{ $saToken }}- 执行
helm install即可完成部署,如果首次执行没有拿到Token,重新执行一次helm upgrade即可同步。
- 在Helm chart的
内容的提问来源于stack exchange,提问作者kelotich_
相关产品推荐
相关产品推荐

