【问题标题】:ArangoDB init container fails on minikubeArangoDB 初始化容器在 minikube 上失败
【发布时间】:2019-12-10 10:13:19
【问题描述】:

我正在开发一个使用 ArangoDB 作为数据存储并部署在 minikube 上的 NodeJS 服务。我在 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://

无奈之下,我把scheme改成了http,结果失败,报错:

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

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

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

我想知道的:

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

  2. 什么可能导致我遇到的错误?我在这里遗漏了一些基本的东西吗?

很高兴得到任何帮助。

【问题讨论】:

  • 似乎无法读取变量 CARSERVICE_CARSERVICEDB_SERVICE_HOST 和 CARSERVICE_CARSERVICEDB_SERVICE_PORT 因此您的 URL 仅变为 http:// 。查看环境变量
  • 你是对的@ankidaemon。对于 init 容器成功启动的情况,env 变量设置正确。我不明白为什么会发生这种情况。什么会导致未设置环境变量? ArangoDB pod 正确设置了环境变量。我认为 kubernetes 提供的内部 DNS 在这里会很方便。我唯一担心的是,当它最终被 initContainer 指令的 shell 命令替换时,它会显示为字符串而不是相应的 IP。有什么指点吗?

标签: kubernetes arangodb minikube


【解决方案1】:

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

kubernetes部署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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多