Kubernetes 运行有意定期退出的容器
我如何让Kubernates自动重新启动一个有意退出的容器,以便从环境变量中获取新数据 我有一个在Kubernates群集上运行的容器,该群集以以下方式运行:Kubernetes 运行有意定期退出的容器,kubernetes,Kubernetes,我如何让Kubernates自动重新启动一个有意退出的容器,以便从环境变量中获取新数据 我有一个在Kubernates群集上运行的容器,该群集以以下方式运行: 容器启动,轮询工作 如果它收到一个任务,它会做一些工作 它再次为工作投票,直到 。。容器已经运行了一段时间,之后退出,而不是轮询更多的工作 它需要不断地重新启动,因为它使用由Kubernates秘密填充的环境变量,这些秘密由另一个进程定期刷新 我尝试过部署,但它似乎不太适合,因为我得到了CrashLoopBackOff状态,这意味着工
- 容器启动,轮询工作
- 如果它收到一个任务,它会做一些工作
- 它再次为工作投票,直到
- 。。容器已经运行了一段时间,之后退出,而不是轮询更多的工作
CrashLoopBackOff
状态,这意味着工作人员的计划越来越少
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-fonky-worker
labels:
app: my-fonky-worker
spec:
replicas: 2
selector:
matchLabels:
app: my-fonky-worker
template:
metadata:
labels:
app: my-fonky-worker
spec:
containers:
- name: my-fonky-worker-container
image: my-fonky-worker:latest
env:
- name: NOTSOSECRETSTUFF
value: cats_are_great
- name: SECRETSTUFF
valueFrom:
secretKeyRef:
name: secret-name
key: secret-key
我也尝试过CronJob,但这似乎有点不太妥当,因为这可能意味着容器在几秒钟内处于停止状态。我认为解决这个问题的方法是将容器作为CronJob运行。但不要将启动死线秒作为容器杀手 它按计划运行 在您的容器中,您可以对工作进行N次轮询。
N次后,它退出0。正如@Josh所说,您需要使用退出0退出,否则它将被视为失败的容器!根据第一个示例,这里是“Pod正在运行并且有一个容器。容器成功退出。”如果您的restartPolicy设置为Always(顺便说一句,这是默认设置)然后容器将重新启动,尽管Pod状态显示为正在运行,但如果您记录Pod,则可以看到容器重新启动 它需要不断地重新启动,因为它使用由Kubernates秘密填充的环境变量,这些秘密由另一个进程定期刷新
对此,我会采取不同的方法。我将按照说明装载配置映射,这将自动刷新装载的配置映射数据。注意:请注意“kubelet中的”kubelet同步周期(默认为1分钟)+ConfigMaps缓存的ttl(默认为1分钟)以管理Pod中configmap数据的刷新率 如果我在您的示例中理解正确,则有两个问题:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: complete
name: complete
spec:
replicas: 1
selector:
matchLabels:
app: complete
template:
metadata:
labels:
app: complete
spec:
hostname: c1
containers:
- name: complete
command:
- "bash"
args:
- "-c"
- "wa=$(shuf -i 15-30 -n 1)&& echo $wa && sleep $wa"
image: ubuntu
imagePullPolicy: IfNotPresent
resources: {}
initContainers:
- name: wait-for
image: ubuntu
command: ['bash', '-c', 'sleep 30']
restartPolicy: Always
请注意:
- 当卷中已经使用的秘密被更新时,投影的密钥最终也会被更新。Kubelet正在检查装载的秘密是否在每次定期同步时都是新的。但是,它正在使用其本地缓存获取机密的当前值。 可以使用(KubeletConfiguration结构中的ConfigMapAndSecretChangeDetectionStrategy字段)配置缓存的类型。它可以通过watch(默认)进行传播,基于ttl,或者直接将所有请求重定向到kube apiserver。因此,从密钥更新到新密钥投影到Pod的总延迟可以与kubelet sync period+缓存传播延迟一样长,其中缓存传播延迟取决于所选缓存类型(它等于监视传播延迟、缓存ttl或零协同响应)
- 使用机密作为子路径卷装载的容器将不会收到机密更新