Kubernetes工作和部署

qyyhg6bp  于 2023-03-12  发布在  Kubernetes
关注(0)|答案(3)|浏览(309)

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

dkqlctbz

dkqlctbz1#

根据您提供的信息,我相信您可以使用名为InitContainer的Kubernetes功能实现您的目标:
初始化容器与常规容器完全相同,不同之处在于:

  • 初始化容器总是运行到完成。
  • 每个init容器必须成功完成,然后才能启动下一个。

如果Pod的初始化容器失败,Kubernetes会重复重新启动Pod,直到初始化容器成功。但是,如果Pod的restartPolicy为“从不”,Kubernetes不会重新启动Pod。

  • 我将使用busybox创建一个initContainer,以运行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状态,等待init容器完成。-现在让我们创建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

如果您需要帮助将此应用到您的环境中,请让我知道。

bis0qfac

bis0qfac2#

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

这将在转向舵形图中的安装/升级阶段之前运行作业直到完成。您可以看到有一个'hook-weight'变量,允许您根据需要订购这些挂钩。
在我看来,这是一个比init容器更优雅的解决方案,并且允许更好的控制。

r8xiu3jd

r8xiu3jd3#

钩子只在Helm升级或安装命令中触发。我想缩小我的部署,扩大它,并运行一个作业,将一些文件注入到我的容器中,而钩子选项不会这样做。

相关问题