[検証] Kubernetesを一緒に始めましょう [minikubeとチュートリアルを活用]

# ■ はじめに

多くの企業が採用を始めており、トレンドになっているという
**Kubernetes を一緒に学んでいきましょう。**

上記が本稿の主旨となります。

といっても公式Documentや他技術blogなどで、Kubernetesとはどういったものかという情報自体は溢れているかと思います。
そこでコチラでは未経験者や初級エンジニアさんを対象に、そして私自身のために、こんな風に学習をススメてみましたを共有出来たらと思います。

// 活発な議論がなされているという参考記事
[専門家が論ずるKubernetesのトップトレンドと運用上の問題](https://www.infoq.com/jp/articles/kubernetes-trends-and-challenges/ "専門家が論ずるKubernetesのトップトレンドと運用上の問題")

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50310/a9b2df25-0f0a-3fda-d37f-9cd36754de76.png" width="25%" alt="kubernetes logo">


## ■ 対象読者
- Kubernetes未経験者
- 初級エンジニア
- 私自身 (Input/Outputしながら進めることで学習効率を上げたい)


## ■ Documents
下記情報を基に、読んでは試してみるというカタチで進めてみようと思います。

**公式Document**
https://kubernetes.io/docs/home/
※日本語版もしっかり整理されています

**GitHub上のリポジトリ**
https://github.com/kubernetes/kubernetes 
※ヒントとなりそうな情報がちらほら。[構成図](https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/design/architecture.md "Kubernetesの構成図")なども公開されています。


## ■ 学習方法
　ざっとDocumentに目を通してみると、多くのクラウドサービスやOSSが提供している機能を包括している印象を受けました。しかしながら、情報量が多すぎてイメージが付きづらいため、実際にさわりながら学習を進めたいと思います。
幸いなことに検証ツールを公式が用意して下さっています。それが下記のminikubeです。

**[minikube](https://minikube.sigs.k8s.io "minikube")**
- ローカル環境でKubernetesを簡単に実行するためのツール
- PC上のVM内でシングルノードのKubernetesクラスタを実行することができる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50310/4d046203-c4ea-c6f6-527b-e5e30bfab7c3.png" width="30%" alt="minikube logo">
**公式Document**
https://minikube.sigs.k8s.io/docs/
https://github.com/kubernetes/minikube
https://kubernetes.io/docs/tutorials/hello-minikube/


## ■ 始める前に
  まず一番最初に引っ掛かるのが Kubernetes の 読み方、発音だと思います。
下記記事を引用しますと、開発メンバーが何と呼んでいるかのツイート と 実際発音している動画を取り上げており、私はそれにならうことにしました(聞こえたとおりに)

引用: [シラベタ - 「Kubernetes」の正しい読み方(発音)](https://shirabeta.net/How-to-pronounce-Kubernetes.html "「Kubernetes」の正しい読み方(発音)")


# ■ 検証開始
## ■ 01. 検証環境の準備
では早速、minikube公式のDocumentに沿って進めてみます。
チュートリアル形式で記載されており、取っ掛かり易い感じです。
https://minikube.sigs.k8s.io/docs/start/


**環境**

| | |
|---|--:|
|Host OS|Windows 10(64bit)|
|VM|VirtualBox(6.1.22)|

多くの方がおうちの環境で用意し易いだろう、コチラでやってみました。
※VirtualBoxは適宜導入してみてください。


## ■ 02. minikube for Windows インストール
3通りの方法が提示されていましたが、そのうちの２つであるパッケージマネージャを導入していなかったため、
**「minikube-installer.exe」**からインストールしました。下記はインストール後の確認になります。

```Poweshell:Poweshell
PS C:\Users\Mitzi> minikube version
minikube version: v1.20.0
commit: c61663e942ec43b20e8e70839dcca52e44cd85ae
```

## ■ 03. Kubernetesクラスタ起動

```Poweshell:Poweshell
PS C:\Users\Mitzi> minikube start
* Microsoft Windows 10 Home 10.0.18363 Build 18363 上の minikube v1.20.0
* virtualboxドライバーが自動的に選択されました
* VM ブートイメージをダウンロードしています...
    > minikube-v1.20.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    > minikube-v1.20.0.iso: 245.40 MiB / 245.40 MiB [] 100.00% 9.77 MiB p/s 25s
* コントロールプレーンのノード minikube を minikube 上で起動しています
* Kubernetes v1.20.2 のダウンロードの準備をしています
    > preloaded-images-k8s-v10-v1...: 491.71 MiB / 491.71 MiB  100.00% 8.78 MiB
* virtualbox VM (CPUs=2, Memory=2200MB, Disk=20000MB) を作成しています...\            # このタイミングでVirtualBox Interfaceへの変更許可を求められる(2回)
* Docker 20.10.6 で Kubernetes v1.20.2 を準備しています...
  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
* Kubernetes コンポーネントを検証しています...
  - Using image gcr.io/k8s-minikube/storage-provisioner:v5
* 有効なアドオン: default-storageclass, storage-provisioner
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
```
Headless Frontendで起動されたVirtualBoxを確認してみると、**minikubeというゲストOS**が追加されていました。
![minikube on VirtualBox](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50310/01713ebe-99b2-c852-9353-e5f482af12e5.png "minikube on VirtualBox")

## ■ 04. shinyなクラスタにさわってみる
// 公式の文言より:
> If you already have kubectl installed, you can now use it to access your shiny new cluster

### 04-1. minikube.exe経由で、 VM上のpodの状態を確認

```Poweshell:Poweshell
PS C:\Users\Mitzi> minikube kubectl -- get po -A
    > kubectl.exe.sha256: 64 B / 64 B [----------------------] 100.00% ? p/s 0s
    > kubectl.exe: 39.52 MiB / 39.52 MiB [---------] 100.00% 11.69 MiB p/s 3.6s
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-74ff55c5b-xjpmp            1/1     Running   0          28m
kube-system   etcd-minikube                      1/1     Running   0          29m
kube-system   kube-apiserver-minikube            1/1     Running   0          29m
kube-system   kube-controller-manager-minikube   1/1     Running   0          29m
kube-system   kube-proxy-92wbf                   1/1     Running   0          28m
kube-system   kube-scheduler-minikube            1/1     Running   0          29m
kube-system   storage-provisioner                1/1     Running   1          29m
```

**※補足**
・kubelctl は下記のようにローカルフォルダ配下に格納されていました。こちらを利用していた様です。
`C:\Users\Mitzi\.minikube\cache\windows\v1.20.2\kubectl.exe`


### 04-2. kubectlを導入
・公式の手順に沿って最新版のkubectlを入手し、同様の確認を行いました。
https://kubernetes.io/docs/tasks/tools/

**a) 最新版の kubectl.exe を入手**

```Poweshell:Poweshell
PS C:\Users\Mitzi\Downloads> curl -LO https://dl.k8s.io/release/v1.21.0/bin/windows/amd64/kubectl.exe

　↓ "-LO" のパラメータは使えないと警告がでる。 実体は下記コマンドになるため下記のように対応

PS C:\Users\Mitzi\Downloads> Invoke-WebRequest -Uri https://dl.k8s.io/release/v1.21.0/bin/windows/amd64/kubectl.exe -OutFile ./kubectl.exe
```

　
**b) チェックサムファイルで正常にDL出来たか確認**
・Documentに沿って律儀に対応してみました。勉強。

```Poweshell:Poweshell
PS C:\Users\Mitzi\Downloads> curl https://dl.k8s.io/v1.21.0/bin/windows/amd64/kubectl.exe.sha256 -o ./kubectl.exe.sha256
```

・ハッシュ値を比較

```Poweshell:Poweshell
PS C:\Users\Mitzi\Downloads> CertUtil -hashfile kubectl.exe SHA256
SHA256 ハッシュ (対象 kubectl.exe):
9f77c0198c15b3b7f051cd4a58fb40941ade04c7d0b30c889aec64b8f4a57ed1

PS C:\Users\Mitzi\Downloads> type kubectl.exe.sha256
9f77c0198c15b3b7f051cd4a58fb40941ade04c7d0b30c889aec64b8f4a57ed1
```
OKでした

・ちなみにワンライナーでは下記のようにして確認出来ました

```Poweshell:Poweshell
PS C:\Users\Mitzi\Downloads> $($(CertUtil -hashfile .\kubectl.exe SHA256)[1] -replace " ", "") -eq $(type .\kubectl.exe.sha256)
True
```

　
**c) PATH環境変数に登録**
・kubectl.exeを気軽に使えるよう手動でPATH環境変数に登録した後、下記のように反映を確認

