ArangoDB 初始化容器在 minikube 上失败

ArangoDB init container fails on minikube

我正在开发一个 NodeJS 服务,它使用 ArangoDB 作为数据存储,并部署在 minikube 上。我在 kubernetes 部署清单中使用了 initContainer 指令,以确保在应用程序尝试连接之前数据库已准备好接收连接。 kubernetes YAML 的相关部分如下所示:

  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: carservice
  template:
    spec:
      initContainers:
        - name: init-carservice
          image: arangodb/arangodb:3.5.1
          command: ['sh', 'c', 'arangosh --server.endpoint="https://${CARSERVICE_CARSERVICEDB_SERVICE_HOST}:${CARSERVICE_CARSERVICEDB_SERVICE_PORT}" --server.password=""; do echo waiting for database to be up; sleep 2; done;']
      containers:
        - name: carservice
          image: carservice
          imagePullPolicy: IfNotPresent

挑战在于,有时 initContainer 能够等待数据库连接成功建立。大多数其他时间,它随机失败并显示错误:

错误捕获到异常:端点规范无效:https://

无奈之下,我将方案更改为http,但失败并出现相应的错误:

错误捕获到异常:端点规范无效:http://

我对这些错误的理解是数据库在这些实例中无法识别 https 和 http,这很奇怪。 initContainer 位成功运行的几次,我在 kubernetes 规范中的相关命令中使用了 https。

我必须补充一点,实际的数据库 (https://${CARSERVICE_CARSERVICEDB_SERVICE_HOST}:${CARSERVICE_CARSERVICEDB_SERVICE_PORT}) 已经使用 kube-arangodb 成功部署到 minikube,可以通过 web 访问 UI,所以该位已排序。

我想知道的:

  1. 这是使用 initContainer 指令等待 ArangoDB 连接的推荐方法,还是我必须使用完全不同的方法?

  2. 是什么导致了我收到的错误?我是否遗漏了一些基本知识?

很乐意提供任何帮助。

问题是在那些时候 init 容器无法连接到 ArangoDB,env 变量没有正确设置。因此,我在此之前添加了另一个 init 容器(因为 init 容器是按顺序执行的),它会等待 ArangoDB 部署的相应 kubernetes "service" 资源出现。这样,到第二个初始化容器 运行 时,环境变量就可用了。

kubernetes deployment YAML对应部分显示为:

  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: carservice
  template:
    spec:
      initContainers:
        - name:init-db-service
          image: busybox:1.28
          command: ['sh', '-c', 'until nslookup carservice-carservicedb; do echo waiting for kubernetes service resource for db; sleep 2; done;']

        - name: init-carservice
          image: arangodb/arangodb:3.5.1
          command: ['sh', 'c', 'arangosh --server.endpoint="https://${CARSERVICE_CARSERVICEDB_SERVICE_HOST}:${CARSERVICE_CARSERVICEDB_SERVICE_PORT}" --server.password=""; do echo waiting for database to be up; sleep 2; done;']
      containers:
        - name: carservice
          image: carservice
          imagePullPolicy: IfNotPresent