web-dev-qa-db-ja.com

KubernetesのCron Jobs-既存のポッドに接続し、スクリプトを実行します

私は明らかな何かを見逃していると確信しています。 KubernetesのScheduledJobs/CronJobsのドキュメントを調べましたが、スケジュールに基づいて次のことを行う方法が見つかりません。

  1. 既存のポッドに接続する
  2. スクリプトを実行する
  3. 切断する

私はこれを行う別の方法を持っていますが、彼らは正しいとは感じません。

  1. Cronタスクをスケジュールします:kubectl exec -it $(kubectl get pods --selector = some-selector | head -1)/ path/to/script

  2. アプリケーションも収容する「クロンポッド」と、アプリケーションだけである「ノンクロンポッド」を含む1つのデプロイメントを作成します。 Cron Podは別のイメージ(cronタスクがスケジュールされたイメージ)を使用します。

同じジョブが一度に複数回実行されるのを防ぐために、可能であればKubernetes ScheduledJobsを使用することをお勧めします。

ScheduledJobs/CronJobsでこれを行う方法はありますか?

http://kubernetes.io/docs/user-guide/cron-jobs/

20
Aeisor

これはアンチパターンのようです。ワーカーポッドをジョブポッドとして実行できないのはなぜですか?

とにかく、あなたはこれを行う必要があるとかなり確信しているようです。これが私がすることです。

ワーカーポッドを取り、簡単なWebサービスでシェルの実行をラップします。ほぼすべての言語で10分間の作業です。ポートを公開し、そのワーカーの前にサービスを配置します。その後、ジョブポッドは、単に..svc.cluster.local:/をカールできます(dnsを使用していない限り)。

1
Brett Wagner

これは役立つはずです。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/30 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            kubectl exec -it  <podname> "sh script.sh ";
          restartPolicy: OnFailure

exec関数を使用して、Kubernetes APIを使用してターゲットポッドで必要なコマンドを実行するスケジュールされたポッドを作成します。ポッドイメージには、APIにアクセスするための クライアントライブラリ が含まれている必要があります。これらの多くは利用可能であるか、独自に構築できます。

たとえば、Pythonクライアントを使用して、各ZooKeeperポッドを実行し、データベースメンテナンスコマンドを実行するソリューションを次に示します。

import time

from kubernetes import config
from kubernetes.client import Configuration
from kubernetes.client.apis import core_v1_api
from kubernetes.client.rest import ApiException
from kubernetes.stream import stream
import urllib3

config.load_incluster_config()

configuration = Configuration()
configuration.verify_ssl = False
configuration.assert_hostname = False
urllib3.disable_warnings()
Configuration.set_default(configuration)

api = core_v1_api.CoreV1Api()
label_selector = 'app=zk,tier=backend'
namespace = 'default'

resp = api.list_namespaced_pod(namespace=namespace,
                               label_selector=label_selector)

for x in resp.items:
  name = x.spec.hostname

  resp = api.read_namespaced_pod(name=name,
                                 namespace=namespace)

  exec_command = [
  '/bin/sh',
  '-c',
  'opt/zookeeper/bin/zkCleanup.sh -n 10'
  ]

  resp = stream(api.connect_get_namespaced_pod_exec, name, namespace,
              command=exec_command,
              stderr=True, stdin=False,
              stdout=True, tty=False)

  print("============================ Cleanup %s: ============================\n%s\n" % (name, resp if resp else "<no output>"))

および関連するDockerfile:

FROM ubuntu:18.04
LABEL maintainer "reDock Inc."

ADD ./cleanupZk.py /

RUN apt-get update \
  && apt-get install -y python-pip \
  && pip install kubernetes \
  && chmod +x /cleanupZk.py

CMD /cleanupZk.py

RBAC対応クラスターがある場合は、サービスアカウントと適切なロールを作成して、このAPI呼び出しを可能にする必要がある場合があることに注意してください。上記のスクリプト例が必要とするように、ポッドをリストし、execを実行するには、次のようなロールで十分です。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-list-exec
  namespace: default
rules:
  - apiGroups: [""] # "" indicates the core API group
    resources: ["pods"]
    verbs: ["get", "list"]
  - apiGroups: [""] # "" indicates the core API group
    resources: ["pods/exec"]
    verbs: ["create", "get"]

関連するcronジョブの例:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: zk-maint
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: zk-maint-pod-list-exec
  namespace: default
subjects:
- kind: ServiceAccount
  name: zk-maint
  namespace: default
roleRef:
  kind: Role
  name: pod-list-exec
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: zk-maint
  namespace: default
  labels:
    app: zk-maint
    tier: jobs
spec:
  schedule: "45 3 * * *"
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: zk-maint
            image: myorg/zkmaint:latest
          serviceAccountName: zk-maint
          restartPolicy: OnFailure
          imagePullSecrets:
          - name: Azure-container-registry
0
Raman