Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

EKSのCoreDNSにおいて、名前解決が失敗する事例とその解決法について

613 views

Published on

Kubernetes Meetup #35でのLT資料です

Published in: Engineering
  • Be the first to comment

EKSのCoreDNSにおいて、名前解決が失敗する事例とその解決法について

  1. 1. EKSのCoreDNSにおいて、 名前解決が失敗する事例とその解決法について @renjikari
  2. 2. 自己紹介 @renjikari SRE@freee K8sがすき。最近全然追えてないけどDockerもだいすき 最近は大体APEXをやる日々(ドヘタ) ホントは対面してボードゲームをするのがすき
  3. 3. 注意 今回の話は全編に渡りチームで原因調査、検証、実装を行ってます Thanks for @nekottyo/@hatajoe 今回の話のもう少し詳細に書いた版をブログにアップしてます 検証とか原因に対する解決策の今回選ばなかった方法とかも載せて ます LTは五分しかないので触りだけの気持ちでonss
  4. 4. 名前解決が一部失敗する話 (数ヶ月前)EKS上で動かしているとあるサービスの名前解決が一部失 敗 hpaなどによってpodが増減し、CoreDNSの乗っているNodeが shutdownされるときに名前解決が失敗していることに気づく CoreDNSはEKSを利用するときのデフォルトで起動しているDNS Cacheサーバ(という言い方であっているか…?)であり、今回の話で もこのCoreDNSを利用しているときに起きたもの
  5. 5. CoreDNSの終了時の挙動 Podの終了時の挙動 https://qiita.com/superbrothers/items/3ac78daba3560ea406b2 CoreDNSはservice + deploymentによって宣言されているリソースで、podの終了時 には以下の1及び2が順序制御されずに行われる。 1. podにshutdown命令がだされる 2. serviceのendpointの削除命令がだされる つまり、"serviceのendpointの削除が行われる前"にpodにたどりついたdns要求には (podがshutdown中なので)corednsから応答がないということになる。
  6. 6. 原因その① CoreDNSの終了時の挙動によってDNSが失敗してしまう。gracefulに 落ちてくれてない 諸々検証したところ、cluster全体でのdnsリクエスト数が1k req/secと かを超えるとたくさんこの事象が発生するみたい
  7. 7. 原因その① 解決編 CoreDNS health pluginにlameduck オプションを導入 CoreDNS Podが終了を受け取ってからsleepしてくれるだけ Corefile .:53 { health { lameduck 10s } (関係ないので略) } }
  8. 8. 原因その② 今回の根本解決のためには解決策その①だけでは不十分でした。 ここでは解決策その①をしてなお失敗する事例を紹介します。
  9. 9. 原因その② ClusterAutoscaler(以下CA)とAWS AutoScalingGroup(以下ASG)の相性 が良くないようで、CAがnodeをへらすときにASGがdesiredをフラッピ ングさせてしまうことがあるようです。 事象はこの辺のissueで上がっています。おそらくASGのAZ間の rebalanceによってこれが行われているという予想です(が、rebalance を切ることはできないので大変です) https://github.com/kubernetes/autoscaler/issues/2787 https://github.com/kubernetes/autoscaler/issues/3342
  10. 10. 原因その② CAが正常に(CoreDNS Podの乗っている)Nodeをdrainしていれば解決 策その①によって、CoreDNS Podは終了時にsleepし安全に落ちます 。 ASGのdesiredのフラッピングによって、ASGがInstanceを落とす際に はdrainなどをせず突然落とします。 そうするとlameduckを設定していても同様に名前解決が失敗する事象 が発生します。
  11. 11. 原因その② 解決編 ASGがInstanceを落とすときにlifecicle hookによって安全に落として あげれば良さそうです 今回はlifecicle hookの追加とそれをhookしてnodeをdrainするnode- drainerというものを作りました
  12. 12. 原因その② 解決編 中身はkube-awsがやっていたnode-drainerのやり方を真似させて頂いてます 。 ① ASGがInstanceをterminateしようとする ② Lifecicle hookで、terminate時にstatusをtermination:waitになるように ③ K8s上にいるDaemonset Node-drainerが定期的に自分のstatusをmetadata 経由で監視していて、termination:waitになったら、自分自身に対してdrainを かける ④ とても安全
  13. 13. まとめ はじめにK8s上で名前解決失敗しだしたときは何事かと思った いろんな原因とそれに対する複数の解決策を考えて検証してってやっ ててなんか楽しかった

×