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,所以该位已排序。
我想知道的:
这是使用 initContainer 指令等待 ArangoDB 连接的推荐方法,还是我必须使用完全不同的方法?
是什么导致了我收到的错误?我是否遗漏了一些基本知识?
很乐意提供任何帮助。
问题是在那些时候 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
我正在开发一个 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,所以该位已排序。
我想知道的:
这是使用 initContainer 指令等待 ArangoDB 连接的推荐方法,还是我必须使用完全不同的方法?
是什么导致了我收到的错误?我是否遗漏了一些基本知识?
很乐意提供任何帮助。
问题是在那些时候 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