0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【書評】Cloud Native DevOps with Kubernetes, 2nd Edition

0
Posted at

はじめに

本書は、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」です。差別化につながらない重労働はアウトソースし、コアビジネスへの投資に集中するという考え方です。

セルフホストは特殊要件がある場合のみ。それでもやるなら kubeadmkops を活用し、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のデフォルト動作
カナリアデプロイ 一部のトラフィックを新バージョンへ流し段階的に拡大
ブルー/グリーン 旧・新を並走させトラフィックを一気に切り替え

readinessProbeminReadySecondsの組み合わせで、ローリングアップデート中の可用性を担保します。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つ挙げます。

  1. マネージドサービスを推薦する潔さ:「Kubernetesの本でKubernetesを自分で動かすな」という逆説が、実用性重視の姿勢を端的に示しています。
  2. コストに対する誠実な向き合い方:リソースリクエストの設定からプリエンプティブインスタンスの活用まで、クラウドコストを具体的に論じています。
  3. 可観測性への厚い記述:デプロイしたら終わりでなく、本番運用こそが本番だという視点が随所に感じられます。

「Kubernetesはいずれ背景に溶け込み、良い意味で退屈なインフラになる」——その言葉が本書の精神を表していると思います。Kubernetesを使い始めているエンジニアにも、これから導入を検討している方にも、通読をおすすめできる一冊です。


参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?