我可以在单个配置文件/操作中运行作业和部署吗?部署将等待作业完成并检查作业是否成功,以便继续部署?
dkqlctbz1#
根据您提供的信息,我相信您可以使用名为InitContainer的Kubernetes功能实现您的目标:初始化容器与常规容器完全相同,不同之处在于:
如果Pod的初始化容器失败,Kubernetes会重复重新启动Pod,直到初始化容器成功。但是,如果Pod的restartPolicy为“从不”,Kubernetes不会重新启动Pod。
restartPolicy
busybox
initContainer
mydb
apiVersion: apps/v1 kind: Deployment metadata: labels: run: my-app name: my-app spec: replicas: 2 selector: matchLabels: run: my-app template: metadata: labels: run: my-app spec: restartPolicy: Always containers: - name: myapp-container image: busybox:1.28 command: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers: - name: init-mydb image: busybox:1.28 command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
在这个字段中可以使用许多种命令,您只需要选择一个包含您需要的二进制文件的Docker映像(包括您的sequelize作业)
sequelize
$ kubectl apply -f my-app.yaml deployment.apps/my-app created $ kubectl get pods NAME READY STATUS RESTARTS AGE my-app-6b4fb4958f-44ds7 0/1 Init:0/1 0 4s my-app-6b4fb4958f-s7wmr 0/1 Init:0/1 0 4s
pod处于Init:0/1状态,等待init容器完成。-现在让我们创建initcontainer在完成任务之前等待运行的服务:
Init:0/1
apiVersion: v1 kind: Service metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377
$ kubectl apply -f mydb-svc.yaml service/mydb created $ kubectl get pods -w NAME READY STATUS RESTARTS AGE my-app-6b4fb4958f-44ds7 0/1 Init:0/1 0 91s my-app-6b4fb4958f-s7wmr 0/1 Init:0/1 0 91s my-app-6b4fb4958f-s7wmr 0/1 PodInitializing 0 93s my-app-6b4fb4958f-44ds7 0/1 PodInitializing 0 94s my-app-6b4fb4958f-s7wmr 1/1 Running 0 94s my-app-6b4fb4958f-44ds7 1/1 Running 0 95s ^C $ kubectl get all NAME READY STATUS RESTARTS AGE pod/my-app-6b4fb4958f-44ds7 1/1 Running 0 99s pod/my-app-6b4fb4958f-s7wmr 1/1 Running 0 99s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/mydb ClusterIP 10.100.106.67 <none> 80/TCP 14s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-app 2/2 2 2 99s NAME DESIRED CURRENT READY AGE replicaset.apps/my-app-6b4fb4958f 2 2 2 99s
如果您需要帮助将此应用到您的环境中,请让我知道。
bis0qfac2#
尽管initContainers是此解决方案的一个可行选项,但如果使用helm管理和部署到集群,则还有另一个选项。Helm has chart hooks,允许您在helm图表中的其他安装发生之前运行Job。您提到这是为了在服务部署之前进行数据库迁移。完成此操作的helm配置示例如下...
Job
apiVersion: batch/v1 kind: Job metadata: name: api-migration-job namespace: default labels: app: api-migration-job annotations: "helm.sh/hook": pre-install,pre-upgrade "helm.sh/hook-weight": "-1" "helm.sh/hook-delete-policy": before-hook-creation spec: template: spec: containers: - name: platform-migration ...
这将在转向舵形图中的安装/升级阶段之前运行作业直到完成。您可以看到有一个'hook-weight'变量,允许您根据需要订购这些挂钩。在我看来,这是一个比init容器更优雅的解决方案,并且允许更好的控制。
r8xiu3jd3#
钩子只在Helm升级或安装命令中触发。我想缩小我的部署,扩大它,并运行一个作业,将一些文件注入到我的容器中,而钩子选项不会这样做。
3条答案
按热度按时间dkqlctbz1#
根据您提供的信息,我相信您可以使用名为InitContainer的Kubernetes功能实现您的目标:
初始化容器与常规容器完全相同,不同之处在于:
如果Pod的初始化容器失败,Kubernetes会重复重新启动Pod,直到初始化容器成功。但是,如果Pod的
restartPolicy
为“从不”,Kubernetes不会重新启动Pod。busybox
创建一个initContainer
,以运行linux命令,等待服务mydb
运行,然后再继续部署。重现步骤:-使用
initContainer
创建部署,该部署将运行在执行部署之前需要完成的作业:在这个字段中可以使用许多种命令,您只需要选择一个包含您需要的二进制文件的Docker映像(包括您的
sequelize
作业)pod处于
Init:0/1
状态,等待init容器完成。-现在让我们创建initcontainer在完成任务之前等待运行的服务:如果您需要帮助将此应用到您的环境中,请让我知道。
bis0qfac2#
尽管initContainers是此解决方案的一个可行选项,但如果使用helm管理和部署到集群,则还有另一个选项。
Helm has chart hooks,允许您在helm图表中的其他安装发生之前运行
Job
。您提到这是为了在服务部署之前进行数据库迁移。完成此操作的helm配置示例如下...这将在转向舵形图中的安装/升级阶段之前运行作业直到完成。您可以看到有一个'hook-weight'变量,允许您根据需要订购这些挂钩。
在我看来,这是一个比init容器更优雅的解决方案,并且允许更好的控制。
r8xiu3jd3#
钩子只在Helm升级或安装命令中触发。我想缩小我的部署,扩大它,并运行一个作业,将一些文件注入到我的容器中,而钩子选项不会这样做。