在此概念验证 (POC) 中,我们将探讨在 Kubernetes (k8s) 生态系统中安装和管理有状态密钥加密服务 (KES)。本指南促进了加密操作的无缝衔接,而不会将敏感的密钥材料暴露给使用型应用程序。
在 Kubernetes 中以有状态配置实现 KES 可确保加密密钥在 Pod 生命周期事件和重新启动期间的持久性。此设置提供了体系结构弹性,这在不依赖外部密钥管理系统 (KMS) 的环境中尤为重要。
当您有数百万亿个对象从 AI/ML 工作负载(例如LLMs)生成时,由于数百个应用程序同时访问它们,您需要确保数据加密/解密层不会成为瓶颈,并且尽可能快,因为每个对象都需要自己唯一的密钥。通过将这些潜在的数十亿个密钥存储在有状态的 KES 后端中,即使 KMS 长时间脱机,密钥也可以保存到 KES,直到 KMS 重新联机。
先决条件
在继续之前,请确保您具备:
-
已安装并配置 Kubernetes CLI (kubectl)。
-
使用适当的权限访问 Kubernetes 集群。
-
MinIO Operator 和 CLI (mc) 已准备好部署。
-
Kubernetes 和加密概念的基本知识。
部署 MinIO Operator
设置 Kubernetes 环境
删除上一个集群
若要避免冲突,请删除任何现有群集:
kind delete clusters kind
创建新集群
使用以下 kind-config.yaml 文件设置具有所需配置的全新 Kubernetes 集群:
kind create cluster --config ~/operator/testing/kind-config.yaml
部署 MinIO Operator
使用 kubectl 部署 MinIO Operator 以管理集群中的 MinIO 实例:
kubectl apply -k github.com/minio/operator/
部署 MinIO 租户
使用适合开发和测试目的的轻量级配置部署 MinIO 租户:
kubectl apply -k github.com/minio/operator/examples/kustomization/tenant-lite
配置密钥加密服务 (KES)
创建 Ubuntu Pod
部署 Ubuntu Pod 以在 MinIO 租户命名空间中托管 KES 服务:
cat <<EOF | kubectl apply -f -apiVersion: v1kind: Podmetadata:name: ubuntunamespace: tenant-litelabels:app: ubuntuspec:containers:- image: ubuntucommand:- "sleep"- "604800"imagePullPolicy: IfNotPresentname: ubunturestartPolicy: AlwaysEOF
安装 KES 和 mc
在 Ubuntu pod 中执行以下命令以安装 KES 和 MinIO 客户端 (mc):
apt updateapt install wgetwget https://github.com/minio/kes/releases/latest/download/kes-linux-amd64mv kes-linux-amd64 keschmod +x kesmv kes /usr/local/bin/keswget https://dl.min.io/client/mc/release/linux-amd64/mcchmod +x mcmv mc /usr/local/bin/mc
为 KES 配置持久性存储
持久性目录创建
在 Ubuntu pod 中为 KES 配置和数据文件创建一个目录,其中 KES 位于:
rm -rf ~/kesmkdir ~/kescd ~/kestouch init.yml
身份管理
生成 KES 和 MinIO 身份验证所需的必要标识:
cd ~/keskes identity new --key sys-admin.key --cert sys-admin.crt kes-sys-adminkes identity new --key minio-admin.key --cert minio-admin.crt minio-adminkes identity new --key minio.key --cert minio.crt miniokes identity new --ip "10.244.2.7" localhost # will generate private.key and public.crt||____ IP Address of the Ubuntu Pod.
预期有 4 个标识。
root@ubuntu:/# cd ~/kesroot@ubuntu:~/kes# lsdata init.yml minio-admin.crt minio-admin.key minio.crt minio.key private.key public.crt sys-admin.crt sys-admin.key| | | | | || | |__________|___ minio |________________|___ kes-sys-admin| ||_______________|___ minio-adminroot@ubuntu:~/kes#
创建 KES 解封密钥。
cat /dev/urandom | head -c 32 | base64 # put the result in the .bashrcvi ~/.bashrcexport KES_UNSEAL_KEY=<VALUE-FROM-ABOVE-COMMAND>source ~/.bashrcecho $KES_UNSEAL_KEY # it should print the value
初始化 KES 部署
KES 配置 - 编辑/创建 KES 配置文件
通过设置必要的配置参数来配置 KES 服务:
cd ~/kesecho "version: v1" > ~/kes/init.ymlecho "address: 0.0.0.0:7373" >> ~/kes/init.ymlecho "" >> ~/kes/init.ymlecho "tls:" >> ~/kes/init.ymlecho " key: private.key" >> ~/kes/init.ymlecho " cert: public.crt" >> ~/kes/init.ymlecho " client:" >> ~/kes/init.ymlecho " verify_cert: false" >> ~/kes/init.ymlecho "" >> ~/kes/init.ymlecho "system:" >> ~/kes/init.ymlecho " admin:" >> ~/kes/init.ymlecho " identity: $(kes identity of sys-admin.crt)" >> ~/kes/init.ymlecho "" >> ~/kes/init.ymlecho "unseal:" >> ~/kes/init.ymlecho " environment:" >> ~/kes/init.ymlecho " name: KES_UNSEAL_KEY" >> ~/kes/init.ymlecho "" >> ~/kes/init.ymlecho "enclave:" >> ~/kes/init.ymlecho " default:" >> ~/kes/init.ymlecho " admin:" >> ~/kes/init.ymlecho " identity: $(kes identity of minio-admin.crt)" >> ~/kes/init.ymlecho " policy:" >> ~/kes/init.ymlecho " minio:" >> ~/kes/init.ymlecho " allow:" >> ~/kes/init.ymlecho " - /v1/api" >> ~/kes/init.ymlecho " - /v1/log/audit" >> ~/kes/init.ymlecho " - /v1/log/error" >> ~/kes/init.ymlecho " - /v1/key/create/*" >> ~/kes/init.ymlecho " - /v1/key/generate/*" >> ~/kes/init.ymlecho " - /v1/key/decrypt/*" >> ~/kes/init.ymlecho " - /v1/key/bulk/decrypt/*" >> ~/kes/init.yml
初始化
使用新创建的配置文件初始化 KES 服务器:
cd ~/kes # where init.yml is savedkes init --config init.yml ~/kes/data
预期为
root@ubuntu:~/kes# cd ~/kes # where init.yml is savedkes init --config init.yml ~/kes/dataTLS:· Private Key: private.key· Certificate: public.crtSystem:· Identity: 1a65f6f86c3268b30528fe4aab88fc6994730346e1c1863052fa3fa192d77d3eUnseal:· Environment: KES_UNSEAL_KEY╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ Initialized KES v0.22.3 in /root/kes/data │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯root@ubuntu:~/kes#
启动 KES 服务器
启动 KES 服务器并验证其是否正常运行:
kes server ~/kes/data
预期为:
root@ubuntu:~/kes# kes server ~/kes/dataCopyright MinIO, Inc. https://min.ioLicense GNU AGPLv3 https://www.gnu.org/licenses/agpl-3.0.htmlVersion v0.22.3 linux/amd64Endpoints https://127.0.0.1:7373https://10.244.4.2:7373mTLS skip verify Client certificates are not verifiedMem Lock off Failed to lock RAM pages. Consider granting CAP_IPC_LOCK
使用 KES 配置 MinIO
分配策略
通过分配适当的策略和标识将 MinIO 和 KES 链接在一起。
在 KES 所在的 Ubuntu Pod 终端中:将 MinIO 标识分配给 MinIO 策略。
cd ~/kesexport KES_SERVER=https://127.0.0.1:7373export KES_CLIENT_KEY=minio-admin.keyexport KES_CLIENT_CERT=minio-admin.crtkes policy assign -k minio $(kes identity of minio.crt)
预期:
root@ubuntu:/# cd ~/kesexport KES_SERVER=https://127.0.0.1:7373export KES_CLIENT_KEY=minio-admin.keyexport KES_CLIENT_CERT=minio-admin.crtkes policy assign -k minio $(kes identity of minio.crt)root@ubuntu:~/kes#root@ubuntu:~/kes#root@ubuntu:~/kes#root@ubuntu:~/kes#root@ubuntu:~/kes#root@ubuntu:~/kes# printenv | grep KES_SERVERKES_SERVER=https://127.0.0.1:7373root@ubuntu:~/kes#
服务器设置
在 MinIO 和 KES 之间建立连接,定义加密端点和凭据:
-
创建 kes-minio 密钥
-
将 ~/kes/minio.key 和 ~/kes/minio.crt 从 ubuntu pod 复制到您的笔记本电脑
下面的这两个文件来自以下行: kes identity new --key minio.key --cert minio.crt minio
# /Users/aj/minio/private.key is ~/kes/minio.key# /Users/aj/minio/public.crt is ~/kes/minio.crtkubectl create secret generic kes-minio -n tenant-lite --from-file=/Users/aj/minio/private.key --from-file=/Users/aj/minio/public.crt
- 创建 kes-minio-public 密钥:
1 . 将 ~/kes/private.key 和 ~/kes/public.crt 从 ubuntu pod 复制到您的笔记本电脑
2 . 下面的这两个文件来自以下行:kes identity new --ip “10.244.2.7” localhost:
# /Users/aj/minio/private.key is ~/kes/private.key# /Users/aj/minio/public.crt is ~/kes/public.crtkubectl create secret generic kes-minio-public -n tenant-lite --from-file=/Users/aj/minio/private.key --from-file=/Users/aj/minio/public.crt
k edit tenant -n tenant-lite
apiVersion: minio.min.io/v2kind: Tenantmetadata:name: storagenamespace: minio-tenantspec:# externalClientCertSecrets is to share the secret with the MinIO Pods:# Under: /tmp/certs/client-0 You will find:# client.crt and client.key# And we can use these files to setup KES in k8sexternalClientCertSecrets:- name: kes-miniotype: Opaque- name: kes-minio-publictype: Opaqueenv:# Set MINIO_KMS_KES_ENDPOINT# It is the IP of the Ubuntu Pod.- name: MINIO_KMS_KES_ENDPOINTvalue: "https://<IP-ADDRESS-OF-UBUNTU-POD>:7373"# Set MinIO Client Credentials, it comes from kes-minio secret- name: MINIO_KMS_KES_CERT_FILEvalue: "/tmp/certs/client-0/client.crt"# Set MinIO Client Credentials, it comes from kes-minio secret- name: MINIO_KMS_KES_KEY_FILEvalue: "/tmp/certs/client-0/client.key"# Set MinIO Default Key- name: MINIO_KMS_KES_KEY_NAMEvalue: "minio-default-key"# Trust the KES Server Certificate, it comes from kes-minio-public secret- name: MINIO_KMS_KES_CAPATHvalue: "/tmp/certs/client-1/client.crt"# Root User- name: MINIO_ROOT_USERvalue: minio# ROOT Password:- name: MINIO_ROOT_PASSWORDvalue: minio123
加密操作
通过创建加密存储桶并配置服务器端加密来执行加密操作:
mc alias set myminio https://minio.tenant-lite.svc.cluster.local:443 minio minio123mc rb myminio/my-bucket --force # remove previous bucket to start freshmc mb myminio/my-bucket # create new bucketmc admin kms key create myminio minio-my-bucket # create keymc encrypt set sse-kms minio-my-bucket myminio/my-bucket # encrypt bucket
结果的验证和测试
通过验证是否可以通过 MinIO 创建和访问密钥,确保您的设置正确:
root@ubuntu:/# mc alias set myminio https://minio.tenant-lite.svc.cluster.local:443 minio minio123Added `myminio` successfully.root@ubuntu:/# mc rb myminio/my-bucket --force # remove previous bucket to start freshmc: <ERROR> Unable to validate target `myminio/my-bucket`. Bucket `my-bucket` does not exist.root@ubuntu:/# mc mb myminio/my-bucket # create new bucketBucket created successfully `myminio/my-bucket`.root@ubuntu:/# mc admin kms key create myminio minio-my-bucket # create keyCreated master key `minio-my-bucket` successfullyroot@ubuntu:/# mc encrypt set sse-kms minio-my-bucket myminio/my-bucket # encrypt bucketAuto encryption configuration has been set successfully for myminio/my-bucketroot@ubuntu:/#
最后的思考
按照概述的步骤操作后,您已在 Kubernetes 集群中成功部署了有状态 KES。通过此配置,您可以管理集群中的加密密钥,从而简化部署并减少对外部 KMS 解决方案的依赖。这可确保您的 AI/ML 工作负载平稳运行,而不会出现依赖于基础架构中这一关键功能的中断。