スケールでのクラウドネイティブモニタリング



導入
我々は、負荷が一時的な雲のネイティブ世界に向かって移動すると、水平方向のスケーリングは、キーとマイクロサービスは、すべてのこれらの拡散コンポーネントの監視は必須ではなく、任意の生産準備環境に強制的になります.
我々は、Kubernetes上で展開されたクラウドネイティブアプリケーション全体の監視のすべての段階に焦点を当て、スケールでクラウドネイティブ監視という名前のシリーズをナビゲートします.単一の実行中のアプリケーションから、それが複数のアプリケーションを同時に実行している複数のK 8 Sクラスタを持つことへのすべての方法(このポスト)がアップしていて、予想通りに走るならば、理解するために.

クラウドネイティブアプリケーションの健康
このブログ記事では、クラウドネイティブアプリケーションを開発し、それがアップしていることを確認しますpod レベル、Kubernetesの内蔵の能力を活用してReadiness and Liveness プローブ

ゴール
で返信するアプリケーションを作成するpong/ping エンドポイント.

ステップ
  • Dockerize開発環境;
  • 囲碁、錆またはデコなどの“雲ネイティブフレンドリー”プログラミング言語でアプリケーションを開発する
  • ユースケースのほとんどを検証するためのすべてのテストを記述し実装する
  • 我々のテスト/統合環境に我々のアプリケーションを配備して、すべての煙テストと確認をしてください;
  • 緑の光を取得し、生産環境へのアプリケーションを促進する;
  • これらの手順を経たら、アプリケーションが起動してK 8 s名前空間で実行できることがわかります.
    → kubectl get pods
    NAME                        READY   STATUS    RESTARTS   AGE
    app-basic-5499dbdcc-4xlmm   1/1     Running   0          6s
    app-basic-5499dbdcc-j84bl   1/1     Running   0          6s
    
    我々は、すべてが予想通りに働いている我々の生産環境を確認することさえできます:
    → curl --max-time 10 http://kubernetes.docker.internal:31792/ping
    {"msg":"pong"}
    

    ライブ!
    私たちのアプリケーションが正常に実装されているすべての(ちょうど)ので、我々は生活していると問題がなくお客様にこのサービスを提供することができますので、罰金を働いている!
    数分後、我々は、サービスを期待して動作していない顧客からのメールを取得し、呼び出しを開始します.変な、右?podが動いているかどうかチェックしましょう.
    → kubectl get pods
    NAME                        READY   STATUS    RESTARTS   AGE
    app-basic-6b6dd6b98f-6t7jl   1/1     Running   0          57s
    app-basic-6b6dd6b98f-pzgxr   1/1     Running   0          57s
    
    それはちょうど良い実行している、それは右の下で言うSTATUS ASRunning だから、顧客と問題がある必要がありますか?正気のためだけにテストをしましょう
    → curl --max-time 10 http://kubernetes.docker.internal:31792/ping
    curl: (28) Operation timed out after 10003 milliseconds with 0 bytes received
    
    これは厄介な、我々は我々のアプリケーションをテストして、展開はちょうどうまく働いているが、明らかにしばらくの間、我々のアプリケーションが動作を停止するが、これは私たちのKubernetes環境に反映されません.
    この運動のために、我々は、我々がログを通して見たことができたように、それが最初に起動したあと30秒、アプリケーションを壊す小さな「殺しスイッチ」をつくりました:
    → kubectl logs app-basic-6b6dd6b98f-6t7jl
    [11/29/2020, 6:49:42 PM] Running on http://0.0.0.0:8080
    [11/29/2020, 6:50:12 PM] Upsie, I'm dead...
    

    クバーネットの救出
    さて、これはKubernetesのコンセプトですReadiness and Liveness Probe 便利で、それはkubelet その状態を理解するためにエンドポイントを調べることによって、定期的にpodの状態をチェックする.

    活性対準備性プローブ
    最初にこれらの2つの概念が混乱することができますが、彼らの責任に関して、我々がその主な目的を調査し始めるので、それはよりわかりやすくなります.
    アプリケーションの健康は2つの主要な状態になります.

  • アライブ(活性):アプリケーションが稼働しており、期待通りに動作します

  • 準備ができて:アプリケーションは、新しいリクエストを受信する準備ができています
  • 最初に、外部の要求に対して高速に応答できるようにメモリ内キャッシュをロードするアプリケーションがあるとしましょう.これは、アプリケーションがalive and running から0s しかし、それはready 周囲で15s .
    これらのプローブを持っていると、Kubernetesは重要なオーケストレーションタスクを実行することができます.これは、サービスがアップデートして準備ができているときだけ、特定のPODへのリクエストをルーティングしたり、PODが特定の時間のために準備されていないときにPODSを再起動するように設定しきい値を設定することです.
    オーケストレーションの観点から、Kubernetesは我々の配備マニフェストにこれらのパラメタを単に加えることによってカバーされました.
    ...
    containers:
      - name: app
        image: pong
        ...
        livenessProbe:
          httpGet:
            path: /health
            port: http
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 1
          failureThreshold: 1
        readinessProbe:
          httpGet:
            path: /ready
            port: http
          initialDelaySeconds: 15
          periodSeconds: 5
          timeoutSeconds: 1
          failureThreshold: 1
        ...
    
    の実装/health and /ready エンドポイントは、アプリケーションのすべての種類の間で異なる意味を持つことができるので、アプリケーションの責任の一部です/pong 我々のアプリケーションが生きていて準備ができているならば、我々のチェックとしての終点.
    我々が我々を振り返るならばpong を持つことによってtimeoutSeconds 1 sに設定し、periodSeconds 5 s(Kubeletは5 sごとにこの終点を調査するでしょう)として、エンドポイントが応答する1秒以上を取っていたことを検出します.
    もちろん、これは我々の根本原因を必ずしも修正するというわけではありません、しかし、それは我々の顧客に対する影響を減らして、我々が我々のポッドの上で複数のトリガーされた再スタートを見るとき、何かが間違っていたということを知らせるでしょう.
    → kubectl get pods
    NAME                         READY   STATUS    RESTARTS   AGE
    app-basic-6b6dd6b98f-6t7jl   1/1     Running   4          2m33s
    app-basic-6b6dd6b98f-pzgxr   1/1     Running   4          2m33s
    
    このシナリオの下で、私たちは、なぜ我々がポッドのイベントの下でそれほど多くの再スタートをしたのかを理解するために、もう少し詳しく調べることができました.
    → kubectl get event --field-selector involvedObject.name=app-basic-6b6dd6b98f-6t7jl
    LAST SEEN   TYPE      REASON      OBJECT                           MESSAGE
    4m          Normal    Scheduled   pod/app-basic-6b6dd6b98f-6t7jl   Successfully assigned default/app-basic-6b6dd6b98f-6t7jl to docker-desktop
    95s         Normal    Pulled      pod/app-basic-6b6dd6b98f-6t7jl   Container image "pong:latest" already present on machine
    2m10s       Normal    Created     pod/app-basic-6b6dd6b98f-6t7jl   Created container app-basic
    2m10s       Normal    Started     pod/app-basic-6b6dd6b98f-6t7jl   Started container app-basic
    2m48s       Warning   Unhealthy   pod/app-basic-6b6dd6b98f-6t7jl   Readiness probe failed: Get "http://10.1.0.15:8080/ping": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
    97s         Warning   Unhealthy   pod/app-basic-6b6dd6b98f-6t7jl   Liveness probe failed: Get "http://10.1.0.15:8080/ping": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
    97s         Normal    Killing     pod/app-basic-6b6dd6b98f-6t7jl   Container app-basic failed liveness probe, will be restarted
    2m9s        Warning   Unhealthy   pod/app-basic-6b6dd6b98f-6t7jl   Readiness probe failed: Get "http://10.1.0.15:8080/ping": dial tcp 10.1.0.15:8080: connect: connection refused
    
    ここでは、ポッドはkilled 我々の活性と準備のプローブの両方がタイミングアウトだったという事実のため.
    これは、我々のアプリケーションは、我々のアプリケーションを30秒ごとに応答を停止させる原因となっていた上で我々のコード内で調査する必要があるいくつかの不健全な症状を示していることを理解することができます.
    それにもかかわらず、我々の実行によってReadiness and Liveness プローブは、我々は我々のポッドの健康状態は、我々のアプリケーションの健康を反映するだけでなく、Kubernetesは、これらの指標を認識しており、それに応じて反応することができることを確認している.この場合、不健康であるたびにポッドを再起動することによって、健康な状態にポッドを戻すことができますpong 我々の顧客に、我々のとても価値あるサービスの休止時間を減らしてください.

    結論
    これは、私たちの“クラウドネイティブネイティブスケール監視”シリーズの最初のブログ記事ですが、我々は我々のアプリケーションの健康を公開し、スケールで監視するすべてのステップを識別するから進化し、最終的に我々のアプリケーション全体、システムや組織全体で何かが間違って行くたびに警告を得るために本格的かつ自動化システムを構築するためにこのシステムを活用する.
    あなたのインフラだけでなく、どのようにあなたのビジネスに影響を与えることができるすべての層を監視する方法についての詳細について議論のように感じるなら、あなたの組織に重要ですし、私に手を差し伸べる.