对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

设置 cert-manager 集成

cert-manager 可简化并自动化Kubernetes安全证书的管理。以下过程介绍如何配置 cert-manager 为MongoDB Kubernetes Operator 资源生成证书。

要使用对象部署副本集,您必须:

注意

为避免在单集群Kubernetes部署中存储密钥,您可以将所有密钥迁移到密钥存储工具。多个Kubernetes集群上的部署不支持将密钥存储在密钥存储工具中,例如 HashiCorp Vault 。

  • 为以下每个组件生成一个 TLS 证书:

    • 您的副本集。确保为每个托管证书副本集节点的 Kubernetes 容器添加 SAN。

      在您的 TLS 证书中,每个 pod 的 SAN 必须使用以下格式:

      <pod-name>.<metadata.name>-svc.<namespace>.svc.cluster.local

      重要

      If you're using an ACME based service provider such as Let's Encrypt to issue TLS certificates, the provider might prohibit you from adding the Pod's default FQDNs (*.svc.cluster.local) to SANs in the certificate.

      要使用基于 ACME 的证书,您必须为副本集资源配置证书。要学习;了解更多信息,请参阅操作步骤中有关基于 ACME 的 TLS 证书的步骤。

    • 您项目的 MongoDB Agent。对于 MongoDB Agent 证书,请确保您满足以下要求:

      • TLS 证书中的公用名不为空。

      • 每个 TLS 证书中的组合组织和组织单位与副本集节点的 TLS 证书中的组织和组织单位不同。

  • 您必须拥有 CA 证书文件,并将其命名为 ca-pem。

  • 您必须拥有用于签署TLS证书的密钥。

重要

Kubernetes 操作符使用 kubernetes.io/tls用于存储 MongoDB Ops Manager 和 MongoDB 资源的 TLS 证书和私钥的秘密。从 Kubernetes1 17操作符版本..0 开始,Kubernetes 操作符不支持作为 不透明的秘密 存储的合并的 PEM 文件。

1

注意

以下步骤假设您已创建自定义 CA 以及对应的 tls.key 私钥和 tls.crt 签名证书。

创建密钥来存储CA数据:

apiVersion: v1
kind: Secret
metadata:
name: ca-key-pair
namespace: <namespace>
data:
tls.crt: <your-CA-certificate>
tls.key: <your-CA-private-key>
2

如果您的MongoDB Ops Manager TLS 证书由自定义 CA 签名,则该 CA 证书还必须包含允许MongoDB Ops Manager备份守护程序从互联网下载MongoDB二进制文件的其他证书。要创建 TLS 证书,请创建 ConfigMap 来保存 CA 证书:

重要

Kubernetes 操作符要求 Ops Manager 证书在 ConfigMap 中命名为mms-ca.crt 。

  1. 从 downloads.mongodb.com 获取 Ops Manager 的完整 `TLS` 证书链。以下 openssl 命令将链中的证书输出到当前工作目录,格式为 .crt:

    openssl s_client -showcerts -verify 2 \
    -connect downloads.mongodb.com:443 -servername downloads.mongodb.com < /dev/null \
    | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}'
  2. 将您用于 MongoDB Ops Manager 的 CA 证书文件与您在上一个步骤中获取的来自 downloads.mongodb.com 的整个 TLS 证书链连接:

    cat <custom_ca_cert.pem> cert2.crt cert3.crt cert4.crt >> mms-ca.crt

    注意

    • 将占位符 <custom_ca_cert.pem> 替换为您的自定义 CA 证书 PEM文件。

    • 请勿包含 cert1.crt文件,因为不应包含来自MongoDB的服务器证书。

  3. 为MongoDB Ops Manager创建 ConfigMap:

    kubectl create configmap om-http-cert-ca --from-file="mms-ca.crt"
3
  1. Create a CA issuer that references your CA secret:

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
    name: ca-issuer
    namespace: <namespace>
    spec:
    ca:
    secretName: ca-key-pair
  2. 验证发行者是否已准备就绪:

    kubectl get issuer ca-issuer

    输出中READY字段的值应为True 。

4

创建一个包含您的 CA 的 ConfigMap。它必须有两个字段,ca-pem 和 mms-ca.crt,两者都指向您的 CA 证书。将 替换为您的<CA-certificate> CA 证书路径。

kubectl create cm ca-issuer --from-file=ca-pem=<CA-certificate> \
--from-file=mms-ca.crt=<CA-certificate>
5

