Why am I getting tis OCI runtime error even though deployment is created

1/26/2021

My Yaml file looks like this

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:
        - name: mongodbport
          containerPort: 27017
          protocol: TCP
        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
          

My secret yaml file

apiVersion: v1
kind: Secret
metadata:
    name: mongodb-secret
type: opaque
data:
    mongo-root-username: JwB2AG8AbABoAGEAcgBkACcA
    mongo-root-password: JwBEAGgAYQBuAHUAcwBoACcA

Error image: Description of error could be found here

There is also a reference for DB credentials if you observe ,if that's needed to debug then I would love to provide. Thanks in advance !

-- Dhanush reddy
kubernetes

2 Answers

1/26/2021

Something is wrong with your secret. Are you trying to store binary value or null byte in your secret?

Please take a look: https://github.com/kubernetes/kubernetes/issues/89906

-- Vasili Angapov
Source: StackOverflow

1/26/2021

There are 2 issues with your current configuration. I've tested on my Minikube cluster.

Issue 1 is related with your secret.

When you will decode your secret you will find out that values ofmongo-root-username and mongo-root-password have '. You can verify it using command

$ echo JwB2AG8AbABoAGEAcgBkACcA | base64 --decode
'vo...rd'
$ echo JwBEAGgAYQBuAHUAcwBoACcA | base64 --decode
'Dh..sh`

In Kubernetes Secret Documentation under one of the Use cases you can find Note information about '.

Note: Special characters such as $, \, *, =, and ! will be interpreted by your shell and require escaping. In most shells, the easiest way to escape the password is to surround it with single quotes ('). For example, if your actual password is S!B*d$zDsb=, you should execute the command this way:

$ kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb='

but if you will encode it, you will see that password do not contains ' characters.

$ kubectl get secrets/dev-db-secret --template={{.data.password}} | base64 --decode
S!B\*d$zDsb=

Issue 2 is related with lack of any Volume where your Mongodb could save data.

$ kubectl logs mongodb-deployment-79d5b75846-jk9ss
...
Error saving history file: FileOpenFailed Unable to open() file /home/mongodb/.dbshell: No such file or directory

You have to provide some Volumes otherwise your pod will get error.

Solution

Change secrets mongo-root-username and mongo-root-passwordto values without '. You can do it using command:

$ kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=YourPassword

or manually with proper encoding:

$ echo devuser | base64
ZGV2dXNlcgo=
$ echo YourPassword | base64
WW91clBhc3N3b3JkCg==

While you are using Database images like MySQL or MongoDB you have to specify Volume to allow your database some read/write operations. Otherwise your container will stuck in CrashLoopBackOff loop.

Below my YAMLs which was tested on Minikube 1.16 and secret contains your values without '.

secret.yaml

apiVersion: v1
kind: Secret
metadata:
    name: mongodb-secret
type: opaque
data:
    mongo-root-username: dm9saGFyZAo=
    mongo-root-password: RGhhbnVzaAo=

pvpvc.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongo-pv
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: manual
  capacity:
    storage: 1Gi
  hostPath:
    path: /data/mongopv/
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: mongo-claim
  name: mongo-claim
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: manual
  resources:
    requests:
      storage: 1Gi

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-deployment
  labels:
    app: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
      - image: mongo
        name: mongodb
        ports:
        - name: mongodbport
          containerPort: 27017
          protocol: TCP
        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:
        - mountPath: /data/db
          name: mongo-claim
      volumes:
      - name: mongo-claim
        persistentVolumeClaim:
          claimName: mongo-claim

Just as additional information, you you would use more replicas you will need to provide new pv and pvc. It's good practice to use Statefulset with VolumeClaimTemplate for that.

-- PjoterS
Source: StackOverflow