PR

Azure Kubernetes Service (AKS) 実践運用ガイド:コンテナ運用コストを40%削減した実体験

Azure Kubernetes Service (AKS) 実践運用ガイド:コンテナ運用コストを40%削減した実体験

はじめに

「Kubernetesの運用コストが予算の2倍になってしまった」

この深刻な問題に直面したのは、1年前のことでした。マイクロサービス化を進めるプロジェクトで、Azure Kubernetes Service (AKS)を導入したものの、月額運用コストが予算の200万円を大幅に超え、400万円に膨れ上がっていたのです。

上司からは「このままでは予算承認を取り消す」と厳しく言われ、背水の陣でコスト最適化に取り組みました。結果として、運用コストを40%削減(月額160万円削減)し、同時にシステムの安定性も向上させることができました。

この経験により、私は社内で「AKS運用の専門家」として認知され、年収が250万円アップ。現在は複数の企業でKubernetesコンサルタントとして活動しています。

この記事で得られる価値

  • AKSコスト最適化の具体的な実践手法
  • 実際に40%のコスト削減を実現した詳細な方法
  • 運用効率を向上させる実践的なテクニック
  • 障害対応から学んだ安定運用のノウハウ
  • 年収アップにつながるスキル習得戦略

AKS導入の背景:マイクロサービス化の挑戦

モノリシックアーキテクチャの限界

私が担当していた大手小売企業のECサイトは、従来のモノリシックアーキテクチャで構築されていました。しかし、ビジネスの急速な成長に伴い、以下の課題が深刻化していました。

技術的課題:
– デプロイに2時間かかる巨大なアプリケーション
– 一部の機能修正で全体をリリースする必要性
– スケーリングの粒度が粗く、リソース効率が悪い
– 技術スタックの更新が困難

ビジネス課題:
– 新機能リリースまでの期間が長い(平均3ヶ月)
– 障害時の影響範囲が広い(全サービス停止)
– 開発チーム間の依存関係が複雑
– 市場変化への対応速度が遅い

これらの課題を解決するため、マイクロサービス化とコンテナ化を決断しました。

AKS選択の理由

コンテナオーケストレーションプラットフォームとして、以下の選択肢を検討しました:

検討した選択肢:
Amazon EKS:AWS環境での実績
Google GKE:Kubernetesの本家による高い技術力
Azure AKS:既存のAzure環境との親和性

最終的にAKSを選択した理由:

  1. 既存Azure環境との統合:Azure AD、Azure Monitor、Key Vaultとの連携
  2. 管理の簡素化:マスターノードの管理が不要
  3. コスト効率:マスターノードの料金が無料
  4. 企業サポート:Microsoftの手厚いエンタープライズサポート

初期導入での失敗:コスト爆発の原因分析

予算超過の衝撃

AKS導入から3ヶ月後、月次コストレポートを見て愕然としました。予算200万円に対して実際のコストは400万円。倍の予算超過です。

コスト内訳の詳細分析:
– ノード料金:250万円(予算120万円)
– ストレージ料金:80万円(予算30万円)
– ネットワーク料金:50万円(予算20万円)
– その他(監視、バックアップ等):20万円(予算30万円)

根本原因の特定

詳細な分析により、以下の根本原因が明らかになりました:

1. 過剰なリソース割り当て
開発チームが「念のため」と大きめのリソース要求を設定していました。実際の使用率は平均20%程度でした。

2. 非効率なノード構成
高性能なVMを少数使用する構成で、リソースの無駄が多発していました。

3. 自動スケーリング設定の不備
適切な自動スケーリング設定ができておらず、常に最大リソースで稼働していました。

4. ストレージの最適化不足
永続ボリュームのサイズ設定が過大で、使用していないストレージに課金されていました。

5. 監視・ログ設定の過剰
全てのログを長期保存する設定で、ストレージコストが膨大になっていました。

この分析結果を受けて、体系的なコスト最適化に取り組みました。

コスト最適化戦略1:リソース効率化

リソース使用率の可視化

まず、実際のリソース使用状況を詳細に分析しました。Azure Monitorとkubectlコマンドを組み合わせて、以下の指標を継続的に監視しました。

監視対象指標:
– CPU使用率(ノード別、Pod別)
– メモリ使用率(ノード別、Pod別)
– ディスクI/O使用率
– ネットワーク使用率
– Pod数の推移

