在此概念验证 (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: v1
kind: Pod
metadata:
name: ubuntu
namespace: tenant-lite
labels:
app: ubuntu
spec:
containers:
- image: ubuntu
command:
- "sleep"
- "604800"
imagePullPolicy: IfNotPresent
name: ubuntu
restartPolicy: Always
EOF
安装 KES 和 mc
在 Ubuntu pod 中执行以下命令以安装 KES 和 MinIO 客户端 (mc):
apt update
apt install wget
wget https://github.com/minio/kes/releases/latest/download/kes-linux-amd64
mv kes-linux-amd64 kes
chmod +x kes
mv kes /usr/local/bin/kes
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv mc /usr/local/bin/mc
为 KES 配置持久性存储
持久性目录创建
在 Ubuntu pod 中为 KES 配置和数据文件创建一个目录,其中 KES 位于:
rm -rf ~/kes
mkdir ~/kes
cd ~/kes
touch init.yml
身份管理
生成 KES 和 MinIO 身份验证所需的必要标识:
cd ~/kes
kes identity new --key sys-admin.key --cert sys-admin.crt kes-sys-admin
kes identity new --key minio-admin.key --cert minio-admin.crt minio-admin
kes identity new --key minio.key --cert minio.crt minio
kes 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 ~/kes
root@ubuntu:~/kes# ls
data 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-admin
root@ubuntu:~/kes#
创建 KES 解封密钥。
cat /dev/urandom | head -c 32 | base64 # put the result in the .bashrc
vi ~/.bashrc
export KES_UNSEAL_KEY=<VALUE-FROM-ABOVE-COMMAND>
source ~/.bashrc
echo $KES_UNSEAL_KEY # it should print the value
初始化 KES 部署
KES 配置 - 编辑/创建 KES 配置文件
通过设置必要的配置参数来配置 KES 服务:
cd ~/kes
echo "version: v1" > ~/kes/init.yml
echo "address: 0.0.0.0:7373" >> ~/kes/init.yml
echo "" >> ~/kes/init.yml
echo "tls:" >> ~/kes/init.yml
echo " key: private.key" >> ~/kes/init.yml
echo " cert: public.crt" >> ~/kes/init.yml
echo " client:" >> ~/kes/init.yml
echo " verify_cert: false" >> ~/kes/init.yml
echo "" >> ~/kes/init.yml
echo "system:" >> ~/kes/init.yml
echo " admin:" >> ~/kes/init.yml
echo " identity: $(kes identity of sys-admin.crt)" >> ~/kes/init.yml
echo "" >> ~/kes/init.yml
echo "unseal:" >> ~/kes/init.yml
echo " environment:" >> ~/kes/init.yml
echo " name: KES_UNSEAL_KEY" >> ~/kes/init.yml
echo "" >> ~/kes/init.yml
echo "enclave:" >> ~/kes/init.yml
echo " default:" >> ~/kes/init.yml
echo " admin:" >> ~/kes/init.yml
echo " identity: $(kes identity of minio-admin.crt)" >> ~/kes/init.yml
echo " policy:" >> ~/kes/init.yml
echo " minio:" >> ~/kes/init.yml
echo " allow:" >> ~/kes/init.yml
echo " - /v1/api" >> ~/kes/init.yml
echo " - /v1/log/audit" >> ~/kes/init.yml
echo " - /v1/log/error" >> ~/kes/init.yml
echo " - /v1/key/create/*" >> ~/kes/init.yml
echo " - /v1/key/generate/*" >> ~/kes/init.yml
echo " - /v1/key/decrypt/*" >> ~/kes/init.yml
echo " - /v1/key/bulk/decrypt/*" >> ~/kes/init.yml
初始化
使用新创建的配置文件初始化 KES 服务器:
cd ~/kes # where init.yml is saved
kes init --config init.yml ~/kes/data
预期为
root@ubuntu:~/kes# cd ~/kes # where init.yml is saved
kes init --config init.yml ~/kes/data
TLS:
· Private Key: private.key
· Certificate: public.crt
System:
· Identity: 1a65f6f86c3268b30528fe4aab88fc6994730346e1c1863052fa3fa192d77d3e
Unseal:
· 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/data
Copyright MinIO, Inc. https://min.io
License GNU AGPLv3 https://www.gnu.org/licenses/agpl-3.0.html
Version v0.22.3 linux/amd64
Endpoints https://127.0.0.1:7373
https://10.244.4.2:7373
mTLS skip verify Client certificates are not verified
Mem Lock off Failed to lock RAM pages. Consider granting CAP_IPC_LOCK
使用 KES 配置 MinIO
分配策略
通过分配适当的策略和标识将 MinIO 和 KES 链接在一起。
在 KES 所在的 Ubuntu Pod 终端中:将 MinIO 标识分配给 MinIO 策略。
cd ~/kes
export KES_SERVER=https://127.0.0.1:7373
export KES_CLIENT_KEY=minio-admin.key
export KES_CLIENT_CERT=minio-admin.crt
kes policy assign -k minio $(kes identity of minio.crt)
预期:
root@ubuntu:/# cd ~/kes
export KES_SERVER=https://127.0.0.1:7373
export KES_CLIENT_KEY=minio-admin.key
export KES_CLIENT_CERT=minio-admin.crt
kes 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_SERVER
KES_SERVER=https://127.0.0.1:7373
root@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.crt
kubectl 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.crt
kubectl 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/v2
kind: Tenant
metadata:
name: storage
namespace: minio-tenant
spec:
# 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 k8s
externalClientCertSecrets:
- name: kes-minio
type: Opaque
- name: kes-minio-public
type: Opaque
env:
# Set MINIO_KMS_KES_ENDPOINT
# It is the IP of the Ubuntu Pod.
- name: MINIO_KMS_KES_ENDPOINT
value: "https://<IP-ADDRESS-OF-UBUNTU-POD>:7373"
# Set MinIO Client Credentials, it comes from kes-minio secret
- name: MINIO_KMS_KES_CERT_FILE
value: "/tmp/certs/client-0/client.crt"
# Set MinIO Client Credentials, it comes from kes-minio secret
- name: MINIO_KMS_KES_KEY_FILE
value: "/tmp/certs/client-0/client.key"
# Set MinIO Default Key
- name: MINIO_KMS_KES_KEY_NAME
value: "minio-default-key"
# Trust the KES Server Certificate, it comes from kes-minio-public secret
- name: MINIO_KMS_KES_CAPATH
value: "/tmp/certs/client-1/client.crt"
# Root User
- name: MINIO_ROOT_USER
value: minio
# ROOT Password:
- name: MINIO_ROOT_PASSWORD
value: minio123
加密操作
通过创建加密存储桶并配置服务器端加密来执行加密操作:
mc alias set myminio https://minio.tenant-lite.svc.cluster.local:443 minio minio123
mc rb myminio/my-bucket --force # remove previous bucket to start fresh
mc mb myminio/my-bucket # create new bucket
mc admin kms key create myminio minio-my-bucket # create key
mc 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 minio123
Added `myminio` successfully.
root@ubuntu:/# mc rb myminio/my-bucket --force # remove previous bucket to start fresh
mc: <ERROR> Unable to validate target `myminio/my-bucket`. Bucket `my-bucket` does not exist.
root@ubuntu:/# mc mb myminio/my-bucket # create new bucket
Bucket created successfully `myminio/my-bucket`.
root@ubuntu:/# mc admin kms key create myminio minio-my-bucket # create key
Created master key `minio-my-bucket` successfully
root@ubuntu:/# mc encrypt set sse-kms minio-my-bucket myminio/my-bucket # encrypt bucket
Auto encryption configuration has been set successfully for myminio/my-bucket
root@ubuntu:/#
最后的思考
按照概述的步骤操作后,您已在 Kubernetes 集群中成功部署了有状态 KES。通过此配置,您可以管理集群中的加密密钥,从而简化部署并减少对外部 KMS 解决方案的依赖。这可确保您的 AI/ML 工作负载平稳运行,而不会出现依赖于基础架构中这一关键功能的中断。