Kubernetes 演算子を使用すると、Kubernetes クラスター上で MongoDB Enterprise v8.2.0 以上と共に実行する MongoDB Search とベクトル検索のリソースを配置できます。この手順では、お使いの Kubernetes クラスター内の新規または既存のレプリカセットで mongot プロセスを実行するために配置して構成する方法を説明します。配置は、MongoDB ノードと mongot 検索プロセスの間の安全な通信を確保するため、TLS 証明書を使用します。
前提条件
MongoDB Search とベクトル検索を配置するには、次のものが必要です。
ローカルで使用可能な
kubeconfigを含む実行中のKubernetesクラスター。Kubernetesコマンドライン ツール(
kubectl)は、クラスターと通信するように構成されています。Helm、Kubernetesのパッケージマネージャーである Helm は、 Kubernetes演算子をインストールします。
このチュートリアルのコマンドを実行中には、Batch v5.1 以上が必要です。
MongoDB Ops Manager または MongoDB Cloud Manager のプロジェクトと API 認証情報。
手順
必須。環境変数を設定してください。
この手順の後続のステップで使用する環境変数を設定します。次のコマンドをコピーして、環境の値を更新し、それらを実行することで変数をロードします。
# set it to the context name of the k8s clusterexport K8S_CTX="<local cluster context>"
# the following namespace will be created if not existsexport MDB_NS="mongodb"
# name of the MongoDB Custom Resource.export MDB_RESOURCE_NAME="mdb-rs"
export MDB_MEMBERS=3# OM/CM's project name to be used to manage mongodb replica setexport OPS_MANAGER_PROJECT_NAME="<arbitrary project name>"
# URL to Cloud Manager or Ops Manager instanceexport OPS_MANAGER_API_URL="https://cloud-qa.mongodb.com"
# The API key can be an Org Owner - the operator can create the project automatically then.# The API key can also be created in a particular project that was created manually with the Project Owner scope.export OPS_MANAGER_API_USER="<SET API USER>"export OPS_MANAGER_API_KEY="<SET API KEY>"export OPS_MANAGER_ORG_ID="<SET ORG ID>"
# minimum required MongoDB version for running MongoDB Search is 8.2.0export MDB_VERSION="8.2.0-ent"
# root admin user for convenience, not used here at all in this guideexport MDB_ADMIN_USER_PASSWORD="admin-user-password-CHANGE-ME"# regular user performing restore and search queries on sample mflix databaseexport MDB_USER_PASSWORD="mdb-user-password-CHANGE-ME"# user for MongoDB Search to connect to the replica set to synchronise data fromexport MDB_SEARCH_SYNC_USER_PASSWORD="search-sync-user-password-CHANGE-ME"
export OPERATOR_HELM_CHART="mongodb/mongodb-kubernetes"# comma-separated key=value pairs for additional parameters passed to the helm-chart installing the operatorexport OPERATOR_ADDITIONAL_HELM_VALUES=""
export MDB_TLS_CERT_SECRET_PREFIX="certs"export MDB_TLS_CA_CONFIGMAP="${MDB_RESOURCE_NAME}-ca-configmap"
export CERT_MANAGER_NAMESPACE="cert-manager"export MDB_TLS_SELF_SIGNED_ISSUER="selfsigned-bootstrap-issuer"export MDB_TLS_CA_CERT_NAME="my-selfsigned-ca"export MDB_TLS_CA_SECRET_NAME="root-secret"export MDB_TLS_CA_ISSUER="my-ca-issuer"export MDB_TLS_SERVER_CERT_SECRET_NAME="${MDB_TLS_CERT_SECRET_PREFIX}-${MDB_RESOURCE_NAME}-cert"export MDB_SEARCH_TLS_SECRET_NAME="${MDB_RESOURCE_NAME}-search-tls"
export MDB_CONNECTION_STRING="mongodb://mdb-user:${MDB_USER_PASSWORD}@${MDB_RESOURCE_NAME}-svc.${MDB_NS}.svc.cluster.local:27017/?replicaSet=${MDB_RESOURCE_NAME}&tls=true&tlsCAFile=/tls/ca.crt"条件付き。MongoDB Helmリポジトリを追加します。
Helm は、 Kubernetes上のMongoDBインスタンスの配置と管理を自動化します。Kubernetes Operator 演算子をインストールするための Helmチャートを含む Helmリポジトリをすでに追加している場合は、この手順をスキップします。それ以外の場合は、 Helmリポジトリを追加します。
を追加、コピー、貼り付け、実行するには、次のコマンドを実行します。
helm repo add mongodb https://mongodb.github.io/helm-chartshelm repo update mongodbhelm search repo mongodb/mongodb-kubernetes条件付き。Kubernetes Operator 用のMongoDBコントロール をインストールします。
Kubernetes 演算子は、MongoDB、MongoDBOpsManager、MongoDBSearch のカスタム リソースを監視し、MongoDB配置のライフサイクルを管理します。MongoDB コントローラー for Kubernetes 演算子をすでにインストールしている場合は、この手順をスキップします。それ以外の場合は、前の手順で追加した Helm リポジトリから MongoDB 用の Kubernetes Operator をインストールします。
MongoDB Controls for Kubernetes Operator を mongodb名前空間にインストールするには、次のコマンドをコピー、貼り付け、実行します。
helm upgrade --install --debug --kube-context "${K8S_CTX}" \ --create-namespace \ --namespace="${MDB_NS}" \ mongodb-kubernetes \ ${OPERATOR_ADDITIONAL_HELM_VALUES:+--set ${OPERATOR_ADDITIONAL_HELM_VALUES}} \ "${OPERATOR_HELM_CHART}"条件付き。cert-managerをインストールします。
cert-managerTLS 証明書の管理には が必要です。クラスターにすでに cert-manager がインストールされている場合は、この手順をスキップします。それ以外の場合は、Helm を使用して cert-manager をインストールします。
cert-manager名前空間に cert-manager をインストールするには、ターミナルで次のコマンドを実行します。
helm upgrade --install \ cert-manager \ oci://quay.io/jetstack/charts/cert-manager \ --kube-context "${K8S_CTX}" \ --namespace "${CERT_MANAGER_NAMESPACE}" \ --create-namespace \ --set crds.enabled=true
for deployment in cert-manager cert-manager-cainjector cert-manager-webhook; do kubectl --context "${K8S_CTX}" \ -n "${CERT_MANAGER_NAMESPACE}" \ wait --for=condition=Available "deployment/${deployment}" --timeout=300sdone
echo "cert-manager is ready in namespace ${CERT_MANAGER_NAMESPACE}."必須。証明書発行者と CA インフラストラクチャを準備します。
MongoDB および MongoDBSearch リソース用の TLS 証明書を発行する証明書発行機関インフラストラクチャを作成します。これらのコマンドは、次のアクションを実行します。
自己署名
ClusterIssuerを作成します。CA 証明書を生成します。
すべての名前空間が使用できるクラスター全体の CA 発行者を公開します。
MongoDBリソースがそれを使用できるように、
ConfigMapを通じて CA バンドルを公開します。
# Bootstrap a self-signed ClusterIssuer to mint the CA secret consumed by application workloads.kubectl apply --context "${K8S_CTX}" -f - <<EOF_MANIFESTapiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: ${MDB_TLS_SELF_SIGNED_ISSUER}spec: selfSigned: {}EOF_MANIFEST
kubectl --context "${K8S_CTX}" wait --for=condition=Ready clusterissuer "${MDB_TLS_SELF_SIGNED_ISSUER}"
kubectl apply --context "${K8S_CTX}" -f - <<EOF_MANIFESTapiVersion: cert-manager.io/v1kind: Certificatemetadata: name: ${MDB_TLS_CA_CERT_NAME} namespace: ${CERT_MANAGER_NAMESPACE}spec: isCA: true commonName: ${MDB_TLS_CA_CERT_NAME} secretName: ${MDB_TLS_CA_SECRET_NAME} privateKey: algorithm: ECDSA size: 256 issuerRef: name: ${MDB_TLS_SELF_SIGNED_ISSUER} kind: ClusterIssuerEOF_MANIFEST
kubectl --context "${K8S_CTX}" wait --for=condition=Ready -n "${CERT_MANAGER_NAMESPACE}" certificate "${MDB_TLS_CA_CERT_NAME}"
kubectl apply --context "${K8S_CTX}" -f - <<EOF_MANIFESTapiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: ${MDB_TLS_CA_ISSUER}spec: ca: secretName: ${MDB_TLS_CA_SECRET_NAME}EOF_MANIFEST
kubectl --context "${K8S_CTX}" wait --for=condition=Ready clusterissuer "${MDB_TLS_CA_ISSUER}"
TMP_CA_CERT="$(mktemp)"trap 'rm -f "${TMP_CA_CERT}"' EXIT
kubectl --context "${K8S_CTX}" get secret "${MDB_TLS_CA_SECRET_NAME}" -n "${CERT_MANAGER_NAMESPACE}" -o jsonpath="{.data['ca\\.crt']}" | base64 --decode > "${TMP_CA_CERT}"
kubectl --context "${K8S_CTX}" create configmap "${MDB_TLS_CA_CONFIGMAP}" -n "${MDB_NS}" \ --from-file=ca-pem="${TMP_CA_CERT}" --from-file=mms-ca.crt="${TMP_CA_CERT}" \ --from-file=ca.crt="${TMP_CA_CERT}" \ --dry-run=client -o yaml | kubectl --context "${K8S_CTX}" apply -f -必須。TLS 証明書を発行します。
MongoDB サーバー (${MDB_RESOURCE_NAME}-server-tls) と MongoDBSearch サービス (${MDB_RESOURCE_NAME}-search-tls) の両方に対して、TLS 証明書を発行します。MongoDB サーバー証明書には、ポッドとサービスの通信に必要なすべての DNS 名が含まれています。両方の証明書は、サーバー認証とクライアント認証の両方をサポートしています。
server_certificate="${MDB_RESOURCE_NAME}-server-tls"search_certificate="${MDB_RESOURCE_NAME}-search-tls"
mongo_dns_names=()for ((member = 0; member < MDB_MEMBERS; member++)); do mongo_dns_names+=("${MDB_RESOURCE_NAME}-${member}") mongo_dns_names+=("${MDB_RESOURCE_NAME}-${member}.${MDB_RESOURCE_NAME}-svc.${MDB_NS}.svc.cluster.local")donemongo_dns_names+=( "${MDB_RESOURCE_NAME}-svc.${MDB_NS}.svc.cluster.local" "*.${MDB_RESOURCE_NAME}-svc.${MDB_NS}.svc.cluster.local")
search_dns_names=( "${MDB_RESOURCE_NAME}-search-svc.${MDB_NS}.svc.cluster.local")
render_dns_list() { local dns_list=("$@") for dns in "${dns_list[@]}"; do printf " - \"%s\"\n" "${dns}" done}
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOF_MANIFESTapiVersion: cert-manager.io/v1kind: Certificatemetadata: name: ${server_certificate} namespace: ${MDB_NS}spec: secretName: ${MDB_TLS_SERVER_CERT_SECRET_NAME} issuerRef: name: ${MDB_TLS_CA_ISSUER} kind: ClusterIssuer duration: 240h0m0s renewBefore: 120h0m0s usages: - digital signature - key encipherment - server auth - client auth dnsNames:$(render_dns_list "${mongo_dns_names[@]}")---apiVersion: cert-manager.io/v1kind: Certificatemetadata: name: ${search_certificate} namespace: ${MDB_NS}spec: secretName: ${MDB_SEARCH_TLS_SECRET_NAME} issuerRef: name: ${MDB_TLS_CA_ISSUER} kind: ClusterIssuer duration: 240h0m0s renewBefore: 120h0m0s usages: - digital signature - key encipherment - server auth - client auth dnsNames:$(render_dns_list "${search_dns_names[@]}")EOF_MANIFEST
kubectl --context "${K8S_CTX}" -n "${MDB_NS}" wait --for=condition=Ready certificate "${server_certificate}" --timeout=300skubectl --context "${K8S_CTX}" -n "${MDB_NS}" wait --for=condition=Ready certificate "${search_certificate}" --timeout=300s条件付き。MongoDB Enterpriseリソースを作成して配置します。
MongoDB Enterpriseをすでに配置している場合は、次の手順に進みます。それ以外の場合は、 MongoDB Enterpriseリソースを配置します。
MongoDB Enterpriseを配置するには、次の手順を実行します。
MongoDB Ops Managerを使用している場合は、MongoDB Ops ManagerプロジェクトのConfigMapとシークレットを作成します。
MongoDB Ops Managerと統合する構成と認証情報を保存するには、次のコマンドをコピー、貼り付け、実行します。
kubectl --context "${K8S_CTX}" -n "${MDB_NS}" create configmap om-project \ --from-literal=projectName="${OPS_MANAGER_PROJECT_NAME}" --from-literal=baseUrl="${OPS_MANAGER_API_URL}" \ --from-literal=orgId="${OPS_MANAGER_ORG_ID:-}" kubectl --context "${K8S_CTX}" -n "${MDB_NS}" create secret generic om-credentials \ --from-literal=publicKey="${OPS_MANAGER_API_USER}" \ --from-literal=privateKey="${OPS_MANAGER_API_KEY}"mdb-rsという名前のMongoDBカスタムリソースを作成します。リソースは、
mongodコンテナとmongodb-agentコンテナの CPU とメモリ リソースを定義し、 Kubernetes Operator に 3 ノードでMongoDBレプリカセットを構成するように指示します。MongoDB Enterpriseを配置するには、以下をコピーして貼り付け、名前空間で実行します。
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBmetadata: name: ${MDB_RESOURCE_NAME}spec: members: ${MDB_MEMBERS} version: ${MDB_VERSION} type: ReplicaSet opsManager: configMapRef: name: om-project credentials: om-credentials security: authentication: enabled: true ignoreUnknownUsers: true modes: - SCRAM certsSecretPrefix: ${MDB_TLS_CERT_SECRET_PREFIX} tls: enabled: true ca: ${MDB_TLS_CA_CONFIGMAP} agent: logLevel: INFO podSpec: podTemplate: spec: containers: - name: mongodb-enterprise-database resources: limits: cpu: "2" memory: 2Gi requests: cpu: "1" memory: 1GiEOFMongoDBリソースの配置が完了するまで待ちます。MongoDBカスタムリソースを適用すると、 Kubernetes演算子によってMongoDBノード(ポッド)の配置が開始されます。このステップでは、mdbc-rsリソースのステータス フェーズがRunningになるまで実行を一時停止します。これはMongoDB Communityレプリカセットが操作可能であることを示します。echo "Waiting for MongoDB resource to reach Running phase..."kubectl --context "${K8S_CTX}" -n "${MDB_NS}" wait --for=jsonpath='{.status.phase}'=Running "mdb/${MDB_RESOURCE_NAME}" --timeout=400secho; echo "MongoDB resource"kubectl --context "${K8S_CTX}" -n "${MDB_NS}" get "mdb/${MDB_RESOURCE_NAME}"echo; echo "Pods running in cluster ${K8S_CTX}"kubectl --context "${K8S_CTX}" -n "${MDB_NS}" get pods
必須。MongoDBユーザーシークレットを作成してロードします。
MongoDB、安全なアクセスのために認証が必要です。この手順では、3 つのKubernetesシークレットを作成します。
mdb-admin-user-password: MongoDB管理者の認証情報。mdb-user-password: 検索クエリを実行する権限を持つユーザーの認証情報。mdbc-rs-search-sync-source-password: データを同期し、インデックスを管理するためにmongotプロセスによって内部的に使用される専用検索ユーザーの認証情報。
Kubernetes Operator はこれらのシークレットをMongoDBポッドにマウントします。
シークレットを作成するには、 MongoDB Serverを配置し、 MongoDB Search とベクトル検索を配置する予定の名前空間で、以下をコピーして貼り付け、実行します。
# admin user with root rolekubectl --context "${K8S_CTX}" --namespace "${MDB_NS}" \ create secret generic mdb-admin-user-password \ --from-literal=password="${MDB_ADMIN_USER_PASSWORD}"
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBUsermetadata: name: mdb-adminspec: username: mdb-admin db: admin mongodbResourceRef: name: ${MDB_RESOURCE_NAME} passwordSecretKeyRef: name: mdb-admin-user-password key: password roles: - name: root db: adminEOF
# user used by MongoDB Search to connect to MongoDB database to synchronize data from# For MongoDB <8.2, the operator will be creating the searchCoordinator custom role automatically# From MongoDB 8.2, searchCoordinator role will be a built-in role.kubectl --context "${K8S_CTX}" --namespace "${MDB_NS}" \ create secret generic "${MDB_RESOURCE_NAME}-search-sync-source-password" \ --from-literal=password="${MDB_SEARCH_SYNC_USER_PASSWORD}"kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBUsermetadata: name: search-sync-source-userspec: username: search-sync-source db: admin mongodbResourceRef: name: ${MDB_RESOURCE_NAME} passwordSecretKeyRef: name: ${MDB_RESOURCE_NAME}-search-sync-source-password key: password roles: - name: searchCoordinator db: adminEOF
# user performing search querieskubectl --context "${K8S_CTX}" --namespace "${MDB_NS}" \ create secret generic mdb-user-password \ --from-literal=password="${MDB_USER_PASSWORD}"kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBUsermetadata: name: mdb-userspec: username: mdb-user db: admin mongodbResourceRef: name: ${MDB_RESOURCE_NAME} passwordSecretKeyRef: name: mdb-user-password key: password roles: - name: readWrite db: sample_mflixEOF必須。MongoDB Search とベクトル検索のリソースを作成して配置します 。
負荷分散なしで、検索ノードの 1 つのインスタンスを配置できます。配置するには、次の手順を実行します。
mdbc-rsという名前の MongoDBSearch カスタムリソースを作成します。このリソースは、検索ノードの CPU とメモリのリソース要件を指定します。このカスタムリソースの設定の詳細については、MongoDB Search とベクトル検索の設定を参照してください。
kubectl apply --context "${K8S_CTX}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBSearchmetadata: name: ${MDB_RESOURCE_NAME}spec: # no need to specify source.mongodbResourceRef if MongoDBSearch CR has the same name as MongoDB CR # the operator infer it automatically security: tls: certificateKeySecretRef: name: ${MDB_SEARCH_TLS_SECRET_NAME} resourceRequirements: limits: cpu: "3" memory: 5Gi requests: cpu: "2" memory: 3GiEOFMongoDBSearchリソースの配置が完了するまで待機します。
MongoDBSearch カスタムリソースを適用すると、Kubernetes演算子による検索ノード(ポッド)の配置が開始されます。このステップでは、
mdbc-rsリソースのステータス フェーズがRunningになるまで実行を一時停止します。このフェーズはMongoDB Communityレプリカセットが操作可能であることを示します。echo "Waiting for MongoDBSearch resource to reach Running phase..."kubectl --context "${K8S_CTX}" -n "${MDB_NS}" wait --for=jsonpath='{.status.phase}'=Running "mdbs/${MDB_RESOURCE_NAME}" --timeout=300s
任意。名前空間で実行中のすべてのポッドを表示します。
MongoDBレプリカセットノード、 Kubernetes演算子用のMongoDBコントロール、および検索ノードの名前空間ポッド内のすべての実行中中のポッドを表示します。
echo; echo "MongoDB resource"kubectl --context "${K8S_CTX}" -n "${MDB_NS}" get "mdb/${MDB_RESOURCE_NAME}"echo; echo "MongoDBSearch resource"kubectl --context "${K8S_CTX}" -n "${MDB_NS}" get "mdbs/${MDB_RESOURCE_NAME}"echo; echo "Pods running in cluster ${K8S_CTX}"kubectl --context "${K8S_CTX}" -n "${MDB_NS}" get pods次のステップ
MongoDB Enterprise Edition で使用するMongoDB Search とベクトル検索を正常に配置したので、 MongoDBクラスターにデータを追加し、 MongoDB Search およびベクトル検索インデックスを作成し、データに対してクエリを実行できます。詳細については、 MongoDB Search とベクトル検索 の設定 を参照してください。