标签: kubernetes-jobs

使用不同的命令重新启动 Kubernetes 作业或 Pod

我正在寻找一种从命令行快速运行/重新启动作业/Pod 并覆盖要在创建的容器中执行的命令的方法。

对于上下文,我有一个 Kubernetes 作业,它作为部署过程的一部分执行。有时该作业会崩溃,我需要在作业创建的容器内运行某些命令来调试和修复问题(后续作业会成功)。

到目前为止我这样做的方法是:

  • 复制作业的 YAML,保存到文件中
  • 清理 YAML(删除 Kubernetes 管理的字段)
  • command:字段更改为tail -f /dev/null(以便容器保持活动状态)
  • kubectl apply -f job.yaml && kubectl get all && kubectl exec -ti pod/foobar bash
  • 在容器内运行命令
  • kubectl delete job/foobar当我完成时

这是非常乏味的。我正在寻找一种方法来做类似以下的事情

kubectl restart job/foobar --command "tail -f /dev/null"

# or even better
kubectl run job/foobar --exec --interactive bash
Run Code Online (Sandbox Code Playgroud)

我无法使用以下run命令创建 Pod:

kubectl restart job/foobar --command "tail -f /dev/null"

# or even better
kubectl run job/foobar --exec --interactive bash
Run Code Online (Sandbox Code Playgroud)

因为我尝试重新启动的作业具有 …

kubernetes kubectl kubernetes-jobs

8
推荐指数
1
解决办法
3万
查看次数

如何设置Kubernetes作业的时间限制?

我想启动Kubernetes工作,并给它一个固定的截止日期。如果在截止日期到来之前吊舱仍在运行,我希望该作业自动终止。

是否存在这样的东西?(起初我以为Job规范activeDeadlineSeconds涵盖了这个用例,但现在我看到这activeDeadlineSeconds仅限制了​​重试作业的时间;它不会主动杀死慢速/失控的工作。)

jobs containers docker kubernetes kubernetes-jobs

7
推荐指数
2
解决办法
2363
查看次数

如何在 k8s 中手动触发 kubernates 作业(而不是 cron)

我有示例 k8s 作业,只要您执行 kubectl apply,作业就会被触发并创建 pod。如何控制Pod的创建?

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-with-timeout
spec:
  backoffLimit: 5
  activeDeadlineSeconds: 100
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-jobs

7
推荐指数
1
解决办法
7502
查看次数

Docker Swarm 中的“Kubernetes 工作”

与 Kubernetes 相比,Docker Swarm 相对更容易维护,因此我正在考虑从 Kubernetes 集群迁移到 Docker Swarm 集群。

在我的 Kubernetes 集群中,我广泛使用Jobs来临时启动工作人员,这对于整个基础设施的主要功能非常关键。Kubernetes Jobs 最好的一点是,它们会在 Job 完成后一定时间限制后关闭并回收资源。

我想问一下 Docker Swarm 中是否有相当于Kubernetes Jobs 的东西?到目前为止我在Docker网站上找不到支持这个功能的官方文档。

docker kubernetes docker-swarm kubernetes-jobs

5
推荐指数
0
解决办法
189
查看次数

手动触发的 cron 作业可以遵守并发策略吗?

所以我有一个这样的 cron 工作:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: my-cron-job
spec:
  schedule: "0 0 31 2 *"
  failedJobsHistoryLimit: 3
  successfulJobsHistoryLimit: 1
  concurrencyPolicy: "Forbid"
  startingDeadlineSeconds: 30
  jobTemplate:
    spec:
      backoffLimit: 0
      activeDeadlineSeconds: 120
...
Run Code Online (Sandbox Code Playgroud)

然后我像这样手动触发作业:

kubectl create job my-job --namespace precompile --from=cronjob/my-cron-job
Run Code Online (Sandbox Code Playgroud)

但似乎我可以根据需要多次触发该工作,并且concurrencyPolicy: "Forbid"会被忽略。

有没有办法让手动触发的作业尊重这一点,或者我必须手动检查这一点?

kubernetes kubernetes-cronjob kubernetes-jobs

5
推荐指数
1
解决办法
2520
查看次数

如何在kubernetes的每个节点而不是daemonset中运行作业

