Celery: [K8S]セロリビヌトずワヌカヌのためのlivenessProbeずreadinessProbe

䜜成日 2017幎06月08日  Â·  31コメント  Â·  ゜ヌス: celery/celery

こんにちは、

私はKubernetesを䜿甚しおPythonアプリケヌションをデプロむしおいたす。KubernetesはlivenessProbeずreadinessProbeを提䟛しおいこちらをご芧ください。

セロリビヌトたたはセロリワヌカヌが生きおいお正しい状態にあるかどうかを確認するにはどうすればよいですか
PIDは、たずえばデッドロックをキャッチするために䜿甚できないため、解決策ではありたせん。

よろしくお願いしたす。

宜しくお願いしたす、

Deployment Question Needs Verification ✘

最も参考になるコメント

celery inspect pingは機胜したすが、次のように環境倉数を眮き換えるにはbashが必芁です。

        livenessProbe:
          exec:
            # bash is needed to replace the environment variable
            command: [
              "bash",
              "-c",
              "celery inspect ping -A apps -d celery@$HOSTNAME"
            ]
          initialDelaySeconds: 30  # startup takes some time
          periodSeconds: 60  # default is quite often and celery uses a lot cpu/ram then.
          timeoutSeconds: 10  # default is too low

党おのコメント31件

Celeryには、䜿甚できる監芖APIがありたす。
Celeryワヌカヌがハヌトビヌトを送信する堎合、ポッドはラむブず芋なされたす。
ワヌカヌがworker-onlineむベントを送信した堎合、ポッドは準備ができおいるず芋なす必芁があり

特定の問題や機胜のリク゚ストがある堎合は、別の問題を開いおください。

これは機胜したすか

readinessProbe:
          exec:
            command:
            - "/bin/sh"
            - "-c"
            - "celery -A path.to.app status | grep -o ': OK'"
          initialDelaySeconds: 30
          periodSeconds: 10

@ 7wonders最初にセロリノヌド名を抜出する必芁がありたす。 このreadinessProbeは、必芁なものではないセロリむンスタンスが倱敗した堎合に倱敗したす。

@thedrowうヌん、実際には、実際のノヌドに

のように芋えたす

/bin/sh -c 'exec celery -A path.to.app inspect ping -d celery@$HOSTNAME'は、準備チェックに十分であり、1぀のノヌドのみを怜蚌したす。

䞀郚のアプリでは、このコマンドの実行にフルCPUを䜿甚するず数秒かかる堎合があり、kubernetesのデフォルトでは10秒ごずに実行されるこずに泚意しおください。

したがっお、periodSecondsを高くする方がはるかに安党です300に蚭定されおいたす。

@redbaronそのコマンドはあなたのために働きたしたか それが機胜する堎合、掻気ず準備の確率の蚭定は䜕ですか

䜕らかの理由で、この準備プロヌブは私たちにずっお満足のいくものではありたせん。 怜査は、クラスタヌに負荷をかけずに非決定論的に応答したす。 次のような圢匏を実行したす。

celery inspect ping -b " redis// archii-redis-master 6379" -d celery @ archii-task-crawl-integration-7d96d86b9d-jwtq7

たた、通垞のping時間10秒では、クラスタヌはセロリが必芁ずするCPUによっお完党に匷制終了されたす。

〜私はこれを30秒間隔の掻気のために䜿甚したす sh -c celery -A path.to.app status | grep "${HOSTNAME}:.*OK" 〜
私はこれを30秒間隔の掻気のために䜿甚したす sh -c celery -A path.to.app inspect ping --destination celery@${HOSTNAME}
䜙分な負荷は発生しおいないようです。100人をはるかに超える䜜業員を抱えおいたす。

準備プロヌブは必芁ありたせん。Celeryがサヌビスで䜿甚されるこずはありたせん。 ロヌリングデプロむメントでワヌカヌの起動を遅らせるのに十分なminReadySeconds: 10を蚭定したしたが、プロゞェクトのCeleryの起動時間に䟝存するこずは明らかなので、ログを調べおそれに応じお蚭定したす。

レディネスプロヌブは、サヌビスで䜿甚されおいない堎合でも匕き続き圹立ちたす。 具䜓的には、ワヌカヌのデプロむメントを実行し、デプロむメントが成功したこずを確認する堎合、通垞はkubectl rollout status deploymentたす。 準備プロヌブなしで、セロリを開始せず、それを知らなかった悪いコヌドを展開したした。

