這已是咱們用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分配一個具備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用戶的名稱和密碼分別定義成了username
和password
,有點蠢,純屬是爲了好理解用。你能夠本身經過在命令行裏執行base64命令,獲得想要的字符串的base64編碼後的字符序列。好比像下面這樣得到字符串root用base64編碼後的結果。微信
echo -n 'root' | base64
cm9vdA==
複製代碼
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仍是用咱們一直在使用的 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裏建立業務用的DB和響應的用戶名密碼,以及怎麼在Java和Go的項目裏鏈接上MongoDB。
當咱們鏈接上建立的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作自動配置的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。
而若是你使用的是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叨」**每週教會你一個進階知識。