本文目录导读:

- 从文件自动创建/更新 Secret
- 自动轮换 TLS 证书(Secret 更新)
- 使用 Python 脚本(更灵活)
- 批量管理(遍历集群或命名空间)
- 使用
kubectl patch进行部分更新(避免覆盖) - CI/CD 集成(GitOps 方式)
- 注意事项
- 推荐的自动化工具(无需自己写复杂脚本)
是的,脚本可以自动管理 Kubernetes Secret,通过结合 kubectl 命令行工具和 Shell、Python 等脚本语言,可以实现 Secret 的创建、更新、删除、备份和同步等自动化操作。
以下是几种常见的自动化管理场景及对应脚本示例:
从文件自动创建/更新 Secret
场景:将配置文件(如 config.json)直接作为 Secret 数据载入。
脚本思路(Bash):
#!/bin/bash
# auto_create_secret.sh
NAMESPACE="default"
SECRET_NAME="my-app-config"
DATA_FILE="config.json"
# 检查 Secret 是否存在,如果存在则删除重建(或使用 kubectl create secret --dry-run=client -o yaml | kubectl apply -f -)
if kubectl get secret $SECRET_NAME -n $NAMESPACE &>/dev/null; then
echo "Secret $SECRET_NAME 已存在,正在更新..."
# 方法1:删除后重建(会短暂丢失,适合非关键场景)
# kubectl delete secret $SECRET_NAME -n $NAMESPACE
# kubectl create secret generic $SECRET_NAME --from-file=$DATA_FILE -n $NAMESPACE
# 方法2:使用 --dry-run 生成 YAML,apply(更平滑)
kubectl create secret generic $SECRET_NAME --from-file=$DATA_FILE -n $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -
else
echo "Secret $SECRET_NAME 不存在,正在创建..."
kubectl create secret generic $SECRET_NAME --from-file=$DATA_FILE -n $NAMESPACE
fi
echo "完成。"
自动轮换 TLS 证书(Secret 更新)
场景:Let's Encrypt 自动更新证书后,需要更新 Ingress 引用的 TLS Secret。
脚本思路(Bash):
#!/bin/bash
# renew_tls_secret.sh
NAMESPACE="default"
SECRET_NAME="my-tls-secret"
# 假设新证书和密钥已经通过 certbot 等工具生成到此目录
CERT_FILE="/etc/letsencrypt/live/example.com/fullchain.pem"
KEY_FILE="/etc/letsencrypt/live/example.com/privkey.pem"
# 使用 tls 类型创建 Secret,apply
kubectl create secret tls $SECRET_NAME --cert=$CERT_FILE --key=$KEY_FILE -n $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -
if [ $? -eq 0 ]; then
echo "TLS Secret $SECRET_NAME 更新成功。"
# 可选:触发关联的 Ingress 或 Deployment 的滚动更新(如果它们不自动监听)
# kubectl rollout restart deployment your-deployment -n $NAMESPACE
else
echo "更新失败。"
fi
使用 Python 脚本(更灵活)
场景:需要从外部 API(如 Vault、AWS Secrets Manager)读取机密,并同步到 Kubernetes。
Python 示例(使用 pyyaml 和 kubernetes 客户端库):
#!/usr/bin/env python3
# sync_secret_from_vault.py
import yaml
from kubernetes import client, config
def sync_secret(secret_name, namespace, data_from_vault):
# 加载集群内或本地 kubeconfig 配置
config.load_incluster_config() # 在 Pod 内运行
# 或 config.load_kube_config() # 在本地运行
api = client.CoreV1Api()
# 构造 Secret 对象
secret_body = client.V1Secret(
metadata=client.V1ObjectMeta(name=secret_name, namespace=namespace),
data={k: v.encode('base64') for k, v in data_from_vault.items()}, # 注意:需要先 base64 编码
type='Opaque'
)
try:
# 尝试更新
api.replace_namespaced_secret(secret_name, namespace, secret_body)
print(f"Secret {secret_name} 更新成功。")
except client.rest.ApiException as e:
if e.status == 404:
# 不存在则创建
api.create_namespaced_secret(namespace, secret_body)
print(f"Secret {secret_name} 创建成功。")
else:
raise
# 模拟从 Vault 获取的数据(实际应调用 Vault API)
vault_data = {"db_password": "supersecret", "api_key": "abc123"}
sync_secret("my-db-creds", "default", vault_data)
批量管理(遍历集群或命名空间)
#!/bin/bash
# 删除所有包含 "test-" 前缀的 Secret
for ns in $(kubectl get ns -o name | cut -d'/' -f2); do
for secret in $(kubectl get secret -n $ns -o name | grep "test-"); do
echo "删除 $secret (在命名空间 $ns 中)"
kubectl delete $secret -n $ns
done
done
使用 kubectl patch 进行部分更新(避免覆盖)
# 直接 patch 一个现有 Secret(数据必须是 base64 编码)
kubectl patch secret my-secret -n default -p='{"data":{"new-key":"'$(echo -n 'new-value' | base64)'"}}'
CI/CD 集成(GitOps 方式)
场景:将加密的 Secret 存入 Git(如使用 Sealed Secrets、SOPS、Helm Secrets),通过 CI/CD 脚本解密并自动应用。
# 使用 sops 解密后 apply sops -d secrets.enc.yaml | kubectl apply -f -
注意事项
- 权限:运行脚本的 Service Account 需要具备
create、update、patch、deleteSecret 的 RBAC 权限。 - 安全:永远不要在脚本中硬编码明文密码或密钥,应使用环境变量、Vault 或 CI/CD 的机密变量功能传递。
- Base64 编码:
kubectl create secret会自动编码,但在使用patch或 Python 时,必须在存入 Secret 前对值进行 Base64 编码(echo -n 'value' | base64)。 - 更新策略:
kubectl apply会完全替换整个 Secret,如果多个脚本同时管理同一个 Secret,可能会互相覆盖,可以使用kubectl patch只更新特定键值。 - 审计:建议在脚本中增加日志记录。
推荐的自动化工具(无需自己写复杂脚本)
- Sealed Secrets:加密 Secret 到 Git 中,自动解密部署。
- External Secrets Operator:从外部源(AWS、GCP、Azure、Vault、1Password等)自动同步 Secret 到 K8s。
- Helm Secrets / Helmfile:管理 Helm Chart 中的 Secret。
- Argo CD / Flux:GitOps 方式,可自动同步 Git 仓库中的 Secret 定义(配合加密方案)。
脚本完全可以胜任自动管理 Secret 的任务,尤其适合简单或临时场景,对于生产环境或复杂的多源管理,建议考虑 Externel Secrets 等专门的 Operator。