Kubernetes クラスタの構築を通して各コンポーネントの理解を深めよう 〜 Kubernetes The Hard Way のご紹介 〜

この記事は [Z Lab Advent Calendar 2018](https://qiita.com/advent-calendar/2018/zlab) の 25日目の記事となります。

こんにちは、ゼットラボ株式会社の [@ryysud](https://qiita.com/ryysud) です。メリークリスマス:santa::christmas_tree:
この記事では GCP 上に Kubernetes クラスタを0から構築するチュートリアルである [Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way) の紹介をします。

# Kubernetes The Hard Way とは？

## 概要

[Kubernetes: Up and Running ( 入門 Kubernetes )](https://www.oreilly.co.jp/books/9784873118406/) の著者である [Kelsey Hightower](https://github.com/kelseyhightower) 氏が GitHub 上で公開している Kubernetes クラスタを0から構築するチュートリアルが [Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way) となります。

`The Hard Way` と題にもある通り、GCP を使ってインスタンスを作成して、ネットワーク構築や各種コンポーネント（etcd, kube-apiserver, kube-scheduler, kubelet, and more.）のインストールまでも、自らコマンドを実行して行っていくので、やや難易度は高めとのことなのですが、チュートリアルの説明が初学者の私にも大変わかりやすく、あまり難しい印象は受けませんでした。過去にはチュートリアル通りには動かないこともあったようですが、現在はそんなこともありませんでした。

では、ここから Kubernetes The Hard Way で実施するチュートリアルの流れなどを紹介していきます。

## クラスタ構成

- クラスタはインスタンス6台で構成
	- Controller Node * 3 ( Master Node )
	- Worker Node * 3
- OS は Ubuntu 18.04 を利用
	- containerd のサポートが強いという理由から採用とのこと
- 各種コンポーネントは systemd で稼働

## 利用バージョン

以下がチュートリアルで利用するソフトウェアのバージョンですが最新バージョンとの大きな差異はないように思えます。

- Kubernetes 1.12.0（2018年12月時点の最新バージョンは [1.13.0](https://github.com/kubernetes/kubernetes/releases)）
- containerd Container Runtime 1.2.0-rc.0（2018年12月時点の最新バージョンは [1.2.1](https://github.com/containerd/containerd/releases)）
- gVisor 50c283b9f56bb7200938d9e207355f05f79f0d17（2018年12月時点の最新バージョンは [こちら](https://github.com/google/gvisor)）
- CNI Container Networking 0.6.0（2018年12月時点の最新バージョンは [0.6.0](https://github.com/containernetworking/cni/releases)）
- etcd v3.3.9（2018年12月時点の最新バージョンは [3.3.10](https://github.com/etcd-io/etcd/releases)）
- CoreDNS v1.2.2（2018年12月時点の最新バージョンは [1.2.6](https://github.com/coredns/coredns/releases)）

## チュートリアルの流れ

全部で 14 の項目が用意されており、そちらを順々に進めていく形となります。
冒頭にも述べた通り、各チュートリアルはコマンドと共に丁寧に説明がなされていて、とてもわかりやすいです。

1. GCP のセットアップ
2. クラスタ構築に必要な CLI のインストール
3. インスタンスの作成とネットワーク構築
4. 認証局、TLS 証明書、鍵の作成と配布
5. Kubernetes クラスタに必要な設定ファイルの作成と配布
6. データの暗号化に利用する設定ファイル、鍵の作成と配布
7. etcd クラスタの構築
8. Controller Node のセットアップ
9. Worker Node のセットアップ
10. Kubernetes クラスタをリモートから操作するための準備
11. Pod 関連のネットワーク構築
12. CoreDNS のデプロイ
13. kubectl を利用した Kubernetes クラスタの操作
14. 後片付け

# Kubernetes The Hard Way を終えて

## 掛かった時間と費用

自分は色々と試しながら実施したので `4時間 ~ 5時間` 掛かりましたが、前提知識があり普通に進めるだけなら `2時間 ~ 3時間` で終えられそうな印象でした。費用に関しては、[チュートリアル](https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/docs/01-prerequisites.md#google-cloud-platform) にも記載があるとおりで `$0.22 per hour ($5.39 per day)` 程で自分もそれぐらいでした。

チュートリアルでは GCP を利用することが前提に説明されていますが、インスタンスやネットワーク要件を満たして準備が出来れば AWS でも OpenStack でも実施可能ですし、どうしても費用などが気になる方は、[vagrantで気軽にKubernetes The Hard Way](https://qiita.com/inajob/items/067f68b6021130911a09) を参考に Vagrant を利用してローカル環境で実施することも可能です。

## 実際にやってみて理解が深まった進め方

以下の作業を並列で実施しながら、チュートリアルを進めたのが結果的にはプラスになったと感じました。

- [Kubernetes: 構成コンポーネント一覧](https://qiita.com/tkusumi/items/c2a92cd52bfdb9edd613) を参照して各種コンポーネントの役割と関係を把握
    - 実際に進めていく作業1つ1つがなぜ必要なのかが明らかになります
- 各種コンポーネントのログを jounrald で垂れ流しながら kubectl で Kubernetes クラスタの基本的な制御を実行
    - コンポーネント1つずつに注目してログを確認していくことで中身の細かな処理を知ることが出来て非常に面白いです
    - 更に詳しく知りたい人はログレベルを調整しても面白いかも
- Kubernetes クラスタを稼働させている最中に特定のコンポーネントを停止したり起動したり
    - 壊し方（壊れ方）を知ることでトラブルシューティングにも役立つという経験からやってみました

## チュートリアルを終えての所感

インスタンス作成や、ネットワーク構築、TLS で通信を行うために認証局と証明書と鍵を作成して配布するところから、公式が提供するバイナリをダウンロードして Kubernetes クラスタを構築した後で、実際にアプリケーションを稼働させて制御するところまでの一連の作業を全て自分で進められるので、Kubernetes への理解が深まる非常に有意義なチュートリアルでした。

また、Kubernetes The Hard Way を通して各種コンポーネントの役割や、正常に稼働させるために必要な作業を網羅的に知ることができるので、GKE・AKS・EKS のような Kubernetes as a Service を利用されている方でも、裏側でどんなコンポーネントがどのように稼働しているのかを知れるので、エンジニア観点として非常に面白いかと思います。

# さいごに

今回の記事では、GCP 上に Kubernetes クラスタを0から構築するチュートリアルである [Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way) の紹介をさせて頂きました。実際に実施してみて得るものがとても大きかったので、少しでも興味がある方にオススメです！

また、[Z Lab Advent Calendar 2018](https://qiita.com/advent-calendar/2018/zlab) では Kubernetes に関連する記事も多く投稿されていますので、業務や趣味開発などで Kubernetes を利用されている方は是非是非チェックしてみてください！

---

このエントリは、弊社 Z Lab のメンバーによる [Z Lab Advent Calendar 2018](https://qiita.com/advent-calendar/2018/zlab) の 25日目 として業務時間中に書きました。