如何在 Kubernetes 上安装 MongoDB

应用部署在 Kubernetes 中可能会很具挑战性,特别是对于诸如 MongoDB 这样的有状态应用到 Kubernetes 集群。您如何简化部署呢?让 MongoDB Kubernetes Operator 自动在您的 Kubernetes 集群中部署和管理有状态应用。

在本教程中,您将学习如何使用 MongoDB Kubernetes Operator 将 MongoDB 部署到 Kubernetes。

继续阅读并开始自动化您的 Kubernetes 部署!

先决条件

本教程将进行实际演示。要跟随操作,请确保您具备以下要求:

  • A Kubernetes cluster – This demo uses the Kubernetes cluster v1.23.

创建 MongoDB 的命名空间

在部署应用程序到 Kubernetes 时,始终建议为您的项目创建一个特定的命名空间。

命名空间使管理员更容易管理 Kubernetes 资源,并防止名称冲突。同时,创建命名空间可以防止在 Kubernetes 环境中错误地使用资源。

打开您的终端,并运行下面的kubectl create命令来在您的 Kubernetes 集群上创建一个名为mongodb的新命名空间(ns)。

kubectl create ns mongodb

现在运行下面的kubectl get命令来验证您的 Kubernetes 集群上命名空间的列表。

kubectl get ns

您将会看到一个名为mongodb的新命名空间出现在您的集群上,如下所示。

Creating and Verifying the mongodb Namespace

下载 MongoDB Kubernetes 运算符

创建了命名空间之后,现在是时候下载 MongoDB Kubernetes Operator 了。MongoDB Kubernetes Operator 是一组 Kubernetes 操作符。这些 Kubernetes 操作符可以在 Kubernetes 环境中自动部署、配置和管理 MongoDB Community。

运行下面的 git 命令,将 MongoDB Kubernetes Operator 项目克隆到本地机器。

git clone <https://github.com/mongodb/mongodb-kubernetes-operator.git>

现在,运行每个命令来将当前工作目录更改为 mongodb-kubernetes-operator 并列出(ls)所有可用的文件和目录。

# 将工作目录更改为 mongodb-kubernetes-operator
cd mongodb-kubernetes-operator/

# 列出文件和目录
ls

您将会看到 ~/mongodb-kubernetes-operator 项目目录下的一个名为 config 的子目录,如下所示。config 子目录包含了用于在 Kubernetes 上部署 MongoDB 的 YAML 文件示例。

Downloading mongodb-kubernetes-operator Source Code

部署 MongoDB Operator

现在,您已经设置好了自定义命名空间和 MongoDB Kubernetes Operator,可以将 MongoDB Operator 部署到 Kubernetes 集群上了。如何进行部署呢?您将使用 config 目录中的配置。

MongoDB Operator 负责处理您在 Kubernetes 集群上的 MongoDB 部署的生命周期。操作符将自动创建、管理和扩展 MongoDB 部署的状态。

要部署 MongoDB 操作员,您必须创建一个 Kubernetes 自定义资源定义(CRD) 和控制器。Kubernetes CRD 可扩展到 Kubernetes API,允许您在 Kubernetes 中创建自定义资源。

1. 运行下面的kubectl apply命令来为 MongoDB 部署创建一个新的 Kubernetes CRD。

Kubernetes 操作员 替代了所有人类交互来在 Kubernetes 上部署应用程序。操作员是一个 pod 控制器,会自动在 Kubernetes 上部署和管理您的有状态应用程序。

kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
Creating New Kubernetes CRD MongoDB Kubernetes Deployment

2. 接下来,运行以下kubectl get命令来验证您的 Kubernetes 中可用的 crd 列表。

kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

下面,您可以看到名称为 mongodbcommunity.mongodbcommunity.mongodb.org 的 CRD。

Checking List of CRDs

3. 运行以下命令为 MongoDB 操作员创建新的自定义基于角色的访问控制(RBAC),并将 RBAC 实现指定到命名空间 mongodb

这个命令创建了一个新的角色(role)、角色绑定(rolebinding)和服务账号(serviceaccount),用于在你的Kubernetes集群上设置MongoDB操作员的自定义权限。这些自定义权限是用来自动部署和管理MongoDB所必需的。

kubectl apply -k config/rbac/ -n mongodb
Deploying RBAC for MongoDB Deployment

4. 现在,运行下面的每个kubectl命令来验证MongoDB操作员的角色、角色绑定和服务账号。

# 检查角色列表
kubectl get role mongodb-kubernetes-operator -n mongodb

# 检查角色绑定列表
kubectl get rolebinding mongodb-kubernetes-operator -n mongodb

# 检查服务账号
kubectl get serviceaccount mongodb-kubernetes-operator -n mongodb

下面的输出显示在mongodb命名空间上创建了角色、角色绑定和服务账号mongodb-kubernetes-operator。

Checking role, rolebinding, and serviceaccount on Kubernetes

5. 验证完成后,运行以下kubectl命令将MongoDB操作员部署到mongodb命名空间。

