【发布时间】: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 访问,因此该位已排序。
我想知道的:
这是等待 ArangoDB 使用 initContainer 指令连接的推荐方法,还是我必须使用完全不同的方法?
什么可能导致我遇到的错误?我在这里遗漏了一些基本的东西吗?
很高兴得到任何帮助。
【问题讨论】:
-
似乎无法读取变量 CARSERVICE_CARSERVICEDB_SERVICE_HOST 和 CARSERVICE_CARSERVICEDB_SERVICE_PORT 因此您的 URL 仅变为 http:// 。查看环境变量
-
你是对的@ankidaemon。对于 init 容器成功启动的情况,env 变量设置正确。我不明白为什么会发生这种情况。什么会导致未设置环境变量? ArangoDB pod 正确设置了环境变量。我认为 kubernetes 提供的内部 DNS 在这里会很方便。我唯一担心的是,当它最终被 initContainer 指令的 shell 命令替换时,它会显示为字符串而不是相应的 IP。有什么指点吗?
标签: kubernetes arangodb minikube