【发布时间】:2021-08-09 04:42:42
【问题描述】:
我有一个特定的场景,我希望通过水平 pod 自动缩放来控制部署。为了在推送新部署时处理 pod 中的数据库迁移,我遵循了 Andrew Lock here 的这篇优秀教程。
简而言之,您必须为 Kubernetes Job 定义一个 initContainer 和 waits,以在新的 Pod 运行之前完成一个进程(如运行 db 迁移)。
这很好用,但是,我不确定在初始部署后如何处理 HPA,因为如果系统检测到需要在我的节点中添加另一个 Pod,我的部署中定义的 initContainer 需要一个 @ 987654327@ 将被部署和运行,但由于Jobs 是一次性进程,因此 pod 无法正常初始化和运行(ttlSecondsAfterFinished 属性无论如何都会删除Job)。
如何定义initContainer 在部署应用程序时运行,以便我可以在Job 中推送我的数据库迁移,同时还允许HPA 控制动态添加Pod 而无需initContainer?
这是我的deployment 的样子:
apiVersion: apps/v1
kind: Deployment
metadata:
name: graphql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: graphql-pod
template:
metadata:
labels:
app: graphql-pod
spec:
initContainers:
- name: wait-for-graphql-migration-job
image: groundnuty/k8s-wait-for:v1.4 # This is an image that waits for a process to complete
args:
- job
- graphql-migration-job # this job is defined next
containers:
- name: graphql-container
image: image(graphql):tag(graphql)
下面的Job也部署了
apiVersion: batch/v1
kind: Job
metadata:
name: graphql-migration-job
spec:
ttlSecondsAfterFinished: 30
template:
spec:
containers:
- name: graphql-migration-container
image: image(graphql):tag(graphql)
command: ["npm", "run", "migrate:reset"]
restartPolicy: Never
所以基本上发生的事情是:
- 我将这两个资源部署到我的节点
-
Job已初始化 -
initContaineronPod使用名为groundnuty/k8s-wait-for:v1.4的图像等待Job完成 -
Job完成 -
initContainer完成 -
Pod初始化 - (30 TTL 秒后)
Job从节点中删除
(大量流量)
- HPA 意识到需要另一个 pod
-
initContainerfor NEW pod 已启动,但无法运行,因为Job不存在 - ...crashLoopBackOff
希望对处理这种情况的正确方法有任何见解!
【问题讨论】:
-
是否需要为每个新 pod 运行作业,或者这只是一件事?
-
@papanito 好问题,只有在初始部署时运行作业才重要。除此之外,不,作业只是运行我的数据库迁移脚本,在水平自动缩放时不需要运行。 initContainer 和
wait-for的有用特性是它在作业完成之前不会运行任何新的 pod,然后扩展新的 pod 并删除旧的 pod,这样就不会停机
标签: kubernetes kubernetes-pod horizontal-pod-autoscaling