如何用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
相关产品推荐
相关产品推荐

