3

两个 pod已成功创建,app并且postgres能够通过节点中彼此的服务进行通信。在当前流程中,两个 pod 是同时创建的,但可以更改为按顺序创建/启动它们。

最初,postgrespod 中的数据库容器是空的,需要播种。种子进程通过apppod,因此它也需要启动并运行。一旦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 的某些方面/功能集,这有助于解决这种情况......

4

2 回答 2

3

您可以在 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

就绪-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 文档:

准备探测

健康检查

于 2017-04-02T07:53:38.387 回答
1

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

这是一个很好的例子

于 2017-03-30T13:51:33.633 回答