为什么即使创建了部署也会出现 OCI 运行时错误

时间:2021-01-26 13:19:08

标签: kubernetes

我的 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:
        - 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
          

我的秘密 yaml 文件

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

错误图片: Description of error could be found here

如果您观察到数据库凭据的参考,如果需要调试,那么我很乐意提供。提前致谢!

2 个答案:

答案 0 :(得分:0)

你的秘密有问题。您是否尝试在您的密钥中存储二进制值或空字节?

请看:https://github.com/kubernetes/kubernetes/issues/89906

答案 1 :(得分:0)

您当前的配置存在 2 个问题。我已经在我的 Minikube 集群上进行了测试。

问题 1 与您的 secret 相关。

当您解码 secret 时,您会发现 mongo-root-usernamemongo-root-password 的值具有 '。您可以使用命令验证它

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

Use cases 之一下的 Kubernetes Secret Documentation 中,您可以找到关于 '注意信息。

<块引用>

注意: 特殊字符,例如 $、*、= 和 !将由您的 shell 解释并需要转义。在大多数 shell 中,对密码进行转义的最简单方法是用单引号 (') 将其括起来。例如,如果你的实际密码是 S!B*d$zDsb=,你应该这样执行命令:

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

但如果您对其进行编码,您将看到密码不包含 ' 个字符。

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

问题 2 与缺少 Volume 可以保存数据的任何 Mongodb 相关。

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

您必须提供一些 Volumes 否则您的 pod 会出错。

解决方案

将机密 mongo-root-usernamemongo-root-password 更改为没有 ' 的值。您可以使用命令来完成:

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

或手动使用正确的编码:

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

当您使用 Database 图像(如 MySQLMongoDB)时,您必须指定 Volume 以允许您的数据库进行一些读/写操作。否则您的容器将卡在 CrashLoopBackOff 循环中。

在我在 Minikube 1.16 上测试过的 YAML 下,秘密包含您的值,而没有 '

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

作为附加信息,您需要使用更多副本来提供新的 pvpvc。为此,最好将 StatefulsetVolumeClaimTemplate 一起使用。