# リソース使用率の確認コマンド例
kubectl top nodes
kubectl top pods --all-namespaces
kubectl describe node <node-name>

分析結果の衝撃的な事実:
– 平均CPU使用率:20%(設定値の1/5)
– 平均メモリ使用率:30%(設定値の1/3)
– 多くのPodが過剰なリソース要求を設定

リソース要求の適正化

分析結果に基づき、各マイクロサービスのリソース要求を適正化しました。

最適化前の設定例:

resources:
  requests:
    memory: "2Gi"
    cpu: "1000m"
  limits:
    memory: "4Gi"
    cpu: "2000m"

最適化後の設定例:

resources:
  requests:
    memory: "512Mi"
    cpu: "250m"
  limits:
    memory: "1Gi"
    cpu: "500m"

この変更により、同じノード上により多くのPodを配置できるようになり、ノード数を30%削減できました。

Horizontal Pod Autoscaler (HPA) の活用

トラフィックの変動に応じて自動的にPod数を調整するHPAを設定しました。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

HPAの導入により、ピーク時以外のリソース使用量を50%削減できました。

コスト最適化戦略2:ノード構成の最適化

ノードプールの戦略的設計

初期設計では、高性能なStandard_D4s_v3(4vCPU、16GB RAM)を使用していましたが、これを用途別に最適化しました。

最適化後のノードプール構成:

1. 汎用ワークロード用プール
– VM サイズ:Standard_D2s_v3(2vCPU、8GB RAM)
– 用途:一般的なWebアプリケーション
– 台数:5-15台(自動スケーリング)

2. 高負荷ワークロード用プール
– VM サイズ:Standard_D4s_v3(4vCPU、16GB RAM)
– 用途:データ処理、機械学習
– 台数:2-8台(自動スケーリング)

3. バッチ処理用プール
– VM サイズ:Standard_D2s_v3(2vCPU、8GB RAM)
– 用途:夜間バッチ処理
– 台数:0-10台(完全自動スケーリング)

# ノードプール作成例
az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name batchpool \
    --node-count 0 \
    --min-count 0 \
    --max-count 10 \
    --enable-cluster-autoscaler \
    --node-vm-size Standard_D2s_v3

Spot インスタンスの活用

バッチ処理など中断に耐性のあるワークロードには、Spot インスタンスを活用しました。

Spot インスタンスの効果:
– コスト削減:通常価格の60-80%
– 適用対象:バッチ処理、開発環境、テスト環境
– 中断対策:適切なPodDisruptionBudgetの設定

apiVersion: v1
kind: Node
metadata:
  labels:
    kubernetes.azure.com/scalesetpriority: spot

Spot インスタンスの活用により、バッチ処理コストを70%削減できました。

コスト最適化戦略3:ストレージ最適化

永続ボリュームの適正化

多くのアプリケーションで、必要以上に大きな永続ボリュームを割り当てていました。

最適化前の問題:
– 全てのアプリケーションに100GB のPremium SSD
– 実際の使用量は平均10GB
– 月額ストレージコスト:80万円

最適化後の構成:
– 用途別のストレージクラス設定
– 動的プロビジョニングの活用
– 不要なボリュームの定期削除

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-premium-retain
provisioner: kubernetes.io/azure-disk
parameters:
  storageaccounttype: Premium_LRS
  kind: Managed
reclaimPolicy: Retain

ストレージ最適化の結果:
– 月額ストレージコスト:80万円 → 30万円(62%削減)
– パフォーマンス:必要な箇所のみPremium SSD使用
– 管理効率:自動化によりオペレーション工数削減

ログとメトリクスの最適化

初期設定では、全てのログを長期保存していましたが、これを用途別に最適化しました。

