CentOS 7.5上に雑なminikube検証環境を作る方法

# 概要

CentOS 7.5 (x86_64) 上で雑に Kubernetes の学習・検証用環境を構築するため、Minikube + Docker が動く環境を作るまでの手順です。

## 動機

ローカルのVMで minikube を使う方法ではなく、リモートのサーバ上で雑に扱う手順がまとまっていなかったので、試した結果をまとめました。

## 注意点など

新規の環境で、出来るだけ手間をかけない手順を想定しています。

既に Docker 等が入っている環境では、設定の上書き等にご注意ください。メモリは 2GB 以上あると良さげです。

なお、以下で紹介する方法はドキュメントでは非推奨と書かれている方法（仮想マシンドライバを使わない場合はrootとしてminikubeを実行する必要があるため）です。しかし、インターネットに晒されていないような環境で、雑に動かしてKubernetesの雰囲気を感じるには十分と思います。

## 手順

### kubectl バイナリのセットアップ

Kubernetes リポジトリを有効化し、バイナリを持ってきます。単純にバイナリを取得しても構いませんが、後々便利なので、この機会に参照できるようにしておきます。

```
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# yum install -y kubectl
```

動作確認は `kubectl version` を実行し、バージョン情報が表示できるかどうか確認します。

```
# kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:53:20Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
```

`GitVersion` から対応しているバージョンが `v1.11.1`だと分かります。末尾に `did you specify the right host or port?`（適切なポートおよびホストを指定していますか？）と表示されていますが、問題ありません。現時点では `kubectl` が接続するホストの指定を全くしていないからです。

### minikube バイナリのセットアップ

最新のバイナリ `minikube` をダウンロードし、実行権限を与えます。

```
# curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.28.1/minikube-linux-amd64 && chmod +x minikube &&  mv minikube /usr/local/bin/
```

次に、`minikube version` を実行し、こちらもバージョン番号が表示されるかどうか確認します。

```
# minikube version
minikube version: v0.28.1
```

### Docker CE(Community Engine)のインストール

Docker のセットアップ用スクリプトを使います。Minikube で Kubernetes 関連プログラムを実行するには Docker を使うためです。

```
# curl -fsSL get.docker.com -o get-docker.sh
# sh get-docker.sh
```

あとは、Docker をサーバ起動時に自動起動するようにし、かつ、これから起動します。

```
# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
# systemctl start docker
```

`docker version` コマンドを実行し、 `Server:` 列の応答があるのを確認します。Docker デーモンが起動しなければ、サーバの応答がありません。

```
# docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:08:18 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:10:42 2018
  OS/Arch:          linux/amd64
  Experimental:     false
```

### minikube 起動

起動コマンド `minikube start --vm-driver=none` を実行します。仮想マシンドライバを使わないオプション（`none`）を指定します。コマンド実行後は数分待ちます。コーヒーをわかすと良い感じです。

```
# minikube start --vm-driver=none
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Downloading kubeadm v1.10.0
Downloading kubelet v1.10.0
Finished Downloading kubelet v1.10.0
Finished Downloading kubeadm v1.10.0
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
===================
WARNING: IT IS RECOMMENDED NOT TO RUN THE NONE DRIVER ON PERSONAL WORKSTATIONS
        The 'none' driver will run an insecure kubernetes apiserver as root that may leave the host vulnerable to CSRF attacks

When using the none driver, the kubectl config and credentials generated will be root owned and will appear in the root home directory.
You will need to move the files to the appropriate location and then set the correct permissions.  An example of this is below:

        sudo mv /root/.kube $HOME/.kube # this will write over any previous configuration
        sudo chown -R $USER $HOME/.kube
        sudo chgrp -R $USER $HOME/.kube

        sudo mv /root/.minikube $HOME/.minikube # this will write over any previous configuration
        sudo chown -R $USER $HOME/.minikube
        sudo chgrp -R $USER $HOME/.minikube

This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true
Loading cached images from config file.
```

あとは `kubectl get node` を実行し、 `minikube` ノードが見えることを確認します。

```
# kubectl get node
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    5m        v1.10.0
```

また、 `kubectl version` を実行して、API サーバ側も応答します。

```
# kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:53:20Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
```

ここではクライアントが `v1.11` 、サーバが `1.10` ですが、マイナーバージョンの差違が１つの場合、機能の互換性が保証されるべきなので、通常は問題ありません。


以上です。雑に使い終わったら docker を止めておきましょう。

```
# systemctl stop docker
```

## 参考情報

- Running Kubernetes Locally via Minikube - Kubernetes
  - https://kubernetes.io/docs/setup/minikube/
- Install and Set Up kubectl - Kubernetes
  - https://kubernetes.io/docs/tasks/tools/install-kubectl/
  - https://github.com/kubernetes/minikube/releases
- Linux Continuous Integration without VM Support
  - https://github.com/kubernetes/minikube#linux-continuous-integration-without-vm-support