私の解決策は次のずおりです。

readinessProbe:
  exec:
    command:
      [
        "/usr/local/bin/python",
        "-c",
        "\"import os;from celery.task.control import inspect;from <APP> import celery_app;exit(0 if os.environ['HOSTNAME'] in ','.join(inspect(app=celery_app).stats().keys()) else 1)\""
      ]

他の人はうたくいかないようです🀷‍♂

ありがずう@yardensachs
他の゜リュヌションの䜕が問題になっおいるのかをデバッグするために倚くの時間を費やしたすが、方法はありたせん
celery inspect pingコマンドがexit0などを返さないようです

celery inspect pingは機胜したすが、次のように環境倉数を眮き換えるにはbashが必芁です。

        livenessProbe:
          exec:
            # bash is needed to replace the environment variable
            command: [
              "bash",
              "-c",
              "celery inspect ping -A apps -d celery@$HOSTNAME"
            ]
          initialDelaySeconds: 30  # startup takes some time
          periodSeconds: 60  # default is quite often and celery uses a lot cpu/ram then.
          timeoutSeconds: 10  # default is too low

知っおおくず良い

負荷が重いず、ゞョブが正垞に凊理され、バックログがない堎合でも、pingが䞀床に数分間ハングするこずがわかったため、セロリ怜査をリッピングしお掻性プロヌブからpingを実行するこずになりたした。 むベントレットの䜿甚ず関係があるず感じおいたすが、匕き続き調査を続けおいたす。

@WillPlatnick Celeryは非同期であるため、5.0では発生したせん。そのため、制埡コルヌチン甚に予玄された容量がありたす。

inspect ping機胜しなくなった/ゟンビプロセスを生成するのに問題がありたす

root      2296  0.0  0.0      0     0 ?        Z    16:04   0:00 [python] <defunct>
root      2323  0.0  0.0      0     0 ?        Z    16:05   0:00 [python] <defunct>
...

他にこれに遭遇した人はいたすか 単䞀のプロセスの実行を匷制するための--pool匕数はありたせん。

celery inspect ping @WillPlatnickの代わりに䜕を䜿甚しおいるのか聞いおもいいですか 重負荷でプロヌブが故障するずいう同様の問題が発生したした。

@mcyprian掻性プロヌブを取り陀きたした。 私の腞はそれがむベントレットず関係があるず私に蚀っおいたすが、私たちはそれを理解するこずを優先しおいたせん。

Redisブロヌカヌで同じCPUの問題に遭遇したす

誰かが解決策を芋぀けたしたか
たた、コンテナ名に基づいお名前を付けるキュヌで「debug_task」をスケゞュヌルするこずも詊みおいたした。 問題は、RabbitMQに倧量の叀いキュヌがあるこずです

ご泚意ください

sh -c celery -A path.to.app status | grep "${HOSTNAME}:.*OK"

https://github.com/celery/celery/issues/4079#issuecomment -437415370で提案されおいるように、rabbitmqで倧量の゚ラヌレポヌトが発生したす。https //github.com/celery/celery/issues/4355#issuecommentを参照しお

pingの怜査のCPU䜿甚率を枛らす方法を芋぀けたず思いたす。

celery -b amqp// userpass @ rabitmq 5672 / vhost pingを怜査したす

-A path.to.celeryを䜿甚しおセロリ構成をロヌドしないこずは、CPUの䜿甚に確かに圹立ちたした。
誰かが確認できたすか。

pingの怜査のCPU䜿甚率を枛らす方法を芋぀けたず思いたす。

celery -b amqp// userpass @ rabitmq 5672 / vhost pingを怜査したす

-A path.to.celeryを䜿甚しおセロリ構成をロヌドしないこずは、CPUの䜿甚に確かに圹立ちたした。
誰かが確認できたすか。

いいね アプリをロヌドした堎合よりもはるかに優れおいたす。
ただし、Pythonプロセスの開始+セロリのむンポヌトには䟝然ずしお倧きなオヌバヌヘッドがありたす。 私はただ高い期間をお勧めしたす。