这个命令创建了一个新的Pod(mongodb-kubernetes-operator),使用基础的Docker镜像(quay.io/mongodb/mongodb-kubernetes-operator)。这个Pod将作为控制器,用于在Kubernetes集群上自动部署MongoDB的副本集。

kubectl create -f config/manager/manager.yaml -n mongodb

下面的输出显示MongoDB操作员部署已经创建,但是Pod仍在初始化中。

Deploying MongoDB Operator to the mongodb Namespace

6. 最后,运行以下命令来验证在mongodb命名空间上的部署和Pod。

# 检查mongodb命名空间上的部署
kubectl get deployment.apps -n mongodb

# 检查mongodb命名空间上的Pod
kubectl get pods -n mongodb

如下所示,MongoDB操作员的Pod正在运行。

Verifying MongoDB Operator Deployment and Pod

部署MongoDB ReplicaSet到Kubernetes

在您的MongoDB部署完成后,您将部署ReplicaSet到您的Kubernetes上,以提供高可用性和冗余性,确保您的MongoDB部署不会出现停机。

使用MongoDB Kubernetes Operator部署MongoDB ReplicaSets默认情况下是安全的,使用SCRAM身份验证来保护用户。同时,您可以为用户和应用程序连接使用TLS安全连接,并公开Prometheus指标以监控资源。

相关:开始使用Grafana和Prometheus监控Kubernetes集群

config/samples/目录中,您将看到多个ReplicaSet部署的YAML文件示例。每个文件可用于不同的部署场景,但默认的ReplicaSet部署文件是mongodb.com_v1_mongodbcommunity_cr.yaml

1. 使用您喜欢的编辑器编辑部署的YAML文件。本演示使用/mongodb.com_v1_hostpath.yaml文件进行本地部署。该YAML文件位于config/samples/arbitrary_statefulset_configuration/目录中。

如果您在云服务(如GKE和AKS)上部署MongoDB Kubernetes Operator,请使用YAML文件`mongodb.com_v1_mongodbcommunity_cr.yaml`。但是,如果您在Kind或Minikube中本地部署,可以使用自定义的YAML文件(`arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml`),该文件会自动为MongoDB ReplicaSet pods创建自定义PV和PVC。

下面根据您的环境更改要部署的ReplicaSets(成员)的数量,但默认值为3。对于本教程,ReplicaSets的数量设置为2。

spec:
  members: 2 # 要创建的副本集数量
  security:
    authentication:
      modes:
      - SCRAM
  statefulSet:

用您强密码替换<your-password-here>。您将使用此密码登录MongoDB数据库,默认情况下使用SCRAM身份验证。

保存更改后,关闭编辑器。

---
apiVersion: v1
kind: Secret
metadata:
  name: my-user-password
type: Opaque
stringData:
  password: <your-password-here> # 为MongoDB管理员设置密码

2. 接下来,运行以下kubectl命令,使用mongodb.com_v1_hostpath.yaml部署(apply)MongoDB ReplicaSet到mongodb命名空间。

此命令将创建以下内容:

  • A new custom resource (MongoDBCommunity) with the name mdb0 under the mongodbcommunity.mongodb.com/v1 CRD
  • Kubernetes secrets用于存储MongoDB用户密码。同时,为MongoDB Replica Set创建了一些类型为hostPath的PV和PVC。

部署需要一些时间,这取决于要创建的 ReplicaSets 的大小和 Kubernetes 集群本身。

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Deploying MongoDB Replica Sets

3. 部署完成后,运行以下每个命令以验证自定义资源和 mongodb 命名空间上的 pod。

# 检查 mongodbcommunity crd
kubectl get mongodbcommunity -n mongodb

# 检查 mongodb 命名空间上的 pod
kubectl get pods -n mongodb

下面的输出显示:

  • 名为 mdb0 的自定义资源 MongoDBCommunity 正在运行,使用的是 MongoDB v4.4.0
  • 两个 MongoDB ReplicaSet pod 正在运行,分别是 mdb0-0mdb0-1。每个 pod 包含两个不同的容器,即 mongodmongodb-agent
Verifying MongoDB ReplicaSet Deployment and Pods

4. 最后,运行另一个 kubectl 命令以验证 mongodb 命名空间上的 pvpvc

kubectl get pv,pvc -n mongodb

下面的输出显示 MongoDB ReplicaSet pod 使用的一些 pv 和 pvc。

Checking PV and PVC on the mongodb Namespace

为 MongoDB 部署创建新用户和数据库

到目前为止,您已经完成了 MongoDB operator 和 ReplicaSets 的部署到 Kubernetes 集群。下一步是为您的应用程序创建一个新的 MongoDB 数据库和用户。

您将为新用户创建一个新的 Kubernetes 密钥,编辑 ReplicaSet 部署的自定义资源,并将 ReplicaSet 更新到您的集群中。

1. 使用您喜欢的编辑器创建一个新的 YAML 文件,并填入以下 Kubernetes 密钥。您可以随意命名 YAML 文件,但本教程中将文件命名为 new-user.yaml