要使用生成的证书保护 MongoDB 资源,您必须为资源本身和 MongoDB 代理创建证书。

  1. 创建 MongoDB 资源证书。 以下示例假设设置名称为my-replica-set的副本集有三个成员:

    注意

    spec.issuerRef.name参数引用之前创建的CA ConfigMap。

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
    name: my-replica-set-certificate
    namespace: mongodb
    spec:
    dnsNames:
    - my-replica-set-0
    - my-replica-set-0.my-replica-set-svc.mongodb.svc.cluster.local
    - my-replica-set-1
    - my-replica-set-1.my-replica-set-svc.mongodb.svc.cluster.local
    - my-replica-set-2
    - my-replica-set-2.my-replica-set-svc.mongodb.svc.cluster.local
    duration: 240h0m0s
    issuerRef:
    name: ca-issuer
    renewBefore: 120h0m0s
    secretName: mdb-my-replica-set-cert
    usages:
    - server auth
    - client auth

    对于分片的集群,您必须为每个StatefulSet创建一个证书。要学习;了解有关分片集群配置的更多信息,请参阅部署分片集群。

  2. 创建 MongoDB 代理证书:

    注意

    spec.issuerRef.name参数引用之前创建的CA ConfigMap。

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
    name: agent-certs
    namespace: mongodb
    spec:
    commonName: automation
    dnsNames:
    - automation
    duration: 240h0m0s
    issuerRef:
    name: ca-issuer
    renewBefore: 120h0m0s
    secretName: mdb-my-replica-set-agent-certs
    usages:
    - digital signature
    - key encipherment
    - client auth
    subject:
    countries:
    - US
    localities:
    - NY
    organizationalUnits:
    - a-1635241837-m5yb81lfnrz
    organizations:
    - cluster.local-agent
    provinces:
    - NY
  3. 创建 MongoDB 资源:

    注意

    如果未指定spec.security.tls.ca参数,则默认为{replica-set}-ca 。

    apiVersion: mongodb.com/v1
    kind: MongoDB
    metadata:
    name: my-replica-set
    namespace: mongodb
    spec:
    type: ReplicaSet
    members: 3
    version: 8.0.0
    opsManager:
    configMapRef:
    name: my-project
    credentials: my-credentials
    security:
    certsSecretPrefix: mdb
    authentication:
    enabled: true
    modes:
    - X509
    tls:
    ca: ca-issuer
    enabled: true
6

要保护 Ops Manager 资源,必须首先为 Ops Manager 和 AppDB 创建证书,然后创建 Ops Manager 资源。

  1. 创建 Ops Manager 证书:

    注意

    spec.issuerRef.name参数引用之前创建的CA ConfigMap。

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
    name: cert-for-ops-manager
    namespace: mongodb
    spec:
    dnsNames:
    - om-with-https-svc.mongodb.svc.cluster.local
    duration: 240h0m0s
    issuerRef:
    name: ca-issuer
    renewBefore: 120h0m0s
    secretName: mdb-om-with-https-cert
    usages:
    - server auth
    - client auth
  2. 创建 AppDB 证书:

    注意

    spec.issuerRef.name参数引用之前创建的CA ConfigMap。

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
    name: appdb-om-with-https-db-cert
    namespace: mongodb
    spec:
    dnsNames:
    - om-with-https-db-0
    - om-with-https-db-0.om-with-https-db-svc.mongodb.svc.cluster.local
    - om-with-https-db-1
    - om-with-https-db-1.om-with-https-db-svc.mongodb.svc.cluster.local
    - om-with-https-db-2
    - om-with-https-db-2.om-with-https-db-svc.mongodb.svc.cluster.local
    duration: 240h0m0s
    issuerRef:
    name: ca-issuer
    renewBefore: 120h0m0s
    secretName: appdb-om-with-https-db-cert
    usages:
    - server auth
    - client auth
  3. 创建 Ops Manager 资源:

    apiVersion: mongodb.com/v1
    kind: MongoDBOpsManager
    metadata:
    name: om-with-https
    namespace: mongodb
    spec:
    adminCredentials: ops-manager-admin-secret
    version: "8.0.0"
    applicationDatabase:
    members: 3
    security:
    certsSecretPrefix: appdb
    tls:
    ca: ca-issuer
    version: 8.0.0-ubi8
    replicas: 1
    security:
    certsSecretPrefix: mdb
    tls:
    ca: ca-issuer

cert-manager 将在以下情况下续订证书:

  • 证书根据其spec.duration和spec.renewBefore字段过期。

  • 删除持有证书的密钥。 在这种情况下,cert-经理会根据证书自定义资源中的配置重新创建密钥。

  • 您可以更改证书自定义资源的配置。 在这种情况下,cert-经理在检测到其配置更改时会重新创建包含证书的密钥。