kubernetes the hard way on PC (１．概要)

#初めに
CKA の資格試験に向けて、 有名な [kubernetes the hard way](https://github.com/inductor/kubernetes-the-hard-way) を試してみました。
ただ、いくつか苦労した点があったので、それを公開しておこうと思います。

kubernetes the hard way をやるにあたって、（私にとって）ハードルだったのは以下のようなポイントでした。

・環境の最終形がわからず　やりながら初めてどんな環境なのか理解できるようになっている（と思う）
・Google Cloud 上で実施されていた
・英語だったので細かいところが理解できなかった（というか理解しようとしなかった？）
・（おそらく）コピペ等でやっていくと、訳も分からず完了する　（よくできている）
・　他にもいろいろあった気がするが忘れた

※ 2020/07/26 追記）
　kubernetes the hard way 日本語訳ページがありました。。。
 　[Kubernetes The Hard Way(日本語版)](https://github.com/inductor/kubernetes-the-hard-way)
 　まぁ、普通に考えればありそうですよね。。。　もっと早く気づけばよかった。


今回は以下の方針でやってみました。

・ 最初にどんな環境なのか、全体像をまとめる
・ ノート PC 上で実施（ホストPC は Cent OS 8,  master / worker ノードは ubuntu 20)
・ kubernetes the hard way に厳密に合わせることは考えない　（ホスト名や IP, Firewalld など違いがあります）
・ つまづいた原因を突き止めた方法についてもできるだけ記載する
・ kubernetes の基礎的なコンポーネントの説明などは行わない
・ 気が向いたところは調べたことをまとめる

#環境説明（PC）
PC は以下の3台を利用しました　（3台もいりません。2台目の sakura だけあればOKといえば OK です）

|PC|用途・その他|
|:---|:---|
|assam|ThinkPad の NFS サーバー。複数台のVM間でファイルを受け渡しするのに利用。 k8s勉強の中でデータ全消しされる悲劇のPC|
|sakura|kubernetes 環境。 Cent OS 上に KVM で Ubuntu を6台 ( master x 3,  worker x 3 ) 構築|
|???|ThinkPad の操作端末。sakura は閉じておいてあるだけなので、sakura に ssh する普段使いPC|

メインの sakura の スペックは以下の通りです。 (古いPC ですが結構頑張って育てました）

|PC|用途・その他|
|:---|:---|
|PC|Think Pad X220||
|CPU|Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz||
|Memory|16GB| ※増設 |
|Disk|HDD 1TB| ※換装|
|SSD|256GB| ※mSATA スロットに増設 |

なお、 SSD は kubernetes the hard way の勉強中に急遽増設しました。
後述しますが etcd の I/O を HDD ではさばききれませんでした。。。


#環境説明（VM）
メインの環境は下図の通りで、ポイントは以下の通り
・sakura (CentOS 8) 上に　ブリッジ接続 (br0) を構成し、全VM が同一セグメントに所属
・kubernetes 用の各ノードは KVM で ubuntu v20 を利用

※もともとは RedHat 系を使っていたのですが、CKA は ubuntu ということで初めてubuntu を触ってみました

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/e3e4d811-5e16-9172-e0da-b3d59f603ec3.png)

IP/NW 構成は以下の通りです。
なお、kubernetes the hard way に従って、 controller-0 などにしておいた方が
コピー＆ペーストできるので良いですが、私がやるときは何も考えずに下記のホスト名を設定してしまいました。。。

|サーバ|IP|kubernetes the hard wayでは。。|
|:--|:--|:--:|
|k8smaster0|192.168.199.200|controller-0 / 10.240.0.10|
|k8smaster1|192.168.199.201|controller-1 / 10.240.0.11|
|k8smaster2|192.168.199.202|controller-2 / 10.240.0.12|
|k8sworker0|192.168.199.210|worker-0 / 10.240.0.20|
|k8sworker1|192.168.199.211|worker-1 / 10.240.0.21|
|k8sworker2|192.168.199.212|worker-2 / 10.240.0.22|



#環境説明（service / NW ）

**下記の図は、説明用ですので、厳密に正しいか、と言われるとそうではないです（正しい図を書く能力が無い。。。）
今回の環境・設定を説明するうえで関係してくるものを記載している、という感じですのでその点はご留意ください。**

図の見方ですが、以下のようになっています。

|パーツ|概要|
|:--|:--|
|青・黄色の箱|KVM 上で稼働する VM(ubuntu)|
|オレンジ（？）オブジェクト|ubuntu の systemd 配下で稼働する Linux のサービス|
|緑のオブジェクト|Pod/コンテナ|
|白のオブジェクト|コマンド|
|青線|ネットワーク|
|青点線|ネットワーク間の接続。 ここでは iptables がつないでくれている、ぐらいの認識でよいです。|

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/9304b004-00cc-2730-e4d7-182506110d08.png)



kubernetes the hard way では kubernetes の各種コンポーネントは systemd 配下で動く service になっています。
ただ、 kubeadm 等で kubernetes クラスター環境を構築すると、これらのコンポーネントの多くは Pod で動きます。
目の前にある kubernetes のコンポーネントが Pod で構成されているのか、 systemd 配下のservice で動いているのか、意識しておく方が理解につながると思います。
（※ kubernetes の service と systemd 配下の service を区別するため、ここでは systemd 配下のものは systemd 配下と記載しています。　上図では、 オレンジ（？）のオブジェクトは systemd 配下のservice で、  「Service用 NW」の "Service" は kubernetes の service に相当します）

