Kubernetes Crashloopbackoff 与 Minikube

Kubernetes Crashloopbackoff With Minikube

所以我正在通过指南学习 Kubernetes,我正在尝试部署一个 MongoDB Pod 和 1 个副本。这是部署配置文件。

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,但我一直得到 CrashLoopBackOff 两个 Pods,根据我的了解,这是由容器失败并在一个循环中重新启动引起的。我尝试使用 kubectl get events 浏览事件,但我看到消息 Back-off restarting failed container 的警告不断出现。我也尝试做一些挖掘并发现了一个解决方案,说添加

command: ['sleep']
args: ['infinity']

这解决了 CrashLoopBackOff 问题,但是当我尝试获取 Pod 的日志时,终端上没有显示任何内容。我需要一些帮助和可能的解释,因为 commandargs 似乎是如何修复它的,还有我如何阻止这种崩溃发生在我的 Pods 和当前的崩溃上,非常感谢很多。

使用 StatefulSet 部署 mongodb,而不是作为部署。

示例:

api版本:v1 种类:服务 元数据: 名称:mongo数据库服务 标签: 姓名:mongo 规格: 端口:

  • 端口:27017 目标端口:27017 集群IP:None 选择器: 角色:mongo

api版本:apps/v1beta1 种类:StatefulSet 元数据: 姓名:mongod 规格: 服务名称:mongo数据库服务 复制品:3 模板: 元数据: 标签: 角色:mongo 环境:测试 副本集:MainRepSet 规格: 亲和力: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - 重量:100 podAffinityTerm: 标签选择器: 匹配表达式: - 键:复制集 运营商:在 价值观: - MainRepSet topologyKey: kubernetes.io/hostname 终止宽限期秒数:10 卷: - 名称:秘密卷 秘密: 秘密名称:共享-bootstrap-数据 默认模式:256 容器: - 名称:mongod-container #image: pkdone/mongo-ent:3.4 图片:mongo 命令: - “numactl” - “--交错=全部” - “mongod” - “--wiredTigerCacheSizeGB” - “0.1” - “--bind_ip” - “0.0.0.0” - “--replSet” - “主要代表” - “--授权” - “--clusterAuthMode” - “密钥文件” - “--keyFile” - “/etc/secrets-volume/internal-auth-mongodb-keyfile” - “--设置参数” - “authenticationMechanisms=SCRAM-SHA-1” 资源: 要求: cpu:0.2 内存:200Mi 端口: - 容器端口:27017 卷挂载: - 名称:秘密卷 只读:真 安装路径:/etc/secrets-volume - 名称:mongodb-persistent-storage-claim 安装路径:/data/db volumeClaimTemplates:

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

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

在有状态应用中,主节点的N个副本管理着一个集群下的多个工作节点。因此,如果任何主节点出现故障,其他序号实例将处于活动状态以执行工作流。主节点实例必须被标识为一个唯一的 ordinal 编号,称为 StatefulSet。 查看更多:mongodb-sts, mongodb-on-kubernetes。 还使用 Headless service to manage the domain of a Pod. In general understanding of Headless Service, there is no need for LoadBalancer or a kube-proxy 直接与 Pods 交互,但使用服务 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

记得还要为您的 pods 配置音量 - 按照我在上面链接的教程进行操作。