脚本能自动管理Kubernetes Secret吗?

wen 实用脚本 4

本文目录导读:

脚本能自动管理Kubernetes Secret吗?

  1. 从文件自动创建/更新 Secret
  2. 自动轮换 TLS 证书(Secret 更新)
  3. 使用 Python 脚本(更灵活)
  4. 批量管理(遍历集群或命名空间)
  5. 使用 kubectl patch 进行部分更新(避免覆盖)
  6. CI/CD 集成(GitOps 方式)
  7. 注意事项
  8. 推荐的自动化工具(无需自己写复杂脚本)

是的,脚本可以自动管理 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 示例(使用 pyyamlkubernetes 客户端库)

#!/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 -

注意事项

  1. 权限:运行脚本的 Service Account 需要具备 createupdatepatchdelete Secret 的 RBAC 权限。
  2. 安全永远不要在脚本中硬编码明文密码或密钥,应使用环境变量、Vault 或 CI/CD 的机密变量功能传递。
  3. Base64 编码kubectl create secret 会自动编码,但在使用 patch 或 Python 时,必须在存入 Secret 前对值进行 Base64 编码(echo -n 'value' | base64)。
  4. 更新策略kubectl apply 会完全替换整个 Secret,如果多个脚本同时管理同一个 Secret,可能会互相覆盖,可以使用 kubectl patch 只更新特定键值。
  5. 审计:建议在脚本中增加日志记录。

推荐的自动化工具(无需自己写复杂脚本)

  • 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。

抱歉,评论功能暂时关闭!