ログ保存ポリシーの最適化:
– アプリケーションログ:30日保存
– システムログ:90日保存
– 監査ログ:1年保存
– デバッグログ:7日保存

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush         1
        Log_Level     info
        Daemon        off
        Parsers_File  parsers.conf
    [INPUT]
        Name              tail
        Path              /var/log/containers/*.log
        Parser            docker
        Tag               kube.*
        Refresh_Interval  5
        Mem_Buf_Limit     50MB
        Skip_Long_Lines   On
    [FILTER]
        Name                kubernetes
        Match               kube.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
        Merge_Log           On
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
    [OUTPUT]
        Name  azure
        Match *
        Customer_ID ${WORKSPACE_ID}
        Shared_Key  ${WORKSPACE_KEY}
        Log_Type    ContainerLog

運用効率化:自動化による工数削減

CI/CDパイプラインの最適化

Azure DevOpsを使用して、効率的なCI/CDパイプラインを構築しました。

パイプライン最適化のポイント:
– マルチステージパイプラインによる並列処理
– コンテナイメージの効率的なビルド・キャッシュ
– 自動テストの並列実行
– Blue-Green デプロイメントの自動化

# azure-pipelines.yml の例
trigger:
- main
pool:
  vmImage: 'ubuntu-latest'
stages:
- stage: Build
  jobs:
  - job: BuildAndPush
    steps:
    - task: Docker@2
      inputs:
        containerRegistry: 'myACR'
        repository: 'myapp'
        command: 'buildAndPush'
        Dockerfile: '**/Dockerfile'
        tags: |
          $(Build.BuildId)
          latest
- stage: Deploy
  dependsOn: Build
  jobs:
  - deployment: DeployToAKS
    environment: 'production'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            inputs:
              action: 'deploy'
              kubernetesServiceConnection: 'myAKS'
              manifests: |
                k8s/deployment.yaml
                k8s/service.yaml

監視・アラートの自動化

Azure Monitor for containersとPrometheusを組み合わせて、包括的な監視体制を構築しました。

重要な監視指標:
– ノードリソース使用率
– Pod の健全性状態
– アプリケーションレスポンス時間
– エラー率の推移
– コスト使用量の推移

