本文目录导读:

- 从文件自动创建/更新 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。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播