我的 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
如果您观察到数据库凭据的参考,如果需要调试,那么我很乐意提供。提前致谢!
答案 0 :(得分:0)
你的秘密有问题。您是否尝试在您的密钥中存储二进制值或空字节?
答案 1 :(得分:0)
您当前的配置存在 2 个问题。我已经在我的 Minikube
集群上进行了测试。
问题 1 与您的 secret
相关。
当您解码 secret
时,您会发现 mongo-root-username
和 mongo-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-username
和 mongo-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
图像(如 MySQL
或 MongoDB
)时,您必须指定 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
作为附加信息,您需要使用更多副本来提供新的 pv
和 pvc
。为此,最好将 Statefulset
与 VolumeClaimTemplate 一起使用。