web-dev-qa-db-ja.com

Kubernetes + Alpinelinuxで実行されていないcronジョブ

Alpine Linux Dockerイメージでcronジョブを実行しようとしています。このイメージは、Kubernetesコンテナーにプッシュされます。 Cronの仕事は、15分ごとにコンテナを再起動することです。だから私のコマンドはpkill processnameです。

Alpine Cronジョブについて少し:Alpine Linuxの場合、cronは定期的にフォローされます。つまり、フォルダーはすでに/ 15分作成されています。 /毎時。 /毎日。 /毎週。 /毎月。そのため、スクリプトを実行するには、いずれかのフォルダーにスクリプトをコピーする必要があります。

スクリプトを作成し、Alpine FAQのページで要求されたように、ファイルに名前拡張子を付けず、フォルダー内の実行権限でコピーしました。コマンドrun-parts --test /etc/periodic/15minを実行しようとすると、実行する必要のあるスクリプトが1つあることがわかります。ただし、そのスクリプトは実行されません。ローカルマシンでそのDockerイメージを実行しようとすると、そのスクリプトではなく、フォルダーにファイルを作成するだけの別のスクリプトで実行すると、うまく機能します。

Kubeクラスタでcrond -f -l 8を試して実行しても、tiはまだ機能しません。

私はこの部分の助けを本当にいただければ幸いです。

1
Nitesh Joshi

スーパーユーザーへようこそ。

まず第一に、多分あなたはそれに間違った方向に直面しています。コンテナ全体を15分ごとに再起動することが目標である場合は、以下のリンクを確認する必要があります。

複数の可能な解決策でポッドを再起動することについての質問

ポッドライフサイクルドキュメント

Kubernetesの概念 -kubernetesがどのように機能するか、および人々がそこで使用する名前についての説明。

完全を期すために、実際に定期的なタスクを実行したい場合は、特定のKubernetesドキュメントを確認してください。これらには、cronジョブの作成方法とデバッグ方法が記載されています。 cronジョブの実行を積極的に妨げているものがある可能性があるため、ドキュメントのKubernetesの制限についても読むことをお勧めします

cronjobsに関するGCPドキュメント

Cronjobsに関するKubernetesドキュメント

Cronjobタスクの作成方法について履歴書をお伝えしますが、kubernetesに慣れていない場合は上記を注意深く読み、内部のリンクをたどってください。kubernetesをプレイして基本を学ぶ準備ができています。

内部ではより詳細に説明されていますが、基本的にはコマンドの例とそれをデプロイする方法を示しています。 15分に1回になるように変更し、pkillを実行します。次の内容でyamlファイルを作成する必要があります(より複雑なcronの動作については構文を確認してください)。

# cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/15 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - pkill yourprocess
          restartPolicy: OnFailure

次に、を使用して展開します

kubectl apply -f [FILENAME]

次のコマンドを使用して、cronjobがデプロイされたかどうかを確認します。

kubectl describe cronjob [CRON_JOB]

上記のプロセスをより多くのスクリーンショットと例で説明した投稿

この後、これは非常に一般的な答えです。コメントを投稿してお手伝いさせていただきますが、現在Alpine Linuxのインストールにアクセスできないため、役に立たない可能性があります。 これはあなたの問題に対処するAlpine Linuxのドキュメントページです

エラーの追跡:簡単な方法

正確ではありませんが、出て行くものを絞り込むための非常に簡単な方法があります。ここには2つの可能性があります。CRON自体に問題があるか、スクリプトに問題があります(許可など)。プロセスは簡単です:

  • 誰もが読み書きできることを絶対に確信しているフォルダ内に空のファイルを作成するタスクを作成します。
  • タスクの実行が中断されたときに新しいファイルが表示される場合は、cronが適切に実行されており、スクリプトに問題があることを意味します。 「スクリプトの問題」セクションに移動します。そうでない場合は、cronに問題があります。 Cronの問題セクションに移動

エラーの追跡:ログ

システムの問題を解決する最良の方法は、ログを確認することです。 cronのようなソフトウェアは、特に設定されていない限り、通常、ログをsyslog(通常は/ var/log/syslogにあります)に保存します。 この投稿 cronロギングフォルダについて説明しています。

Cronインスタンスがログを記録している場所が見つかり、そこに何もない場合は、cronサービスがまったく実行されていないことを意味します。 Cronの問題には、この問題に対するAlpineLinux固有のソリューションがあります。エラーが表示された場合は、エラーを確認して、問題を絞り込んでください。そうでない場合は、スクリプトが実際に実行されていないことを確認する必要があります。

cronの問題

さて、あなたはcronが正しく機能していないことを知っています。考えられるさまざまなシナリオがあります。

  • Cronがまったく実行されていない

Cronサービスが開始されていない可能性があります。サービスが実行されているかどうかを確認します。そうでない場合は、手動で開始してください。正常に起動したか確認し、起動処理に追加してください。その方法はOSによって異なります。 Alpine Linuxでは、これでうまくいくはずです。

rc-service crond start && rc-update add crond
  • 使用しているcronフォルダーはcronによって使用されていません

スクリプトを配置するフォルダーが実際に追加されていることを確認するには、メインのcron構成ファイルを確認する必要があります。

  • タイプミス

おそらく、構成行の引数にスペースが含まれているなどのエラーがあるかもしれませんが、この場合は、フォルダーでテストコマンドを使用したため、これはシナリオではないようです。

スクリプトの問題

スクリプトを実行しても目的の出力が生成されない場合は、次の手順を実行することをお勧めします。

  • スクリプトをファイルに分割します。実行権限を付与し、最初の行に使用するシェルが適切に記述されていることを確認します。アルパインの場合、この行は#!/ bin/shである必要があります。
  • 標準出力とエラー出力をファイルにリダイレクトします 何が起こっているかを分析します。

一般的な提案

  • スクリプトの問題のセクションで述べたように、あらゆる種類の問題をデバッグできるようにするには、ワンライナーをスクリプトファイルに分割し、その出力をファイルにポイントすることをお勧めします。
  • ディレクトリとファイルのアクセス許可(スクリプトによって直接アクセスされるもの、およびcronがスクリプトを実行するためにユーザーが読み取る必要があるもの)をよく見てください。これは、特にコンテナーでは、失敗の一般的な原因です。

編集:たぶん私はあなたの状況を間違った方法で理解しました、そしてあなたは これのようなシナリオにいます

1
DGoiko