文档

cert-manager for 租户

以下步骤创建并应用在租户中使用 cert-manager 进行 TLS 证书所需的资源。

注意

这些步骤使用 tenant-1 作为租户名称。

在整个过程中替换字符串 tenant-1 以反映您租户的名称。

先决条件

1) 创建租户命名空间 CA 发行者

在部署新租户之前,为租户的命名空间创建一个证书颁发机构和发行者。

  1. 如有必要,请创建租户的命名空间。

    kubectl create ns tenant-1
    

    这必须与租户 YAML 中 metadata.namespace 字段的值匹配。

  2. 使用 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 必须与 设置 cert-manager 时创建的 ClusterIssuer 的名称匹配。如果您指定了不同的 ClusterIssuer 名称或正在使用与指南不同的 Issuer,请修改 issuerRef 以匹配您的环境。

  3. 应用资源

    kubectl apply -f tenant-1-ca-certificate.yaml
    

2) 创建 Issuer

Issuer 在租户命名空间中颁发证书。

  1. 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
    
  2. 应用 Issuer 资源定义

    kubectl apply -f tenant-1-ca-issuer.yaml
    

3) 为租户创建证书

请求 cert-manager 为 MinIO 颁发新的 TLS 服务器证书。证书必须对以下 DNS 域名有效

  • minio.<命名空间>

  • minio.<命名空间>.svc

  • minio.<命名空间>.svc.<集群 域名>

  • *.<租户名称>-hl.<命名空间>.svc.<集群 域名>

  • *.<命名空间>.svc.<集群 域名>

  • *.<租户名称>.minio.<命名空间>.svc.<集群 域名>'

重要

用你的租户的值替换占位符文本(用 <> 字符标记)

  • <集群 域名> 是在你的 Kubernetes 集群中分配的内部根 DNS 域名。通常,这是 cluster.local,但请通过检查你的 CoreDNS 配置来确认你的 Kubernetes 集群的正确值。

    例如

    kubectl get configmap coredns -n kube-system -o jsonpath="{.data}"
    

    不同的 Kubernetes 提供商以不同的方式管理根域名。请咨询你的 Kubernetes 提供商以了解更多信息。

  • 租户名称 是在租户 YAML 的 metadata.name 中为你的租户提供的名称。在本例中,它是 myminio

  • 命名空间 是之前创建的值,租户将在其中安装。在租户 YAML 中,它在 metadata.namespace 字段中定义。在本例中,它是 tenant-1

  1. 为指定的域请求 证书

    创建一个名为 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 字段中的秘密命名为 <租户名称>-tls 作为命名约定。

  2. 应用证书资源

    kubectl apply -f tenant-1-minio-certificate.yaml
    
  3. 验证更改是否生效

    kubectl describe secret/myminio-tls -n tenant-1
    

    注意

    • tenant-1 替换为你的租户的命名空间。

    • myminio-tls 替换为你的秘密的名称(如果不同)。

4) 使用 cert-manager 部署租户进行 TLS 证书管理

部署租户时,必须设置 TLS 配置,以便

  • 租户不会自动生成自己的证书 (spec.requestAutoCert: false) 并且

  • 租户具有有效的 cert-manager 引用 (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 Operator 中信任租户的 CA

默认情况下,MinIO Operator 不信任租户的 CA。要信任租户的 CA,必须将证书作为秘密传递给操作员。

为此,请使用前缀 operator-ca-tls- 创建一个秘密,后跟 minio-operator 命名空间中的唯一标识符。

MinIO Operator 会挂载并信任由提供的证书颁发机构颁发的所有证书。这是必需的,因为 MinIO Operator 使用 /minio/health/cluster 端点执行健康检查。

创建 operator-ca-tls-tenant-1 秘密

将租户的 cert-manager 生成的 CA 公钥 (ca.crt) 复制到 minio-operator 命名空间。这使操作员能够信任 cert-manager 颁发的 CA 及其所有派生证书。

  1. 创建一个包含 CA 的 ca.crt 文件

    kubectl get secrets -n tenant-1 tenant-1-ca-tls -o=jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
    
  2. 创建秘密

    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,你现在可以 部署对象存储租户

使用修改后的基线租户 YAML 来禁用 AutoCert 并引用你生成的秘密。