用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叨」**每周教会你一个进阶知识。

相关文章
相关标签/搜索