我使用Kubernetes 1.6和Docker来部署微服务的实例/ pod。
我有一项服务需要定期从外部存储库中提取更新的数据。可以在运行时手动触发此更新,但在此期间服务无法使用。此外,始终在启动时检索最新数据,以便新启动的服务实例具有最新的外部数据。
因此,我想每小时(或其他一些频率)自动创建一个新鲜的pod,然后杀掉旧的pod。
从概念上讲,似乎我应该在部署中配置每个pod的最大生命周期,以便Kubernetes启动一个新的实例/ pod并在最长生命周期到期时杀死旧实例/ pod,同时确保始终存在至少在pod运行。 但是,Kubernetes does not seem to provide a maximum pod lifetime。
此外,由于启动期间的数据更新,启动pod需要1-2分钟才能准备好。
答案 0 :(得分:3)
这意味着作为评论,但可能会成为一个答案。我将其作为答案发布,以便该方法易于阅读。
所以我有可能适合你的方法。您运行全局下载窗格,将文件下载到特定文件夹。我们假设下载每1小时发生一次。因此,您将创建一个类似22-08-2017-20-00
的文件夹,并创建名为latest
的文件。此latest
文件的内容为22-08-2017-20-00
下载程序在获取新更新时,将创建一个新文件夹并将数据下载到该文件夹。下载数据后,它会将最新文件夹的内容更改为该名称。
现在,您的主应用程序窗格将引用此主机卷,读取文件内容并使用该文件夹启动数据处理。
现在你应该运行一些副本。如果您设置了一个cron并重新启动它们,它们将快速启动(无数据下载)并获取最新数据。您可以通过更改虚假参数并进行滚动更新来进行滚动更新。
或者你也可以在1小时后将你的豆荚设置为失败。怎么做?确保您的图像具有超时命令
$ time timeout 2 sleep 12
real 0m2.002s
user 0m0.000s
sys 0m0.000s
现在您不希望所有pod同时失败,因此您可以生成50分钟到70分钟之间的随机数,让每个pod在不同时间失败并由k8s自动重启
看看这种方法是否有意义
答案 1 :(得分:2)
这里有一个可以帮助您的示例:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
image: gcr.io/google_containers/busybox
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
使用运行状况检查,您可以强制在一段时间后重新安排容器。我认为这可能适合你的情况。