【问题标题】:Kubernetes job and deploymentKubernetes 作业和部署
【发布时间】:2023-03-13 21:31:01
【问题描述】:

我可以在单个配置文件/操作中运行作业和部署吗 部署将在哪里等待作业完成并检查它是否成功以便继续部署?

【问题讨论】:

  • 是的,你可以,例如,你可以使用InitContainer,我正在写一个关于它的答案,如果你想分享更多关于我可以定制什么样的工作来回答你的细节情况更好。这项工作是在 Kubernetes 内部还是外部运行?
  • @willrof 它是一个迁移工作,意思是,它执行 Sequelize 迁移到 nodejs 项目上的数据库,然后,如果所有迁移都成功通过,我希望部署开始
  • @willrof 我不能投票给你,因为我没有足够的声誉另外,我不能让你的例子工作我收到这个错误来自服务器的错误(BadRequest):容器“容器名称”在 pod "container-name-6db8f67df5-8r8wp" 中等待启动:PodInitializing
  • 我相信我成功了,您错过了应用程序的服务,感谢您的帮助,您能否提供指向 Kubernetes 解释的链接,您从中复制了答案,谢谢跨度>
  • 很高兴为您提供帮助该链接与我的答案开头相同,此处为:kubernetes.io/docs/concepts/workloads/pods/init-containers/…

标签: kubernetes deployment jobs kubectl


【解决方案1】:

虽然 initContainers 是此解决方案的一个可行选项,但如果您使用 helm 管理和部署到集群,还有另一个选项。

Helm has chart hooks 允许您在 helm 图表中的其他安装发生之前运行 Job。您提到这是在服务部署之前进行的数据库迁移。完成此操作的一些示例 helm 配置可能是...

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
        ...

这将在进入 helm 图表中的安装/升级阶段之前完成作业。您可以看到有一个“挂钩重量”变量,可让您根据需要订购这些挂钩。

在我看来,这是一个比 init 容器更优雅的解决方案,并且可以更好地控制。

【讨论】:

  • 如果作业失败,部署是继续还是停止?
  • 如果作业失败,那么它之后会发生的一切都不会发生。因此,在 API 迁移的情况下,之后发生的“部署”不会发生,旧的部署仍然存在。
【解决方案2】:

根据您提供的信息,我相信您可以使用名为 InitContainer 的 Kubernetes 功能实现您的目标:

初始化容器与普通容器完全一样,除了:

  • 初始化容器总是运行到完成。
  • 每个 init 容器必须在下一个启动之前成功完成。

如果 Pod 的 init 容器失败,Kubernetes 会反复重启 Pod,直到 init 容器成功。但是,如果 Pod 的 restartPolicy 为 Never,Kubernetes 不会重启 Pod。

  • 我将创建一个 initContainer 和一个 busybox 来运行命令 linux 以等待服务 mydb 运行,然后再继续部署。

复制步骤: - 使用initContainer 创建一个部署,它将运行需要在部署之前完成的作业:

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工作)

  • 现在让我们应用它,看看部署的状态:
$ 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 状态,等待初始化容器完成。 - 现在让我们创建 initcontainer 在完成任务之前等待运行的服务:

apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377
  • 我们将应用它并监控 pod 中的变化:
$ 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

如果您需要帮助将其应用于您的环境,请告诉我。

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 2020-12-22
    • 2021-10-24
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多