Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

The story of migrating production env to Amazon...

Avatar for AnD00 AnD00
June 27, 2021

The story of migrating production env to Amazon EKS

2021-06-27
Drecom SRE Sunday
https://drecom.connpass.com/event/213139/

Avatar for AnD00

AnD00

June 27, 2021
Tweet

More Decks by AnD00

Other Decks in Technology

Transcript

  1. 自己玹介 名前: 安藀 尚之あんどう なおゆき 幎霢: 30æ­³ å­Šæ­Ž: 倚摩矎術倧孊 造圢衚珟孊郚

    映像挔劇孊科 卒業 ゚ンゞニア / enzaæ­Ž: 4幎くらい 抂芁:  2020幎1月 ドリコムに䞭途入瀟。  enza郚に所属しお、コヌド曞いたりスクラムマスタヌやったりしおたす。  高校3幎生くらいから10幎近く挔劇に人生を捧げおきたのに、突然゚ンゞニア  になっおみた系゚ンゞニア。
  2. 抱えおいた課題点 • スケヌルむン・アりト等のオペレヌションコストがかかる ◩ 手順や泚意点が倚く、属人化しやすい觊っおた人が蟞めたらアりト ◩ 觊れる人がなかなか増えない ◩ 䜜業が面倒くさい •

    蚀語やラむブラリのアップデヌトが倧倉 ◩ マシンむメヌゞ䜜り盎しおむンスタンスを党郚取り替えたり ◩ プロビゞョニングツヌル流さないずいけなかったり ◩ ぀たり面倒くさい
  3. 課題に察する解決策 1. Railsアプリをコンテナ化する a. Rubyのバヌゞョンアップやラむブラリの远加をするずきは Dockerfileを曎新するだけで枈む 2. Kubernetes䞊で動かす a. むンフラがPod

    / ReplicaSet / Deployment / Service等のリ゜ヌスに抜象化される b. むンフラ構成をマニフェストファむルで䞀元的に管理できる c. コヌド化されるため誰でも読めるし曞ける Infrastructure as Code
  4. 先にたずめちゃう Amazon EKSぞの移行に぀いお、もちろん解決したい課題があったこずは事実ですが、なによりも「技術 的に挑戊したい」ずいう意欲が根底にあったず感じおいたす。 コンテナオヌケストレヌションサヌビスの遞択肢ずしおは、 Amazon ECSもありたしたが「AWS内に閉じた 技術知識になっおしたう」ずいう点から Amazon EKSを遞択したした。

    Kubernetesであれば、Google Cloudなど他の堎面でも掻甚できたす。 Kubernetesは孊習コストが高いずいう巷の話は確かに間違いなく、正盎いただによく分かっおいない郚 分が倚いです。 しかし「Kubernetesに觊れる」ずいうこずは既にスタンダヌドになっおいる䞖の䞭なので、運甚環境移行に 挑んだこずは良いアクションだったず思っおいたす。
  5. Railsアプリをコンテナ化する 1. Dockerfileを曞く a. Alpine LinuxベヌスのRubyコンテナを䜿う b. Multi-stage buildsを䜿う 2.

    コンフィグを敎理する a. Capistranoでのデプロむ前提のコヌドを廃止 b. KubernetesのConfigMap / SecretずRailsのCustom-configurationを䜿う
  6. Kubernetes䞊で動かす 1. マニフェストを曞く a. Namespace / Deployment / Service /

    ConfigMap / Secret / HorizontalPodAutoscaler / Job 2. ツヌルを䜿っおマニフェストを管理する a. Kustomizeを䜿う 3. AWSリ゜ヌスを䜜成する a. EKS Cluster / Security Group / Application Load Balancer / Simple Storage Service / Elastic Container Registry / Kinesis Data Firehose 4. CI/CDからデプロむする a. むメヌゞのビルド・プッシュ / マむグレヌション / デプロむ
  7. 運甚環境の切り替え方法 1. ALBに玐づくタヌゲットグルヌプを切り替える a. メリット i. 準備もオペレヌションも簡単 b. デメリット i.

    タヌゲットグルヌプが切り替わっおからタヌゲットのむンスタンスのヘルスチェックを行うため、ダりンタむムが発生しおしたう 2. Route53の加重ルヌティングポリシヌでアクセスを振り分ける a. メリット i. 割合倉曎のための操䜜が、 Route53のルヌティングポリシヌを倉曎するだけで枈む ii. ALB Ingress Controllerがサポヌトされおいるので、䞀般的な EKS Clusterで䜿いやすい b. デメリット i. アクセスを振り分けるため、 ALB関連のリ゜ヌスをもう 1セット䜜成する必芁がある ii. 蚭定反映に時間がかかるため、実際にアクセスが振り分けられるたでにラグが発生する 3. ALBの加重タヌゲットグルヌプでアクセスを振り分ける a. メリット i. ALBにタヌゲットグルヌプを远加するだけなので、 ALB関連のリ゜ヌスをもう 1セット䜜成する必芁がない ii. DNSでの切り替えではないので、アクセス割合蚭定の倉曎が即時反映される b. デメリット i. ALBに蚭定する内容のため、 ALB Ingress Controllerは䜿甚できない
  8. 移行した結果に぀いお • メリット ◩ スケヌルむン・アりト等のオペレヌションが簡単になった ▪ 手順の共有もシンプルに ◩ 蚀語やラむブラリのアップデヌトが簡単になった ▪

    反映もコヌドをデプロむするだけ ◩ Kubernetesの技術を扱うこずは財産になる • デメリット ◩ Kubernetesの運甚・孊習コストが高い ▪ 前提ずなる知識を぀けるたでに時間がかかる ◩ むンフラ専門のメンバヌがいないずキツむ ▪ 改善に日々取り組たないず切り替えただけで終わる ▪ 想定倖のこずが起きた時にチンプンカンプン ◩ ログ収集が蟛い ▪ さたざたな眠がある
  9. Fluent Bitの動䜜が䞍安定 [課題] • DaemonSetで動かしおいたが、呚幎むベントによるスパむクで捌き切れなくなった [察応] • Mem_Buf_Limitを増やし、ログ送信時のバッファ䞊限を増やす • バッファをメモリバッファからファむルバッファに倉曎しお再起動時の欠損を回避する

    • バヌゞョンを曎新しお、マルチスレッドを有効化する • Prometheusでメトリクスを監芖し、異垞を怜知したらアラヌトを送る [反省点] • 負荷詊隓でアプリケヌションのほうは芋おいたが、 Fluent Bitはノヌマヌクだった [曎なる蟛み] • ある皋床の改善は芋られたが、 Error code 135でPodの突然死が倚発するように... ◩ このあたりのIssueが解決されないず厳しい ▪ https://github.com/fluent/fluent-bit/issues/2661 ▪ https://github.com/fluent/fluent-bit/issues/3014
  10. Firehoseのクォヌタの制限に匕っかかる [課題] • クォヌタの制限に匕っかかっおしたい、リトラむを埅っおいる間にバッファチャンクが Flushされおしたっおいた [察応] • AWSサポヌトケヌスを䜜成しお䟝頌 ◩ Service

    Quotasコン゜ヌルから倉曎できるのは、 Delivery streamsのみ ◩ Rate of Put requestの䞊限をあげおもらうには、サポヌトケヌスじゃないずだめ [反省点] • Firehoseのログやメトリクスをちゃんず远っおおけばもっず早く気付けた
  11. JSONログが途䞭で匷制的に分割される [課題] • アプリケヌションが暙準出力に出しおいる分析甚のJSONログが、ある䞀定のサむズを超え るず匷制的に分割されおしたう ◩ Docker 1.13からLogging Driverの仕様が倉わり、16384バむトで分割される ▪

    https://github.com/moby/moby/issues/32923 ▪ https://github.com/kubernetes/kubernetes/issues/52444 [察応] • Fluent BitにはDocker_Modeずいう、たさにこのための蚭定が甚意されおいた ◩ Docker_Modeを有効化したら䜕事もなかったかのように解決 [反省点] • 公匏ドキュメントを読み蟌むっお倧切
  12. CloudWatchの料金が倧倉なこずになる [課題] • Cluster内のすべおのPodのログずKubeletのログをCloudWatch Logsに送信しお したっお、料金が倧倉なこずになった ◩ 収集する察象のログの蚭定を芋盎し損ねおいた [察応] •

    収集すべきログを絞っお蚭定するこずで、翌月から料金が正垞な倀に戻った [反省点] • コストの監芖が疎かだったこずを埌悔し、定期的なチェックを行うように ◩ 組織的な諞事情でAWS Cost Explorerなどが䜿えず...
  13. ワヌカヌノヌドの安党な停止 • ノヌドを停止する堎合は、Drain機胜を䜿う必芁がある ◩ 手順ずしおは以䞋の通り ▪ DrainでPodを退避させる ▪ オヌトスケヌリンググルヌプの最小台数を曎新する ▪

    ノヌドをデタッチしお停止する ◩ Pod偎はPreStopフックを䜿甚しお、Gracefulに終了するように調敎 • 運甚環境のノヌド数だず、コマンドで地道にやるのは蟛いのでスクリプト化しお運甚 しおいる
  14. AWSリ゜ヌスの内郚アクセス • 移行前の負荷詊隓でむンスタンスメタデヌタサヌビスの通信が明らかに遅いこずを 発芋 ◩ EC2 むンスタンスメタデヌタサヌビス v2IMDSv2なるものがAmazon EKSでサポヌトされるように なっおいた

    ▪ https://aws.amazon.com/jp/about-aws/whats-new/2020/08/amazon-eks-supports-e c2-instance-metadata-service-v2/ ◩ AWS SDKのバヌゞョンアップを行なったこずにより IMDSv2が䜿われるようになっおいたが、ノヌド偎 の蚭定ができおおらず ◩ v2に倱敗したらv1にフォヌルバックするようになっおおり、時間はかかるけど成功するような状態 だった • InstanceMetadataOptionsのHttpPutResponseHopLimitを2に蚭定する ◩ SSRF脆匱性等の攻撃に察するセキュリティが匷化されおいるので、アップデヌトするのが吉
  15. 今埌やっおいくこず • Fluent BitからFluentdぞの移行 ◩ 負荷詊隓を行い性胜を比范した結果、 Fluentdでも十分捌ける䞊、動䜜が安定しおいる • DNSの名前解決の問題に぀いお調査・察応 ◩

    ただ問題は顕圚化しおいないが準備しおおくに越したこずはない ◩ GREEさんの蚘事がずおも参考になる ▪ https://labs.gree.jp/blog/2020/01/20271/ • Progressive Deliveryの導入 ◩ Spinnaker + Kayentaでカナリヌリリヌスの仕組みを構築䞭 • GitOpsの導入 ◩ ベストプラクティスず蚀われおは気にせざるを埗ない • オヌトスケヌルを掻甚する方法の暡玢 ◩ 珟状はむベントに合わせお、事前にノヌドの台数を調敎 ◩ もっず良い運甚方法がありそう
  16. たずめ再掲 Amazon EKSぞの移行に぀いお、もちろん解決したい課題があったこずは事実ですが、なによりも「技術 的に挑戊したい」ずいう意欲が根底にあったず感じおいたす。 コンテナオヌケストレヌションサヌビスの遞択肢ずしおは、 Amazon ECSもありたしたが「AWS内に閉じた 技術知識になっおしたう」ずいう点から Amazon EKSを遞択したした。

    Kubernetesであれば、Google Cloudなど他の堎面でも掻甚できたす。 Kubernetesは孊習コストが高いずいう巷の話は確かに間違いなく、正盎いただによく分かっおいない郚 分が倚いです。 しかし「Kubernetesに觊れる」ずいうこずは既にスタンダヌドになっおいる䞖の䞭なので、運甚環境移行に 挑んだこずは良いアクションだったず思っおいたす。