当另一个变化发生时,重新启动Kubernetes吊舱

两个pods apppostgres被成功创build,并且能够通过节点中的对方的服务进行通信。 在当前的过程中,两个豆荚同时被创build,但是可以被改变为使它们按顺序被创build/开始。

最初, postgres窗格中的数据库容器是空的,需要播种。 种subprocess通过app窗口,因此,它也需要启动和运行。 一旦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 

一旦postgres达到种子状态,有没有更好的方式来自动协调app的重启?

也许有一些Kubernetes方面/function集,我完全失踪,这有助于这样的情况….

您可以使用postgresql pod上的“准备探测”,在数据导入之前(例如,查询您导入的数据库或表),不会报告容器已准备就绪。 您的应用程序容器可以查询db pod的准备就绪状态,以便在报告准备就绪后自动重新启动。 准备就绪探测器可以是执行导入的脚本。 这里是一个例子(你需要用你的案例中的任何适用代替“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文档:

准备就绪探测器

健康检查

如果应用程序不需要在播种过程中运行,并且您可以使播种过程idempotent然后init容器可以帮助您。

这是一个很好的例子 。