租户认证管理器
以下步骤将创建和应用必要的资源,以便在租户内使用 cert-manager 管理 TLS 证书。
备注
程序使用 tenant-1
作为租户名称。
在整个程序中替换字符串 tenant-1
以反映租户的名称。
前提条件
kustomize 安装
kubectl
访问您的k8s
集群完成以下步骤 set up cert-manager
已安装 MinIO 操作员,且 set up for cert-manager。
1) 创建租户命名空间 CA 发布者
在部署新租户之前,为租户的命名空间创建证书颁发机构和颁发者。
必要时,创建租户的命名空间。
kubectl create ns tenant-1
这与租户 YAML 中的
metadata.namespace
字段的值相匹配。spec.isCA
设置为true
的新证书颁发机构申请证书。
创建名为
tenant-1-ca-certificate.yaml
的文件,内容如下:# tenant-1-ca-certificate.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: tenant-1-ca-certificate namespace: tenant-1 spec: isCA: true commonName: tenant-1-ca secretName: tenant-1-ca-tls duration: 70128h # 8y privateKey: algorithm: ECDSA size: 256 issuerRef: name: selfsigned-root kind: ClusterIssuer group: cert-manager.io重要
spec.issueRef.name
必须与在 setting up cert-manager 时创建的ClusterIssuer
的名称一致。 如果您指定了不同的ClusterIssuer
名称或使用了与指南不同的Issuer
,请修改issuerRef
以匹配您的环境。
应用资源:
kubectl apply -f tenant-1-ca-certificate.yaml
2) 创建 Issuer
Issuer
在租户名称空间内颁发证书。
为
Issuer
生成资源定义。创建名为
tenant-1-ca-issuer.yaml
的文件,内容如下:# tenant-1-ca-issuer.yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: tenant-1-ca-issuer namespace: tenant-1 spec: ca: secretName: tenant-1-ca-tls
应用
Issuer
资源定义:kubectl apply -f tenant-1-ca-issuer.yaml
3) 为租户创建证书
请求证书管理器为 MinIO 签发新的 TLS 服务器证书。 证书必须对以下 DNS 域有效:
minio.<namespace>
minio.<namespace>.svc
minio.<namespace>.svc.<cluster domain>
*.<tenant-name>-hl.<namespace>.svc.<cluster domain>
*.<namespace>.svc.<cluster domain>
*.<tenant-name>.minio.<namespace>.svc.<cluster domain>'
重要
用租户的值替换占位符文本(用 <
和 >
)字符标记:
<cluster domain>
是指分配给 Kubernetes 集群的内部根 DNS 域。 通常,这是cluster.local
,但请通过检查 CoreDNS 配置来确认 Kubernetes 集群的正确值。例如:
kubectl get configmap coredns -n kube-system -o jsonpath="{.data}"
不同的 Kubernetes 提供商管理根域的方式不同。 更多信息请咨询您的 Kubernetes 提供商。
tenant-name
是租户 YAML 的metadata.name
中为租户提供的名称。 在本例中,它是myminio
。namespace
是之前创建的值,租户将安装在该值上。 在租户 YAML 中,它定义在metadata.namespace
字段中。 在本例中,它是tenant-1
。
为指定域申请
Certificate
创建名为
tenant-1-minio-certificate.yaml
的文件。 文件内容应类似于以下内容,并根据群集和租户配置进行修改:# tenant-1-minio-certificate.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: tenant-certmanager-cert namespace: tenant-1 spec: dnsNames: - "minio.tenant-1" - "minio.tenant-1.svc" - 'minio.tenant-1.svc.cluster.local' - '*.minio.tenant-1.svc.cluster.local' - '*.myminio-hl.tenant-1.svc.cluster.local' - '*.myminio.minio.tenant-1.svc.cluster.local' secretName: myminio-tls issuerRef: name: tenant-1-ca-issuer
小技巧
在本例中,租户名称
myminio
。 我们建议将字段spec.secretName
中的秘密命名为<tenant-name>-tls
作为命名约定。应用证书资源:
kubectl apply -f tenant-1-minio-certificate.yaml
验证更改是否生效:
kubectl describe secret/myminio-tls -n tenant-1
备注
将
tenant-1
替换为租户的命名空间。将
myminio-tls
替换为秘密名称(如果不同)。
4) 使用 cert-manager 管理 TLS 证书,部署租户
部署租户时,必须设置 TLS 配置:
租户不会自动生成自己的证书(
spec.requestAutoCert: false
) and承租人拥有有效的证书管理人证明 (
spec.externalCertSecret
)
这将指示操作员只使用 cert-manager 证书部署租户。
以下 YAML spec
提供了符合这些要求的基准配置:
apiVersion: minio.min.io/v2
kind: Tenant
metadata:
name: myminio
namespace: tenant-1
spec:
...
## Disable default tls certificates.
requestAutoCert: false
## Use certificates generated by cert-manager.
externalCertSecret:
- name: myminio-tls
type: cert-manager.io/v1
...
5) 在 MinIO 操作员中信任租户的 CA
MinIO 操作员默认不信任租户的 CA。 要信任租户的 CA,必须将证书作为秘密传递给操作员。
为此,请在 minio-operator 命名空间中创建一个秘密,前缀为 operator-ca-tls-
,后缀为唯一标识符。
MinIO Operator 挂载并信任由所提供的证书颁发机构签发的 所有 证书。
之所以需要这样做,是因为 MinIO 操作员会使用 /minio/health/cluster
端点执行健康检查。
创建 operator-ca-tls-tenant-1
秘密
将租户的证书管理器生成的 CA 公钥(ca.crt
)复制到 minio-operator 命名空间。
这样,操作员就可以信任证书管理器签发的 CA 及其衍生的所有证书。
创建包含 CA 的
ca.crt
文件:kubectl get secrets -n tenant-1 tenant-1-ca-tls -o=jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
创建密码:
kubectl create secret generic operator-ca-tls-tenant-1 --from-file=ca.crt -n minio-operator
小技巧
在本例中,我们选择的秘密名称是 operator-ca-tls-tenant-1
。
我们使用租户命名空间 tenant-1
作为后缀,以便于识别 CA 来自哪个命名空间。
使用租户命名空间的名称,以方便链接相关资源的秘密。
6) 部署租户
租户命名空间的证书颁发机构和 Issuer
就位后,现在就可以 :ref:` 部署对象存储租户 <minio-k8s-deploy-minio-tenant>` 。
使用修改后的基线租户 YAML 禁用 AutoCert,并引用您生成的密文。