2020/08/10 追記）--
図が間違っていました。 kube-DNS はController-Plane のコンポーネントなのでわかりやすさ重視で k8smaster0 上に記載していますが、実際には (kubernetes the hard wayでは) POD として worker ノード上で稼働させています。 --



IP/NW 構成は以下の通りです。
なお、kubernetes the hard way に従って、 controller-0 などにしておいた方が
コピー＆ペーストできるので良いですが、私がやるときは何も考えずに下記のホスト名を設定してしまいました。。。
また、上の図でも何も考えずに書いてしまいました。。。計画的じゃないですね。。すみません。。

|ネットワーク|アドレス|用途|上の図では|kubernetes the hard way では。。|
|:--|:--|:--|:--|:--:|
|LAN|192.168.199.0/24|物理LAN|LAN|10.240.0.0/24|
|cluster-ip-range|10.32.0.0/24|kubernetes の ClusterIP 等で利用される|Service用NW|同じ|
|cluster-cidr|10.200.0.0/16|Pod のIPアドレスで利用される|Pod用NW|同じ|
|pod-cidr (k8sworker0)|10.200.0.0/24|worker ノード#0 Pod用NW|Pod用NW|同じ|
|pod-cidr (k8sworker1)|10.200.1.0/24|worker ノード#1 Pod用NW|Pod用NW|同じ|
|pod-cidr (k8sworker2)|10.200.2.0/24|worker ノード#2 Pod用NW|Pod用NW|同じ|

※ 後述しますが、pod-cidr から、各ノードの Pod 用 IP アドレスレンジとして、  10.200.xx.0/24 を払い出していきます。

2020/08/02 追記
　cluster-cidr と pod-cidr を一部混同して記載していたため訂正しました。
　それに伴い、図も修正しました。


#環境説明 (ソフトウェア)

今回利用した各種ソフトウェアのバージョンです。（kubernetes the hard way とは異なる部分があります）
（ CKA が k8s 1.16 だと思って 1.16 で頑張っていましたが、 2020/06 受験時点では 1.18 でした (T_T) )

|S/W or Component|バージョン|入手元|
|:--|:--|:--|
|kubernetes|1.16.9||
|cfssl|1.4.1|
|ubuntu|20.04 LTS|

#説明記事目次

こんなペースで書いていくととても長い記事になるため、
分けて記載していきます。　ここにそのリンク集を作成しておきます。
(リンクがつながっているものは公開済みで、リンクになっていないものは未公開です。
また目次構成自体が変わるかもしれません。）

|タイトル・リンク|概要|
|:--|:--|
|kubernetes the hard way on PC １．概要|当ページ。全体概要や設定まとめを記載|
|[２．ホストPC設定](https://qiita.com/shimauma_Zzzzz/items/06cbbc74a5769fb1ef7e)|kubernetes 用 VMを立てるホストPC の Linux 設定(KVM等) について記載|
|[３．VM作成](https://qiita.com/shimauma_Zzzzz/items/4c436a6030f7ed120d5d)|kubernetes 用の VM (ubuntu) の導入・設定について記載|
|[４．Clone 作成](https://qiita.com/shimauma_Zzzzz/items/533a31d9994856d21e3c)|Provisioning Compute Resources の部分を記載|
|[５．Client Tools](https://qiita.com/shimauma_Zzzzz/items/6a756f12d73d92949a69)|Installing the Client Tools の導入部分を記載|
|[６．Certificates](https://qiita.com/shimauma_Zzzzz/items/03d28db24cf9d9830760)|Provisioning a CA and Generating TLS Certificates の部分を記載|
|[７．k8sConfig](https://qiita.com/shimauma_Zzzzz/items/e90710402e76b50322c4)|Generating Kubernetes Configuration Files for Authentication 部分を記載|
|[８．Encryption Config and Key](https://qiita.com/shimauma_Zzzzz/items/c51fe9ba789bb9dfa1d4)|Generating the Data Encryption Config and Key 部分を記載|
|[９．etcd](https://qiita.com/shimauma_Zzzzz/items/3c61ec5aa869b6a333c2)|Bootstrapping the etcd Cluster 部分を記載|
|[１０．Control Plane](https://qiita.com/shimauma_Zzzzz/items/5822813313a7aae049a0)|Bootstrapping the Kubernetes Control Plane 部分を記載|
|[１１．Worker Nodes](https://qiita.com/shimauma_Zzzzz/items/725a333ac1c7c9634793)|Bootstrapping the Kubernetes Worker Nodes 部分を記載|
|[１２．kubectl](https://qiita.com/shimauma_Zzzzz/items/a45b0221710f0ee89e94)|Configuring kubectl for Remote Access 部分を記載|
|[１３．Pod Network](https://qiita.com/shimauma_Zzzzz/items/9a968bd1fac186586e37)|Provisioning Pod Network Routes 部分を記載|
|[１４．CoreDNS](https://qiita.com/shimauma_Zzzzz/items/d63d9a9819b3183391ec)|Deploying the DNS Cluster Add-on 部分を記載|
|[１５．Smoke Test](https://qiita.com/shimauma_Zzzzz/items/7ba1de95d9bf69e1bfde)|Smoke Test 部分を記載|
|１６．その他|何かあれば…|


#参考情報）
**kubernetes the hard way**
https://github.com/kelseyhightower/kubernetes-the-hard-way

**Kubernetes The Hard Way(日本語版)**
https://github.com/inductor/kubernetes-the-hard-way