ヘルスチェックと本番環境のチューニング
コンテナでHEALTHCHECK、tini、シグナル処理を使います。
「ヘルスチェックと本番環境のチューニング」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
ヘルスチェックエンドポイント
ヘルスチェックエンドポイントを使用すると、ロードバランサーやオーケストレーターがサービスの稼働状態とトラフィックを処理できる状態を確認できます。一般的な種類は、ライブネス(稼働しているか)とレディネス(リクエストを処理できるか)の 2 つです。
ライブネスエンドポイント
プロセスが稼働していれば 200 OK を返します。プロセスが起動していることだけで十分な、常に成功する単純なハンドラーです。
mux.HandleFunc("/healthz/live", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
})レディネスエンドポイント
サービスの準備が完了した場合(DB への接続、キャッシュのウォームアップ、マイグレーションの完了など)にだけ 200 を返します。起動中または状態が劣化している場合は 503 を返します。
mux.HandleFunc("/healthz/ready", func(w http.ResponseWriter, r *http.Request) {
if err := db.PingContext(r.Context()); err != nil {
w.WriteHeader(http.StatusServiceUnavailable); return
}
w.WriteHeader(http.StatusOK)
})Kubernetes のプローブ
Kubernetes の Deployment 仕様で、ライブネスプローブとレディネスプローブを設定します。
livenessProbe:
httpGet: { path: /healthz/live, port: 8080 }
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet: { path: /healthz/ready, port: 8080 }
initialDelaySeconds: 3
periodSeconds: 5GOMAXPROCS の調整
コンテナ内では、GOMAXPROCS はコンテナの CPU 制限ではなくホストの CPU 数をデフォルト値として使用します。go.uber.org/automaxprocsを使用すると、cgroup の制限に基づいて正しく設定できます。
import _ "go.uber.org/automaxprocs"メモリ制限
GOMEMLIMIT(Go 1.19 以降)をコンテナのメモリ制限に設定すると、OOM キラーが作動する前に GC がより積極的にメモリを使用できるようになります。
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024) // 512 MiBGC の調整
GOGC を設定して GC の頻度を制御します。デフォルト値は 100 で、ヒープが 2 倍になると GC が実行されます。値を下げると、GC の頻度が増える代わりにメモリ使用量が減ります。値を上げると、メモリ使用量が増える代わりに GC の頻度が減ります。
os.Setenv("GOGC", "200") // allow heap to grow 2× before GCコネクションプールの調整
コンテナのリソース制限と、データベースの max_connections に適したデータベース接続プールの上限を設定します。
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(5 * time.Minute)メトリクスの公開
Prometheus のメトリクスは、メインの API ポートとは別のポートで公開し、内部データが外部クライアントに漏洩するのを防ぎます。
go func() {
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":9090", nil)
}()Kubernetes でのグレースフルシャットダウン
シャットダウンのタイムアウトに十分な時間を確保できるよう、Pod 仕様でterminationGracePeriodSecondsを設定します。SIGTERM を受信したら、レディネスプローブから直ちに 503 を返します。
本番環境でのプロファイリング
pprof は認証付きの非公開ポートで有効にします。内部状態が露出し、サービスへの DoS 攻撃に悪用される可能性があるため、決して公開しないでください。
クイックチェック
GOMAXPROCS をホストの CPU 数ではなく、コンテナの CPU 制限に基づいて設定する必要があるのはなぜですか。
まとめ:ヘルスチェックと本番環境の調整
要点:
- ライブネスはプロセスの稼働状態、レディネスはサービスがトラフィックを処理できる状態を示します
- automaxprocs はコンテナの CPU 制限に基づいて GOMAXPROCS を設定します
- GOMEMLIMIT は OOM による強制終了を防ぎ、GOGC は GC の頻度を調整します
- メトリクスは内部専用の別ポートで公開します
よくある質問
「ヘルスチェックと本番環境のチューニング」レッスンは無料ですか?
はい。「ヘルスチェックと本番環境のチューニング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「ヘルスチェックと本番環境のチューニング」で何を学びますか?
コンテナでHEALTHCHECK、tini、シグナル処理を使います。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ヘルスチェックと本番環境のチューニング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Go向けマルチステージDockerビルド
- 環境設定とシークレット
- ローカル開発のためのDocker Compose
- ヘルスチェックと本番環境のチューニング