在当前的 Kubernetes 生态中,创建、管理和自动化 TLS 证书的标准方法是使用 `kind: CertificateSigningRequest` (CSR) 资源。此 Kubernetes 原生资源提供了一种强大而高效的方式来处理集群内证书的整个生命周期。
通过利用 CSR 资源,您可以简化和自动化证书管理的各个方面,包括
- 创建证书:CSR 允许您轻松为服务生成新的证书,确保集群内组件之间的安全通信。
- 更新证书:使用 CSR,您可以自动化证书到期前的更新过程,无需人工干预,并降低服务中断的风险。
- 吊销证书:如果由于安全问题或其他原因需要吊销证书,CSR 提供了一种简单的机制来使证书失效并阻止其进一步使用。
我们将重点介绍如何专门利用 Kubernetes CSR 资源来创建 MinIO 可以使用的证书。在本指南结束时,您将清楚地了解如何使用 CSR 生成证书,将其安全地存储在 Kubernetes Secret 中,以及配置 MinIO 以访问和使用生成的证书。
生成的私钥和公钥证书将安全地存储在名为 operator-tls 的 Kubernetes Secret 中。此 Secret 可供 Operator 访问,允许它们利用证书进行安全通信。
教程
首先,我们将使用椭圆曲线数字签名算法 (ECDSA) 和 P-256 曲线生成一个自签名私钥。ECDSA 是一种广泛使用且安全的生成密钥对的算法。
步骤 1:生成自签名私钥
首先,我们将使用“椭圆曲线数字签名算法”(ECDSA) 和 P-256 曲线生成一个自签名私钥。ECDSA 是一种广泛使用且安全的生成密钥对的算法。
openssl ecparam -name prime256v1 -genkey -noout -out private.key |
或者,您可以使用不同的算法,例如 RSA。
openssl genrsa -out private.key 2048 |
步骤 2:生成证书签名请求 (CSR)
生成私钥后,我们现在可以创建一个证书签名请求 (CSR)。CSR 包含有关请求证书的实体的信息,并使用私钥进行签名。
openssl req -new -key private.key -out curve.csr \ -subj "/O=system:nodes/CN=system:node:operator.minio-operator.svc" \ -addext "subjectAltName = DNS:operator,DNS:operator.minio-operator.svc,DNS:operator.minio-operator.svc.cluster.local" |
步骤 3:将 CSR 编码为 Base64
要在 Kubernetes 资源中包含 CSR,我们需要将其转换为 Base64 编码的字符串。
步骤 4:创建 Kubernetes CertificateSigningRequest
创建一个名为 `csr-manual.yaml` 的文件,内容如下,将 `` 替换为上一步中 Base64 编码的 CSR。
apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata name: operator-minio-operator-csr spec request: <copy base64 encoded curve.csr here> signerName: kubernetes.io/kubelet-serving expirationSeconds: 604800 # 延长至一年 groups - system:serviceaccounts - system:serviceaccounts:minio-operator - system:authenticated - system:nodes usages - "digital signature" - "key encipherment" - "server auth" username: system:serviceaccount:minio-operator:minio-operator |
注意:关于 EKS 1.21 和 1.22:在 EKS 1.22 及更高版本上,`signerName kubernetes.io/legacy-unknown` 不允许使用,您应该设置如上例所示的 `signerName` 或 `beta.eks.amazonaws.com/app-serving`,有关 EKS 上 CSR 签名的更多详细信息,请参阅证书签名文档。在 EKS 的早期版本(1.21 及以下)中,您可以使用证书 CSR API `v1beta1` 并发送 `signerName` kubernetes.io/legacy-unknown。
注意:在 Kubernetes 1.21 及以下版本中:`expirationSeconds` 字段是在 Kubernetes 1.22 中引入的,在此之前,该字段会被静默丢弃且不会生效。
使用上一步中创建的 `csr-manual.yaml` 文件,创建 Kubernetes CSR 资源。
kubectl apply -f csr-manual.yaml |
步骤 6:批准 CSR
手动批准 CSR。这是单次步骤。
kubectl certificate approve operator-minio-operator-csr |
步骤 7:检索已签名的证书
从 Kubernetes `csr` 资源中的 `.status.certificate` 密钥获取公钥证书。
kubectl get csr operator-minio-operator-csr -o jsonpath="{.status.certificate}" | base64 --decode > public.crt |
步骤 7:验证证书
让我们验证上面获取的证书。
从 CSR 资源中提取证书,它将以 Base64 格式存在。解码 Base64 并使用 OpenSSL 读取它,如下所示。
kubectl get csr operator-minio-operator-csr -ojsonpath="{.status.certificate}" | base64 --decode | openssl x509 -noout -text |
将显示类似于以下内容的证书描述
证书 数据: 版本:3 (0x2) 序列号: 19:35:68:7b:bc:16:51:b1:95:14:15:45:13:27:e2:b7 签名算法:sha256WithRSAEncryption 颁发者:CN=kubernetes 有效期 开始时间:2023年3月15日22:25:10 GMT 结束时间:2024年3月14日22:25:10 GMT 主体:O=system:nodes, CN=system:node:operator.minio-operator.svc 主题公钥信息: 公钥算法:id-ecPublicKey 公钥:(256 位) pub: 04:5b:53:08:98:54:8f:45:c9:e9:15:49:73:cc:50: fe:32:ec:33:de:f8:79:6e:87:a9:7d:01:3e:c3:b0: 20:21:69:46:33:a5:44:92:18:90:79:4f:b4:e5:d9: a7:94:5f:b1:4b:73:57:e3:3a:cc:d8:be:24:94:3f: 32:2d:d3:f4:38 ASN1 OID:prime256v1 NIST 曲线:P-256 X509v3 扩展: X509v3 密钥用途:关键 数字签名,密钥加密 X509v3 扩展密钥用途: TLS Web 服务器身份验证 X509v3 基本约束:关键 CA:FALSE X509v3 颁发机构密钥标识符: keyid:73:58:4C:D0:20:80:2A:C4:7A:5E:EE:26:C0:28:50:CA:F2:05:48:73
X509v3 主题替代名称: DNS:operator,DNS:operator.minio-operator.svc,DNS:operator.minio-operator.svc.cluster.local 签名算法:sha256WithRSAEncryption 64:1c:de:99:cd:54:e8:eb:08:fd:89:c5:6a:94:a5:29:dd:a9: ... |
输出将显示证书详细信息,包括主题、颁发者、有效期和扩展。
步骤 9:创建 Kubernetes 密钥
最后,这是关键的一步。我们将为 Operator 创建一个 Kubernetes 的 secret
供其使用。
kubectl create secret generic --from-file=./private.key --from-file=./public.crt operator-tls -n minio-operator |
下次 Operator 启动时,它将不会尝试创建证书或密钥,而是使用我们存储在 minio-operator
密钥中的证书。
使用 MinIO 和 Kubernetes 简化证书管理
如果没有其他对象存储,我们不可能写出这个简短的教程。其他类似的对象存储设置起来极其复杂且耗时,但我们只需使用内置的 Kubernetes 资源,就能轻松地设置 MinIO Operator 以使用密钥中的证书。
虽然其他对象存储解决方案通常需要复杂的配置和耗时的设置过程,但 MinIO 的设计以及与 Kubernetes 的紧密集成使开发人员和管理员能够专注于其核心业务逻辑,并确信其对象存储是安全的且经过适当身份验证的。MinIO 证书管理流程的简洁性和效率使其在竞争中脱颖而出,使其成为寻求强大且可靠的对象存储解决方案的企业的首选。
如果您有任何疑问、遇到挑战或只是想分享您使用 MinIO 的经验,我们充满活力的社区随时为您提供帮助。加入我们的 Slack,在那里您可以与其他 MinIO 爱好者联系,获得专家建议,并随时了解对象存储领域的最新发展。