如何執行 MongoDB Kubernetes 安裝

在 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

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

Downloading mongodb-kubernetes-operator Source Code

部署MongoDB Operator

现在,你已经设置好了自定义命名空间和MongoDB Kubernetes Operator,准备将MongoDB Operator部署到你的Kubernetes集群中。如何做呢?你将使用config目录中的配置。

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

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

1. 运行以下命令kubectl apply,创建用于MongoDB部署的新的Kubernetes CRD。

Kubernetes operator 替代了所有人为干预Kubernetes应用部署的过程。这个operator是一个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 Operator创建一个新的自定义基于角色的访问控制(RBAC),并将RBAC实现指定到命名空间mongodb

此命令創建了一個新角色、角色綁定和服務帳戶,用於 MongoDB 運算子,這些是您 Kubernetes 集群上的自定義權限。這些自定義權限是自動部署和管理 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-kubernetes-operator 已在 mongodb 命名空間上創建。

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 副本集到 Kubernetes

在完成 MongoDB 部署后,您将在 Kubernetes 上部署副本集,以提供 MongoDB 部署的高可用性和冗余。您不希望在部署中出现停机时间。

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

相关: 使用 Grafana 和 Prometheus 进行 Kubernetes 集群监控入门

在 config/samples/ 目录中,您将看到用于副本集部署的多个 YAML 文件示例。每个文件可用于不同的部署场景,但默认的副本集部署文件是 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。

以下根據您的環境更改要部署的副本集數量(成員數),但默認值為3。對於本教程,將副本集數量設置為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
  • 用於存儲MongoDB用戶密碼的Kubernetes secrets。同時,一些具有hostPath類型的PV和PVC用於MongoDB Replica Set。

部署將需要一些時間,具體取決於要創建的 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-0 和 mdb0-1。每個 Pod 包含兩個不同的容器,分別是 mongod 和 mongodb-agent 容器。
Verifying MongoDB ReplicaSet Deployment and Pods

4. 最後,運行另一個 kubectl 命令以驗證在 mongodb 命名空間中的 pv 和 pvc

kubectl get pv,pvc -n mongodb

以下輸出顯示 MongoDB ReplicaSet Pod 使用的一些 pv 和 pvc。

Checking PV and PVC on the mongodb Namespace

為 MongoDB 部署創建新用戶和數據庫

到目前為止,您已經完成了將 MongoDB 運算元和 ReplicaSets 部署到您的 Kubernetes 集群的工作。下一步是為您的應用程序創建新的 MongoDB 數據庫和用戶。

您將為新用戶創建一個新的 Kubernetes 密鑰,編輯 ReplicaSet 部署的自定義資源,並將 ReplicaSet 更新到您的集群中。

1. 使用您喜歡的編輯器創建一個新的 YAML 文件,並填入以下 Kubernetes 密鑰。您可以隨意命名 YAML 文件,但在本教程中該文件命名為 new-user.yaml

此 YAML 文件創建一個名為 myappdata 的新 Kubernetes 密鑰,並將密碼設置為 myapppassword。

---
apiVersion: v1
kind: Secret
metadata:
  name: myappdata # 密鑰的名稱 meta.data
type: Opaque
stringData:
  password: myapppassword # 新用戶的密碼

2. 接下來,運行以下 kubectl 命令來執行 new-user.yaml 配置。

此命令將在您的集群中創建並應用(apply)一個新的 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 檔案中所做的新更改。

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)'

# 獲取 appuser 驗證詳細信息和連接
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命令get列出在mongodb命名空間(-n)中的服務(svc)。

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運算子的基本用法。 到目前為止,您已經對自動將應用程序部署和管理到Kubernetes擁有了良好的知識。

為什麼不在您的MongoDB部署上設立一個TLS連接,以利用這些新知識? TLS連接可保護副本集之間的連接,並保護客戶端或應用程序與MongoDB的連接。

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