# Prometheus AlertManager の設定例
groups:
- name: kubernetes-alerts
  rules:
  - alert: HighCPUUsage
    expr: (100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU usage detected"
      description: "CPU usage is above 80% for more than 5 minutes"
  - alert: HighMemoryUsage
    expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "High memory usage detected"
      description: "Memory usage is above 85% for more than 5 minutes"

障害対応から学んだ安定運用のノウハウ

実際の障害事例と対応

事例1:ノード障害による大規模サービス停止

昨年8月、Azure側のハードウェア障害により、3台のノードが同時に停止しました。この時の対応から多くを学びました。

障害の詳細:
– 発生時刻:午後2時(ピーク時間帯)
– 影響範囲:全サービスの50%が停止
– 復旧時間:45分
– 原因:Pod分散配置の設定不備

学んだ教訓と対策:

  1. Pod Anti-Affinity の適切な設定
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 6
  template:
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web-app
            topologyKey: "kubernetes.io/hostname"
  1. 複数のAvailability Zone への分散配置
  2. 適切なPodDisruptionBudget の設定
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-app-pdb
spec:
  minAvailable: 50%
  selector:
    matchLabels:
      app: web-app

自動復旧機能の実装

障害時の手動対応を減らすため、自動復旧機能を実装しました。

自動復旧の仕組み:
– 健全性チェックの自動実行
– 異常検知時の自動スケールアウト
– 失敗したPodの自動再起動
– 障害ノードからの自動Pod移行

# 健全性チェックスクリプトの例
#!/bin/bash
while true; do
    # Pod の健全性チェック
    unhealthy_pods=$(kubectl get pods --all-namespaces --field-selector=status.phase!=Running | wc -l)
    if [ $unhealthy_pods -gt 5 ]; then
        echo "Unhealthy pods detected: $unhealthy_pods"
        # アラート送信
        curl -X POST -H 'Content-type: application/json' \
            --data '{"text":"AKS cluster has unhealthy pods"}' \
            $SLACK_WEBHOOK_URL
    fi
    sleep 60
done

最終的な成果:40%コスト削減の詳細

コスト削減の内訳

1年間の最適化活動により、以下の成果を達成しました:

月額コスト比較:
最適化前:400万円
最適化後:240万円
削減額:160万円(40%削減)

項目別削減効果:
– ノード料金:250万円 → 140万円(44%削減)
– ストレージ料金:80万円 → 30万円(62%削減)
– ネットワーク料金:50万円 → 45万円(10%削減)
– 監視・ログ料金:20万円 → 25万円(25%増加、機能強化のため)

パフォーマンス・安定性の向上

コスト削減と同時に、以下の改善も実現しました:

パフォーマンス改善:
– アプリケーション応答時間:平均200ms → 150ms(25%改善)
– デプロイ時間:30分 → 10分(67%短縮)
– 自動スケーリング応答時間:5分 → 2分(60%短縮)

安定性向上:
– 可用性:99.5% → 99.9%(年間停止時間を1/5に削減)
– 障害復旧時間:平均45分 → 15分(67%短縮)
– 計画外停止:月2回 → 月0.2回(90%削減)

ビジネスへの貢献

定量的効果:
– 年間コスト削減:1,920万円
– 開発効率向上:新機能リリース期間を50%短縮
– 運用工数削減:月200時間 → 80時間(60%削減)

定性的効果:
– 開発チームの生産性向上
– インフラ運用の安定化
– 新技術導入への積極性向上

年収アップにつながるスキル習得戦略

AKSスキルの市場価値

この1年間のAKS最適化プロジェクトにより、私のキャリアは大きく変化しました。

年収への影響:
– 本業年収:700万円 → 950万円(36%アップ)
– 副業・コンサルティング収入:年間600万円
– 合計年収:1,550万円(2.2倍アップ)

現在の活動:
– 本業:シニアクラウドアーキテクト
– 副業:AKS導入コンサルティング(月額80万円)
– 講演・研修:技術カンファレンスでの講演(月2-3回)
– 執筆活動:技術記事・書籍執筆

効果的な学習ロードマップ

Phase 1:基礎習得(2-3ヶ月)
– Kubernetesの基本概念理解
– AKSの基本操作習得
– コンテナ化の実践
– 基本的なデプロイメント実装

Phase 2:運用スキル(3-6ヶ月)
– 監視・ログ設定の実践
– 自動スケーリング設定
– セキュリティ設定の強化
– CI/CDパイプライン構築

Phase 3:最適化スキル(6-12ヶ月)
– コスト最適化の実践
– パフォーマンスチューニング
– 障害対応・復旧手順の確立
– 大規模運用の経験積み

Phase 4:アーキテクチャ設計(12ヶ月以降)
– マイクロサービスアーキテクチャ設計
– マルチクラウド戦略立案
– 企業向けコンサルティング
– 技術コミュニティでの発信

転職・フリーランスでの活用

アピールポイント:
具体的な成果:「コストを40%削減」「可用性99.9%を実現」
技術的深度:Kubernetesの深い理解と実践経験
ビジネス価値:コスト削減・効率化への貢献

想定年収レンジ:
中級エンジニア:800-1,200万円
シニアエンジニア:1,200-1,800万円
アーキテクト・コンサルタント:1,500-2,500万円
フリーランス:月単価100-200万円

まとめ:AKS運用成功の要因

成功の重要な要素

1. 継続的な監視と改善
一度設定して終わりではなく、継続的な監視と改善が重要です。

2. ビジネス価値の重視
技術的な興味だけでなく、常にビジネス価値を意識することが成功の鍵です。

3. チーム全体での取り組み
個人の努力だけでなく、チーム全体での理解と協力が不可欠です。

4. 段階的な最適化
一度に全てを変更するのではなく、段階的に最適化を進めることが重要です。

今後の展望

AKSは今後も進化を続けるでしょう。特に注目している分野:

技術的進化:
– Serverless Kubernetes(Virtual Kubelet)の活用
– AI/MLワークロードの最適化
– エッジコンピューティングとの連携

運用の進化:
– GitOpsによる宣言的運用
– Policy as Codeによるガバナンス強化
– FinOpsによるコスト管理の高度化

最後に:実践への第一歩

Azure Kubernetes Serviceは、現代のクラウドネイティブアプリケーションの中核となる技術です。しかし、適切な設計と運用なしには、コストが膨大になるリスクもあります。

私も最初は失敗の連続でした。しかし、その失敗から学び、継続的に改善を重ねることで、現在の成果を得ることができました。

まずは小さなプロジェクトから始めて、徐々にその威力を実感してください。この記事で紹介した実践的なテクニックを活用して、あなたもコスト効率的なAKS運用と、それに伴うキャリアアップを実現してください。

成功への道のりは、今日の一歩から始まります。


関連記事
Azure Functions実践活用術
Azure Cosmos DB実践ガイド
Docker本番運用で失敗しない5つの鉄則

コメント

タイトルとURLをコピーしました