1. 概述

在 Kubernetes 中,Secret 是用于安全存储敏感信息(如密码、OAuth Token、SSH 密钥等)的资源对象。本文将介绍如何使用 kubectl 命令以多种方式更新 Secret,包括编辑、打补丁、替换、应用 YAML 清单等。

2. 环境准备

在开始之前,确保以下环境已经就绪:

  • Kubernetes 集群已安装并运行
  • kubectl 已安装,并能与集群正常通信

3. 更新 Kubernetes Secret

Kubernetes 提供了两种操作方式:

  • 命令式(Imperative):明确告诉 Kubernetes 要做什么,例如 kubectl editkubectl patchkubectl replace
  • 声明式(Declarative):定义期望状态,由 Kubernetes 自动达成目标状态,如 kubectl apply

更新 Secret 的常见方式包括:

  • 编辑现有 Secret
  • 对 Secret 打补丁
  • 替换整个 Secret
  • 使用 YAML 清单 apply
  • 使用 JSON Merge Patch
  • 使用插件简化操作

下面我们将逐一介绍这些方式。

3.1. 创建 Secret

首先,我们创建一个名为 application-configuration 的 Secret,内容如下:

apiVersion: v1
kind: Secret
metadata:
  name: application-configuration
type: Opaque
data:
  database-username: user
  database-password: pass

使用以下命令创建 Secret:

$ kubectl create -f application-configuration.yaml

✅ 小贴士:Secret 中的 data 字段要求值必须是 Base64 编码。如果你希望使用明文字符串,可以改用 stringData 字段,Kubernetes 会自动进行编码。

3.2. 编辑 Secret

使用 kubectl edit 可以直接编辑 Secret 内容。该命令会调用系统默认编辑器(如 Vim、Nano),编辑保存后自动生效。

$ kubectl edit secret application-configuration

你可以通过设置 KUBE_EDITOR 环境变量来指定编辑器:

$ export KUBE_EDITOR="nano"

⚠️ 踩坑提醒:编辑时务必确认字段格式为 Base64,否则可能导致数据异常。

3.3. 打补丁更新 Secret

使用 kubectl patch 可以对 Secret 的特定字段进行增量更新,而不影响其他字段。

$ kubectl patch secret application-configuration -p '{"data": {"database-password": "newpass"}}'

该命令会将 database-password 更新为 newpass(注意:该值需为 Base64 编码)。

3.4. 替换整个 Secret

使用 kubectl replace 可以用新的 YAML 文件完全替换现有 Secret。新文件必须包含相同的名称,否则会报错。

新建 application-configuration-new.yaml

{
  "apiVersion": "v1",
  "kind": "Secret",
  "metadata": {
    "name": "application-configuration"
  },
  "type": "Opaque",
  "data": {
    "username": "newuser",   
    "password": "newpass"  
  }
}

执行替换:

$ kubectl replace -f application-configuration-new.yaml

⚠️ 踩坑提醒:replace 会覆盖整个资源,原有字段若未在新配置中声明将被删除。

3.5. 使用 apply 更新 Secret

kubectl apply 是声明式更新方式的代表,通过 YAML 文件定义期望状态,Kubernetes 自动完成更新。

修改 application-configuration.yaml 后执行:

$ kubectl apply -f application-configuration.yaml

✅ 推荐做法:适用于 CI/CD 管理 Secret 的场景,推荐使用 apply 命令。

3.6. 使用 JSON Merge Patch

除了直接 patch JSON 对象,也可以使用 JSON Patch 格式进行字段级更新:

$ kubectl patch secret application-configuration --type='json' -p='[{"op": "replace", "path": "/data/database-password", "value": "newpass"}]'

这种方式更精确,适合自动化脚本使用。

3.7. 使用插件更新 Secret

使用 kubectl-modify-secret 插件可以更方便地编辑 Secret,无需手动处理 Base64 编码。

安装步骤如下:

  1. 安装 Krew(Kubernetes 插件管理器)
$ (
  set -x; cd "$(mktemp -d)" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.{tar.gz,yaml}" &&
  tar zxpf krew.tar.gz &&
  KREW=./krew-"$(uname | tr '[:upper:]' '[:lower:]')_amd64" &&
  "$KREW" install --manifest=krew.yaml --archive=krew.tar.gz &&
  echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> ~/.bashrc &&
  source ~/.bashrc
)
  1. 安装 kubectl-modify-secret 插件
$ kubectl krew install modify-secret
  1. 使用插件编辑 Secret
$ kubectl modify-secret application-configuration

✅ 插件优势:自动解码 Base64,编辑体验更友好,适合频繁修改 Secret 的场景。

4. 总结

本文详细介绍了在 Kubernetes 中更新 Secret 的多种方式:

方法 适用场景 是否影响其他字段
kubectl edit 快速修改单个 Secret
kubectl patch 局部更新,适合脚本自动化
kubectl replace 完全替换旧配置,适合结构变更
kubectl apply 声明式更新,适合 CI/CD 流程
JSON Merge Patch 精准更新字段,适合自动化脚本
插件方式 快速编辑,无需处理 Base64 编码

根据实际需求选择合适的更新方式,有助于提升运维效率和保障安全。Secret 是 Kubernetes 安全体系的重要组成部分,合理使用这些命令,能让你更好地管理敏感数据。


原始标题:Managing Secrets in Kubernetes: Updating With kubectl