この記事では、Azure Kubernetes Service (AKS) クラスターで CoreDNS 自動スケールを構成およびカスタマイズする方法について説明します。
CoreDNS のポッドの水平スケーリングを構成する
AKS のエラスティックな性質により、クラスター内の DNS トラフィックが急激に急増するのが一般的です。 これらの増加により、CoreDNS ポッドによるメモリ消費量が増加する可能性があります。 場合によっては、メモリ消費量が増加すると、 Out of memory の問題が発生する可能性があります。
この問題を回避するために、AKS クラスターは CoreDNS ポッドを自動スケーリングして、ポッドあたりのメモリ使用量を減らします。 この自動スケール ロジックの既定の設定は、 coredns-autoscaler ConfigMap に格納されます。 ただし、CoreDNS ポッドの既定の自動スケールが、CoreDNS ポッドの Out of memory の問題を防ぐのに十分なアグレッシブであるとは限らない場合があります。 この場合は、coredns-autoscalerConfigMap を直接変更できます。
Out of memoryの問題の根本原因に対処せずに CoreDNS ポッドの数を増やすだけで、一時的な修正しか提供しない可能性があることに注意してください。 CoreDNS ポッドが実行されているノード全体で十分なメモリが使用できない場合、CoreDNS ポッドの数を増やすことは役に立ちません。 リソース使用量の最適化、リソース要求と制限の調整、ノードへのメモリの追加など、適切なソリューションをさらに調査して実装することが必要になる場合があります。
CoreDNS では、ポッドの自動スケーリングに 水平クラスタープロポーショナル オートスケーラー が使用されます。
coredns-autoscalerを編集して、CoreDNS ポッドの数のスケーリング ロジックを構成できます。
coredns-autoscaler ConfigMap では現在、2 つの異なる ConfigMap キー値 (linear と ladder) がサポートされています。これは、サポートされている 2 つの制御モードに対応します。
-
linearコントローラーは、max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) )と同じ [最小値,最大値] の範囲で多数のレプリカを生成します。 -
ladderコントローラーは、コア スケーリング用とノード スケーリング用の 2 つの異なるステップの関数を参照してレプリカの数を計算し、2 つのレプリカ値の最大値を生成します。
コントロール モードと ConfigMap 形式の詳細については、アップストリームのドキュメントを 参照してください。
Important
クラスターごとに少なくとも 2 つの CoreDNS ポッド レプリカを使用することをお勧めします。
現在の coredns-autoscaler ConfigMap を表示する
coredns-autoscalerコマンドを使用して、現在のkubectl get configmapsConfigMap を取得します。kubectl get configmap coredns-autoscaler --namespace kube-system --output yaml出力は、次の出力例のようになります。
apiVersion: v1 data: ladder: '{"coresToReplicas":[[1,2],[512,3],[1024,4],[2048,5]],"nodesToReplicas":[[1,2],[8,3],[16,4],[32,5]]}' kind: ConfigMap metadata: name: coredns-autoscaler namespace: kube-system resourceVersion: "..." creationTimestamp: "..."
注
提供される構成は、潜在的な開始点として機能しますが、特定のクラスター要件と DNS トラフィック パターンに基づいて値をカスタマイズする必要があります。 環境に適した数のレプリカを決定する方法の 1 つは、線形スケーリングの数式を使用することです。 replicas = max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ) 、クラスター内のコア/ノード数に基づいてレプリカ数を決定します。
CoreDNS 垂直ポッドの自動スケール動作
CoreDNS では、CoreDNS ポッドの再起動プロセス中にサービスが使用できなくなるのを防ぐために 、アドオンの自動スケール機能を 有効にするときに、元に指定されたリソース要求/制限が使用されます。
次の表は、AKS CoreDNS アドオンの既定の要求/制限と要求対制限の比率の概要を示しています。
| Resource | 要求/制限 | 要求対制限率 |
|---|---|---|
| CPU | 100 m / 3 cores |
約 1:30 |
| 記憶 | 70 Mi / 500 Mi |
約 1:7 |
推奨される CPU 要求が 500 m の場合、VPA はこの比率を維持するために CPU 制限を 15 に調整します。 同様に、推奨されるメモリ要求が 700 Mi の場合、VPA はメモリ制限を 5,000 Mi に調整します。
VPA は、VPA 推奨 CPU/メモリ要求と AKS 定義の要求対制限比に基づいて、CoreDNS CPU とメモリの制限を大きな値に設定します。 これらの調整は、サービスのピーク時に複数の要求を処理する場合に役立ちます。 欠点は、コアDNSがサービス時間のピーク時にノード上のすべての CPU およびメモリ利用可能なリソースを消費する可能性があるということです。
大規模クラスターと小規模クラスターの両方の要件を同時に満たすために、単一の理想的な CPU とメモリの要求/制限値を設定することは困難です。 最適化されたアドオン スケーリングを有効にすると、CoreDNS の CPU とメモリの要求/制限をカスタマイズしたり、VPA を使用して特定のクラスター要件を満たすために CoreDNS を自動スケールしたりできます。 リソース構成をカスタマイズするか、VPA を使用するかを決定するときは、次のシナリオに留意してください。
- VPA が CoreDNS サービスに適していて、VPA の推奨事項のみを表示するかどうかを検討しています。 VPA でポッドを自動的に更新しない場合は、オーバーライド VPA 更新モードを オフ にすることで、CoreDNS の VPA を無効にすることができます。 [デプロイ] でリソース構成をカスタマイズ して、CPU/メモリ要求/制限を好みの値に設定します。
- VPA の使用を検討していますが、VPA が CPU とメモリの制限を一度に大きな値にバンプしないように、要求対制限の比率を制限する必要があります。 デプロイのリソースをカスタマイズし、CPU とメモリの要求/制限の値を更新して、要求対制限の比率を 1:2 または 1:3 に維持できます。
- VPA コンテナー ポリシーで maxAllowed CPU とメモリが設定されている場合、推奨されるリソース要求はこれらの制限を超えません。 リソース構成をカスタマイズすると、maxAllowed 値を増減し、VPA の推奨事項を制御できます。
詳細については、「 AKS クラスターでアドオンの自動スケールを有効にする (プレビュー)」を参照してください。
次のステップ
CoreDNS の問題のトラブルシューティング方法については、「 Azure Kubernetes Service (AKS) での CoreDNS に関する問題のトラブルシューティング」を参照してください。
Azure Kubernetes Service