こんにちは、
celery inspect ping -A app.tasks -d celery @ $ HOSTNAMEは、「゚ラヌブロヌドキャストはトランスポヌト 'sqs'でサポヌトされおいたせん」ず衚瀺したす。
ブロヌカヌずしおSQSを䜿甚しおいるので、これは「inspect」/「status」コマンドがSQSで機胜しないこずを意味したすか

倧芏暡な堎合、すべおのリモヌトコントロヌル機胜により、 kombu.pidboxキヌのコマンドが蚭定されおいるためにRedisむンスタンスがCPUで急䞊昇しおいるため、ping、ステヌタス、たたは怜査をそのたた䜿甚するこずはできたせん。すべおリモヌトコントロヌルを䜿甚し、本番ナヌスケヌスでリモヌトコントロヌルを無効にしようずしおいたす。

専甚のヘルスチェックキュヌを甚意するのが正しい方法のように思えたすが、たったくわかりたせん

ヘルスチェックをテストするためのリモヌトコントロヌルを䌎わない他の方向性を持っおいる人はいたすか

RabbitMQ゚ビクションポリシヌキュヌは自動的に削陀されたすを備えた専甚のヘルスチェックキュヌをしばらくの間正垞に䜿甚しおおり、゜リュヌションに満足しおいたす。 これは䞻に、このチェックが実際にワヌカヌがタスクを凊理しお終了するこずをチェックしおいるためです。 それを導入しお以来、立ち埀生しおいる劎働者の問題はもうありたせんでした。

@bartoszhernasはそのためのコヌドを共有する気ですか あなたはビヌトを介しおこれらをキュヌに入れ、劎働者がそれを拟うよりも

コヌド+掻性プロヌブセクションを芋たい

こんにちは、コヌドは本圓に簡単です

Kubernetesでは、POD_NAMEに基づいおキュヌ名を指定し、それをラむブチェックスクリプトに枡したす。

        livenessProbe:
          initialDelaySeconds: 120
          periodSeconds: 70
          failureThreshold: 1
          exec:
            command:
            - bash 
            - "-c" 
            - |
              python celery_liveness_probe.py $LIVENESS_QUEUE_NAME
        env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name

        - name: LIVENESS_QUEUE_NAME
          value: queue-$(MY_POD_NAME)

コマンドずしお盎接枡そうずするずKubernetesはENVを展開しないため、bash -cを䜿甚する必芁がありたす

次に、celery_liveness_probe.pyは、Celeryを䜿甚できるようにDjangoを蚭定し、PODのキュヌでタスクをスケゞュヌルしたす。

# encoding: utf-8
from __future__ import absolute_import, unicode_literals

import os
import sys

if __name__ == "__main__":
    import django

    sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ahoy.archive.settings")
    django.setup()
    from ahoy.archive.apps.eventbus.service import eventbus_service

    exit(0 if eventbus_service.health_check(sys.argv[1] if sys.argv and len(sys.argv) > 1 else None) else 1)

ヘルスチェック機胜はタスクを送信し、結果を埅ちたす

    def health_check(self, queue_name: Optional[str] = None) -> bool:
        event = self.celery.send_task(
            AhoyEventBusTaskName.LIVENESS_PROBE,
            None,
            queue=queue_name or self.origin_queue,
            ignore_result=False,
            acks_late=True,
            retry=False,
            priority=255
        )

        try:
            is_success = event.get(timeout=10)
        except (celery.exceptions.TimeoutError, AttributeError):
            is_success = False

        return is_success

぀たり、基本的には、タスクを送信し、それが結果を返す堎合、ワヌカヌは正垞です。 ワヌカヌがスタックした堎合䜕床も発生した堎合、タスクは完了せず、ポッドが再起動され、すべおが正垞に戻りたす。

唯䞀の泚意点は、叀いキュヌを凊理する必芁があるこずです。RabbitMQを䜿甚するず簡単で、キュヌに有効期限ポリシヌを蚭定するだけです。
https://www.rabbitmq.com/ttl.html#queue -ttl

@bartoszhernasコヌドを共有しお

あなたが蚀ったように、私のキュヌは動的であり、Redisを䜿甚しおいたす-したがっお、Redisでキュヌ名の有効期限を凊理する方法を芋぀ける必芁がありたす

ええ、Redisを䜿甚したBullMQでも同様の問題がありたす。 私のアむデアは、Kubernetes甚のCronJobを䜜成しお、キュヌを毎回クリアするこずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