因此,我正在通过指南学习 Kubernetes,我正在尝试部署具有 1 个副本的 MongoDB Pod。这是部署配置文件。
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:
- containerPort: 27017
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
---
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
selector:
app: mongodb
ports:
- protocol: TCP
port: 27017
targetPort: 27017
我也尝试用几乎相同的配置文件部署一个 Mongo-Express Pod,但我不断为两个 Pod 获取 CrashLoopBackOff
,据我所知,这是由容器失败引起的并在一个循环中重新启动。我尝试使用 kubectl get events
查看事件,我看到消息 Back-off restarting failed container
不断出现警告。我也试着做了一些挖掘,发现了一个解决方案,说要添加
command: ['sleep']
args: ['infinity']
这解决了 CrashLoopBackOff 问题,但是当我尝试获取 Pod 的日志时,终端上没有显示任何内容。我需要一些帮助和可能的解释,因为 command
和 args
似乎是如何修复它的,还有我如何阻止这种崩溃发生在我的 Pod 和当前的 Pod 上,谢谢非常喜欢你。
最佳答案
我的建议是将 MongoDB 部署为 StatefulSet在 Kubernetes 上。
在有状态应用中,主 Node 的N个副本管理集群下的多个工作 Node 。因此,如果任何主 Node 出现故障,其他序号实例将处于事件状态以执行工作流。主 Node 实例必须标识为唯一的 ordinal称为 StatefulSet 的编号。 查看更多:mongodb-sts , mongodb-on-kubernetes . 也可以使用 Headless service管理 Pod 的域。对Headless Service的一般理解,不需要LoadBalancer或 kube-proxy直接与 Pod 交互但使用服务 IP,因此集群 IP 设置为none。
在你的情况下:
apiVersion: v1
kind: Service
metadata:
name: mongodb
spec:
clusterIP: None
selector:
app: mongodb
ports:
- port: 27017
错误:
Also uncaught exception: Error: couldn't add user: Error preflighting normalization: U_STRINGPREP_PROHIBITED_ERROR _getErrorWithCode@src/mongo/shell/utils.js:25:13
表示 secret 可能丢失。看看:mongodb-initializating .
在你的案例中, secret 应该看起来很相似:
apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
type: Opaque
data:
mongo-root-username: YWRtaW4=
mongo-root-password: MWYyZDFlMmU2N2Rm
请记住还要为您的 pod 配置一个卷 - 按照我在上面链接的教程进行操作。
https://stackoverflow.com/questions/64815920/