两个pod app
和postgres
已成功创建,并且能够通过节点中的其他服务进行通信。在当前进程中,两个pod同时创建,但可以更改为按顺序创建/启动它们。
最初,postgres
窗格中的数据库容器为空,需要播种。种子过程通过app
pod,因此,它也需要启动并运行。种子postgres
后,app
仍然不知道此新数据,需要重新启动。这是app
本身的一个缺陷,我无法控制。
现在,流程是:
kubectl create -f pods.yaml # creates `app` and `postgres` pods
kubectl exec app -- bash -c "<seed command>"
kubectl delete pod app
sleep 45 # takes a while for `app` to terminate
kubectl create -f pods.yaml # Ignore the "postgres pod and service already exist" error
一旦app
到达种子状态,是否有更好的方法可以自动协调重启postgres
?
也许Kubernetes的某些方面/功能集我完全缺失,这有助于解决这种情况....
答案 0 :(得分:1)
您可以在postgresql pod上使用“就绪探测”,在导入数据之前不会将容器报告为就绪(例如,查询导入的数据库或表)。您的app容器可以查询数据库窗格的准备状态,以便在报告就绪后自动重新启动。 准备情况探测器可以是执行导入的脚本。这是一个示例(您需要将“SHOW DATABASES”命令替换为您的情况中的任何内容):
spec:
containers:
- name: mysql
image: mysql:latest
ports:
- containerPort: 3306
name: mysql
readinessProbe:
exec:
command:
- /path-in-container/readiness-probe.sh
initialDelaySeconds: 15
timeoutSeconds: 5
readiness-probe.sh:
#!/bin/bash
MYSQL_USER="readinessProbe"
MYSQL_PASS="readinessProbe"
MYSQL_HOST="127.0.0.1"
mysql -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} -e"SHOW DATABASES;"
if [ $? -ne 0 ]; then
exit 1
else
exit 0
fi
要阅读有关该主题的更多信息,请参阅k8s docs:
答案 1 :(得分:0)
如果应用程序不需要在播种过程中运行,并且您可以使播种过程具有幂等性,那么init containers可以为您提供帮助。
可用good example。