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を選択した理由:
- 既存Azure環境との統合:Azure AD、Azure Monitor、Key Vaultとの連携
- 管理の簡素化:マスターノードの管理が不要
- コスト効率:マスターノードの料金が無料
- 企業サポート: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分散配置の設定不備
学んだ教訓と対策:
- 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"
- 複数のAvailability Zone への分散配置
- 適切な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つの鉄則
コメント