You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Kustomize或Helm提取K8s ServiceAccount token并创建新Secret

可行方案说明

以下分别提供优先选用的Kustomize方案,以及备选的Helm方案:


优先方案:Kustomize 实现

Kustomize v4.1+内置的ReplacementTransformer可以原生支持资源字段的跨资源引用,完全不需要额外工具,纯声明式即可实现需求。

  • 操作步骤
    1. 首先定义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
    
    1. 新建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
    
    1. 直接执行kubectl apply -k .即可一次性完成所有资源创建。

备选方案:Helm 实现

可以通过Helm内置的lookup函数在渲染阶段从集群中读取已经创建的SA Token值,注入到目标Secret中。

注意:lookup函数依赖集群连接,仅在helm install/upgrade执行时生效,helm template本地渲染无法拿到真实数据。

  • 操作步骤
    1. 在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"
    
    1. 在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 }}
    
    1. 执行helm install即可完成部署,如果首次执行没有拿到Token,重新执行一次helm upgrade即可同步。

内容的提问来源于stack exchange,提问作者kelotich_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:54:01