我正在使用副本集管理我的Pod。如果我的应用在启动后崩溃,我希望副本集重新启动它。但我有一个场景,副本集不应该重新启动我的应用或限制重新启动它。
当我的应用程序成功启动时,它将返回一个端点/健康的OK结果。我有这样的场景:我将推送一些更改,这样应用程序将无法成功启动,它将在启动时崩溃。并且它不会返回端点/健康的OK结果。当更改应用于Kubernetes时,从副本集重新启动它没有意义,因为它总是会失败。我知道副本集重新启动策略总是。但是有什么方法可以让它工作吗?我期待:当应用成功启动时(返回端点/运行状况的OK结果),如果副本集将在运行时崩溃,则应始终重新启动副本集。
当应用程序未成功启动(未返回端点/健康状态的OK结果)时,副本集不应重新启动它超过3次,因为这没有意义。相反,它应该保留旧版本的应用程序。
我的部署文件是基本的:
apiVersion: apps/v1
kind: Deployment
metadata:
name: apideployment
namespace: dilshod
spec:
selector:
matchLabels:
app: api_deploymentpod
template:
metadata:
labels:
app: api_deploymentpod
spec:
containers:
- image: komdil/app:1.0.19
imagePullPolicy: Always
name: appcontainer
ports:
- containerPort: 80
1条答案
按热度按时间enxuqcxy1#
不幸的是,Kubernetes ReplicaSet不允许你做你要求的事情;这将始终尝试将Pod的副本带到所需的状态(定时会不时地递增)。
您可以通过设置. spec. replicas来指定应该同时运行多少个Pod。ReplicaSet将创建/删除其Pod以匹配此数量。
如果不指定.spec.replicas,则默认值为1。
https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/#replicas
Pod的spec有一个restartPolicy字段,可能值为Always、OnFailure和Never。默认值为Always。
restartPolicy适用于Pod中的所有容器。restartPolicy仅指同一节点上kubelet对容器的重启。Pod中的容器退出后,kubelet会以指数级回退延迟重启容器(10 s,20 s,40 s,...),上限为5分钟。一旦容器执行了10分钟而没有任何问题,kubelet重置该容器的重启退避定时器。
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy
我不清楚如果Pod(无论出于何种原因)没有正确启动,为什么要阻止这种机制......但是如果你仍然想实现你的目标,你必须实现一个监控系统,检查Pod的状态+它重新启动的次数(可能在给定的时间范围内),并触发一个工作流(Jenkins,GitHub等),将Deployment扩展到0。
https://kubernetes.io/docs/reference/kubectl/cheatsheet/#scaling-resources
https://stackoverflow.com/a/51245203/21404450