```Poweshell:Poweshell
PS C:\Users\Mitzi> $ENV:path.split(";") | Select-String Kubernetes
-----
C:\Program Files\Kubernetes\Minikube
C:\Program Files\Kubernetes\bin       <- minikubeに合わせて、当該フォルダ配下にkubectl.exeを格納したためコチラを設定
```
　
**d) コマンド実行確認と合わせてバージョン確認**

```Poweshell:Poweshell
PS C:\Users\Mitzi> kubectl version --client
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"windows/amd64"}
```
最新版であることを確認


**e) あらためてkubectlコマンドから直接shinyなクラスタにアクセス(pod情報を表示)**

```Poweshell:Poweshell
PS C:\Users\Mitzi> kubectl get po -A
NAMESPACE              NAME                                        READY   STATUS    RESTARTS   AGE
kube-system            coredns-74ff55c5b-xjpmp                     1/1     Running   0          10h
kube-system            etcd-minikube                               1/1     Running   0          10h
kube-system            kube-apiserver-minikube                     1/1     Running   0          10h
kube-system            kube-controller-manager-minikube            1/1     Running   0          10h
kube-system            kube-proxy-92wbf                            1/1     Running   0          10h
kube-system            kube-scheduler-minikube                     1/1     Running   0          10h
kube-system            storage-provisioner                         1/1     Running   1          10h
kubernetes-dashboard   dashboard-metrics-scraper-f6647bd8c-dmcbn   1/1     Running   0          9h
kubernetes-dashboard   kubernetes-dashboard-968bcb79-68sph         1/1     Running   0          9h
```
※後述するDashboardの起動をやった後だったため、上記のように表示が増えていました。


### 04-3. Dashboard起動

```Poweshell:Poweshell
PS C:\Users\Mitzi> minikube dashboard
* ダッシュボードを有効化しています...
  - Using image kubernetesui/dashboard:v2.1.0
  - Using image kubernetesui/metrics-scraper:v1.0.4
* ダッシュボードの状態を確認しています...
* プロキシを起動しています...
* プロキシの状態を確認しています...
* Opening http://127.0.0.1:51281/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
```

・デフォルトブラウザが自動で起動しDashboardが表示されました (ちなみにポート番号は、起動の度に変わっていました)
![Kubernetes Dashboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50310/6cede090-a7a9-bd2a-5783-13bdfd085efa.png "Kubernetes Dashboard")



**公式Documentより**
https://minikube.sigs.k8s.io/docs/handbook/dashboard/

GUIからrolling update や podの管理が出来るとのこと 

### 04-4. Dashboard停止
> To stop the proxy (leaves the dashboard running), abort the started process (Ctrl+C)

肝心の止め方も記載がありました。割り込んで止めてとのことです。ワイルド


# ■ ここまでのまとめ
　検証環境を用意し、Kubernetesの機能の一端に触れるところまでになります。
今後も Documentを参照しながら検証するという形式で学習を継続したく思います。