k3s secrets-encrypt
K3s 支持启用静态加密密钥。有关更多信息,请参阅密钥加密。
密钥加密工具
自v1.21.8+k3s1起可用
K3s 包含一个 CLI 工具 secrets-encrypt
,它可以自动控制以下内容:
- 禁用/启用密钥加密
- 添加新的加密密钥
- 轮换和删除加密密钥
- 重新加密密钥
不按照轮换加密密钥的正确程序操作可能会导致您的集群永久损坏。请谨慎操作。
新的密钥轮换(实验性)
自v1.28.1+k3s1起可用。此新版本的工具利用了 K8s 自动配置重新加载,该功能目前处于测试阶段。预计将在 v1.29.0 中正式发布。
对于较旧的版本,请参阅经典密钥轮换
- 单服务器
- 高可用性
要轮换单服务器集群上的密钥,请执行以下操作:
-
使用标志
--secrets-encryption
启动 K3s 服务器。注意目前不支持在没有加密的情况下启动 K3s,并在稍后启用加密。
-
轮换密钥
k3s secrets-encrypt rotate-keys
-
等待重新加密完成。监视服务器日志,或等待
$ k3s secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: reencrypt_finished
要轮换高可用性设置上的密钥,请执行以下操作:
-
使用
--secrets-encryption
标志启动所有三个 K3s 服务器。为简洁起见,服务器将分别称为 S1、S2、S3。注意目前不支持在没有加密的情况下启动 K3s,并在稍后启用加密。
-
轮换 S1 上的密钥
k3s secrets-encrypt rotate-keys
-
等待重新加密完成。监视服务器日志,或等待
$ k3s secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: reencrypt_finished信息K3s 将以每秒约 5 个密钥的速度重新加密密钥。包含大量密钥的集群可能需要几分钟才能重新加密。您可以在服务器日志中跟踪进度。
-
使用相同的参数重新启动 S1 上的 K3s。如果以服务的形式运行 K3s,则
# If using systemd
systemctl restart k3s
# If using openrc
rc-service k3s restart -
S1 启动后,重新启动 S2 和 S3 上的 K3s。
经典密钥轮换
- 单服务器
- 高可用性
要轮换单服务器集群上的密钥,请执行以下操作:
-
使用标志
--secrets-encryption
启动 K3s 服务器。注意目前不支持在没有加密的情况下启动 K3s,并在稍后启用加密。
-
准备
k3s secrets-encrypt prepare
-
使用相同的参数停止并重新启动 K3s 服务器。如果以服务的形式运行 K3s,则
# If using systemd
systemctl restart k3s
# If using openrc
rc-service k3s restart -
轮换
k3s secrets-encrypt rotate
-
使用相同的参数停止并重新启动 K3s 服务器。
-
重新加密
信息K3s 将以每秒约 5 个密钥的速度重新加密密钥。
包含大量密钥的集群可能需要几分钟才能重新加密。k3s secrets-encrypt reencrypt
嵌入式数据库和外部数据库集群的步骤相同。
要轮换高可用性设置上的密钥,请执行以下操作:
-
使用
--secrets-encryption
标志启动所有三个 K3s 服务器。为简洁起见,服务器将分别称为 S1、S2、S3。注释- 目前不支持在没有加密的情况下启动 K3s,并在稍后启用加密。
- 虽然不是必需的,但建议您选择一个服务器节点来运行
secrets-encrypt
命令。
-
在 S1 上准备
k3s secrets-encrypt prepare
-
使用相同的参数停止并重新启动 S1。如果以服务的形式运行 K3s,则
# If using systemd
systemctl restart k3s
# If using openrc
rc-service k3s restart -
S1 启动后,停止并重新启动 S2 和 S3。
-
在 S1 上轮换
k3s secrets-encrypt rotate
-
使用相同的参数停止并重新启动 S1。
-
S1 启动后,停止并重新启动 S2 和 S3。
-
在 S1 上重新加密
信息K3s 将以每秒约 5 个密钥的速度重新加密密钥。
包含大量密钥的集群可能需要几分钟才能重新加密。k3s secrets-encrypt reencrypt
-
使用相同的参数停止并重新启动 S1。
-
S1 启动后,停止并重新启动 S2 和 S3。
禁用/重新启用密钥加密
- 单服务器
- 高可用性
使用 --secrets-encryption
标志启动服务器后,可以禁用密钥加密。
要在单节点集群上禁用密钥加密,请执行以下操作:
-
禁用
k3s secrets-encrypt disable
-
使用相同的参数停止并重新启动 K3s 服务器。如果以服务的形式运行 K3s,则
# If using systemd
systemctl restart k3s
# If using openrc
rc-service k3s restart -
使用标志重新加密
k3s secrets-encrypt reencrypt --force --skip
要在单节点集群上重新启用密钥加密,请执行以下操作:
-
启用
k3s secrets-encrypt enable
-
使用相同的参数停止并重新启动 K3s 服务器。
-
使用标志重新加密
k3s secrets-encrypt reencrypt --force --skip
使用 --secrets-encryption
标志启动高可用性集群后,可以禁用密钥加密。
虽然不是必需的,但建议您选择一个服务器节点来运行 secrets-encrypt
命令。
为简洁起见,本指南中使用的三个服务器将分别称为 S1、S2、S3。
要在高可用性集群上禁用密钥加密,请执行以下操作:
-
在 S1 上禁用
k3s secrets-encrypt disable
-
使用相同的参数停止并重新启动 S1。如果以服务的形式运行 K3s,则
# If using systemd
systemctl restart k3s
# If using openrc
rc-service k3s restart -
S1 启动后,停止并重新启动 S2 和 S3。
-
在 S1 上使用标志重新加密
k3s secrets-encrypt reencrypt --force --skip
要在高可用性集群上重新启用密钥加密,请执行以下操作:
-
在 S1 上启用
k3s secrets-encrypt enable
-
使用相同的参数停止并重新启动 S1。
-
S1 启动后,停止并重新启动 S2 和 S3。
-
在 S1 上使用标志重新加密
k3s secrets-encrypt reencrypt --force --skip
密钥加密状态
secrets-encrypt 工具包含一个 status
命令,该命令显示有关节点上密钥加密当前状态的信息。
单服务器节点上的命令示例:
$ k3s secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: start
Server Encryption Hashes: All hashes match
Active Key Type Name
------ -------- ----
* AES-CBC aescbckey
另一个高可用性集群的示例,在轮换密钥后但重新启动服务器之前:
$ k3s secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: rotate
Server Encryption Hashes: hash does not match between node-1 and node-2
Active Key Type Name
------ -------- ----
* AES-CBC aescbckey-2021-12-10T22:54:38Z
AES-CBC aescbckey
每个部分的详细信息如下:
- 加密状态:显示节点上是否禁用了或启用了密钥加密。
- 当前轮换阶段:指示节点上的当前轮换阶段。
阶段包括:start
、prepare
、rotate
、reencrypt_request
、reencrypt_active
、reencrypt_finished
- 服务器加密哈希值:对于高可用性集群很有用,它指示所有服务器的本地文件是否处于相同的阶段。这可以用来识别在继续执行下一个阶段之前是否需要重新启动服务器。在上面的高可用性示例中,节点 1 和节点 2 的哈希值不同,表示它们当前没有相同的加密配置。重新启动服务器将同步其配置。
- 密钥表:汇总有关节点上找到的密钥加密密钥的信息。
- 活动:"*" 表示哪些(如果有)密钥当前用于密钥加密。活动密钥由 Kubernetes 用于加密任何新的密钥。
- 密钥类型:使用此工具的所有密钥均为
AES-CBC
类型。更多信息请参阅此处。 - 名称:加密密钥的名称。