スケールでのクラウドネイティブモニタリング
9287 ワード
導入
我々は、負荷が一時的な雲のネイティブ世界に向かって移動すると、水平方向のスケーリングは、キーとマイクロサービスは、すべてのこれらの拡散コンポーネントの監視は必須ではなく、任意の生産準備環境に強制的になります.
我々は、Kubernetes上で展開されたクラウドネイティブアプリケーション全体の監視のすべての段階に焦点を当て、スケールでクラウドネイティブ監視という名前のシリーズをナビゲートします.単一の実行中のアプリケーションから、それが複数のアプリケーションを同時に実行している複数のK 8 Sクラスタを持つことへのすべての方法(このポスト)がアップしていて、予想通りに走るならば、理解するために.
クラウドネイティブアプリケーションの健康
このブログ記事では、クラウドネイティブアプリケーションを開発し、それがアップしていることを確認します
pod
レベル、Kubernetesの内蔵の能力を活用してReadiness
and Liveness
プローブゴール
で返信するアプリケーションを作成する
pong
で/ping
エンドポイント.ステップ
→ 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
我々の顧客に、我々のとても価値あるサービスの休止時間を減らしてください.結論
これは、私たちの“クラウドネイティブネイティブスケール監視”シリーズの最初のブログ記事ですが、我々は我々のアプリケーションの健康を公開し、スケールで監視するすべてのステップを識別するから進化し、最終的に我々のアプリケーション全体、システムや組織全体で何かが間違って行くたびに警告を得るために本格的かつ自動化システムを構築するためにこのシステムを活用する.
あなたのインフラだけでなく、どのようにあなたのビジネスに影響を与えることができるすべての層を監視する方法についての詳細について議論のように感じるなら、あなたの組織に重要ですし、私に手を差し伸べる.
Reference
この問題について(スケールでのクラウドネイティブモニタリング), 我々は、より多くの情報をここで見つけました https://dev.to/schmittfelipe/cloud-native-monitoring-at-scale-application-s-health-17n7テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol