资讯动态

K3s 如何启用 secrets 静态加密并完成 prepare、rotate、reencrypt 密钥轮换流程

发布时间:2026/9/12 8:46:41 来源:尧图企业网站定制
K3s 如何启用 secrets 静态加密并完成 prepare、rotate、reencrypt 密钥轮换流程【免费下载链接】k3sLightweight Kubernetes项目地址: https://gitcode.com/GitHub_Trending/k3/k3s本文面向已部署 K3s 集群的运维人员任务是完成两件事启用 secrets 静态加密encryption at rest并在需要时完成一次完整的加密密钥轮换。轮换支持单 serversqlite和 HA etcd 两种部署形态。整个流程通过k3s server的--secrets-encryption参数和k3s secrets-encrypt子命令完成每一步都有k3s secrets-encrypt status输出的阶段名stage可以作为判断依据。第一步用 --secrets-encryption 启动 server 启用静态加密在 server 节点启动 K3s 时加上--secrets-encryption参数k3s server --secrets-encryption该参数在 server.go 中的说明是 Enable secret encryption at rest。加密 provider 可选k3s server --secrets-encryption --secrets-encryption-provider aescbc--secrets-encryption-provider标记为 experimental有效值为aescbc和secretbox默认是aescbc见 server.go。provider 逻辑上支持 AESCBC、SecretBox 和 Identity 三类其中 Identity 只表示加密开/关遇到 AES-GCM 或 KMS 配置会直接报 unsupported encryption keys found见 config.go。启动完成后用 status 子命令确认加密已生效k3s secrets-encrypt status输出中应包含以下三行下面为示例结果key 名中的年份和阶段名来自测试断言Encryption Status: Enabled Current Rotation Stage: start Server Encryption Hashes: All hashes match如果集群此前从未配置过加密输出会是Encryption Status: Disabled, no configuration file found集成测试中新启用加密的 server 状态是Enabled且阶段为start见 secretsencryption_int_test.go。HA 部署时建议在每台 server 上分别执行 statusServer Encryption Hashes一行显示All hashes match表示各 server 的加密配置哈希一致。执行 prepare → rotate → reencrypt 轮换流程完整流程为prepare→ 重启 server →rotate→ 重启 server →reencrypt见 secrets-encryption-v3.md。两种部署形态的差异只在重启次数单 serversqlite中间各重启一次 serverHA etcd每步之后重启所有k3s server且reencrypt之后还要再重启一次所有 k3s server。1. prepare申请新的加密 keyk3s secrets-encrypt prepare命令成功时输出prepare completed successfully。随后查状态k3s secrets-encrypt status此时Current Rotation Stage变为prepare且 status 会列出 2 把 AES-CBC key当前激活的aescbckey以及新加入的aescbckey-年份集成测试按此断言见 secretsencryption_int_test.go。2. 重启 server单 server 重启该 serverHA etcd 重启所有 k3s server仓库根目录随附 k3s.servicesystemd 部署下即重启 k3s 服务。重启后确认 status 阶段仍为prepare且集群内 Pod 恢复正常。3. rotate切换激活 keyk3s secrets-encrypt rotate成功输出rotate completed successfully。status 中Current Rotation Stage变为rotate且激活 key带*标记变为aescbckey-年份旧 key 退居 inactive测试断言见 secretsencryption_int_test.go。4. 再次重启 server与第 2 步相同单 server 重启一次HA etcd 重启所有 k3s server。重启后 status 阶段为rotate。5. reencrypt用新 key 重加密存量数据k3s secrets-encrypt reencrypt命令返回reencryption started表示任务已提交重加密是后台异步进行的。轮询 status 直到Current Rotation Stage: reencrypt_finished完成后 status 中只剩 1 把 keyaescbckey-年份旧 key 已被移除。HA etcd 部署在此之后再重启一次所有 k3s server这是 secrets-encryption-v3.md 中 HA etcd 流程的第 6 步。可选分支rotate-keys 一步轮换如果 K3s 版本较新可以不走上面 5 步流程。k3s secrets-encrypt rotate-keys会动态轮换 key 并自动完成重加密按 secrets-encryption-v3.md 的版本计划v1.28 起引入标记为 experimentalv1.29 起 GA同时prepare、rotate、reencrypt被标记为 deprecated执行时会给出警告并建议使用rotate-keys最终在 v1.32 或 v1.33 执行时变为致命错误v1.34 从代码中移除。rotate-keys的流程单 serversqlite只需在 server 上执行一次k3s secrets-encrypt rotate-keysHA etcd执行rotate-keys后仍需重启所有 k3s server。e2e 测试展示了 HA 3 server 场景下的状态演变在 server 0 上执行rotate-keys后该节点阶段会到达reencrypt_finished其余节点停留在start且Server Encryption Hashes显示hash does not match重启全部 server 后所有节点都达到reencrypt_finished且All hashes match见 secretsencryption_test.go。也就是说HA 部署中 hashes 短暂不一致是轮换过程中的正常现象以最终全部节点 hash 一致作为完成判据。命令参数说明secrets-encrypt各子命令status、enable、disable、prepare、rotate、reencrypt、rotate-keys在 secrets_encrypt.go 中定义常用参数-d/--data-dir数据目录。如果你用非默认目录启动 server执行子命令时必须带上同一目录例如k3s secrets-encrypt status -d /tmp/k3sse集成测试即如此使用--server/-s要连接的 server默认https://127.0.0.1:6443可用环境变量K3S_URL覆盖--tokenserver token。不带时命令会读取数据目录下的token文件-f/--force强制当前阶段prepare、rotate、reencrypt支持--skipreencrypt专用跳过移除旧 key-o/--outputstatus专用取值text默认或json。另外两个与开关相关的子命令k3s secrets-encrypt enable/disable输出secrets-encryption enabled/secrets-encryption disabled。关闭加密后如需把存量数据恢复为明文存储集成测试中的做法是k3s secrets-encrypt disable k3s secrets-encrypt reencrypt -f --skip然后重启 serverstatus 应显示Encryption Status: Disabled见 secretsencryption_int_test.go。注意--skip的用途是跳过移除旧 key-f用于强制该阶段两者在此组合中用于在已禁用状态下触发 reencrypt。边界与限制加密 provider 仅限aescbc和secretbox且该参数仍标记为 experimental轮换期间 HA etcd 各 server 的加密哈希短暂不一致属于流程中间状态不要据此判断失败每步都以 status 的阶段名作为判断依据而不是命令是否无报错返回start→prepare→rotate→reencrypt_finished旧命令的退役时间表以 secrets-encryption-v3.md 为准升级到 v1.32/v1.33 时不要再依赖prepare/rotate/reencrypt单独执行。【免费下载链接】k3sLightweight Kubernetes项目地址: https://gitcode.com/GitHub_Trending/k3/k3s创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价