<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>FinOps on AI2CORE - AI技術ブログ</title>
    <link>https://www.ai2core.com/tags/finops/</link>
    <description>Recent content in FinOps on AI2CORE - AI技術ブログ</description>
    <generator>Hugo -- 0.146.4</generator>
    <language>ja</language>
    <lastBuildDate>Fri, 27 Feb 2026 18:30:00 +0900</lastBuildDate>
    <atom:link href="https://www.ai2core.com/tags/finops/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Kubernetesコスト最適化の実務：FinOps視点で無駄を可視化し、性能を落とさず削減する方法</title>
      <link>https://www.ai2core.com/posts/2026-02-27-kubernetes-finops-cost-optimization/</link>
      <pubDate>Fri, 27 Feb 2026 18:30:00 +0900</pubDate>
      <guid>https://www.ai2core.com/posts/2026-02-27-kubernetes-finops-cost-optimization/</guid>
      <description>Kubernetes環境で発生しがちな無駄コストを、計測・改善・運用ルールの3段階で削減する具体的な実践ガイド。</description>
      <content:encoded><![CDATA[<h1 id="kubernetesコスト最適化の実務finops視点で無駄を可視化し性能を落とさず削減する方法">Kubernetesコスト最適化の実務：FinOps視点で無駄を可視化し、性能を落とさず削減する方法</h1>
<p>Kubernetes を導入した直後は「自動で効率化される」と期待されがちですが、実際には逆です。適切な運用ルールがないと、クラウド請求は静かに膨らみ続けます。</p>
<p>典型例は次の通りです。</p>
<ul>
<li>リクエスト/リミットが過大でノードが常時スカスカ</li>
<li>夜間トラフィック減少時も同じ台数を維持</li>
<li>開発環境が週末ずっと起動</li>
<li>HPA が CPU しか見ておらず、キュー滞留を無視</li>
<li>過剰なストレージクラス（IOPS課金）を全環境で使用</li>
</ul>
<p>本記事では、FinOps の考え方を用いて、Kubernetesコストを「見える化→改善→定着」の順に進める方法を解説します。</p>
<h2 id="コスト削減の前に定義すべき指標">コスト削減の前に定義すべき指標</h2>
<p>削減施策が失敗する理由は、目標が「安くする」しかないからです。最低でも次の 4 指標を定義します。</p>
<ol>
<li><strong>Unit Cost</strong>: 1リクエストあたりコスト / 1ジョブあたりコスト</li>
<li><strong>Utilization</strong>: CPU・Memoryの実効使用率</li>
<li><strong>Reliability</strong>: SLO 達成率（削減で品質を落とさない）</li>
<li><strong>Waste Ratio</strong>: 予約/実使用の差分率</li>
</ol>
<p>この4つを同時に追うと、単なるコストカットでなく「健全な最適化」になります。</p>
<h2 id="ステップ1可視化基盤を整える">ステップ1：可視化基盤を整える</h2>
<h3 id="1-1-kubecost-または-opencost-の導入">1-1. Kubecost または OpenCost の導入</h3>
<p>EKS/GKE/AKS いずれでも、namespace / deployment / label 単位で費用を把握できる状態にします。重要なのは <code>team</code>, <code>service</code>, <code>env</code> ラベルを強制することです。</p>
<p>推奨ラベル:</p>
<ul>
<li><code>cost-center</code></li>
<li><code>owner</code></li>
<li><code>environment</code>（prod/stg/dev）</li>
<li><code>criticality</code></li>
</ul>
<p>ラベルがないと請求分析ができず、改善責任が曖昧になります。</p>
<h3 id="1-2-観測ダッシュボード">1-2. 観測ダッシュボード</h3>
<p>最初のダッシュボードは次を必須にします。</p>
<ul>
<li>Namespace別コスト（当日/前日比）</li>
<li>Pod別 request/usage ギャップ</li>
<li>ノード空き率（CPU、Memory）</li>
<li>時間帯別トラフィックとレプリカ数</li>
</ul>
<p>ここまでで「どこが高いか」は見えます。次は「なぜ高いか」を潰します。</p>
<h2 id="ステップ2最も効果が高い改善施策">ステップ2：最も効果が高い改善施策</h2>
<h3 id="2-1-right-sizing最優先">2-1. Right Sizing（最優先）</h3>
<p>多くの環境で最大効果が出るのは request/limit の見直しです。VPA recommendation を参考に、まずは read-only で 2 週間観測します。</p>
<p>例:</p>
<ul>
<li>現在: <code>requests.cpu=1000m</code>, 実使用 P95 が 220m</li>
<li>改善後: <code>requests.cpu=300m</code></li>
</ul>
<p>この1変更だけでノード数が 20〜35% 下がるケースがあります。</p>
<h3 id="2-2-cluster-autoscaler--karpenter-最適化">2-2. Cluster Autoscaler / Karpenter 最適化</h3>
<p>オートスケーラーを入れていても、設定不備で縮退しないことが多いです。次をチェックします。</p>
<ul>
<li>scale down unneeded time が長すぎないか</li>
<li>pod disruption budget が硬すぎないか</li>
<li>daemonset が過剰にリソースを固定していないか</li>
</ul>
<p>Karpenter なら Spot + On-Demand の比率制御を導入し、重要ワークロードのみ On-Demand 固定にします。</p>
<h3 id="2-3-ワークロードの時間制御">2-3. ワークロードの時間制御</h3>
<p>開発・検証環境はスケジュール停止が有効です。平日 9:00-20:00 だけ稼働し、夜間/休日は scale to zero。</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 例: CronJobで夜間停止</span>
</span></span><span style="display:flex;"><span>kubectl scale deployment api-staging --replicas<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span> -n staging
</span></span></code></pre></td></tr></table>
</div>
</div><p>単純ですが、月額で大きく効きます。</p>
<h3 id="2-4-hpa指標の改善">2-4. HPA指標の改善</h3>
<p>CPU のみでスケールすると、I/O 待ちやキュー詰まりを見逃します。Prometheus Adapter を使い、次の指標を追加します。</p>
<ul>
<li>queue length</li>
<li>request latency P95</li>
<li>in-flight request</li>
</ul>
<p>結果として「必要な時だけ増やす」が実現し、過剰常時稼働を減らせます。</p>
<h2 id="ステップ3ストレージネットワークの見直し">ステップ3：ストレージ/ネットワークの見直し</h2>
<h3 id="ストレージ">ストレージ</h3>
<p>高IOPSディスクを全環境に使うのは典型的な浪費です。ワークロード特性でクラス分離します。</p>
<ul>
<li>DB本番: 高IOPS</li>
<li>バッチ/開発: 標準クラス</li>
</ul>
<p>スナップショット保持期間も要確認です。無制限保持は請求を圧迫します。</p>
<h3 id="ネットワーク">ネットワーク</h3>
<p>クロスAZ通信量は見落とされがちです。チャットAPIや内部gRPCが高頻度だと、トラフィック課金が無視できません。依存サービスを同一AZに寄せる設計を検討します。</p>
<h2 id="ガードレールを仕組み化する">ガードレールを仕組み化する</h2>
<p>最適化は一度で終わりません。再び膨らむので、CI/CD に制約を組み込みます。</p>
<ul>
<li>OPA/Gatekeeper で「requests未設定」を拒否</li>
<li>ラベル欠落 (<code>owner</code>, <code>cost-center</code>) の manifest を reject</li>
<li>予算超過 namespace の新規デプロイを警告</li>
</ul>
<p>さらに、週次で「Top Waste 10」を自動配信し、チームごとに改善オーナーを固定します。</p>
<h2 id="実例3か月で-32-削減した手順">実例：3か月で 32% 削減した手順</h2>
<p>ある SaaS 環境（5クラスタ）で実施した順序は次の通りです。</p>
<ol>
<li>2週間の使用実績を収集</li>
<li>上位20 deployment の rightsizing</li>
<li>staging/dev の時間停止</li>
<li>Spot 比率を 15% → 45% へ引き上げ</li>
<li>高コストPVの棚卸し</li>
</ol>
<p>結果:</p>
<ul>
<li>月次コスト: -32%</li>
<li>P95 レイテンシ: ほぼ維持</li>
<li>インシデント増加: なし</li>
</ul>
<p>ポイントは、SLO を維持しながら段階実施したことです。</p>
<h2 id="よくある反論への回答">よくある反論への回答</h2>
<p><strong>Q. 削減すると障害が増えるのでは？</strong>
A. いきなり下げると危険です。P95実績を基準に 10〜15% ずつ下げ、SLO と同時監視すれば安全に進められます。</p>
<p><strong>Q. チームが協力しない</strong>
A. コストを「共通責任」にすると進みません。namespaceごとに owner を明示し、改善期限を決めると動きます。</p>
<p><strong>Q. どこから始めるべき？</strong>
A. Right Sizing と夜間停止です。最短で効果が出ます。</p>
<h2 id="まとめ">まとめ</h2>
<p>Kubernetes コスト最適化は、節約テクニックの寄せ集めではありません。計測、改善、運用ガードレールをセットで回す FinOps プロセスです。</p>
<p>まずは「誰の、どのワークロードが、なぜ高いか」を可視化し、Right Sizing から着手してください。性能を落とさずにコストを下げる道筋は、思っているより現実的です。</p>
<h2 id="実装テンプレート無駄を自動検出する">実装テンプレート：無駄を自動検出する</h2>
<p>可視化だけだと改善は進みません。週次で自動的に「無駄候補」を抽出してチームへ配信する仕組みを入れると、改善が継続します。</p>
<p>抽出ルール例:</p>
<ul>
<li>7日平均で CPU 使用率 &lt; 15% かつ request &gt; 500m</li>
<li>夜間（0:00-6:00）にトラフィックほぼゼロなのに replicas &gt; 1</li>
<li>メモリ使用率 P95 &lt; 40% が 14 日継続</li>
</ul>
<p>このルールで候補を Slack/Discord に自動投稿し、オーナーと期限を付けるだけで改善率が上がります。</p>
<h2 id="具体的なyaml見直し例">具体的なYAML見直し例</h2>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">resources</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">requests</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">cpu</span>: <span style="color:#e6db74">&#34;250m&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">memory</span>: <span style="color:#e6db74">&#34;512Mi&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">limits</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">cpu</span>: <span style="color:#e6db74">&#34;500m&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">memory</span>: <span style="color:#e6db74">&#34;1Gi&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">autoscaling</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">minReplicas</span>: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">maxReplicas</span>: <span style="color:#ae81ff">8</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">targetCPUUtilizationPercentage</span>: <span style="color:#ae81ff">65</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>ポイントは「requests を現実に寄せる」「limits を安全マージンに置く」「HPA で不足分だけ増やす」の3点です。</p>
<h2 id="ガバナンスコストを技術負債化させない">ガバナンス：コストを技術負債化させない</h2>
<p>削減施策は放置すると必ず戻ります。そこで、リリースゲートに FinOps 観点を追加します。</p>
<ul>
<li>新規サービスは cost label 必須</li>
<li>request 未設定の Pod はデプロイ拒否</li>
<li>予算超過時は自動で注意喚起</li>
</ul>
<p>さらに月次レビューで「削減額」だけでなく「SLO維持率」も一緒に報告することで、コスト最適化が品質改善と対立しない文化を作れます。</p>
<h2 id="まとめ実行順の再確認">まとめ（実行順の再確認）</h2>
<ol>
<li>まず可視化（誰が何にいくら使っているか）</li>
<li>次に Right Sizing と時間停止</li>
<li>最後にガードレールをCI/CDに組み込む</li>
</ol>
<p>この順番を守れば、短期の削減成果と中長期の運用安定を両立できます。</p>
]]></content:encoded>
      <category>Tech</category>
      <category>Kubernetes</category>
      <category>FinOps</category>
      <category>Cloud</category>
      <category>SRE</category>
    </item>
  </channel>
</rss>
