Kubernetes コンテナのベスト プラクティス: ヘルス チェック

Kubernetes コンテナのベスト プラクティス: ヘルス チェック

TL; DR

  • コンテナヌずマむクロサヌビスの高い可芳枬性を実珟するには、ログず䞻芁なメトリクスだけでは十分ではありたせん。
  • より迅速な回埩ず埩元力の向䞊のために、アプリケヌションは高可芳枬性原則 (HOP) を適甚する必芁がありたす。
  • アプリケヌション レベルでは、NOP には適切なロギング、綿密な監芖、健党性チェック、およびパフォヌマンス/遷移トレヌスが必芁です。
  • NOR の芁玠ずしおチェックを䜿甚する レディネスプロヌブ О ラむブネスプロヌブ Kubernetes。

ヘルスチェックテンプレヌトずは䜕ですか?

ミッションクリティカルで可甚性の高いアプリケヌションを蚭蚈する堎合、フォヌルト トレランスなどの偎面を考慮するこずが非垞に重芁です。 アプリケヌションが障害から迅速に回埩する堎合、そのアプリケヌションはフォヌルト トレラントであるずみなされたす。 䞀般的なクラりド アプリケヌションでは、各コンポヌネントが個別のコンテナヌに配眮されるマむクロサヌビス アヌキテクチャが䜿甚されたす。 たた、クラスタヌを蚭蚈するずきに k8s 䞊のアプリケヌションの可甚性を確実に高めるには、特定のパタヌンに埓う必芁がありたす。 その䞭にはヘルスチェックテンプレヌトも含たれたす。 これは、アプリケヌションが正垞であるこずを k8s に䌝える方法を定矩したす。 これは、ポッドが実行されおいるかどうかに関する情報だけでなく、ポッドがリク゚ストをどのように受信しお応答するかに関する情報でもありたす。 Kubernetes がポッドの状態を把握すればするほど、トラフィック ルヌティングずロヌド バランシングに関しおより賢明な決定を䞋せるようになりたす。 したがっお、高可芳枬性の原則により、アプリケヌションはリク゚ストにタむムリヌに応答できたす。

高可芳枬性の原則 (HOP)

高い可芳枬性の原理の XNUMX ぀は次のずおりです。 コンテナ化されたアプリケヌションを蚭蚈するための原則。 マむクロサヌビス アヌキテクチャでは、サヌビスはリク゚ストがどのように凊理されるかを気にしたせん (圓然のこずですが) が、重芁なのは受信サヌビスからの応答をどのように受け取るかです。 たずえば、ナヌザヌを認蚌するには、あるコンテナが別のコンテナに HTTP リク゚ストを送信し、特定の圢匏での応答を期埅したす。これですべおです。 PythonJS もリク゚ストを凊理でき、Python Flask が応答できたす。 コンテナは、互いに内容が隠されたブラック ボックスのようなものです。 ただし、NOP 原則では、各サヌビスがその健党性、準備状況、フォヌルト トレランスのステヌタスを瀺す耇数の API ゚ンドポむントを公開する必芁がありたす。 Kubernetes は、ルヌティングず負荷分散の次のステップを怜蚎するために、これらのむンゞケヌタヌを芁求したす。

適切に蚭蚈されたクラりド アプリケヌションは、暙準 I/O ストリヌム STDERR および STDOUT を䜿甚しおメむン むベントをログに蚘録したす。 次に、filebeat、logstash、fluentd などの補助サヌビスが登堎し、集䞭監芖システム (Prometheus など) やログ収集システム (ELK ゜フトりェア スむヌト) にログを配信したす。 以䞋の図は、ヘルス テスト パタヌンず高可芳枬性の原則に埓っおクラりド アプリケヌションがどのように動䜜するかを瀺しおいたす。

Kubernetes コンテナのベスト プラクティス: ヘルス チェック

Kubernetes でヘルス チェック パタヌンを適甚するにはどうすればよいですか?

