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

4

成功创建了两个 pod: apppostgres,它们可以通过彼此的服务进行通信。在当前的流程中,这两个 pod 同时创建,但是可以更改为按顺序创建/启动。

postgres pod 中的数据库容器最初是空的,需要进行种子填充。种子填充过程通过 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

是否有更好的自动协调方法,在 postgres 达到种子状态后自动重启 app

也许我完全忽略了 Kubernetes 的某些方面/功能集,可以帮助处理这种情况....

2个回答

3
您可以在postgresql pod上使用“就绪探针”,在导入数据之前不会将容器报告为就绪状态(例如查询您要导入的DB或表)。您的应用程序容器可以查询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文档:

就绪探针

健康检查


一旦就绪探针指示种子进程已完成,我该如何触发应用程序 Pod 的“重新启动”?也许,deployments 有一种方法? - changingrainbows
应用程序容器可以重启自身,或者您可以使用“kubectl delete pods <podname>”命令。如果您的Pod是“Deployment”的一部分,则“ReplicaSet”将立即重新安排它。此链接也可能对您有所帮助:https://blog.giantswarm.io/wait-for-it-using-readiness-probes-for-service-dependencies-in-kubernetes/ 另一种选择是您可以尝试使用一个Init-Container,在开始运行应用程序容器之前等待postgresql准备就绪。请参阅https://kubernetes.io/docs/user-guide/pods/init-container/。 - Oswin Noetzelmann

1
如果应用程序在种子处理过程中不需要运行,并且您可以使种子处理过程具有幂等性,那么init containers可以帮助您。
有一个很好的示例可用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接