在当前的 Kubernetes 环境中,创建、管理和自动化 TLS 证书的标准方法是使用 kind: CertificateSigningRequest (CSR)
资源。此原生 Kubernetes 资源提供了一种强大而高效的方式来处理集群中证书的整个生命周期。
通过利用 CSR 资源,您可以简化和自动化证书管理的各个方面,包括:
1 . **创建证书:**CSR 允许您轻松地为服务生成新证书,从而确保集群中组件之间的安全通信。
2 . **续订证书:**借助 CSR,您可以在证书过期之前自动续订证书,从而消除手动干预并降低服务中断的风险。
3 . **吊销证书:**如果由于安全问题或其他原因需要吊销证书,CSR 提供了一种简单的机制来使证书失效并防止其进一步使用。
我们将重点利用 Kubernetes CSR 资源专门用于创建可供 MinIO 使用的证书。在本指南结束时,您将清楚地了解如何使用 CSR 生成证书、将其安全地存储在 Kubernetes Secret 中,以及配置 MinIO 以访问和使用生成的证书。
生成的私钥和公有证书将安全地存储在名为 operator-tls 的 Kubernetes Secret 中。操作员可以访问此密钥,允许他们利用证书进行安全通信。
教程
首先,我们将使用带有 P-256 曲线的椭圆曲线数字签名算法 (ECDSA) 生成一个自签名私钥。ECDSA 是一种广泛使用且安全的算法,用于生成密钥对。
步骤 1:生成自签名私钥
首先,我们将使用带有 P-256 曲线的“椭圆曲线数字签名算法”(ECDSA) 生成一个自签名私钥。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 步:以 Base64 对 CSR 进行编码
要将 CSR 包含在 Kubernetes 资源中,我们需要将其转换为 base64 编码的字符串。
base64 curve.csr
步骤 4:创建 Kubernetes CertificateSigningRequest
创建一个包含以下内容的文件 csr-manual.yaml
,并替换 <copy base64 encoded curve.csr here>
为上一步中的 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 #extend here for 1 year long
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:检索签名证书
从 .status.certificate
Kubernetes csr
资源中的密钥获取公共证书。
kubectl get csr operator-minio-operator-csr -o jsonpath="{.status.certificate}" | base64 --decode > public.crt
步骤 8:验证证书
让我们验证我们上面获取的证书。
从 CSR 资源中提取证书,它将位于 base64 中。解码 base64 并使用 OpenSSL 读取它,如下所示。
kubectl get csr operator-minio-operator-csr -ojsonpath="{.status.certificate}" | base64 --decode | openssl x509 -noout -text
将出现与此类似的证书说明:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
19:35:68:7b:bc:16:51:b1:95:14:15:45:13:27:e2:b7
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=kubernetes
Validity
Not Before: Mar 15 22:25:10 2023 GMT
Not After : Mar 14 22:25:10 2024 GMT
Subject: O=system:nodes, CN=system:node:operator.minio-operator.svc
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
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 CURVE: P-256
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
keyid:73:58:4C:D0:20:80:2A:C4:7A:5E:EE:26:C0:28:50:CA:F2:05:48:73
X509v3 Subject Alternative Name:
DNS:operator, DNS:operator.minio-operator.svc, DNS:operator.minio-operator.svc.cluster.local
Signature Algorithm: sha256WithRSAEncryption
64:1c:de:99:cd:54:e8:eb:08:fd:89:c5:6a:94:a5:29:dd:a9:
...
输出将显示证书详细信息,包括使用者、颁发者、有效期和扩展名。
步骤 9:创建 Kubernetes 密钥
最后,这是橡胶与道路相遇的地方。我们将创建一个 Kubernetes secret
供 Operator 使用
kubectl create secret generic --from-file=./private.key --from-file=./public.crt operator-tls -n minio-operator
下次操作员启动时,它不会尝试创建证书或机密,而是使用我们存储在密钥 minio-operator
中的证书或机密。
使用 MinIO 和 Kubernetes 简化证书管理
我们不可能用另一个对象存储来编写这个简短的教程。其他类似的对象存储设置起来非常复杂且耗时,但我们只是将 MinIO 运算符设置为使用来自密钥的证书,只需使用内置的 Kubernetes 资源即可获得太多提升。
虽然其他对象存储解决方案通常需要复杂的配置和耗时的设置过程,但 MinIO 的设计和与 Kubernetes 的紧密集成使开发人员和管理员能够专注于他们的核心业务逻辑,因为他们知道他们的对象存储是安全的并且经过了适当的身份验证。MinIO 证书管理流程的简单性和效率使其在竞争中脱颖而出,使其成为寻求强大而可靠的对象存储解决方案的企业的首选。