From 1f4a6192173d4afcb438b40c0b669054db3da530 Mon Sep 17 00:00:00 2001 From: "xin.li" Date: Sat, 16 Dec 2023 22:43:56 +0800 Subject: [PATCH] [zh-cn] sync resource-bin-packing create-cluster-kubeadm encrypt-data Signed-off-by: xin.li --- .../resource-bin-packing.md | 23 +- .../tools/kubeadm/create-cluster-kubeadm.md | 50 ++- .../tasks/administer-cluster/encrypt-data.md | 365 ++++++++++++++---- 3 files changed, 337 insertions(+), 101 deletions(-) diff --git a/content/zh-cn/docs/concepts/scheduling-eviction/resource-bin-packing.md b/content/zh-cn/docs/concepts/scheduling-eviction/resource-bin-packing.md index 638ffb975c70f..bf47d6b5569e8 100644 --- a/content/zh-cn/docs/concepts/scheduling-eviction/resource-bin-packing.md +++ b/content/zh-cn/docs/concepts/scheduling-eviction/resource-bin-packing.md @@ -43,7 +43,7 @@ To set the `MostAllocated` strategy for the `NodeResourcesFit` plugin, use a 可以使用一个类似于下面这样的[调度器配置](/zh-cn/docs/reference/scheduling/config/): ```yaml -apiVersion: kubescheduler.config.k8s.io/v1beta3 +apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - pluginConfig: @@ -64,10 +64,10 @@ profiles: 要进一步了解其它参数及其默认配置,请参阅 -[`NodeResourcesFitArgs`](/zh-cn/docs/reference/config-api/kube-scheduler-config.v1beta3/#kubescheduler-config-k8s-io-v1beta3-NodeResourcesFitArgs) +[`NodeResourcesFitArgs`](/zh-cn/docs/reference/config-api/kube-scheduler-config.v1/#kubescheduler-config-k8s-io-v1-NodeResourcesFitArgs) 的 API 文档。 要进一步了解其它参数及其默认配置,可以参阅 -[`NodeResourcesFitArgs`](/zh-cn/docs/reference/config-api/kube-scheduler-config.v1beta3/#kubescheduler-config-k8s-io-v1beta3-NodeResourcesFitArgs) +[`NodeResourcesFitArgs`](/zh-cn/docs/reference/config-api/kube-scheduler-config.v1/#kubescheduler-config-k8s-io-v1-NodeResourcesFitArgs) 的 API 文档。 -kubeadm 对 `admin.conf` 中的证书进行签名时,将其配置为 -`Subject: O = system:masters, CN = kubernetes-admin`。 -`system:masters` 是一个例外的、超级用户组,可以绕过鉴权层(例如 RBAC)。 -不要将 `admin.conf` 文件与任何人共享,应该使用 `kubeadm kubeconfig user` -命令为其他用户生成 kubeconfig 文件,完成对他们的定制授权。 -更多细节请参见[为其他用户生成 kubeconfig 文件](/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs#kubeconfig-additional-users)。 +The kubeconfig file `admin.conf` that `kubeadm init` generates contains a certificate with +`Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin`. The group `kubeadm:cluster-admins` +is bound to the built-in `cluster-admin` ClusterRole. +Do not share the `admin.conf` file with anyone. +--> +`kubeadm init` 生成的 kubeconfig 文件 `admin.conf` +包含一个带有 `Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin` 的证书。 +`kubeadm:cluster-admins` 组被绑定到内置的 `cluster-admin` ClusterRole 上。 +不要与任何人共享 `admin.conf` 文件。 + + +`kubeadm init` 生成另一个 kubeconfig 文件 `super-admin.conf`, +其中包含带有 `Subject: O = system:masters, CN = kubernetes-super-admin` 的证书。 +`system:masters` 是一个紧急访问、超级用户组,可以绕过授权层(例如 RBAC)。 +不要与任何人共享 `super-admin.conf` 文件,建议将其移动到安全位置。 + + +有关如何使用 `kubeadm kubeconfig user` 为其他用户生成 kubeconfig +文件,请参阅[为其他用户生成 kubeconfig 文件](/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs#kubeconfig-additional-users)。 {{< /warning >}} 例子: * kubeadm 的版本为 {{< skew currentVersion >}}。 -* 主机上的 kubelet 必须为 {{< skew currentVersion >}} 或者 {{< skew currentVersionAddMinor -1 >}}。 +* 主机上的 kubelet 必须为 {{< skew currentVersion >}}、{{< skew currentVersionAddMinor -1 >}}、 + {{< skew currentVersionAddMinor -2 >}} 或 {{< skew currentVersionAddMinor -3 >}}。 -```yaml + + + +{{< highlight yaml "linenos=false,hl_lines=2-5" >}} --- # # 注意:这是一个示例配置。请勿将其用于你自己的集群! @@ -174,7 +177,7 @@ resources: keys: - name: key3 secret: c2VjcmV0IGlzIHNlY3VyZSwgSSB0aGluaw== -``` +{{< /highlight >}} 通过数据加密密钥(DEK)使用 AES-GCM 加密数据; DEK 根据 Key Management Service(KMS)中的配置通过密钥加密密钥(Key Encryption Keys,KEK)加密。 - Kubernetes 默认在 API 服务器启动时生成一个新的 DEK, - 然后重复使用该密钥进行资源加密。然而,如果你使用 KMS v2 并且启用了 `KMSv2KDF` - [特性门控](/zh-cn/docs/reference/command-line-tools-reference/feature-gates/), - 则 Kubernetes 将转为基于秘密的种子数为每次加密生成一个新的 DEK。 - 无论你配置哪种方法,每当 KEK 轮换时,DEK 或种子也会轮换。 - 如果使用第三方工具进行密钥管理,会是一个不错的选择。 - 从 `v1.27` 开始,该功能处于 Beta 阶段。 + Kubernetes 基于秘密的种子数为每次加密生成一个新的 DEK。 + 每当 KEK 轮换时,种子也会轮换。 + 如果使用第三方工具进行密钥管理,这是一个不错的选择。 + 从 `v1.29` 开始,该功能处于稳定阶段。
使用封套加密会依赖于密钥加密密钥,此密钥不存储在 Kubernetes 中。 -就 KMS 而言,如果攻击者意图未经授权地访问明文值,则需要同时入侵 etcd **和** 第三方 KMS 提供程序。 +就 KMS 而言,如果攻击者意图未经授权地访问明文值,则需要同时入侵 etcd +**和**第三方 KMS 提供程序。 + + +### 保护加密密钥 {#protection-for-encryption-keys} + +你应该采取适当的措施来保护允许解密的机密信息,无论是本地加密密钥还是允许 +API 服务器调用 KMS 的身份验证令牌。 + + +即使你依赖提供商来管理主加密密钥(或多个密钥)的使用和生命周期, +你仍然有责任确保托管加密服务的访问控制和其他安全措施满足你的安全需求。 + + +## 加密你的数据 {#encrypting-your-data} + +### 生成加密密钥 {#generate-key-no-kms} + + +以下步骤假设你没有使用 KMS,因此这些步骤还假设您需要生成加密密钥。 +如果你已有加密密钥,请跳至[编写加密配置文件](#write-an-encryption-configuration-file)。 + +{{< caution >}} + +与不加密相比,将原始加密密钥存储在 EncryptionConfig 中只能适度改善你的安全状况。 + + +为了获得额外的保密性,请考虑使用 `kms` 提供程序,因为这依赖于 Kubernetes +集群外部保存的密钥。`kms` 的实现可以与硬件安全模块或由云提供商管理的加密服务配合使用。 + + +要了解如何使用 KMS 设置静态加密,请参阅[使用 KMS 提供程序进行数据加密](/zh-cn/docs/tasks/administer-cluster/kms-provider/)。 +你使用的 KMS 提供程序插件可能还附带其他特定文档。 +{{< /caution >}} + + +首先生成新的加密密钥,然后使用 base64 对其进行编码: + +{{< tabs name="generate_encryption_key" >}} +{{% tab name="Linux" %}} + +生成 32 字节随机密钥并对其进行 base64 编码。你可以使用这个命令: + +```shell +head -c 32 /dev/urandom | base64 +``` + + +如果你想使用 PC 的内置硬件熵源,可以使用 `/dev/hwrng` 而不是 `/dev/urandom`。 +并非所有 Linux 设备都提供硬件随机数生成器。 +{{% /tab %}} +{{% tab name="macOS" %}} + + +生成 32 字节随机密钥并对其进行 base64 编码。你可以使用此命令: + +```shell +head -c 32 /dev/urandom | base64 +``` +{{% /tab %}} +{{% tab name="Windows" %}} + +生成 32 字节随机密钥并对其进行 base64 编码。你可以使用此命令: + + +```powershell +# 不要在已设置随机数生成器种子的会话中运行此命令。 +[Convert]::ToBase64String((1..32|%{[byte](Get-Random -Max 256)})) +``` +{{% /tab %}} +{{< /tabs >}} + + +{{< note >}} + +保持加密密钥的机密性,包括在生成密钥时,甚至理想的情况下在你不再主动使用密钥后也要保密。 +{{< /note >}} + + +### 复制加密密钥 + +使用安全的文件传输机制,将该加密密钥的副本提供给所有其他控制平面主机。 + +至少,使用传输加密 - 例如,安全 shell(SSH)。为了提高安全性, +请在主机之间使用非对称加密,或更改您正在使用的方法,以便依赖 KMS 加密。 -遵循如下步骤来创建一个新的 Secret: - -1. 生成一个 32 字节的随机密钥并进行 base64 编码。如果你在 Linux 或 macOS 上,请运行以下命令: - - ```shell - head -c 32 /dev/urandom | base64 - ``` +要创建新的加密密钥(不使用 KMS),请参阅[生成加密密钥](#generate-key-no-kms)。 -2. 将这个值放入到 `EncryptionConfiguration` 结构体的 `secret` 字段中。 -3. 设置 `kube-apiserver` 的 `--encryption-provider-config` 参数,将其指向配置文件所在位置。 +### 使用新的加密配置文件 - 你将需要把新的加密配置文件挂载到 `kube-apiserver` 静态 Pod。以下是这个操作的示例: + +你将需要把新的加密配置文件挂载到 `kube-apiserver` 静态 Pod。以下是这个操作的示例: - - 1. 将新的加密配置文件保存到控制平面节点上的 `/etc/kubernetes/enc/enc.yaml`。 - 2. 编辑 `kube-apiserver` 静态 Pod 的清单:`/etc/kubernetes/manifests/kube-apiserver.yaml`, - 代码范例如下: + +1. 将新的加密配置文件保存到控制平面节点上的 `/etc/kubernetes/enc/enc.yaml`。 +2. 编辑 `kube-apiserver` 静态 Pod 的清单:`/etc/kubernetes/manifests/kube-apiserver.yaml`, + 代码范例如下: +你现在已经为**一个**控制平面主机进行了加密。典型的 Kubernetes +集群有多个控制平面主机,因此需要做的事情更多。 + +## 防止纯文本检索 {#cleanup-all-secrets-encrypted} + +如果你想确保对特定 API 类型的唯一访问是使用加密完成的,你可以移除 +API 服务器以明文形式读取该 API 的支持数据的能力。 + +{{< warning >}} + + +此更改可防止 API 服务器检索标记为静态加密但实际上以明文形式存储的资源。 + +当你为某个 API 配置静态加密时(例如:API 种类 `Secret`,代表核心 API 组中的 `secrets` 资源), +你**必须**确保该集群中的所有这些资源确实被静态加密, +在后续步骤开始之前请检查此项。 +{{< /warning >}} -Changing a Secret without incurring downtime requires a multi-step operation, especially in -the presence of a highly-available deployment where multiple `kube-apiserver` processes are running. + +一旦集群中的所有 Secret 都被加密,你就可以删除加密配置中的 `identity` 部分。例如: + + +{{< highlight yaml "linenos=false,hl_lines=12" >}} +--- +apiVersion: apiserver.config.k8s.io/v1 +kind: EncryptionConfiguration +resources: + - resources: + - secrets + providers: + - aescbc: + keys: + - name: key1 + secret: + - identity: {} # 删除此行 +{{< /highlight >}} + + +…然后依次重新启动每个 API 服务器。此更改可防止 API 服务器访问纯文本 Secret,即使是意外访问也是如此。 -1. Generate a new key and add it as the second key entry for the current provider on all servers -1. Restart all `kube-apiserver` processes to ensure each server can decrypt using the new key -1. Make the new key the first entry in the `keys` array so that it is used for encryption in the config -1. Restart all `kube-apiserver` processes to ensure each server now encrypts using the new key -1. Run `kubectl get secrets --all-namespaces -o json | kubectl replace -f -` to encrypt all - existing Secrets with the new key -1. Remove the old decryption key from the config after you have backed up etcd with the new key in use - and updated all Secrets + ## 轮换解密密钥 {#rotating-a-decryption-key} -在不发生停机的情况下更改 Secret 需要多步操作,特别是在有多个 `kube-apiserver` +在不发生停机的情况下更改 Kubernetes 的加密密钥需要多步操作,特别是在有多个 `kube-apiserver` 进程正在运行的高可用环境中。 -1. 生成一个新密钥并将其添加为所有服务器上当前提供程序的第二个密钥条目 -1. 重新启动所有 `kube-apiserver` 进程以确保每台服务器都可以使用新密钥进行解密 -1. 将新密钥设置为 `keys` 数组中的第一个条目,以便在配置中使用其进行加密 -1. 重新启动所有 `kube-apiserver` 进程以确保每个服务器现在都使用新密钥进行加密 -1. 运行 `kubectl get secrets --all-namespaces -o json | kubectl replace -f -` +1. 生成一个新密钥并将其添加为所有控制平面节点上当前提供程序的第二个密钥条目 +1. 重新启动所有 `kube-apiserver` 进程以确保每台服务器都可以使用新密钥加密任何数据 +1. 对新的加密密钥进行安全备份。如果你丢失了此密钥的所有副本,则需要删除用已丢失的密钥加密的所有资源, + 并且在静态加密被破坏期间,工作负载可能无法按预期运行。 +1. 将新密钥设置为 `keys` 数组中的第一个条目,以便将其用于新配置的静态加密 +1. 重新启动所有 `kube-apiserver` 进程,以确保每个控制平面主机现在使用新密钥进行加密 +1. 作为特权用户,运行 `kubectl get secrets --all-namespaces -o json | kubectl replace -f -` 以用新密钥加密所有现有的 Secret -1. 在使用新密钥备份 etcd 后,从配置中删除旧的解密密钥并更新所有密钥 - -当只运行一个 `kube-apiserver` 实例时,第 2 步可以忽略。 +1. 将所有现有 Secret 更新为使用新密钥并对新密钥进行安全备份后,从配置中删除旧的解密密钥。 ## 解密所有数据 {#decrypting-all-data} -要禁用静态加密,请将 `identity` 提供程序 -作为配置中的第一个条目并重新启动所有 `kube-apiserver` 进程。 +此示例演示如何停止静态加密 Secret API。如果你所加密的是其他 API 类型,请调整对应步骤来适配。 +要禁用静态加密,请将 `identity` 提供程序作为加密配置文件中的第一个条目: + + ```yaml --- apiVersion: apiserver.config.k8s.io/v1 @@ -872,16 +1082,17 @@ kind: EncryptionConfiguration resources: - resources: - secrets + # 在此列出你之前静态加密的任何其他资源 providers: - - identity: {} + - identity: {} # 添加此行 - aescbc: keys: - name: key1 - secret: + secret: # 将其保留在适当的位置并确保它位于 "identity" 之后 ``` 然后运行以下命令以强制解密所有 Secret: @@ -889,6 +1100,14 @@ Then run the following command to force decrypt all Secrets: kubectl get secrets --all-namespaces -o json | kubectl replace -f - ``` + +将所有现有加密资源替换为不使用加密的支持数据后,你可以从 `kube-apiserver` +中删除加密设置。 + @@ -923,4 +1142,4 @@ To allow automatic reloading, configure the API server to run with: * Learn more about the [EncryptionConfiguration configuration API (v1)](/docs/reference/config-api/apiserver-encryption.v1/). --> * 进一步学习[解密已静态加密的数据](/zh-cn/docs/tasks/administer-cluster/decrypt-data/)。 -* 进一步学习 [EncryptionConfiguration 配置 API (v1)](/zh-cn/docs/reference/config-api/apiserver-encryption.v1/)。 +* 进一步学习 [EncryptionConfiguration 配置 API(v1)](/zh-cn/docs/reference/config-api/apiserver-encryption.v1/)。