有一个具有 100 个节点的 kubernetes 集群,我必须手动清理特定图像,我知道 kubelet 垃圾收集可能会有所帮助,但它不适用于我的情况。浏览互联网后,我找到了一个解决方案——docker in docker,解决了我的问题。

我只想删除每个节点中的图像一次,有什么方法可以在每个节点中运行一次作业吗?

我检查了 kubernetes 标签和 podaffinity,但仍然没有想法,任何人都可以提供帮助吗?

另外,我尝试使用 daemonset 来解决问题,但事实证明它只能删除部分节点的图像,而不是所有节点,我不知道可能是什么问题......

这是守护程序集示例:

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: test-ds
  labels:
    k8s-app: test
spec:
  selector:
    matchLabels:
      k8s-app: test
  template:
    metadata:
      labels:
        k8s-app: test
    spec:
      containers:
      - name: test
        env:
        - name: DELETE_IMAGE_NAME
          value: "nginx"
        image: busybox
        command: ['sh', '-c', 'curl --unix-socket /var/run/docker.sock -X DELETE http://localhost/v1.39/images/$(DELETE_IMAGE_NAME)']
        securityContext:
          privileged: true
        volumeMounts:
        - mountPath: /var/run/docker.sock
          name: docker-sock-volume
        ports:
        - containerPort: 80
      volumes:
      - name: docker-sock-volume
        hostPath:
          # location …
Run Code Online (Sandbox Code Playgroud)

docker kubernetes daemonset kubernetes-jobs

5
推荐指数
1
解决办法
4299
查看次数

通过 kubernetes 作业创建或更新现有的 postgres db 容器

我有一个在 Kubernetes 集群中运行的 Postgres DB 容器。我需要编写一个 Kubernetes 作业来连接到 Postgres DB 容器并从 SQL 文件运行脚本。我需要在这里了解两件事

  1. 运行 SQL 脚本的命令
  2. 如何在 Job.yaml 文件中加载 SQL 文件

这是我用于 Kubernetes 作业的示例 yaml 文件

apiVersion: batch/v1
kind: Job
metadata:
  name: init-db
spec:
  template:
    metadata:
      name:  init-db
      labels:
        app: init-postgresdb
    spec:
      containers:
      - image: "docker.io/bitnami/postgresql:11.5.0-debian-9-r60"
        name: init-db
        command:
        - psql -U postgres 
        env:
          - name: DB_HOST
            value: "knotted-iguana-postgresql"
          - name: DB_DATABASE
            value: "postgres"
      restartPolicy: OnFailure  
Run Code Online (Sandbox Code Playgroud)

postgresql kubernetes kubernetes-jobs

4
推荐指数
1
解决办法
3500
查看次数

是否有可能,如果总是失败,如何限制 kubernetes 作业创建最大数量的 pod?

作为我们公司的 QA,我是 kubernetes 的日常用户,我们使用 kubernetes 作业来创建性能测试 pod。根据文档,工作的优势之一是

创建一个 Job 对象,以便可靠地运行一个 Pod 直至完成

但在我们的测试中,如果之前的 Pod 失败,此功能将创建无限个 Pod,这将占用我们团队共享集群的资源,并且删除这些 Pod 将花费大量时间。看这张图片: 在此输入图像描述

