Kubernetes在Minikube上出现Crashloopbackoff错误

3

我正在跟着指南学习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的日志时,终端上没有显示任何内容。请帮忙解释一下commandargs是如何解决这个问题的,并告诉我如何防止我的Pods和当前Pod发生崩溃,非常感谢。


1
添加该命令会覆盖容器的入口点。这意味着,它不会在容器上运行mongodb,而是无限期地运行sleep命令。我猜你找到的“解决方案”只是尝试启动容器并查看周围情况。由于此时容器上没有任何运行内容,因此您将得不到任何日志。关于为什么您的Pod崩溃,我建议运行kubectl describe pod <podName>和kubectl logs <podName>以获取更多有关问题的信息。 - camba1
好的,我注意到日志并发现了这个错误未捕获的异常:错误:无法添加用户:规范化预检错误:U_STRINGPREP_PROHIBITED_ERROR _getErrorWithCode@src/mongo/shell/utils.js:25:13我该如何解决?我正在使用Windows并运行minikube集群。 - thatguy
我也在跟着同样的教程,但是我不明白为什么它对这里有效,但对我无效。 - Psychotechnopath
3个回答

1
尝试弄清楚发生了什么以及为什么会发生,运行:
kubectl get pods

之后

kubectl logs NAME_OF_POD_FROM_PREV_COMMAND

在我的情况下,问题是“警告:MongoDB 5.0+需要支持AVX的CPU,而您当前的系统似乎没有!”所以我只是添加了镜像版本:
containers:
  - name: mongodb
    image: mongo:4.0

0

我的建议是在Kubernetes上部署MongoDB作为StatefulSet

在有状态的应用程序中,主节点的N个副本在集群下管理多个工作节点。因此,如果任何一个主节点出现故障,其他序号实例将会活跃起来执行工作流程。主节点实例必须被标识为唯一的序数号,即所谓的StatefulSet。 了解更多:mongodb-sts, mongodb-on-kubernetes。 同时使用无头服务来管理Pod的域名。在对无头服务的一般理解中,没有必要直接使用负载均衡器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

这表示可能缺少密钥。请查看:mongodb-initializating

在您的情况下,密钥应该类似于:

apiVersion: v1
kind: Secret
metadata:
  name: mongodb-secret
type: Opaque
data:
  mongo-root-username: YWRtaW4=
  mongo-root-password: MWYyZDFlMmU2N2Rm


请记得为您的 Pod 配置一个卷 - 可以按照我上面链接的教程进行操作。

-1

使用StatefulSet部署MongoDB,而不是使用Deployment。

示例:

apiVersion:v1 kind:Service metadata: name:mongodb-service labels: name:mongo spec: ports:

  • port:27017 targetPort:27017 clusterIP:无 selector: role:mongo

apiVersion:apps/v1beta1 kind:StatefulSet metadata: name:mongod spec: serviceName:mongodb-service replicas:3 template: metadata: labels: role:mongo environment:test replicaset:MainRepSet spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight:100 podAffinityTerm: labelSelector: matchExpressions: - key:replicaset operator:In values: - MainRepSet topologyKey:kubernetes.io/hostname terminationGracePeriodSeconds:10 volumes: - name:secrets-volume secret: secretName:shared-bootstrap-data defaultMode:256 containers: - name:mongod-container #image:pkdone/mongo-ent:3.4 image:mongo command: - "numactl" - "--interleave=all" - "mongod" - "--wiredTigerCacheSizeGB" - "0.1" - "--bind_ip" - "0.0.0.0" - "--replSet" - "MainRepSet" - "--auth" - "--clusterAuthMode" - "keyFile" - "--keyFile" - "/etc/secrets-volume/internal-auth-mongodb-keyfile" - "--setParameter" - "authenticationMechanisms=SCRAM-SHA-1" resources: requests: cpu:0.2 memory:200Mi ports: - containerPort:27017 volumeMounts: - name:secrets-volume readOnly:true mountPath:/etc/secrets-volume - name:mongodb-persistent-storage-claim mountPath:/data/db volumeClaimTemplates:

  • 元数据: 名称:mongodb-persistent-storage-claim 注释: volume.beta.kubernetes.io/storage-class:“standard” 规格: 访问模式:[“ReadWriteOnce”] 资源: 请求: 存储:1Gi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接