当另一个

时间:2017-03-30 13:07:12

标签: docker kubernetes minikube

两个pod apppostgres已成功创建,并且能够通过节点中的其他服务进行通信。在当前进程中,两个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的某些方面/功能集我完全缺失,这有助于解决这种情况....

2 个答案:

答案 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:

readiness probes

health checking

答案 1 :(得分:0)

如果应用程序不需要在播种过程中运行,并且您可以使播种过程具有幂等性,那么init containers可以为您提供帮助。

可用good example