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

如何用GitHub Secrets存储Kubernetes密钥?Vault选型及落地求助

从GitHub Secrets到本地Kubernetes集群的密钥使用方案

核心逻辑

你已经完成GitHub Secrets配置,接下来只需通过GitHub Actions(适配GitHub Enterprise)将Secrets同步到本地K8s集群,或在部署时直接注入到K8s资源中即可。

具体实现步骤

1. 让GitHub Actions有权访问本地K8s集群

先在本地K8s中创建具备Secret管理权限的服务账号:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: github-actions-sa
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-manager
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["create", "update", "get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: github-actions-secret-binding
subjects:
- kind: ServiceAccount
  name: github-actions-sa
  namespace: default
roleRef:
  kind: ClusterRole
  name: secret-manager
  apiGroup: rbac.authorization.k8s.io

导出该服务账号的kubeconfig:

kubectl get secret $(kubectl get sa github-actions-sa -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
kubectl config set-cluster local-k8s --server=https://<你的K8s集群API地址> --certificate-authority=ca.crt
kubectl config set-credentials github-actions-sa --token=$(kubectl get secret $(kubectl get sa github-actions-sa -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 -d)
kubectl config set-context github-actions-context --cluster=local-k8s --user=github-actions-sa
kubectl config use-context github-actions-context

将生成的kubeconfig内容存入GitHub Enterprise Secrets(命名为KUBECONFIG)。

2. 用GitHub Actions同步Secrets到K8s

在代码仓库中创建.github/workflows/sync-secrets.yaml流水线文件:

name: Sync GitHub Secrets to Kubernetes
on:
  push:
    branches: [ main ]
  workflow_dispatch:

jobs:
  sync-secrets:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Kubernetes CLI
        uses: azure/setup-kubectl@v3
        with:
          version: 'latest'

      - name: Configure Kubernetes context
        run: |
          echo "${{ secrets.KUBECONFIG }}" > $HOME/.kube/config
          chmod 600 $HOME/.kube/config

      - name: Create/Update Kubernetes Secret
        run: |
          kubectl create secret generic app-secrets \
            --from-literal=DB_USER=${{ secrets.DB_USER }} \
            --from-literal=DB_PASSWORD=${{ secrets.DB_PASSWORD }} \
            --namespace default \
            --dry-run=client -o yaml | kubectl apply -f -

该流水线会在代码推送到main分支或手动触发时,将GitHub Secrets中的DB_USER、DB_PASSWORD同步为K8s集群里的app-secrets Secret。

3. 在K8s Pod中调用Secret

同步完成后,有两种方式在Pod中使用密钥:

  • 环境变量注入:
    apiVersion: v1
    kind: Pod
    metadata:
      name: app-pod
    spec:
      containers:
      - name: app-container
        image: your-app-image
        env:
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: DB_USER
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: DB_PASSWORD
    
  • Volume挂载:
    apiVersion: v1
    kind: Pod
    metadata:
      name: app-pod
    spec:
      volumes:
      - name: secret-volume
        secret:
          secretName: app-secrets
      containers:
      - name: app-container
        image: your-app-image
        volumeMounts:
        - name: secret-volume
          mountPath: /etc/secrets
          readOnly: true
    

挂载后,密钥会以文件形式出现在/etc/secrets/DB_USER和/etc/secrets/DB_PASSWORD路径下。

Vault vs GitHub Secrets选型补充

  • 若需要细粒度权限控制、密钥自动轮转、动态临时凭证生成(如数据库短期密钥),选Vault更合适。
  • 若工作流已深度绑定GitHub Enterprise,且仅需静态密钥同步到K8s,GitHub Secrets + Actions方案更轻量、易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:46:27