目前的工作清单是这样的:

   {
  "apiVersion": "batch/v1",
  "kind": "Job",
  "metadata": {
    "name": "upgradeperf",
    "namespace": "ntg6-grpc26-tts"
  },
  "spec": {
    "template": {
      "spec": {
        "containers": [
          {
            "name": "upgradeperfjob",
            "image":
"mycompany.com:5000/ncs-cd-qa/upgradeperf:0.1.1",
            "command": [
              "python",
              "/jmeterwork/jmeter.py",
              "-gu",
              "git@gitlab-pri-eastus2.dev.mycompany.net:mobility-ncs-tools/tts-cdqa-tool.git",
              "-gb",
              "upgradeperf",
          "-t",
              "JMeter/testcases/ttssvc/JMeterTestPlan_ttssvc_cmpsize.jmx",
          "-JtestDataFile",
              "JMeter/testcases/ttssvc/testData/avaml_opus.csv",
          "-JthreadNum",
              "3",
          "-JthreadLoopCount",
              "1500",
          "-JresultsFile",
              "results_upgradeperf_cavaml_opus_t3_l1500.csv",
          "-Jhost",
          "mtl-blade32-03.mycompany.com",
          "-Jport",
          "28416"
            ]
          }
        ],
        "restartPolicy": "Never",
        "imagePullSecrets": [
          {
            "name": "docker-registry-secret"
          }
        ] …
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-pod kubernetes-jobs

3
推荐指数
1
解决办法
1836
查看次数

如何在 Kubernetes 中找到 cronjobs 的所有者并杀死它?

尽管我没有部署或作业,但我有一个 cron 作业继续运行。我正在运行 minikube:

$ kubectl get deployments
No resources found in default namespace.

$ kubectl delete pods --all && kubectl delete jobs --all && get deployments
pod "hello-27125612-lmcb5" deleted
pod "hello-27125613-w5ln9" deleted
pod "hello-27125614-fz84r" deleted
pod "hello-27125615-htf4z" deleted
pod "hello-27125616-k5czn" deleted
pod "hello-27125617-v79hx" deleted
pod "hello-27125618-bxg52" deleted
pod "hello-27125619-d6wps" deleted
pod "hello-27125620-66b65" deleted
pod "hello-27125621-cj8m9" deleted
pod "hello-27125622-vx5kp" deleted
pod "hello-27125623-xj7nj" deleted
job.batch "hello-27125612" deleted
job.batch "hello-27125613" deleted
job.batch "hello-27125614" deleted
...

$ kb get jobs
No resources found …
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-jobs

3
推荐指数
1
解决办法
4617
查看次数

如何使用 kubectl 查明 K8s 作业是失败还是成功?

我有一个 Kubernetes 作业运行了一段时间,我需要检查它是失败还是成功。

我正在定期检查:

kubectl describe job/myjob | grep "1 Succeeded"
Run Code Online (Sandbox Code Playgroud)

这行得通,但我担心 kubernetes 的变化会破坏这一点;例如,消息更改为“1 成功完成”(愚蠢的文本,但您知道我的意思),现在我的 grep 将找不到它要查找的内容。

有什么建议?这是在 bash 脚本中完成的。

kubernetes kubectl kubernetes-jobs

2
推荐指数
1
解决办法
2306
查看次数

从作业创建或编辑 Kubernetes 密钥

我正在尝试从 Kubernetes 作业生成 Kubernetes 秘密。秘密是TLS证书,对于elasticsearch传输,我尝试了这个工作:

apiVersion: batch/v1
kind: Job
metadata:
  name: conso-security-tls-gen-certs
spec:
  template:
    spec:
      containers:
      - name: generator
        volumeMounts:
          - name: certs
            mountPath: "/certs"
        image: "docker.elastic.co/elasticsearch/elasticsearch:7.4.2"
        command: ["/bin/sh", "-c"]
        args:
        - "bin/elasticsearch-certutil ca (...) --silent -out /certs/bundle.p12"
      restartPolicy: Never
      volumes:
      - name: certs
        secret:
          secretName: conso-security-tls-certs
  backoffLimit: 4
Run Code Online (Sandbox Code Playgroud)

但正如https://github.com/kubernetes/kubernetes/issues/62099所说,该卷/certs是只读的。有没有办法像这样创建/编辑这个秘密?

kubernetes kubernetes-secrets kubernetes-jobs

1
推荐指数
1
解决办法
3986
查看次数

在 kubernetes pod 中运行 bash 脚本

我正在尝试使用以下文件运行外部bashyaml脚本。

该脚本位于该/scripts/run.sh文件夹内。我也已经给出了defaultMode: 0777

这是我得到的错误。

sh: 0: Can't open /scripts/run.sh
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
data:
  script.sh: |-
    echo "Hello world!"
    kubectl get pods
kind: ConfigMap
metadata:
  name: script-configmap
---
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app: script-job
  name: script-job
spec:
  backoffLimit: 2
  template:
    spec:
      containers:
        - command:
            - sh
            - /scripts/run.sh
          image: 'bitnami/kubectl:1.12'
          name: script
          volumeMounts:
            - name: script-configmap
              mountPath: /scripts
              subPath: run.sh              
              readOnly: false
      restartPolicy: Never
      volumes:
        - name: script-configmap
          configMap:
            name: script-configmap
            defaultMode: 0777
Run Code Online (Sandbox Code Playgroud)

kubernetes kubectl kubernetes-jobs

1
推荐指数
1
解决办法
8189
查看次数