GKE AutopilotのPodバーストとHPAで問題が起きた

久しぶりに記事書きました。 最近はObsidianに情報をまとめることが多いですが、もう少し気軽にアウトプットしようと思って書きました。 なので、詳細を調査はできていません。適当なこと書いてたらすみません。 発生した問題 タイトルにもある通りGKE Autopilotに関する話です。 AutopilotやPodバースト、水平Pod自動スケーリング(HPA)を知らない方はこれらの記事が参考になると思います。 Autopilot の概要 GKE で Pod バースト機能を構成する 水平Pod自動スケーリング 発生した問題についてですが、AutopilotクラスタでHPAを有効にしたDeploymentを上げたところ、Podが何度も再起動されながらHPAの最大値までPodが増えるといった挙動をしました。最大値までPodが増えたあとは再起動を何回もして不安定な状態でした。 原因 おそらく、Deploymentのresources.requestsが動かしているアプリに対して低すぎたことがこの状態を発生させていたと思います。 こんな感じの設定にしてました。 resources: requests: cpu: "50m" memory: "52Mi" limits: cpu: "500m" memory: "1Gi" コスト削減のため、リクエストを最も小さい値にしてました。 対象アプリがrequestsの値を大きく上回ってました。 Podバーストを有効にしているとlimitsはあくまで予約しているだけで実際にはリソースを確保していないということらしいので、以下のような解釈をしました。 requestsの値を大きく上回る HPAが適用される(HPAはCPUが80%で動くようにしてました。) Podが増える よくわからん挙動する 対処方法 requestsの値を対象アプリが要求している値の120%ぐらいにしました。 正常に動作するようになりました。 まとめ Autopilotクラスタを利用することで、Nodeの管理が必要なく運用が楽にはなりますが、自動で管理してくれる分よくわからないことも発生するので、手放しには喜べないなと思いました。 誰かの役に立ちそうなことがあれば、定期的に自分のメモを書いてるぐらいの感覚でブログを更新したいという気持ちです。

March 15, 2025 · 1 min · 42 words · Yu

Kubernetes完全ガイドを読んだので感想とか

去年からちょっとずつ読んでた「Kubernetes完全ガイド 第2版」を読み終わりました。 なかなかボリュームのある本で668ページもあって読むのが大変でした。k8sを雰囲気しかしらない僕にとってはかなり勉強になる本で、体系的に学ぶことができk8sの全体像が頭に入ってきて解像度がかなり上がりました。 本のアウトプットも兼ねて感想とか気になったこととか書きます。 環境構築 この本はハンズオン形式なので、k8sの環境を作る必要があります。 僕は最初GKEを作成したのですが、費用がすぐに発生していやだったのでローカルで構築できるkindを利用しました。kindはDocker上でk8sを構築することができとても楽でした。ただ、他のブログなどをみてるとMinikubeがおすすめみたいです。kindはちょっとクセが強く一部の機能を動かすために設定が必要だったりしてたしかに初心者向けではないなと思いました。 図が多くて分かりやすい 大体のページに図があって、初めて知った概念などの理解をする補助になりました。文章読んでよくわからなかったら図を先にみて理解してました。 第7章までやれば基礎力が身につく この章まで終われば、一旦は基礎知識OKな気がしました。 仕事でk8sをさわらないけど、何をしているの知りたいとか動いてるGKEを追えるようになりたいとかの理由でこの本を読み始めた人は一旦区切りかなとか思います。 第9章 リソース管理とオートスケーリング k8sを利用する上でかなりのメリットかなと思いました。アプリの負荷にあわせてスケールアウトを自動でやってくれたりするのは可用性を高めてくれてかなりよきですね。 仕事で利用しているGKEではあまり高負荷がかかる場面もないのでここらへんの機能が効果的に発揮されてる場面に遭遇したことがほぼないのが残念です。 運用上のベストプラクティスをもっと知りたい この本を読んでて思ったのが、実際の運用だとどの機能をどれぐらい利用して構築しているんだろう、です。 ヘルスチェックや柔軟なスケジューリングやセキュリティなど便利な機能がたくさんあり、それらを知れてとてもよかったです。ただ、僕ぐらいのk8s初心者だと運用レベルをどれぐらい高めればいいのかって疑問がでてきました。何かしらのベンチマークとか取れたりするのかな。。今後そこらへんも調べたいと思いました。 この本は体系的にk8sを学べて最高です。文句とかは一切ないです。 マイクロサービスとの相性の良さ 複数のコンテナを安全に管理することができるk8sはやっぱりマイクロサービスとの相性はかなりいいですね。 逆にマイクロサービスでなく高負荷がかかったりしないモノリスなアプリだった場合はk8sはオーバースペックかもなと思いました。普通にCloud RunとかECSとかそういうので運用のほうが費用面も考えてコスパがいい気がしてます。もちろん、利用する言語や求められるシステムによっては選択はかなり変わると思いますが。 マイクロサービスやモノリスといった話はそのまま組織論として置換できそうで、大規模なアプリや多数の開発メンバーを抱えている組織だとそれぞれを分離させて管理できるk8sといった技術はかなり有用だなと改めて思いました。 逆に小さい組織の場合はもっとミニマムかつ小回りが聞く技術構成にしたりすると救われそうですね。 まとめ k8sの勉強において最高最強の本でした。 あと、GitOptsについてもこの本きっかけで理解が深まったのでよかったです。

