Kubernetesで実践するクラウドネイティブDevOps

[cover photo]
TOPICS
System/Network
発行年月日
PRINT LENGTH
384
ISBN
978-4-87311-901-4
原書
Cloud Native DevOps with Kubernetes
FORMAT
Print PDF EPUB
Ebook
3,850円
Ebookを購入する
Print
3,850円

Kubernetesが標準プラットフォームであるクラウドネイティブの世界でアプリケーションを開発し運用する方法を解説する書籍です。
はじめに、Kubernetesの概要と背景、ソフトウェアの開発と運用にKubernetesがもたらす変化、コンテナの動作原理、コンテナの構築および管理方法、クラウドネイティブなサービスおよびインフラの設計方法などの基礎を紹介します。
そしてKubernetesアプリケーションの作成とデプロイ、Kubernetesクラスタの設定と運用、クラウドインフラの自動化、Helmなどのツールを用いたデプロイについてサンプルコードを使って学習します。ロールベースのアクセス制御(RBAC)をはじめとした、セキュリティ、認証、パーミッションなどに対するKubernetesのサポートや、本番でコンテナとKubernetesの安全性を確保するためのベストプラクティスについても学びます。
さらにKubernetesで継続的インテグレーションと継続的デプロイをセットアップする方法、データをバックアップおよび復元する方法、クラスタの適合性や信頼性をテストする方法、監視・トレーシング・ロギング・メトリクスを集約する方法、Kubernetesインフラの拡張性・耐障害性・費用対効果を高める方法を解説します。
Kubernetesの基本から、継続的デプロイ、機密情報管理、オブザーバビリティなどの高度なトピックを扱う本書は、サーバ、アプリケーション、サービスを管理するIT運用者、クラウドネイティブサービスの構築や移行を行う開発者必携の一冊です。

目次

本書への推薦の言葉
監訳者まえがき
序文
はじめに

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 まとめ

あとがき
索引