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

How to include data with mongo image in kubernetes

我正在尝试在 minikube 上获取我的应用程序 运行,可通过 minikube ip 地址访问。下面是我用来获取它的命令 运行。这一切都按照我的意愿工作(如果我尝试登录,它 returns 预期的 401 因为 mongo 数据库是空的)。

我想在我的应用程序中实际包含一个数据库,比如说,一个现有用户。我找不到关于如何将数据(比如在与 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

使用 mongo 图像中的 initdb 基础设施的好方法。 mongo:3.2 包含一个 entrypoint shell script,它遍历 /docker-entrypoint-initdb.d/*.{sh,js}(在容器中)。

根据您需要插入新创建的数据库的数据类型,使用 ConfigMap or a Secret 作为卷是可行的方法。但是你不能用 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

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

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

3. 创建 ConfigMap:

$ kubectl create configmap mongo-initdb --from-file=createuser.sh
configmap "mongo-initdb" created

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

$ kubectl apply -f mongo.yaml
deployment "mongo" created

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: {
[...]

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