Kubernetesが標準プラットフォームであるクラウドネイティブの世界でアプリケーションを開発し運用する方法を解説する書籍です。
はじめに、Kubernetesの概要と背景、ソフトウェアの開発と運用にKubernetesがもたらす変化、コンテナの動作原理、コンテナの構築および管理方法、クラウドネイティブなサービスおよびインフラの設計方法などの基礎を紹介します。
そしてKubernetesアプリケーションの作成とデプロイ、Kubernetesクラスタの設定と運用、クラウドインフラの自動化、Helmなどのツールを用いたデプロイについてサンプルコードを使って学習します。ロールベースのアクセス制御(RBAC)をはじめとした、セキュリティ、認証、パーミッションなどに対するKubernetesのサポートや、本番でコンテナとKubernetesの安全性を確保するためのベストプラクティスについても学びます。
さらにKubernetesで継続的インテグレーションと継続的デプロイをセットアップする方法、データをバックアップおよび復元する方法、クラスタの適合性や信頼性をテストする方法、監視・トレーシング・ロギング・メトリクスを集約する方法、Kubernetesインフラの拡張性・耐障害性・費用対効果を高める方法を解説します。
Kubernetesの基本から、継続的デプロイ、機密情報管理、オブザーバビリティなどの高度なトピックを扱う本書は、サーバ、アプリケーション、サービスを管理するIT運用者、クラウドネイティブサービスの構築や移行を行う開発者必携の一冊です。
Kubernetesで実践するクラウドネイティブDevOps
John Arundel、Justin Domingus 著、須田 一輝 監訳、渡邉 了介 訳
- TOPICS
- System/Network
- 発行年月日
- 2020年02月
- PRINT LENGTH
- 384
- ISBN
- 978-4-87311-901-4
- 原書
- Cloud Native DevOps with Kubernetes
- FORMAT
- Print PDF EPUB
目次
本書への推薦の言葉 監訳者まえがき 序文 はじめに 1章 クラウドでの革命 1.1 クラウドの創造 1.1.1 時間を買う 1.1.2 Infrastructure as a Service 1.2 DevOpsの黎明 1.2.1 DevOpsに対する無理解 1.2.2 ビジネスにとってのメリット 1.2.3 Infrastructure as Code 1.2.4 ともに学ぶ 1.3 コンテナの到来 1.3.1 これまでの状況 1.3.2 常識を打ち破った箱 1.3.3 ソフトウェアのコンテナへの格納 1.3.4 プラグ&プレイ型アプリケーション 1.4 コンテナのオーケストラを指揮する 1.5 Kubernetes 1.5.1 Borgから Kubernetesへ 1.5.2 Kubernetesが高い価値を誇る理由 1.5.3 Kubernetesもいずれ消え去るのか 1.5.4 Kubernetesは万能ではない 1.6 クラウドネイティブ 1.7 運用の将来 1.7.1 分散型の DevOps 1.7.2 集中管理が残る領域 1.7.3 開発者生産性工学 1.7.4 皆さんこそが将来 1.8 まとめ 2章 Kubernetes最初の一歩 2.1 最初のコンテナの実行 2.1.1 Docker Desktopのインストール 2.1.2 Dockerの概要 2.1.3 コンテナイメージの実行 2.2 デモアプリケーション 2.2.1 ソースコードの内容 2.2.2 Goについて 2.2.3 デモアプリケーションが動作する仕組み 2.3 コンテナのビルド 2.3.1 Dockerfileの理解 2.3.2 最小限のコンテナイメージ 2.3.3 docker image buildの実行 2.3.4 イメージの命名 2.3.5 ポート転送 2.4 コンテナレジストリ 2.4.1 レジストリの認証 2.4.2 イメージの命名とプッシュ 2.4.3 イメージの実行 2.5 ようこそ Kubernetesへ 2.5.1 デモアプリケーションの実行 2.5.2 コンテナが起動しない場合 2.6 Minikube 2.7 まとめ 3章 Kubernetes環境の選択 3.1 クラスタのアーキテクチャ 3.1.1 コントロールプレーン 3.1.2 ノードのコンポーネント 3.1.3 高可用性 3.2 セルフホスティング型 Kubernetesのコスト 3.2.1 想像以上に面倒な作業 3.2.2 初期セットアップだけの問題ではない 3.2.3 痒いところに手が届くわけではないツール 3.2.4 Kubernetesは難しい 3.2.5 管理のオーバヘッド 3.2.6 まずはマネージドサービスから 3.3 マネージド Kubernetesサービス 3.3.1 Google Kubernetes Engine(GKE) 3.3.2 クラスタのオートスケール 3.3.3 Amazon Elastic Container Service for Kubernetes(EKS) 3.3.4 Azure Kubernetes Service(AKS) 3.3.5 OpenShift 3.3.6 IBM Cloud Kubernetes Service 3.3.7 Heptio Kubernetes Subscription(HKS) 3.4 ターンキー方式の Kubernetesソリューション 3.4.1 Stackpoint.io 3.4.2 Containership Kubernetes Engine(CKE) 3.5 Kubernetesインストーラ 3.5.1 kops 3.5.2 Kubespray 3.5.3 TK8 3.5.4 Kubernetes The Hard Way 3.5.5 kubeadm 3.5.6 Tarmak 3.5.7 Rancher Kubernetes Engine(RKE) 3.5.8 Puppet Kubernetesモジュール 3.5.9 Kubeformation 3.6 購入か構築か:本書の推奨事項 3.6.1 実行するソフトウェアを減らす 3.6.2 可能ならマネージド Kubernetesを使用 3.6.3 ベンダロックインの問題 3.6.4 どうしても必要なら標準の Kubernetesセルフホスティングツールを使用 3.6.5 選択肢が限られる場合 3.6.6 ベアメタルとオンプレミス 3.7 クラスタレスのコンテナサービス 3.7.1 Amazon Fargate 3.7.2 Azure Container Instances(ACI) 3.8 まとめ 4章 Kubernetesオブジェクトの基本操作 4.1 Deployment 4.1.1 スーパバイズ機能とスケジューリング 4.1.2 コンテナの再起動 4.1.3 Deployment情報の取得 4.2 Pod 4.3 ReplicaSet 4.4 望ましい状態の維持 4.5 Kubernetesスケジューラ 4.6 YAML形式のリソースマニフェスト 4.6.1 リソースがデータ 4.6.2 Deploymentマニフェスト 4.6.3 kubectl applyの使用 4.6.4 Serviceリソース 4.6.5 kubectlを用いたクラスタへのクエリ 4.6.6 リソース管理の次の段階 4.7 Helm:Kubernetesパッケージマネージャ 4.7.1 Helmのインストール 4.7.2 Helmチャートのインストール 4.7.3 チャート、リポジトリ、リリース 4.7.4 Helmリリースのリスト表示 4.8 まとめ 5章 リソースの管理 5.1 リソースの理解 5.1.1 リソースの単位 5.1.2 リソース要求 5.1.3 リソース制限 5.1.4 コンテナは小さく保つ 5.2 コンテナのライフサイクル管理 5.2.1 Liveness probe 5.2.2 ブローブの遅延と頻度 5.2.3 他のタイプのプローブ 5.2.4 gRPC probe 5.2.5 Readiness probe 5.2.6 ファイルベースのReadiness probe 5.2.7 minReadySeconds 5.2.8 Pod Disruption Budget 5.3 Namespaceの使用 5.3.1 Namespaceを使った作業 5.3.2 Namespaceの選択基準 5.3.3 Serviceのアドレス 5.3.4 リソースのクオータ 5.3.5 リソース要求とリソース制限のデフォルト値 5.4 クラスタのコストの最適化 5.4.1 Deploymentの最適化 5.4.2 Podの最適化 5.4.3 Vertical Pod Autoscaler 5.4.4 ノードの最適化 5.4.5 ストレージの最適化 5.4.6 未使用リソースのクリーンアップ 5.4.7 余剰キャパシティのチェック 5.4.8 リザーブドインスタンスの使用 5.4.9 プリエンプティブ(スポット)インスタンスの使用 5.4.10 ワークロードのバランスの維持 5.5 まとめ 6章 クラスタの運用 6.1 クラスタのサイジングとスケーリング 6.1.1 キャパシティ計画 6.1.2 ノードとインスタンス 6.1.3 クラスタのスケーリング 6.2 適合性のチェック 6.2.1 CNCF認定 6.2.2 Sonobuoyによる適合性テスト 6.3 検証と監査 6.3.1 K8Guard 6.3.2 Copper 6.3.3 kube-bench 6.3.4 Kubernetesの監査ロギング 6.4 カオステスト 6.4.1 本番だけが本番 6.4.2 chaoskube 6.4.3 kube-monkey 6.4.4 PowerfulSeal 6.5 まとめ 7章 Kubernetesの強力なツール 7.1 kubectlを極める 7.1.1 シェルエイリアス 7.1.2 フラグの短縮形の使用 7.1.3 リソースタイプの省略 7.1.4 kubectlコマンドの自動補完機能 7.1.5 ヘルプの表示 7.1.6 Kubernetesリソースに関するヘルプの表示 7.1.7 より詳細な出力の表示 7.1.8 JSONデータと jqの活用 7.1.9 オブジェクトの監視 7.1.10 オブジェクトに関する記述 7.2 リソースを使った作業 7.2.1 命令的な kubectlコマンド 7.2.2 命令的コマンドを使うべきではない場合 7.2.3 リソースマニフェストの生成 7.2.4 リソースのエクスポート 7.2.5 リソースの差分チェック 7.3 コンテナを使った作業 7.3.1 コンテナのログの閲覧 7.3.2 コンテナへのアタッチ 7.3.3 kubespyによる Kubernetesリソースの監視 7.3.4 コンテナポートの転送 7.3.5 コンテナでのコマンド実行 7.3.6 トラブルシューティングのためのコンテナ実行 7.3.7 BusyBoxコマンドの使用 7.3.8 BusyBoxのコンテナへの追加 7.3.9 コンテナへのプログラムのインストール 7.3.10 kubesquashによるライブデバッグ 7.4 Contextと Namespace 7.4.1 kubectxと kubens 7.4.2 kube-ps1 7.5 Kubernetesのシェルとツール 7.5.1 kube-shell 7.5.2 Click 7.5.3 kubed-sh 7.5.4 Stern 7.6 独自の Kubernetesツールの構築 7.7 まとめ 8章 コンテナの実行 8.1 コンテナと Pod 8.1.1 コンテナとは何か 8.1.2 コンテナの構成要素 8.1.3 Podの構成要素 8.2 コンテナのマニフェスト 8.2.1 イメージ識別子 8.2.2 latestタグ 8.2.3 コンテナのダイジェスト 8.2.4 ベースイメージのタグ 8.2.5 ポート 8.2.6 リソース要求とリソース制限 8.2.7 イメージのプルに関するポリシ 8.2.8 環境変数 8.3 コンテナのセキュリティ 8.3.1 非rootユーザとしてのコンテナ実行 8.3.2 rootコンテナのブロック 8.3.3 読み取り専用ファイルシステムの設定 8.3.4 権限昇格の無効化 8.3.5 ケイパビリティ 8.3.6 Podのセキュリティコンテキスト 8.3.7 Podのセキュリティに関するポリシ 8.3.8 Podのサービスアカウント 8.4 ボリューム 8.4.1 emptyDirボリューム 8.4.2 永続ボリューム 8.5 再起動ポリシ 8.6 Image Pull Secret 8.7 まとめ 9章 Podの管理 9.1 Label 9.1.1 Labelとは何か 9.1.2 セレクタ 9.1.3 セレクタの高度な使い方 9.1.4 Labelの他の使い方 9.1.5 LabelとAnnotation 9.2 Node Affinity 9.2.1 ハード Affinity 9.2.2 ソフト Affinity 9.3 Podの Affinityと Anti-Affinity 9.3.1 Podの同居 9.3.2 Podの分離 9.3.3 ソフト Anti-Affinity 9.3.4 Pod Affinityを使ってもよい場合 9.4 Taintと Toleration 9.5 Podコントローラ 9.5.1 DaemonSet 9.5.2 StatefulSet 9.5.3 Job 9.5.4 CronJob 9.5.5 Horizontal Pod Autoscaler 9.5.6 PodPreset 9.5.7 Operatorと Custom Resource Definition(CRD) 9.6 Ingressリソース 9.6.1 Ingressルール 9.6.2 Ingressによる TLS終端 9.6.3 Ingressコントローラ 9.7 Istio 9.8 Envoy 9.9 まとめ 10章 設定と機密情報 10.1 ConfigMap 10.1.1 ConfigMapの作成 10.1.2 ConfigMapからの環境変数の設定 10.1.3 ConfigMapからの環境全体の設定 10.1.4 コマンド引数での環境変数の使用 10.1.5 ConfigMapからの設定ファイルの作成 10.1.6 設定変更に伴う Podの更新 10.2 Kubernetesの Secret 10.2.1 環境変数としてのSecretの使用 10.2.2 Secretのファイルへの書き込み 10.2.3 Secretの読み取り 10.2.4 Secretへのアクセス 10.2.5 保存データの暗号化 10.2.6 Secretの保持 10.3 機密情報管理の戦略 10.3.1 バージョン管理を通じた機密情報の暗号化 10.3.2 機密情報のリモート保存 10.3.3 専用の機密情報管理ツールの使用 10.3.4 本書の推奨事項 10.4 SOPSによる機密情報の暗号化 10.4.1 SOPSの概要 10.4.2 SOPSによるファイルの暗号化 10.4.3 KMSバックエンドの使用 10.5 まとめ 11章 セキュリティとバックアップ 11.1 アクセス制御とパーミッション 11.1.1 クラスタ別のアクセス管理 11.1.2 ロールベースのアクセス制御(RBAC)の導入 11.1.3 ロールの理解 11.1.4 ユーザに対するロールのバインディング 11.1.5 必要なロールの判断 11.1.6 cluster-adminに対するアクセスの保護 11.1.7 アプリケーションとデプロイ 11.1.8 RBACのトラブルシューティング 11.2 セキュリティスキャン 11.2.1 Clair 11.2.2 Aqua Security 11.2.3 Anchore Engine 11.3 バックアップ 11.3.1 Kubernetesをバックアップする必要性 11.3.2 etcdのバックアップ 11.3.3 リソース状態のバックアップ 11.3.4 クラスタ状態のバックアップ 11.3.5 大小のディザスタ 11.3.6 Velero 11.4 クラスタのステータスの監視 11.4.1 kubectl 11.4.2 CPUとメモリの使用率 11.4.3 クラウドプロバイダのコンソール 11.4.4 Kubernetes Dashboard 11.4.5 Weave Scope 11.4.6 kube-ops-view 11.4.7 node-problem-detector 11.5 参考文献 11.6 まとめ 12章 Kubernetesアプリケーションのデプロイ 12.1 Helmによるマニフェストのビルド 12.1.1 Helmチャートの内部構成 12.1.2 Helmテンプレート 12.1.3 変数の補完 12.1.4 テンプレートにおける値の引用 12.1.5 依存関係の指定 12.2 Helmチャートのデプロイ 12.2.1 変数の設定 12.2.2 Helmリリースにおける値の指定 12.2.3 アプリケーションの Helmによる更新 12.2.4 以前のバージョンへのロールバック 12.2.5 Helmチャートリポジトリの作成 12.2.6 Helmチャート内の SecretのSOPSによる管理 12.3 Helmfileによる複数チャートの管理 12.3.1 Helmfileの内容 12.3.2 チャートのメタデータ 12.3.3 Helmfileの適用 12.4 高度なマニフェスト管理ツール 12.4.1 ksonnet 12.4.2 Kapitan 12.4.3 kustomize 12.4.4 kompose 12.4.5 Ansible 12.4.6 Kubeval 12.5 まとめ 13章 開発ワークフロー 13.1 開発ツール 13.1.1 Skaffold 13.1.2 Draft 13.1.3 Telepresence 13.1.4 Knative 13.2 デプロイ戦略 13.2.1 ローリングアップデート 13.2.2 Recreate 13.2.3 maxSurgeと maxUnavailable 13.2.4 ブルーグリーンデプロイ 13.2.5 レインボーデプロイ 13.2.6 カナリアデプロイ 13.3 Helmによる移行処理 13.3.1 Helmのフック機能 13.3.2 フック失敗時の対応 13.3.3 他のフック 13.3.4 フックのチェーン化 13.4 まとめ 14章 Kubernetesにおける継続的デプロイ 14.1 継続的デプロイとは何か 14.2 おすすめの CDツール 14.2.1 Jenkins 14.2.2 Drone 14.2.3 Google Cloud Build 14.2.4 Concourse 14.2.5 Spinnaker 14.2.6 GitLab CI 14.2.7 Codefresh 14.2.8 Azure Pipelines 14.3 CDのコンポーネント 14.3.1 Docker Hub 14.3.2 Gitkube 14.3.3 Flux 14.3.4 Keel 14.4 Cloud Buildによる CDパイプライン 14.4.1 Google Cloudと GKEのセットアップ 14.4.2 デモリポジトリのフォーク 14.4.3 Cloud Buildの導入 14.4.4 テスト用コンテナのビルド 14.4.5 テストの実行 14.4.6 アプリケーションコンテナのビルド 14.4.7 Kubernetesマニフェストの検証 14.4.8 イメージのパブリッシュ 14.4.9 Git SHAタグ 14.4.10 最初のビルドトリガの作成 14.4.11 トリガのテスト 14.4.12 CDパイプラインからのデプロイ 14.4.13 デプロイトリガの作成 14.4.14 ビルドパイプラインの最適化 14.4.15 パイプライン例の適応化 14.5 まとめ 15章 オブザーバビリティと監視 15.1 オブザーバビリティとは何か 15.1.1 監視とは何か 15.1.2 ブラックボックス監視 15.1.3 「アップ」の意味 15.1.4 ロギング 15.1.5 メトリクスの導入 15.1.6 トレーシング 15.1.7 オブザーバビリティ 15.2 オブザーバビリティパイプライン 15.3 Kubernetesにおける監視 15.3.1 外部からのブラックボックス型チェック 15.3.2 内部ヘルスチェック 15.4 まとめ 16章 Kubernetesにおけるメトリクス 16.1 メトリクスとは実際のところ何か 16.1.1 時系列データ 16.1.2 カウンタとゲージ 16.1.3 メトリクスは何を語れるか 16.2 優れたメトリクスの選択 16.2.1 サービス:REDパターン 16.2.2 リソース:USEパターン 16.2.3 ビジネスメトリクス 16.2.4 Kubernetesのメトリクス 16.3 メトリクスの分析 16.3.1 単純な平均の問題点 16.3.2 単純平均、中央値、外れ値 16.3.3 パーセンタイルの把握 16.3.4 メトリクスデータへのパーセンタイルの適用 16.3.5 最悪を知ることこそ一般の関心事 16.3.6 パーセンタイルを超えて 16.4 メトリクスのダッシュボードによるグラフ化 16.4.1 すべてのサービスで標準レイアウトを使う 16.4.2 マスタダッシュボードで情報ラジエータを構築 16.4.3 壊れていくもののダッシュボード 16.5 メトリクスに基づくアラート 16.5.1 アラートの問題点 16.5.2 オンコールを地獄にすべきではない 16.5.3 緊急かつ重要で対処可能なアラート 16.5.4 アラート、時間外呼び出し、夜間起床の追跡管理 16.6 メトリクス管理のツールとサービス 16.6.1 Prometheus 16.6.2 Google Stackdriver 16.6.3 AWS CloudWatch 16.6.4 Azure Monitor 16.6.5 Datadog 16.6.6 New Relic 16.7 まとめ あとがき 索引