用Kubernetes搭建便攜式開發環境之MongoDB

前言

這已是咱們用Kubernetes搭建便攜式開發環境的第三篇文章了,前兩篇文章咱們分別在本地的Kubernetes集羣上作了什麼呢?第一篇文章咱們在搭建了一個Etcd集羣,因爲Etcd沒有什麼好的管理客戶端還搭建了一個Etcd的Web UI客戶端。第二篇文章咱們搭建了一個單點的MySQL服務和Redis服務,若是想不起來的同窗能夠翻看前面的兩篇文章:node

用Kubernetes搭建便攜式開發環境之MySQL和Redisgit

用Kubernetes搭建Etcd集羣和WebUIgithub

那麼有的同窗就私信問啦,我想搭建一個MongoDB該怎麼弄啊?其實若是前面搭建MySQL和Redis的文章看懂了,按照一樣的思路搭建一個MongoDB環境也不是什麼難事,湊巧以前有個用Spring寫的服務也用了MongoDB,今天我就帶你們快速搭建一個開發環境用的單點MongoDB服務。在應用過程當中咱們也會趁這個機會介紹一下 Kubernetes 的 Secret 應該怎麼使用。spring

今天文章裏使用的案例我已經上傳到Github上我整理的Kubernetes經常使用YAML的倉庫裏了,你們點擊閱讀原文或者直接訪問 github.com/kevinyan815… 後下載使用。mongodb

聲明MongoDB資源

定義Secret

咱們先爲MongoDB分配一個具備Root權限的帳戶和相應的密碼,Kubernetes專門有一種資源叫作Secret,用來解決密碼、token、密鑰等敏感數據的配置問題,而不須要把這些敏感數據暴露PodTemplate的Spec信息中。Secret也分三種類型,今天咱們使用的是Opaque類型的Secret,它以base64編碼格式存儲密碼、密鑰等信息。api

# 文件名 mongo-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mongodb-secret
type: Opaque
data:
  # echo -n 'username' | base64
  mongo-root-username: dXNlcm5hbWU=
  # echo -n 'password' | base64
  mongo-root-password: cGFzc3dvcmQ=
複製代碼

這裏我把Root用戶的名稱和密碼分別定義成了usernamepassword,有點蠢,純屬是爲了好理解用。你能夠本身經過在命令行裏執行base64命令,獲得想要的字符串的base64編碼後的字符序列。好比像下面這樣得到字符串root用base64編碼後的結果。微信

echo -n 'root' | base64
cm9vdA==
複製代碼

定義MongoDB應用

Secret和ConfigMap在使用上有點相似,也能夠把配置項直接應用到Pod模板的環境變量定義裏,若是說ConfigMap是Kubernetes在用管理對象的方式管理配置,那麼Secret就至關因而Kubernetes在用管理對象的方式管理密鑰之類的敏感信息。markdown

關於ConfigMap的詳細介紹,能夠參考之前的文章:ConfigMap用管理對象的方式管理配置app

完整的MongoDB應用的資源定義以下:spring-boot

# 文件名 deployment-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb-deployment
  labels:
    app: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
        - name: mongodb
          image: mongo
          ports:
            - containerPort: 27017
          env:
            - name: MONGO_INITDB_ROOT_USERNAME
              valueFrom:
                secretKeyRef:
                  name: mongodb-secret
                  key: mongo-root-username
            - name: MONGO_INITDB_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mongodb-secret
                  key: mongo-root-password
          volumeMounts:
            - name: mongodb-storage
              mountPath: /data/db
      volumes:
        - name: mongodb-storage
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-service
spec:
  type: NodePort
  selector:
    app: mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017
      nodePort: 30017
複製代碼

除了應用Pod的定義以外,我把像集羣外暴露Mongo服務的Service也放在了同一個YAML定義文件裏,咱們指定了在集羣外部能夠經過 30017 這個端口訪問到Mongo服務的監聽的27017端口。

建立MongoDB

聊明白了MongoDB的資源定義後,建立MongoDB仍是用咱們一直在使用的 kubectl apply -f 命令,把資源定義提交給 Kubernetes 的 ApiServer ,調度器就會自動幫咱們建立好這些資源。

# 切到mongo yaml所在的目錄
kubectl apply -f mongo-secret.yaml

kubectl apply -f deployment-service.yaml
複製代碼

等建立完成後,咱們可使用MongoDB Compass 這個客戶端,嘗試鏈接一下。

圖片

鏈接信息設置成下面這個,就能鏈接上咱們剛剛建立的MongoDB。

mongodb://username:password@127.0.0.1:30017/?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&ssl=false
複製代碼

在程序裏鏈接MongoDB

在這裏,我還行跟你們拓展一下怎麼在MongoDB裏建立業務用的DB和響應的用戶名密碼,以及怎麼在Java和Go的項目裏鏈接上MongoDB。

建立業務DB

當咱們鏈接上建立的MongoDB時,它只有默認的三個系統自帶的db,通常咱們的項目程序在用到MongoDB存儲數據是會跟MySQL同樣建立一個db。

> use my-database

> db.createUser(
  {
    user: "my-user",
    pwd: "passw0rd",
    roles: [ { role: "readWrite", db: "my-database" } ]
  }
)
複製代碼

經過上面這兩個命令我就在MongoDB裏建立了一個名爲my-database的 db,爲這個db分配了一個能夠讀寫的用戶my-user,密碼是passw0rd

在SpringBoot項目裏鏈接MongoDB

若是你使用的是用SpringBoot作自動配置的Java項目的話,要鏈接MongoDB只須要在POM文件裏引入spring-boot-starter-data-mongodb 這個依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
複製代碼

在application.properties 文件里加上

spring.data.mongodb.uri=mongodb://my-user:passw0rd@127.0.0.1:30017/my-database
複製代碼

SpringBoot在項目啓動時就會自動幫咱們鏈接上MongoDB。

在Go項目裏鏈接MongoDB

而若是你使用的是Golang開發的項目的話,則須要引入go.mongodb.org下的幾個包

import (
	"time"
	"context"
	"fmt"

	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

var (
	MongoClient *mongo.Client
	mongoURI = "mongodb://my-user:passw0rd@127.0.0.1:30017/my-database"
)

func init() {
	ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
	client, err := mongo.Connect(ctx,
		options.Client().ApplyURI(mongoURI),
	)
	MongoClient = client
}
複製代碼

固然SpringBoot和Go鏈接MongoDB時都還有很多細分的鏈接參數,這個已經超出了咱們這篇文章內容的範圍了,就不展開往下說了。

總結

今天經過實踐在 Kubernetes 上安裝一個單點的 MongoDB 服務,咱們穿插的介紹了一下 Kubernetes 是怎麼經過 Secret 管理密鑰之類的敏感配置項的,經過這種邊實踐中學習的方式能讓你們更快地接受新知識。捎帶着咱們還擴展了一下在使用 SpringBoot 或者 Golang 的項目裏怎麼去鏈接 MongoDB,但願你們能喜歡今天的文章。

今天的文章就到這裏啦,若是喜歡個人文章就幫我點個贊吧,我會每週經過技術文章分享個人所學所見和第一手實踐經驗,感謝你的支持。**微信搜索關注公衆號「網管叨bi叨」**每週教會你一個進階知識。

相關文章
相關標籤/搜索