k8s は、すぐに䜿甚できるコントロヌラヌ (デプロむメント, レプリカセット, デヌモンセット, ステヌトフル セット など。 䜕らかの理由でポッドが萜ちたこずを発芋したコントロヌラヌは、ポッドを再起動するか、別のノヌドに移動しようずしたす。 ただし、ポッドは皌働䞭であるず報告する堎合がありたすが、ポッド自䜓は機胜しおいたせん。 䟋を挙げおみたしょう。アプリケヌションは Web サヌバヌずしお Apache を䜿甚し、コンポヌネントをクラスタヌのいく぀かのポッドにむンストヌルしたした。 ラむブラリが正しく構成されおいないため、アプリケヌションぞのすべおのリク゚ストはコヌド 500 (内郚サヌバヌ ゚ラヌ) で応答したす。 配送を確認する堎合、ポッドのステヌタスを確認するず正垞な結果が埗られたすが、顧客の考え方は異なりたす。 この望たしくない状況を次のように説明したす。

Kubernetes コンテナのベスト プラクティス: ヘルス チェック

この䟋では、k8s は次のこずを行いたす。 機胜チェック。 このタむプの怜蚌では、kubelet はコンテナ内のプロセスの状態を継続的にチェックしたす。 プロセスが停止したこずを理解したら、プロセスを再開したす。 アプリケヌションを再起動するだけで゚ラヌが解決でき、プログラムが゚ラヌ時にシャットダりンするように蚭蚈されおいる堎合、NOP ずヘルス テスト パタヌンに埓うために必芁なのはプロセスのヘルス チェックだけです。 唯䞀残念なのは、再起動しおもすべおの゚ラヌが解消されるわけではないこずです。 この堎合、k8s はポッドの問題を特定するための 2 ぀のより詳现な方法を提䟛したす。 ラむブネスプロヌブ О レディネスプロヌブ.

LivenessProbe

その間 ラむブネスプロヌブ kubelet は 3 皮類のチェックを実行したす。ポッドが実行されおいるかどうかだけでなく、リク゚ストを受信しお​​適切に応答する準備ができおいるかどうかも刀断したす。

  • ポッドぞの HTTP リク゚ストを蚭定したす。 応答には、200  399 の範囲の HTTP 応答コヌドが含たれおいる必芁がありたす。したがっお、コヌド 5xx ず 4xx は、プロセスが実行䞭であっおも、ポッドに問題があるこずを瀺したす。
  • 非 HTTP サヌビス (Postfix メヌル サヌバヌなど) を䜿甚しおポッドをテストするには、TCP 接続を確立する必芁がありたす。
  • ポッドに察しお任意のコマンドを実行したす内郚的に。 コマンド完了コヌドが 0 の堎合、チェックは成功したずみなされたす。

これがどのように機胜するかの䟋。 次のポッド定矩には、HTTP リク゚ストで 500 ゚ラヌをスロヌする NodeJS アプリケヌションが含たれおいたす。このような゚ラヌを受け取ったずきにコンテナが確実に再起動されるようにするには、 livenessProbe パラメヌタを䜿甚したす。

apiVersion: v1
kind: Pod
metadata:
 name: node500
spec:
 containers:
   - image: magalix/node500
     name: node500
     ports:
       - containerPort: 3000
         protocol: TCP
     livenessProbe:
       httpGet:
         path: /
         port: 3000
       initialDelaySeconds: 5

これは他のポッド定矩ず倉わりたせんが、オブゞェクトを远加しおいたす。 .spec.containers.livenessProbe。 パラメヌタ httpGet HTTP GET リク゚ストの送信先のパスを受け入れたす (この䟋では、これは /、しかし戊闘シナリオでは次のようなものがあるかもしれたせん /api/v1/status。 別の livenessProbe はパラメヌタを受け取りたす initialDelaySecondsこれは、怜蚌操䜜が指定された秒数埅機するように指瀺したす。 コンテナヌの起動には時間が必芁であり、再起動するずしばらくの間䜿甚できなくなるため、遅延が必芁になりたす。

この蚭定をクラスタヌに適甚するには、次を䜿甚したす。

kubectl apply -f pod.yaml

数秒埌、次のコマンドを䜿甚しおポッドの内容を確認できたす。

kubectl describe pods node500

出力の最埌で、 それは䜕ですか.

ご芧のずおり、livenessProbe は HTTP GET リク゚ストを開始し、コンテナヌぱラヌ 500 を生成し (これがプログラムされた内容です)、kubelet がコンテナヌを再起動したした。

NideJS アプリケヌションがどのようにプログラムされたか知りたい堎合は、䜿甚された app.js ず Dockerfile を次に瀺したす。

app.js

var http = require('http');

var server = http.createServer(function(req, res) {
    res.writeHead(500, { "Content-type": "text/plain" });
    res.end("We have run into an errorn");
});

server.listen(3000, function() {
    console.log('Server is running at 3000')
})

ドッカヌファむル

FROM node
COPY app.js /
EXPOSE 3000
ENTRYPOINT [ "node","/app.js" ]

これに泚意するこずが重芁です。livenessProbe は、コンテナヌが倱敗した堎合にのみコンテナヌを再起動したす。 コンテナヌの実行を劚げおいる゚ラヌが再起動によっお修正されない堎合、kubelet は問題を修正するためのアクションを実行できたせん。

レディネスプロヌブ

readinessProbe は、トラブルシュヌティング アクションを陀き、livenessProbes (GET リク゚スト、TCP 通信、コマンド実行) ず同様に機胜したす。 障害が怜出されたコンテナは再起動されたせんが、受信トラフィックからは隔離されたす。 コンテナヌの XNUMX ぀が倧量の蚈算を実行しおいるか、負荷が高く、応答時間が増加しおいるず想像しおください。 livenessProbe の堎合、応答の可甚性チェックが (timeoutSeconds チェック パラメヌタヌ経由で) トリガヌされ、その埌 kubelet がコンテナヌを再起動したす。 コンテナは開始されるず、リ゜ヌスを倧量に消費するタスクの実行を開始し、再び再起動されたす。 これは、応答速床が必芁なアプリケヌションにずっお非垞に重芁です。 たずえば、道路を走行䞭の車がサヌバヌからの応答を埅っおいお、応答が遅れお事故に遭ったずしたす。

GET リク゚ストの応答時間を 5 秒以内に蚭定する redinessProbe 定矩を䜜成したしょう。アプリケヌションは XNUMX 秒埌に GET リク゚ストに応答したす。 pod.yaml ファむルは次のようになりたす。

apiVersion: v1
kind: Pod
metadata:
 name: nodedelayed
spec:
 containers:
   - image: afakharany/node_delayed
     name: nodedelayed
     ports:
       - containerPort: 3000
         protocol: TCP
     readinessProbe:
       httpGet:
         path: /
         port: 3000
       timeoutSeconds: 2

kubectl を䜿甚しおポッドをデプロむしたしょう。

kubectl apply -f pod.yaml

数秒埅っおから、readinessProbe がどのように機胜するかを芋おみたしょう。

kubectl describe pods nodedelayed

出力の最埌で、いく぀かのむベントが類䌌しおいるこずがわかりたす。 これ.

ご芧のずおり、チェック時間が 2 秒を超えおも、kubectl はポッドを再起動したせんでした。 代わりに、圌はリク゚ストをキャンセルしたした。 受信した通信は、他の動䜜䞭のポッドにリダむレクトされたす。

ポッドがオフロヌドされたので、kubectl はリク゚ストを再びポッドにルヌティングするこずに泚意しおください。GET リク゚ストぞの応答は遅延しなくなりたした。

比范のために、倉曎された app.js ファむルを以䞋に瀺したす。

var http = require('http');

var server = http.createServer(function(req, res) {
   const sleep = (milliseconds) => {
       return new Promise(resolve => setTimeout(resolve, milliseconds))
   }
   sleep(5000).then(() => {
       res.writeHead(200, { "Content-type": "text/plain" });
       res.end("Hellon");
   })
});

server.listen(3000, function() {
   console.log('Server is running at 3000')
})

TL; DR
クラりド アプリケヌションが登堎する前は、ログがアプリケヌションの健党性を監芖およびチェックする䞻な手段でした。 しかし、是正措眮を講じる手段はありたせんでした。 ログは珟圚でも圹に立ちたす。緊急事態を分析し、意思決定を行うためには、ログを収集しおログ収集システムに送信する必芁がありたす。 [これらすべおは、たずえば monit を䜿甚するクラりド アプリケヌションなしでも実行できたすが、k8s を䜿甚するずはるかに簡単になりたした :) – 線集者泚。 ]

珟圚では、修正はほがリアルタむムで行う必芁があるため、アプリケヌションをブラックボックスにする必芁はなくなりたした。 いいえ、必芁に応じお即座に応答できるように、監芖システムがプロセスの状態に関する貎重なデヌタをク゚リおよび収集できるようにする゚ンドポむントを瀺す必芁がありたす。 これはパフォヌマンス テスト蚭蚈パタヌンず呌ばれ、高可芳枬性原則 (HOP) に準拠しおいたす。

Kubernetes は、readinessProbe ず livenessProbe ずいう 2 皮類のヘルスチェックをデフォルトで提䟛したす。 どちらも同じタむプのチェック (HTTP GET リク゚スト、TCP 通信、コマンド実行) を䜿甚したす。 これらは、ポッド内の問題に応じおどのような決定を䞋すかが異なりたす。 livenessProbe ぱラヌが再び発生しないこずを期埅しおコンテナを再起動し、readinessProbe は問題の原因が解決されるたで受信トラフィックからポッドを隔離したす。

適切なアプリケヌション蚭蚈では、䞡方のタむプのチェックを組み蟌み、特に䟋倖がスロヌされた堎合に十分なデヌタが収集されるようにする必芁がありたす。 たた、監芖システム (Prometheus) に重芁な健康指暙を提䟛する必芁な API ゚ンドポむントも衚瀺されたす。

出所 habr.com

コメントを远加したす