Minikube On Ubuntu 18.04

#Minikubeの重要性について
まずは何故こんな記事を書くことになったかというところからお話ししたい。皆はKubernetesにApplicationをDeployする時にどのような工程を踏んでいるだろうか。もし、Dockerで動作しているものがそのままKubernetesでも簡単に動くものだと考えている方がいるなら、残念ながら私と同様大きな失敗をしてしまうことだろう。Komposeなるものが世の中に存在しているくらいだからDockerからのKubernetesへの移行はそれほど高くないものだと思っていた。しかし、KubernetesはKubernetesの考えに基づいてDeployされるものだからDocker Imageだけあれば何とかなるななどという簡単な話ではないのだ。この変換部分について今のところMinikubeが一番利用価値の高いものだと思ったのでここに記載しておくことにする。

##環境
仮想環境上に立てることをお勧めする。MAC UserはきっとLocalで立てておけばそれほど困らないだろうが、チーム内で共通の環境を利用するためにも。Minikube事態をサーバとして提供できることが望ましいだろう。
ということで以下の環境で試してみた…

- Ubuntu Desktop 18.04 LTS
- docker 17.12.1-ce
- vSphere 6.5
- 4 vCPU, 16 GB Memory
- VNC（後述するがMinikubeは外からアクセスできないので必要）

##Install

### 1 VM作成

今回はvSphere上でUbuntu Linux 64 bitで作成。基本的に2018/6/1日時点では仮想のバックエンドと連携するのは難しいと考えた方がよいだろう。頑張ってISOからインストールしよう。インストール方法は特に記載しない。欲しければコメントをいただきたい。Desktopの場合デフォルトでSSH Serverが入っていないので要注意。

### 2 Docker & kubectl Setup

[Installing kubeadm] (https://kubernetes.io/docs/tasks/tools/install-kubeadm/)
まずはDockerのセットアップを行う。特に方法は問わないが上記のものが参考になる。Ubuntu環境なので以下のコマンドでセットアップを行う。

```
apt-get update
apt-get install -y docker.io
```

or install Docker CE 17.03 from Docker’s repositories for Ubuntu or Debian:

```
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"
apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}')
```

Kubectlをインストールする。kubeletやkubeadmは必要ない気がするが、動いたのでそのまま転記しておく。

```
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
```

### 3 Minikube Setup

[Minikube] (https://github.com/kubernetes/minikube/tree/v0.28.0)

そのまま転記するが以下のコマンドでMinikubeをセットアップ

```
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl

export MINIKUBE_WANTUPDATENOTIFICATION=false
export MINIKUBE_WANTREPORTERRORPROMPT=false
export MINIKUBE_HOME=$HOME
export CHANGE_MINIKUBE_NONE_USER=true
mkdir -p $HOME/.kube
touch $HOME/.kube/config

export KUBECONFIG=$HOME/.kube/config
sudo -E ./minikube start --vm-driver=none

# this for loop waits until kubectl can access the api server that Minikube has created
for i in {1..150}; do # timeout for 5 minutes
   ./kubectl get po &> /dev/null
   if [ $? -ne 1 ]; then
      break
  fi
  sleep 2
done

# kubectl commands are now able to interact with Minikube cluster
```

### 4 Minikube Start & Verify

これもそのまま転記する。

```
$ minikube start
Starting local Kubernetes v1.7.5 cluster...
Starting VM...
SSH-ing files into VM...
Setting up certs...
Starting cluster components...
Connecting to cluster...
Setting up kubeconfig...
Kubectl is now configured to use the cluster.

$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
deployment "hello-minikube" created
$ kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed

# We have now launched an echoserver pod but we have to wait until the pod is up before curling/accessing it
# via the exposed service.
# To check whether the pod is up and running we can use the following:
$ kubectl get pod
NAME                              READY     STATUS              RESTARTS   AGE
hello-minikube-3383150820-vctvh   1/1       ContainerCreating   0          3s
# We can see that the pod is still being created from the ContainerCreating status
$ kubectl get pod
NAME                              READY     STATUS    RESTARTS   AGE
hello-minikube-3383150820-vctvh   1/1       Running   0          13s
# We can see that the pod is now Running and we will now be able to curl it:
$ curl $(minikube service hello-minikube --url)
CLIENT VALUES:
client_address=192.168.99.1
command=GET
real path=/
...
$ kubectl delete service hello-minikube
service "hello-minikube" deleted
$ kubectl delete deployment hello-minikube
deployment "hello-minikube" deleted
$ minikube stop
Stopping local Kubernetes cluster...
Machine stopped.
```

### 4 VNC

冒頭に記載させていただいているが、Minikubeは外からのアクセスができないのでLocal上で動作確認をする以外ない。そのためLocal上でアクセスするDesktop環境が必要になるのだ。仮想の場合仮想コンソールをそのまま利用してもよいが、使い勝手が悪いのでVNCでアクセスできるようにしておくことをお勧めする。

[Ubuntu VNC](https://linuxconfig.org/ubuntu-remote-desktop-18-04-bionic-beaver-linux)

上記リンクを参考にDesktop Shareを有効にする。
Settings --> Sharing --> Screen Sharing
 ON, Allow Connections to control the screen, Require a password, Wired Connection
上記のものにそれぞれチェックをして閉じる。

```
user01@user01-virtual-machine:~$ gsettings set org.gnome.Vino require-encryption false
```

上記コマンドをコンソールのユーザとして発行。sudo しない。暗号化オプションに関する設定だが現状Clientとの相性が悪いのでOffにしておくことをお勧めする。

```
root@user01-virtual-machine:~# minikube dashboard
Opening kubernetes dashboard in default browser...
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: www-browser: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: links2: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: elinks: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: links: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: lynx: not found
/usr/bin/xdg-open: 851: /usr/bin/xdg-open: w3m: not found
xdg-open: no method available for opening 'http://"IP Address":30000'
```
上記を実行して動作確認を行う。これはkubectlが実行できるユーザでやる必要があるので注意。普通はroot。うまく立ち上がればVNC上のブラウザで以下のURLにアクセスする。IPやPortは環境に合わせて変更されるべし。
http://"IP Address":30000

##感想
Minikube自体をServer提供することに疑問を持たれる方も多いかもしれませんが、きっとあとから何かと役に立つ（実際ないとこまった、別途記載）と思うので是非Kubernetesを始めるときはここから挑戦してみてください。