ヘルス プローブの構成
概要
ヘルス プローブ をアプリケーションに実装することは、Kubernetes がいくつかのタスクを自動化して改善する優れた方法です。 エラーが発生した場合の可用性。
osm-edge はアプリケーション Pod を再構成して、プロキシ サイドカーを介してすべての受信および送信ネットワーク トラフィックをリダイレクトするため、kubelet によって呼び出される「httpGet」および「tcpSocket」ヘルス プローブは、プロキシに必要な mTLS コンテキストがないために失敗します。
「httpGet」ヘルス プローブがメッシュ内から期待どおりに機能し続けるために、osm-edge は、プロキシを介してプローブ エンドポイントを公開するための構成を追加し、プロキシに公開されたエンドポイントを参照するように新しい Pod のプローブ定義を書き換えます。 元のプローブのすべての機能が引き続き使用されます。osm-edge は、kubelet がプローブと通信できるように、単にプロキシを前面に配置します。
メッシュで「tcpSocket」ヘルス プローブをサポートするには、特別な構成が必要です。 osm-edge はすべてのネットワーク トラフィックを Pipy 経由でリダイレクトするため、Pod ではすべてのポートが開いているように見えます。 これにより、Pipy サイドカーが挿入された Pod にルーティングされたすべての TCP 接続が成功したように見えます。 「tcpSocket」ヘルス プローブがメッシュで期待どおりに機能するように、osm-edge はプローブを「httpGet」プローブに書き換え、「osm-healthcheck」公開エンドポイントで Pipy プロキシをバイパスする「iptables」コマンドを追加します。 「osm-healthcheck」コンテナーが Pod に追加され、kubelet からの HTTP ヘルス プローブ リクエストを処理します。 ハンドラーは、リクエストの「Original-Tcp-port」ヘッダーから元の TCP ポートを取得し、指定されたポートでソケットを開こうとします。 TCP 接続が成功したかどうかは、httpGet
プローブの応答ステータス コードに反映されます。
調査 | 道 | ポート |
---|---|---|
活気 | /osm-liveness-probe | 15901 |
準備 | /osm-readiness-probe | 15902 |
起動 | /osm-startup-probe | 15903 |
健康診断 | /osm-healthcheck | 15904 |
HTTP および「tcpSocket」プローブの場合、ポートとパスが変更されます。 HTTPS プローブの場合、ポートは変更されますが、パスは変更されません。
定義済みの「httpGet」および「tcpSocket」プローブのみが変更されます。 プローブが定義されていない場合、プローブはその場所に追加されません。 exec
プローブ (grpc_health_probe
を使用するものを含む) は決して変更されず、コマンドが localhost
外部のネットワーク アクセスを必要としない限り、期待どおりに機能し続けます。
例
次の例は、osm-edge がメッシュ内の Pod のヘルス プローブを処理する方法を示しています。
HTTP
次の livenessProbe
を使用してコンテナーを定義する Pod 仕様を検討してください。
livenessProbe:
httpGet:
path: /liveness
port: 14001
scheme: HTTP
Pod が作成されると、osm-edge はプローブを次のように変更します。
livenessProbe:
httpGet:
path: /osm-liveness-probe
port: 15901
scheme: HTTP
Pod のプロキシには、次の Pipy 構成が含まれます。
元のプローブ ポート 14001 にマップされる Pipy クラスター:
{
"Probes": {
"ReadinessProbes": null,
"LivenessProbes": [
{
"httpGet": {
"path": "/osm-liveness-probe",
"port": 15901,
"scheme": "HTTP"
},
"timeoutSeconds": 1,
"periodSeconds": 10,
"successThreshold": 1,
"failureThreshold": 3
}
],
"StartupProbes": null
}
}
}
上記のクラスターにマッピングされたポート 15901 の /osm-liveness-probe
にある新しいプロキシ公開 HTTP エンドポイントのリスナー:
.listen(probeScheme ? 15901 : 0)
.link(
'http_liveness', () => probeScheme === 'HTTP',
'connection_liveness', () => Boolean(probeTarget),
'deny_liveness'
)
tcpソケット
次の livenessProbe
を使用してコンテナーを定義する Pod 仕様を検討してください。
livenessProbe:
tcpSocket:
port: 14001
Pod が作成されると、osm-edge はプローブを次のように変更します。
livenessProbe:
httpGet:
httpHeaders:
- name: Original-Tcp-Port
value: "14001"
path: /osm-healthcheck
port: 15904
scheme: HTTP
ポート 15904 へのリクエストは、Pipy プロキシをバイパスし、「osm-healthcheck」エンドポイントに転送されます。
メッシュ内のポッドの健全性を確認する方法
Kubernetes は、起動、活性、および準備プローブで構成された Pod の正常性エンドポイントを自動的にポーリングします。
起動プローブが失敗すると、Kubernetes はイベントを生成し (「kubectl describe pod kubectl describe
の出力は次のようになります。
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 17s default-scheduler Successfully assigned bookstore/bookstore-v1-699c79b9dc-5g8zn to osm-control-plane
Normal Pulled 16s kubelet Successfully pulled image "openservicemesh/init:v0.8.0" in 26.5835ms
Normal Created 16s kubelet Created container osm-init
Normal Started 16s kubelet Started container osm-init
Normal Pulling 16s kubelet Pulling image "openservicemesh/init:v0.8.0"
Normal Pulling 15s kubelet Pulling image "flomesh/pipy:0.5.0"
Normal Pulling 15s kubelet Pulling image "openservicemesh/bookstore:v0.8.0"
Normal Pulled 15s kubelet Successfully pulled image "openservicemesh/bookstore:v0.8.0" in 319.9863ms
Normal Started 15s kubelet Started container bookstore-v1
Normal Created 15s kubelet Created container bookstore-v1
Normal Pulled 14s kubelet Successfully pulled image "flomesh/pipy:0.5.0" in 755.2666ms
Normal Created 14s kubelet Created container pipy
Normal Started 14s kubelet Started container pipy
Warning Unhealthy 13s kubelet Startup probe failed: Get "http://10.244.0.23:15903/osm-startup-probe": dial tcp 10.244.0.23:15903: connect: connection refused
Warning Unhealthy 3s (x2 over 8s) kubelet Startup probe failed: HTTP probe failed with statuscode: 503
liveness プローブが失敗すると、Kubernetes はイベントを生成し (「kubectl describe pod kubectl describe
の出力は次のようになります。
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 59s default-scheduler Successfully assigned bookstore/bookstore-v1-746977967c-jqjt4 to osm-control-plane
Normal Pulling 58s kubelet Pulling image "openservicemesh/init:v0.8.0"
Normal Created 58s kubelet Created container osm-init
Normal Started 58s kubelet Started container osm-init
Normal Pulled 58s kubelet Successfully pulled image "openservicemesh/init:v0.8.0" in 23.415ms
Normal Pulled 57s kubelet Successfully pulled image "flomesh/pipy:0.5.0" in 678.1391ms
Normal Pulled 57s kubelet Successfully pulled image "openservicemesh/bookstore:v0.8.0" in 230.3681ms
Normal Created 57s kubelet Created container pipy
Normal Pulling 57s kubelet Pulling image "flomesh/pipy:0.5.0"
Normal Started 56s kubelet Started container pipy
Normal Pulled 44s kubelet Successfully pulled image "openservicemesh/bookstore:v0.8.0" in 20.6731ms
Normal Created 44s (x2 over 57s) kubelet Created container bookstore-v1
Normal Started 43s (x2 over 57s) kubelet Started container bookstore-v1
Normal Pulling 32s (x3 over 58s) kubelet Pulling image "openservicemesh/bookstore:v0.8.0"
Warning Unhealthy 32s (x6 over 50s) kubelet Liveness probe failed: HTTP probe failed with statuscode: 503
Normal Killing 32s (x2 over 44s) kubelet Container bookstore-v1 failed liveness probe, will be restarted
readiness プローブが失敗すると、Kubernetes はイベント (「kubectl describe pod
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 32s default-scheduler Successfully assigned bookstore/bookstore-v1-5848999cb6-hp6qg to osm-control-plane
Normal Pulling 31s kubelet Pulling image "openservicemesh/init:v0.8.0"
Normal Pulled 31s kubelet Successfully pulled image "openservicemesh/init:v0.8.0" in 19.8726ms
Normal Created 31s kubelet Created container osm-init
Normal Started 31s kubelet Started container osm-init
Normal Created 30s kubelet Created container bookstore-v1
Normal Pulled 30s kubelet Successfully pulled image "openservicemesh/bookstore:v0.8.0" in 314.3628ms
Normal Pulling 30s kubelet Pulling image "openservicemesh/bookstore:v0.8.0"
Normal Started 30s kubelet Started container bookstore-v1
Normal Pulling 30s kubelet Pulling image "flomesh/pipy:0.5.0"
Normal Pulled 29s kubelet Successfully pulled image "flomesh/pipy:0.5.0" in 739.3931ms
Normal Created 29s kubelet Created container pipy
Normal Started 29s kubelet Started container pipy
Warning Unhealthy 0s (x3 over 20s) kubelet Readiness probe failed: HTTP probe failed with statuscode: 503
Pod の status
は、kubectl get pod
出力に表示される準備ができていないことも示します。 例えば:
NAME READY STATUS RESTARTS AGE
bookstore-v1-5848999cb6-hp6qg 1/2 Running 0 85s
Pod のヘルス プローブは、Pod の必要なポートを転送し、「curl」またはその他の HTTP クライアントを使用してリクエストを発行することにより、手動で呼び出すこともできます。 たとえば、bookstore-v1 デモ Pod の liveness プローブを確認するには、ポート 15901 を転送します。
kubectl port-forward -n bookstore deployment/bookstore-v1 15901
次に、別の端末インスタンスで、「curl」を使用してエンドポイントを確認できます。 次の例は、健全な bookstore-v1 を示しています。
$ curl -i localhost:15901/osm-liveness-probe
HTTP/1.1 200 OK
date: Wed, 31 Mar 2021 16:00:01 GMT
content-length: 1396
content-type: text/html; charset=utf-8
x-pipy-upstream-service-time: 1
server: pipy
<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="en">
...
</html>
既知の問題点
トラブルシューティング
いずれかの正常性プローブが一貫して失敗する場合は、次の手順を実行して根本原因を特定します。
-
メッシュ内の Pod の「httpGet」および「tcpSocket」プローブが変更されていることを確認します。
メッシュ内で機能し続けるには、起動、活性、および準備の
httpGet
プローブを osm-edge で変更する必要があります。 liveness、readiness、および startuphttpGet
プローブ用に、ポートをそれぞれ 15901、15902、および 15903 に変更する必要があります。 HTTP (HTTPS ではない) プローブのみが、/osm-liveness-probe
、/osm-readiness-probe
、または/osm-startup-probe
に加えてパスが変更されます。
また、Pod の Pipy 構成に、変更されたエンドポイントのリスナーが含まれていることを確認します。
`tcpSocket` プローブがメッシュで機能するには、`httpGet` プローブに書き換える必要があります。 liveness、readiness、および startup プローブのために、ポートを 15904 に変更する必要があります。 パスは `/osm-healthcheck` に設定する必要があります。 HTTP ヘッダー「Original-Tcp-Port」は、「tcpSocket」プローブ定義で指定された元のポートに設定する必要があります。 また、「osm-healthcheck」コンテナーが実行されていることを確認します。 詳細については、「osm-healthcheck」ログを調べてください。
詳細については、[上記の例](#examples) を参照してください。
-
Pod のスケジューリングまたは開始中に、Kubernetes で他のエラーが発生したかどうかを確認します。
異常な Pod の「kubectl describe」で最近発生した可能性のあるエラーを探します。 エラーを解決し、Pod の正常性を再度確認します。
-
Pod で実行時エラーが発生したかどうかを確認します。
kubectl logs
でログを調べて、コンテナの起動後に発生した可能性のあるエラーを探します。 エラーを解決し、Pod の正常性を再度確認します。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.