フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

GKEで使えるCloudDNSについてちょっと考えてみた

f:id:lirlia:20210616151230p:plain

Integrating Cloud DNS with GKE | Google Cloud Blog

課題

GKEないしはk8sではDNSクエリがとんでもない数発生する。というのもPod間の通信はドメイン名で行われるので、その解決に都度クエリが発生するからだ。

その他にもServiceアクセス、ServiceMesh…など、スケーラブルで高可用なシステムを維持するにはFQDNは欠かせない。

k8sはcoreDNSをというPodがこれらを一手に引き受けているが、coreDNSが負荷上がりすぎてk8sクラスタが事故るケースもよく聞く。

コロプラなどの大規模クラスタを運用しているところはNode Local DNS Cacheを各Nodeに入れることでレイテンシ減少とBlastRadiusを小さくしている。

『ドラゴンクエストウォーク』で、Kubernetesのマルチクラスター構成を採用した経緯|コロプラベアーズ

CloudDNSが解決すること

f:id:lirlia:20210616150502p:plain

  1. Node(Pod)からリンクローカルアドレス経由でDNSが利用可能なため、Node Local DNS CacheやCoreDNSが不要 (管理Pod減らせる)
  2. DNSは複数クラスタで同時に使えるので異なるクラスタのFQDNを共有可能
    • GKEサービスのためのマルチリージョンのクロスクラスターサービスディスカバリ

価格

  • マネージド ゾーン 料金
    • 25 ゾーンまで マネージド ゾーンあたり $0.20/月
    • 26~1 万ゾーン マネージド ゾーンあたり $0.10/月
    • 1 万ゾーン超 マネージド ゾーンあたり $0.03/月
  • トラフィック 料金
    • 10 億件まで 100 万件のクエリごとに $0.40/月
    • 10 億件超 100 万件のクエリごとに $0.20/月

Cloud DNS  |  Google Cloud

トラフィックがどれぐらいあるのか次第だけど10億でも月2万なので安い。Podのリソースをペイできそう。

個人的見解

DNSは複数クラスタで同時に使えるので異なるクラスタのFQDNを共有可能が非常に大きいと思っている。クラスタ間の名前解決はServiceMeshの仕組みを使うか、SubmarinerのLightHouse / skupperのようなクラスタ間接続のソフトウェアが必要だった。(もしくはLoadBalancer / Ingress利用)

クラスタ間通信をどう実現すべきか?は変わらず検討範囲だが、名前解決をクリアできたのは大きい。(使ってみないとわからないけど、流石にClusterIPしかないSeviceの名前解決ができてもクラスタ外からアクセスできないよね…?それともなんかGCPのスーパーネットワーク的な仕組みでうまいことNATとかすんのかな? / ExternalIPとかうまく使えるなら)

公式サイトを見るとこれしかないのでうーん。NodePortなのかなあ。

  • ClusterIP(デフォルト)
  • NodePort
  • LoadBalancer
  • ExternalName
  • Headless

クラスタごとに同じNamespace / Serviceを使うとレコードがかぶる恐れがあるのでうまく設計する必要がある。

->VPCスコープDNSを見るとクラスタごとに一意のドメイン発行するらしい。

あとはcoreDNSで見れるメトリクスやログに比べてCloudDNSがどの程度充実しているのか?とか、安定性はどんなもんじゃい?っていうところがクリアできれば積極的に使っていきたい。

EKSもコンセプト同じこと外から見るとすぐできる気がするので、是非取り込んでもらいたいです!!!