如何在 kubernetes 中包含带有 mongo 图像的数据

swa*_*rov 1 mongodb docker kubernetes minikube

我正在尝试让我的应用程序在 minikube 上运行,可通过 minikube ip 地址访问。下面是我用来让它运行的命令。这一切都如我所愿(如果我尝试登录,它会返回预期的 401,因为 mongo DB 是空的)。

我想在我的应用程序中实际包含一个数据库,比如一个现有用户。我找不到明确的方法来包含我正在做的事情(比如在与 mongo 一起工作的 tar 文件中)。我怎样才能做到这一点?

### Get mongo up
docker pull mongo:3.2
kubectl run mongo --image=mongo:3.2 --port=27017
kubectl expose deployment mongo

### Get API up
cd /api
docker build -t api:v1 .
kubectl run api --image=api:v1 --port=3000 --env="MONGODB_URI=mongodb://mongo:27017/myapp-dev"
kubectl apply -f api-deployment.yml
kubectl expose deployment api --type=LoadBalancer

### Get dashboard up
docker build -t myapp-dashboard:v1 .
kubectl apply -f ./tooling/minikube/myapp-dashboard-qa-config-map.yml
kubectl apply -f ./tooling/minikube/myapp-dashboard-deployment.yml
kubectl expose deployment myapp-dashboard --type=LoadBalancer

### Ingress setup
minikube addons enable ingress
kubectl create -f ingress.yml
kubectl apply -f ./tooling/minikube/ingress.yml
Run Code Online (Sandbox Code Playgroud)

Jan*_*art 5

这样做的好方法是利用图像中的initdb基础设施mongo。的mongo:3.2包括一个entrypoint外壳脚本该迭代波谷/docker-entrypoint-initdb.d/*.{sh,js}(在容器中)。

根据您需要使用 aConfigMap或 aSecret作为卷插入到新创建的数据库中的数据类型是要走的路。但是你不能用kubectl run.

1.创建一个mongo.yaml这样的:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mongo
spec:
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
      - image: mongo:3.2
        name: mongo
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: mongo-initdb
          mountPath: /docker-entrypoint-initdb.d
      volumes:
      - name: mongo-initdb
        configMap:
          name: mongo-initdb
Run Code Online (Sandbox Code Playgroud)

2.createuser.sh像这样创建(只是一个例子):

mongo <<EOF
use reporting
db.createUser(
  {
    user: "reportsUser",
    pwd: "12345678",
    roles: [
       { role: "read", db: "reporting" },
       { role: "read", db: "products" },
       { role: "read", db: "sales" },
       { role: "readWrite", db: "accounts" }
    ]
  }
)
EOF
Run Code Online (Sandbox Code Playgroud)

3.创建ConfigMap

$ kubectl create configmap mongo-initdb --from-file=createuser.sh
configmap "mongo-initdb" created
Run Code Online (Sandbox Code Playgroud)

4.创建 mongo 部署(而不是kubectl run mongo --image=mongo:3.2 --port=27017):

$ kubectl apply -f mongo.yaml
deployment "mongo" created
Run Code Online (Sandbox Code Playgroud)

5.检查日志:

$ kubectl logs -f deploy/mongo
[...]
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/createuser.sh
MongoDB shell version: 3.2.17
[...]
Successfully added user: {
[...]
Run Code Online (Sandbox Code Playgroud)

正如我提到的,可以使用Secrets敏感数据来完成一个非常相似的解决方案。该kubectl create configmap --from-file=...命令还接受目录名而不是文件名,并将按预期工作。