microk8sとhelmを使ったローカルKubernetesクラスタの構築

# はじめに
WebでKubernetes関連記事を読み漁っても今ひとつピンとこなかったので、実際にコマンド叩きまくって実践してみるのが早いと判断しました。
私自身Kubernetes/Helmとも初心者であるため、間違いなどあればご指摘いただけると幸いです。

# 事前準備
Azure/GCPなどのクラウドを使った方がKubernetesクラスタの構築はラクらしいのですが、操作ミスにより無駄な課金が発生するのも嫌だったので、Windows PCのローカル環境にmicrok8sを使って環境を構築しました。
ちなみにローカル環境はminikubeを使って構築することが多いと思うのですが、あえてmicrok8sを理由は以下でした。

* dockerやkubectlも合わせてインストールしてくれる
* `microk8s.reset`コマンドでいつでもKubernetesクラスタをリセットできる

つまり、面倒くさがり屋＋初心者の私に優しいと判断したからです(笑)

## 動作環境
Windows10 Pro: version 1903 (OSビルド 18885.1001)
Vagrant : version 2.2.4
VirtualBox : version 6.0.6
Network : 非Proxy環境

## 構築手順(microk8s編)
このあたりに記事を参考にさせていただきました。

* [Vagrant+VirtualBoxでUbuntu環境構築 - Qiita](https://qiita.com/w2-yamaguchi/items/191830191f8af05ac4dd)
* [第560回　microk8sでお手軽Kubernetes環境構築：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0560)

ひとことで言えば、Windows上にVagrantとVirtualBoxをインストールし、Ubuntu18.04が動作する仮想マシンを作成。
その後Ubuntuの仮想マシンにSSH接続し、microk8sをデプロイしてKubernetesクラスタを構築するというものです。

ちなみにVagrantで構築する仮想マシンはIPアドレスを固定(192.168.33.10)、メモリを2GBに増設しておきます。

また本来microk8sをインストールした環境ではmicrok8s.kubectlやmicrok8s.dockerなど、microk8sプレフィックスを付与してコマンド実行をするのですが、本記事ではキータイプ数を節約するため、以下のコマンドを実行してプレフィックスを付与せずとも実行できる想定で記載しています。
プレフィックスの付与は本物のkubectlやdockerと共存するために分かれているのだと思いますが、どうせ実験用の仮想マシンだし、分離する必然性はないので迷わず以下を実行しちゃいます。

```bash
$ sudo snap alias microk8s.kubectl kubectl
$ sudo snap alias microk8s.docker docker
```

## 環境構築(helm編)
Ubuntu仮想マシンを作成し、microk8sを構築するまではそのものズバリの記事があったのですが、microk8sに対してhelmを動かすための適当な記事が見当たらなかったので、その部分だけ詳しめに記載します。
Ubuntu上にhelmをインストールする方法は[公式サイトの方法](https://helm.sh/docs/using_helm/#installing-helm) でインストールしてください。
その後`helm init`を起動するのですが、その前にmicrok8sで構築したKubernetesクラスタにtillerをデプロイするため、環境変数KUBECONFIGを設定してください。

```bash
# microk8sのclient.configファイルを環境変数KUBECONFIGに設定
$ export KUBECONFIG=/snap/microk8s/current/client.config
```

```bash
# helmの初期化を実行
$ helm init
Creating /home/vagrant/.helm
Creating /home/vagrant/.helm/repository
Creating /home/vagrant/.helm/repository/cache
Creating /home/vagrant/.helm/repository/local
Creating /home/vagrant/.helm/plugins
Creating /home/vagrant/.helm/starters
Creating /home/vagrant/.helm/cache/archive
Creating /home/vagrant/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /home/vagrant/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!
```

`helm init`によってhelmの初期化が実行されます。この初期化動作にはmicrok8s上にtillerをデプロイするプロセスが含まれます。
このtillerというのはhelmと連携して動作するエージェントです。KubernetesクラスタにPodとして配備され、helmコマンドからの指示を受けてデプロイ作業を実行します(ここは想像)。
その後`helm version`を実行し、ClientとServerの両方にバージョンが正しく表示されればhelmは正しく初期化できています。
ネットワーク速度によってはtillerがインストールされるまでに時間がかかることがあります。
その場合はしばらく待ってから`helm version`を実行してください。

```bash
# helmのバージョンチェック
$ helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
```
tillerのPodが正しくデプロイされているかはkubectlからも確認ができます。
`helm version`のServerが正しく表示されない場合、以下の出力でREADYが0/1とかになって止まっているので手順やネットワーク環境などをチェックしてください。
例えばインターネットアクセスにプロキシ経由のアクセスが必要な場合、適切にプロキシを設定してからでないとtillerのデプロイに失敗します(仕事場のPCがそれだった)。

```bash
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
kube-system   tiller-deploy-664d6bdc7b-bvjrb   1/1     Running   0          26m
```

ここまでできれば、すべての環境が整っているはずです。
最後に各ツールのバージョン確認結果を載せておきます。

```bash
$ snap info microk8s
name:      microk8s
summary:   Kubernetes for workstations and appliances
publisher: Canonical?
contact:   https://github.com/ubuntu/microk8s
license:   unset
description: |
  MicroK8s is a small, fast, secure, single node Kubernetes that installs on just about any Linux
  box. Use it for offline development, prototyping, testing, or use it on a VM as a small, cheap,
  reliable k8s for CI/CD. It's also a great k8s for appliances - develop your IoT apps for k8s and
  deploy them to MicroK8s on your boxes.
commands:
  - microk8s.config
  - microk8s.disable
  - microk8s.docker
  - microk8s.enable
  - microk8s.inspect
  - microk8s.istioctl
  - microk8s.kubectl
  - microk8s.reset
  - microk8s.start
  - microk8s.status
  - microk8s.stop
services:
  microk8s.daemon-apiserver:          simple, enabled, active
  microk8s.daemon-apiserver-kicker:   simple, enabled, active
  microk8s.daemon-containerd:         simple, enabled, active
  microk8s.daemon-controller-manager: simple, enabled, active
  microk8s.daemon-docker:             simple, enabled, active
  microk8s.daemon-etcd:               simple, enabled, active
  microk8s.daemon-kubelet:            simple, enabled, active
  microk8s.daemon-proxy:              simple, enabled, active
  microk8s.daemon-scheduler:          simple, enabled, active
snap-id:      xxxxxxxxxxxxxxxxxxxxxx
tracking:     1.13/stable
refresh-date: 2 days ago, at 18:03 UTC
channels:
  stable:         v1.14.1  2019-04-18 (522) 214MB classic
  candidate:      v1.14.1  2019-04-15 (522) 214MB classic
  beta:           v1.14.1  2019-04-15 (522) 214MB classic
  edge:           v1.14.1  2019-04-24 (549) 217MB classic
  1.14/stable:    v1.14.1  2019-04-18 (521) 214MB classic
  1.14/candidate: v1.14.1  2019-04-15 (521) 214MB classic
  1.14/beta:      v1.14.1  2019-04-15 (521) 214MB classic
  1.14/edge:      v1.14.1  2019-04-24 (550) 217MB classic
  1.13/stable:    v1.13.5  2019-04-22 (526) 237MB classic
  1.13/candidate: v1.13.5  2019-04-19 (526) 237MB classic
  1.13/beta:      v1.13.5  2019-04-19 (526) 237MB classic
  1.13/edge:      v1.13.5  2019-04-19 (526) 237MB classic
  1.12/stable:    v1.12.7  2019-04-24 (534) 259MB classic
  1.12/candidate: v1.12.7  2019-04-19 (534) 259MB classic
  1.12/beta:      v1.12.7  2019-04-19 (534) 259MB classic
  1.12/edge:      v1.12.8  2019-04-24 (547) 259MB classic
  1.11/stable:    v1.11.9  2019-04-23 (545) 258MB classic
  1.11/candidate: v1.11.9  2019-04-22 (545) 258MB classic
  1.11/beta:      v1.11.9  2019-04-22 (545) 258MB classic
  1.11/edge:      v1.11.9  2019-04-20 (545) 258MB classic
  1.10/stable:    v1.10.13 2019-04-22 (546) 222MB classic
  1.10/candidate: v1.10.13 2019-04-22 (546) 222MB classic
  1.10/beta:      v1.10.13 2019-04-22 (546) 222MB classic
  1.10/edge:      v1.10.13 2019-04-22 (546) 222MB classic
installed:        v1.13.5             (526) 237MB classic

$ docker version
Client:
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        6247962
 Built:             Tue Feb 26 23:56:24 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       6247962
  Built:            Tue Feb 12 22:47:29 2019
  OS/Arch:          linux/amd64
  Experimental:     false

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.5", GitCommit:"2166946f41b36dea2c4626f90a77706f426cdea2", GitTreeState:"clean", BuildDate:"2019-03-25T15:26:52Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.5", GitCommit:"2166946f41b36dea2c4626f90a77706f426cdea2", GitTreeState:"clean", BuildDate:"2019-03-25T15:19:22Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}

$ helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
```

# 最後に
次回はhelmを使って何かデプロイする手順について記事を書きたいと思いま~~す~~したが[追加設定](https://qiita.com/hidenki/items/13f84e6e60b9b542848c)の記事を書きました:sweat_smile:

# 参考記事
microk8s関連のコマンドに関しては、以下の記事を参考にさせていただきました。

[MicroK8sを使ってみる - Qiita](https://qiita.com/niiku-y/items/e5285af4f12b1318cf4e)