私は明らかな何かを見逃していると確信しています。 KubernetesのScheduledJobs/CronJobsのドキュメントを調べましたが、スケジュールに基づいて次のことを行う方法が見つかりません。
私はこれを行う別の方法を持っていますが、彼らは正しいとは感じません。
Cronタスクをスケジュールします:kubectl exec -it $(kubectl get pods --selector = some-selector | head -1)/ path/to/script
アプリケーションも収容する「クロンポッド」と、アプリケーションだけである「ノンクロンポッド」を含む1つのデプロイメントを作成します。 Cron Podは別のイメージ(cronタスクがスケジュールされたイメージ)を使用します。
同じジョブが一度に複数回実行されるのを防ぐために、可能であればKubernetes ScheduledJobsを使用することをお勧めします。
ScheduledJobs/CronJobsでこれを行う方法はありますか?
これはアンチパターンのようです。ワーカーポッドをジョブポッドとして実行できないのはなぜですか?
とにかく、あなたはこれを行う必要があるとかなり確信しているようです。これが私がすることです。
ワーカーポッドを取り、簡単なWebサービスでシェルの実行をラップします。ほぼすべての言語で10分間の作業です。ポートを公開し、そのワーカーの前にサービスを配置します。その後、ジョブポッドは、単に..svc.cluster.local:/をカールできます(dnsを使用していない限り)。
これは役立つはずです。
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