説明
このプラグインは、変更されたCorefileの自動リロードを可能にします。ゾーンファイルの変更を自動的にリロードできるようにするには、auto
プラグインを使用してください。
このプラグインは、Corefile を読み込み、その SHA512 チェックサムを計算することで、Corefile が変更されたかどうかを定期的に確認します。ファイルが変更された場合、新しい Corefile で CoreDNS をリロードします。これにより、Corefile の変更後に SIGHUP または SIGUSR1 を送信する必要がなくなります。
リロードはグレースフルに行われます。リロードが発生しても、サービスの損失は発生しないはずです。新しい Corefile にエラーがあっても、CoreDNS は古い設定で実行を続け、エラーメッセージがログに出力されます。ただし、失敗モードについては「バグ」セクションを参照してください。
一部の環境 (例: Kubernetes) では、ほぼ同時に起動し、共通の Corefile を共有する CoreDNS インスタンスが多数存在する場合があります。これらがすべて同時にリロードされるのを防ぐために、リロードチェックの間隔に多少のジッターが追加されます。これは、複数の CoreDNS インスタンスの視点からのジッターです。各インスタンスは依然として定期的な間隔でチェックしますが、これらのインスタンスのリロードはすべてジッター期間に分散されます。リロードがグレースフルであることを考えると、これは厳密には必要ではなく、ジッターを 0s
に設定することで無効にできます。
ジッターは、Corefile がリロードされるたびに再計算されます。
このプラグインは、サーバーブロックごとに一度しか使用できません。
構文
reload [INTERVAL] [JITTER]
このプラグインは、INTERVAL ごとに変更をチェックします。これは、+/- の JITTER 時間の範囲内です。
- INTERVAL および JITTER は、Golang durationsです。デフォルトの INTERVAL は 30 秒、デフォルトの JITTER は 15 秒、INTERVAL の最小値は 2 秒、JITTER の最小値は 1 秒です。JITTER が INTERVAL の半分より大きい場合は、INTERVAL の半分に設定されます。
例
デフォルトの間隔でチェック
. {
reload
erratic
}
10秒ごとにチェック(この場合、ジッターは自動的に 10 / 2 = 5 に設定されます)
. {
reload 10s
erratic
}
バグ
リロードはデータの損失なしに発生しますが(つまり、DNS クエリは流れ続けます)、リロードが失敗し、機能が失われるコーナーケースがあります。次の Corefile を考えてみましょう
. {
health :8080
whoami
}
CoreDNS が起動し、:8080 からヘルスを提供します。ここで、:8080
を :443
に変更しますが、そのポートで別のプロセスが既にリッスンしていることに気づいていません。プロセスがリロードされ、次の手順が実行されます
- 8080 のリスナーを閉じます
- リロードして設定を再度解析します
- 443 で新しいリスナーの起動に失敗します
- 新しい Corefile のロードに失敗し、中止して古いプロセスを使い続けます
リロードの中止後、古いプロセスが実行されたままになりますが、ステップ 1 でリスナーが閉じられているため、ヘルスエンドポイントが壊れています。同じことが、prometheus プラグインでも発生する可能性があります。
一般的に、新しいポートを割り当て、リロードが完全に機能することを期待する場合は注意が必要です。
CoreDNS v1.6.0 以前では、import
ステートメントはこのプラグインによって検出されません。つまり、これらのインポートされたファイルのいずれかが変更された場合、reload プラグインはその事実を知りません。CoreDNS v1.7.0 以降は Corefile を解析し、インポートされたファイルの変更の検出をサポートします。
メトリクス
モニタリングが有効になっている場合(prometheusプラグイン経由)、次のメトリクスがエクスポートされます
coredns_reload_failed_total{}
- 失敗したリロード試行回数をカウントします。coredns_reload_version_info{hash, value}
- リロード中のハッシュ値を記録します。
現在、hash
のタイプは “sha512” であり、value
は返されたハッシュ値です。
参考資料
coredns-import(7) および corefile(5) を参照してください。