はじめに
本書は、Kubernetesを中心としたクラウドネイティブなDevOps実践を初心者から本番運用担当まで網羅的にカバーしています。ツール解説にとどまらず、「なぜKubernetesなのか」という背景から可観測性・セキュリティ・CI/CDまで一冊で俯瞰できます。
第1章:クラウドの革命
本書は現代のソフトウェア開発を取り巻く3つの革命から語り起こします。
- クラウド:コンピュートを「買う」から「借りる」へ。インフラが従量課金のコモディティになりました。
- DevOps:開発と運用の壁を取り払いフィードバックループを高速化する考え方。文化・自動化・計測・共有(CAMS)が指針です。
- コンテナ:アプリと依存関係を丸ごとパッケージする標準形式。VMと違い仮想化レイヤーのオーバーヘッドがなく軽量です。
クラウドネイティブなシステムの特徴として、自動化可能・ユビキタス・レジリエント・可観測・分散型の5点が挙げられています。
ただしマイクロサービスは銀の弾丸ではありません。分割の粒度とサービス境界の設計こそが腕の見せ所です。
Kubernetesはこの交差点に生まれたデファクトスタンダードです。GoogleのBorgプロジェクトから学んだ知見をオープンソースに落とし込みました。
第2章:Kubernetesで最初の一歩
ハンズオン形式でGoアプリのコンテナ化〜Kubernetes上へのデプロイを体験します。マルチステージビルドがポイントです。
FROM golang:1.17-alpine AS build
WORKDIR /src/
COPY main.go go.* /src/
RUN CGO_ENABLED=0 go build -o /bin/demo
FROM scratch
COPY --from=build /bin/demo /bin/demo
ENTRYPOINT ["/bin/demo"]
ビルド環境と実行環境を分離することで最終イメージを約6MBに抑えられます。コンテナが小さいほどセキュリティリスクも低減します。
第3章:Kubernetesを手に入れる
マネージドサービスの利用が強く推奨されています。セルフホストには高可用性・セキュリティ・バックアップ・定期メンテナンスなど膨大な考慮が必要です。
| サービス | 特徴 |
|---|---|
| GKE | Kubernetesの創始者。Autopilotモードでワーカーノードも管理委託可能 |
| EKS | AWS既存インフラがある場合の自然な選択 |
| AKS | 新バージョン対応が早くAzureエコシステムとの統合が強い |
本書の軸となる哲学が「Run Less Software」です。差別化につながらない重労働はアウトソースし、コアビジネスへの投資に集中するという考え方です。
セルフホストは特殊要件がある場合のみ。それでもやるなら kubeadm や kops を活用し、HA・セキュリティ・監視の3点は必ず設計してください。
第4章:Kubernetesオブジェクトを操作する
すべてのリソースはYAML形式のマニフェストで宣言的に管理します。
kubectl apply -f deployment.yaml # 適用
kubectl diff -f deployment.yaml # 差分確認
主要なリソース種別はDeployment・Service・ConfigMap・Secretです。Helmによるパッケージ管理も本章のトピックで、複数マニフェストをチャートにまとめ変数でカスタマイズします。
第5章:リソースを管理する
スケジューラが適切にPodを配置するにはリクエストとリミットの明示が必須です。
resources:
requests:
memory: "128Mi"
cpu: "200m"
limits:
memory: "256Mi"
cpu: "500m"
QoSクラスはリクエスト/リミットの設定から自動決定され、リソース逼迫時の退去優先度に影響します。
Probeの設定も重要です。
-
livenessProbe:失敗するとコンテナをkillして再起動 -
readinessProbe:失敗するとServiceのエンドポイントから除外(killはしない) -
startupProbe:起動完了を判定し、完了後にlivenessProbeへ移譲
PodDisruptionBudgetで計画的な立ち退き時のレプリカ最小数を保証でき、Namespaceでクラスタを論理的にパーティショニングできます。ResourceQuotaでNamespaceごとのリソース上限を、LimitRangeでデフォルト値を設定します。
コスト最適化にはプリエンプティブインスタンス(スポットインスタンス)が有効です。ノードアフィニティでクリティカルなPodを除外しつつ、コストを最大50%削減できる逸話があります。
第6章:クラスターの演算子
-
kubectl drainでPodを安全に退避させてからノードをメンテナンス - HPA(Horizontal Pod Autoscaler)でCPU使用率に応じてレプリカ数を自動調整
- Cluster AutoscalerでノードプールのVM数を動的に増減
- カオステストで意図的に障害を起こしレジリエンスを検証
第7章:Kubernetesパワーツール
日常運用を快適にするツール群です。
- kubectx / kubens:コンテキストとNamespaceを素早く切り替え
- stern:複数PodのログをリアルタイムでTail
- k9s:ターミナルベースのKubernetesダッシュボード
kubectl explain deployment.spec.template.spec.containers # リソース定義の確認
kubectl get pods --all-namespaces # 全Namespace横断
kubectl get deployment demo -o yaml # YAML出力
第8章:コンテナを実行する
Podの仕様とコンテナ設計の詳細です。
-
セキュリティコンテキスト:
runAsNonRoot: true・read-only rootファイルシステムで権限を最小化 - InitContainer:メインコンテナ起動前の前処理
- サイドカーパターン:ロギングやプロキシをメインコンテナから分離
第9章:Podを管理する
| リソース | 用途 |
|---|---|
| Deployment | ステートレスなアプリの標準的なデプロイ管理 |
| StatefulSet | 固定のPodアイデンティティが必要なステートフルアプリ |
| DaemonSet | 全ノードに1つずつPod展開(ロギングエージェントなど) |
| Job / CronJob | 一度きり・定期実行のバッチ処理 |
ラベルとセレクタはKubernetesの根幹機能で、Serviceはselectorで対象Podをフィルタします。
第10章:コンフィギュレーションと秘密
- ConfigMap:非機密設定を環境変数またはファイルとしてマウント
- Secret:機密情報はetcdに保存されるため、etcd暗号化とRBACが必須
- 外部シークレット管理:AWS Secrets Manager・HashiCorp VaultをExternal Secrets Operatorで自動同期
KubernetesのSecretはデフォルトでBase64エンコードのみです。etcdの暗号化設定とシークレットへのRBACは必ず実施してください。
第11章:セキュリティ、バックアップ、クラスタの健全性
RBACで最小権限の原則を実施します。ServiceAccountごとに必要なRoleだけを付与します。
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
kube-benchでCIS Benchmarkに照らした設定診断、etcdスナップショットによるバックアップとリストアの定期テストも欠かせません。
第12章:Kubernetesアプリケーションのデプロイ
- Helm:チャートによるテンプレート化と依存関係管理
-
Kustomize:Overlayで環境差分を管理。
kubectl apply -kでネイティブ対応 - GitOps:GitリポジトリをSSOTとし、ArgoCD・Flux CDでクラスタを自動同期
特にKustomize + GitOpsの組み合わせは、学習コストが低く中小規模チームに実践しやすい構成です。
第13章:開発ワークフロー
デプロイ戦略の比較:
| 戦略 | 概要 |
|---|---|
| ローリングアップデート | Podを徐々に切り替え。Kubernetesのデフォルト動作 |
| カナリアデプロイ | 一部のトラフィックを新バージョンへ流し段階的に拡大 |
| ブルー/グリーン | 旧・新を並走させトラフィックを一気に切り替え |
readinessProbeとminReadySecondsの組み合わせで、ローリングアップデート中の可用性を担保します。Skaffoldはコード保存のたびに自動デプロイするローカル開発を快適にします。
第14章:継続的デプロイ
GitHub Actions・GitLab CIでPushをトリガーにイメージビルド〜デプロイを自動化します。ArgoCDはGitリポジトリの状態をKubernetesクラスタに常時同期するGitOpsツールとして広く使われています。
第15章:可観測性とモニタリング
可観測性はモニタリング・ロギング・トレーシングの三本柱で実現します。
- Prometheus + Grafana:メトリクス収集とダッシュボード可視化
- Fluentd / Fluent Bit:ログ収集エージェント
- Jaeger / Zipkin:分散トレーシング
グレーの故障——完全にはダウンしていないが性能が劣化している状態——を検知するには単純な死活監視では不十分です。REDメソッド(Rate・Errors・Duration)を計測・アラート化することが推奨されています。
SLO(サービスレベル目標)とエラーバジェットを導入することで、「どの程度の可用性を保証するか」を定量的に管理できます。
第16章:Kubernetesにおけるメトリクス
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: demo-monitor
spec:
selector:
matchLabels:
app: demo
endpoints:
- port: metrics
アプリ側は/metricsエンドポイントをPrometheus形式で公開します。カスタムメトリクスをHPAと連携させることで、CPUだけでなくキューの深さやビジネス指標によるオートスケーリングも実現できます。
本書を読んで感じたこと
本書の強みは**「なぜ」から始まる一貫した思想**にあります。特に印象に残った点を3つ挙げます。
- マネージドサービスを推薦する潔さ:「Kubernetesの本でKubernetesを自分で動かすな」という逆説が、実用性重視の姿勢を端的に示しています。
- コストに対する誠実な向き合い方:リソースリクエストの設定からプリエンプティブインスタンスの活用まで、クラウドコストを具体的に論じています。
- 可観測性への厚い記述:デプロイしたら終わりでなく、本番運用こそが本番だという視点が随所に感じられます。
「Kubernetesはいずれ背景に溶け込み、良い意味で退屈なインフラになる」——その言葉が本書の精神を表していると思います。Kubernetesを使い始めているエンジニアにも、これから導入を検討している方にも、通読をおすすめできる一冊です。