这个 YAML 文件创建了一个新的 Kubernetes 密钥,名称为 myappdata,密码为 myapppassword。

---
apiVersion: v1
kind: Secret
metadata:
  name: myappdata # 密钥元数据的名称
type: Opaque
stringData:
  password: myapppassword # 新用户的密码

2. 接下来,运行以下 kubectl 命令来执行 new-user.yaml 配置。

此命令将创建并应用一个新的 Kubernetes 密钥到您的集群,并将此密钥应用到 mongodb 命名空间。

kubectl apply -f new-user.yaml -n mongodb
Creating Secret to Kubernetes Cluster

3. 编辑您的 ReplicaSet CRD 配置的 YAML 文件(mongodb.com_v1_hostpath.yaml)在 config/samples/arbitrary_statefulset_configuration 目录中。

将以下配置添加到 mongodb.com_v1_hostpath.yaml 文件中,该配置将为 MongoDB 创建数据库和用户。

确保将 scram-secret-myapp 替换为您自己的 scram 凭据,保存文件更改并关闭编辑器。

    - name: appuser # 新用户 appuser
      db: admin # 允许认证到数据库 admin
      passwordSecretRef:
        name: myappdata # Kubernetes 密钥
      roles:
        - name: dbAdmin # 设置角色 dbAdmin
          db: appdb1 # 到 appdb1 的
      scramCredentialsSecretName: scram-secret-myapp

4. 现在,在第三步中运行以下命令以在 mongodb.com_v1_hostpath.yaml 文件中 apply 你所做的新更改。

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Creating New MongoDB User and Database on Kubernetes

5. 最后,运行以下每个命令以为你的应用程序生成详细的 MongoDB 连接。这些命令生成以 JSON 输出的应用程序的详细 MongoDB 连接,并使用 jq 命令行解析输出。

将 mdb0-admin-mongoadmin 替换为以下环境详细信息:

  • mdb0 – MongoDB 资源的元数据名称。
  • admin – 用于身份验证的数据库。
  • mongoadmin – 用于身份验证的用户。
# 获取管理员身份验证详细信息和连接
kubectl get secrets mdb0-admin-mongoadmin -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

# 获取应用程序用户身份验证详细信息和连接
kubectl get secrets mdb0-admin-appuser -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

下面的输出显示你可以使用 standard 和 standardSrv 连接到 MongoDB。你还将看到 MongoDB 部署的用户名和密码。

Retrieving Details of MongoDB User and Password, and Connections

连接到 MongoDB 部署

你已经完成在 Kubernetes 集群上使用 MongoDB Kubernetes 运算符部署 MongoDB。但是你如何知道部署是否有效?你将验证本地计算机与 Kubernetes 集群内的 MongoDB 数据库和用户连接。

要验证与 MongoDB 部署的连接,你将使用端口转发。Kubernetes 中的端口转发允许你从任何 Kubernetes 服务创建到本地端口的转发端口。

1. 运行以下kubectl命令以getmongodb命名空间(-n)的服务列表

kubectl get svc -n mongodb

下面,您将看到名为mdb0-svc的服务,该服务暴露了端口27017(MongoDB的默认端口)。

Listing Services on the mongodb Namespace

2. 接下来,运行以下命令以在Kubernetes集群上创建端口转发。

此命令在Kubernetes服务(mdb0-svc)上创建新的端口转发,并将本地端口27017转发到Kubernetes服务端口27017。

kubectl port-forward service/mdb0-svc -n mongodb 27017:27017
Setting up Port-forward

3. 最后,在本地计算机上打开您的MongoDB Compass应用程序,使用以下格式添加新连接,然后点击连接以连接到MongoDB。

将用户名和密码字段更改为您的MongoDB用户名和密码。

# 作为mongoadmin连接
mongodb://mongoadmin:secretpassword@localhost:27017/admin?ssl=false

# 作为appuser连接
mongodb://appuser:myapppassword@localhost:27017/admin?ssl=false
Connecting as mongoadmin user to MongoDB
Connecting as appuser to MongoDB

当连接成功时,您将收到确认MongoDB部署到Kubernetes正常工作的窗口。

对于mongoadmin用户,您将看到默认数据库(local、config和admin)。

Verifying Connection to the MongoDB mongoadmin

对于appuser,您只会看到一个名为appdb1的权限数据库。

Verifying Connection to the MongoDB as appuser

结论

通过本教程,您学会了如何使用MongoDB Kubernetes Operator将MongoDB部署到Kubernetes集群。您还了解了Kubernetes operator的基本用法。到目前为止,您已经对自动部署和管理应用程序到Kubernetes有了扎实的了解。

为什么不在您的 MongoDB 部署上建立一个 TLS 连接,以利用这一新获得的知识呢?TLS 连接可以保护副本集之间的连接,并保护客户端或应用程序与 MongoDB 的连接。

Source:
https://adamtheautomator.com/mongodb-kubernetes/