April 5, 2023 · 1 min · 29 words · Yu

所属している会社のアドベントカレンダーを書いた

ブログをリニューアルしてから初めての投稿です。 今年はブログを全然更新できていなかったので、心機一転+記事を書く手間を極力減らして気軽に投稿できるようにリニューアルしました。 無理せず継続する予定なので今後もよろしくお願いします! アドベントカレンダー書いた Qiitaのアドベントカレンダーを書いたのでURL載せておきます。 Scala + Play Frameworkでリクエストを値オブジェクトにする Scalaに関する記事を書いていて、今年はScalaを触ることがほとんどで強い型付けには非常に助けられてます。(型パズル化したときは難しくて時間を溶かしてますが、、) アプリを作るなら、Java, Scala, Goあたりの静的言語はマストだなーと最近思っています。

December 12, 2022 · 1 min · 13 words · Yu

最新の継続日数を取得するSQLを作ろうとした

このブログは技術記事メインで運用しようとして始めましたが、気付いたら本のアウトプットメインになってました。笑 たまには技術記事を書こうということで今週取り組んでて苦しんだPostgreSQLを使った最新の継続日数取得について書きます。 経緯 今コツコツと取り組んでいる個人開発でGitHubとかで見る最新の継続日数の取得をしたいと考えたところから始まりました。 ちなみにこんな感じのやつです。 Current StreakをSQLで実現しようとしました。 実装 ネットで最新の継続日数を取得するSQLの情報が全然なくどうしようかなと迷っていたら、Latest Number of Consecutive Days(Current Streak)を見つけました。 この記事を見ていると何やらSQL Serverで実現したいことを実装しているっぽい!ということでこれをPostgreSQLに書き換えてみようと試みました。 上記記事で最終的にできてたSQLはこんな感じでした。これをPostgreSQLに変えていきます。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 DECLARE @habits TABLE (ID INT IDENTITY, [Target] INT) INSERT INTO @habits ([Target]) VALUES (1) DECLARE @entries TABLE (ID INT IDENTITY, HabitID INT, EntryDate datetime) INSERT INTO @entries (HabitID, EntryDate) VALUES (1, '20150221'),(1, '20150222'),(1,'20150223') ;WITH distinct_dates AS ( SELECT DISTINCT HabitID, convert(date, dateadd(HOUR, -3, EntryDate)) AS Day FROM @entries ), numbering AS ( SELECT distinct_dates.HabitID, Day, lastDateApply.lastDate, row_number() OVER(PARTITION BY distinct_dates.HabitID ORDER BY Day DESC) AS rowno FROM distinct_dates outer apply (select max(ee.EntryDate) 'lastDate' from @entries ee where ee.habitid = distinct_dates.HabitID) lastDateApply ) SELECT a.HabitID, a.lastDate 'LastEntryDate', DATEDIFF(day, getdate(), a.lastDate) 'DateDifference', case when DATEDIFF(day, getdate(), a.lastDate) = 0 THEN MIN(a.rowno) else DATEDIFF(day, getdate(), a.lastDate) + 1 end 'CurrentStreak' FROM numbering a LEFT JOIN numbering b ON b.HabitID = a.HabitID AND b.rowno = a.rowno + 1 WHERE b.Day IS NULL OR datediff(DAY, b.Day, a.Day) > 1 GROUP BY a.HabitID, a.lastDate で実際にやってみたらこんなSQLができ上がりました。SQL ServerとPostgreSQLで書き方の差があって結構苦労しました。 outer applyの書き換えとかも訳わからなくて疲れました。。 ...

January 31, 2021 · 2 min · 336 words · Yu

TablePlusで追加したデータが取得できない

PostgreSQLにTablePlusからデータを作成したはいいもののGolangから作成したデータが取得できない。。 ということが発生していました。解決策はとても単純でしたが、少しハマったので記事にしました。 解決策 TablePlusの画面でデータを作成した後にコミットができていなかったです。 上記画像の状態だとコミットができていません。⌘Sなどでコミットしてあげましょう。 しっかりと公式ドキュメントを読まなあかんですね。

December 7, 2020 · 1 min · 6 words · Yu