Ubuntu16.04のminikubeをアップデートした

# TL;DR

Ubuntu16.04にminikubeをアップデートしてみた時にハマったことメモ。
つらつらと書いていきます。

# 環境

- アップデート対象マシン: Ubuntu16.04 LTS。これ自体がVM。社内のお遊び用(外からは見えない)
- 手元のマシン： macOS Mojave 10.14.2
- minikube: v0.22.1 -> v0.33.1
- kubectl: アップデート前を忘れた... -> 

```json
{
  Major:"1",
  Minor:"13",
  GitVersion:"v1.13.2",
  GitCommit:"cff46ab41ff0bb44d8584413b598ad8360ec1def",
  GitTreeState:"clean",
  BuildDate:"2019-01-10T23:35:51Z",
  GoVersion:"go1.11.4",
  Compiler:"gc",
  Platform:"linux/amd64"
}
```
- その他： proxyあり

# minikubeのupdate

## 古いminikubeの停止

古いminikubeを停止させる。

```bash
minikube stop
minikube delete
```

## 新しいminikubeのインストール

[公式のwithout vm](https://github.com/kubernetes/minikube#linux-continuous-integration-without-vm-support)を参考に実施。

proxyが存在するため、proxy設定を含めてコマンドを実行。
以下のコマンドを叩いた。

```bash
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash # helmコマンドをget
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube # minikubeバイナリをget
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 # kubectlコマンドをget

export MINIKUBE_WANTUPDATENOTIFICATION=false
export MINIKUBE_WANTREPORTERRORPROMPT=false
export MINIKUBE_HOME=$HOME
mkdir $HOME/.kube || true
touch $HOME/.kube/config

export KUBECONFIG=$HOME/.kube/config
sudo -E minikube start --vm-driver=none --docker-env HTTP_PROXY="<http_proxyをいい感じに>" --docker-env HTTPS_PROXY="<https_proxyをいい感じに>" --docker-env NO_PROXY="<no_proxyをいい感じに>"

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

普通はこれで起動するはずだが、今回はこのようなエラーがでた。

`[ERROR Port-10250]: Port 10250 is in use`

portが使われている。見たら`localkube`なるプロセスが10250ポートを使用していた。
minikubeの生き残りのようだ。

[こちら](https://github.com/kubernetes/minikube/issues/2707)を参考にし、`sudo systemctl stop localkube`で止めた。
`kill <localkubeのPID>`では無限に復活するので注意。

## minikube dashboardでdashboardの確認

`minikube service list`を叩くと、現在動いているサービスの一覧が見られる。
以前は何もしなくてもdashboardが起動していた気がするが、起動しなくなったようだ。

`minikube dashboard`を叩くとdashboardが起動し、ブラウザも起動する機能があるが、
今回はサーバ機なので`minikube dashboard --url`でURLだけ教えてもらおうとしたが、hangしたため`Ctrl + c`で停止。

[こちら](https://github.com/kubernetes/minikube/issues/3236)にあるように、セキュリティの問題からdashboardを表示する機能をやめたらしい。
なお、`minikube dashboard --url`でhangするのは仕様通りのよう。

`kubectl proxy`コマンドを叩くとポートフォワードが行われ、
http://localhost:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy/#!/overview?namespace=default
にアクセスすると目的のdashboardが見られる。
ただ、手元のマシンにkubectlを入れていないので、今はまだdashboardが見られない。

## 手元のマシンからサーバのminikubeを操作

macOSなのでhomebrewでインストールする。
kubectlのインストールは[公式](https://kubernetes.io/docs/tasks/tools/install-kubectl/)を参考に
helmのインストールも[公式](https://github.com/helm/helm)を参考に

```bash
brew install kubernetes-cli
brew install kubernetes-helm
```

### kubectlのセッティング

kubectlは`~.kube/config`を見て動いている。なので、いい感じに書き換える。

```yml
apiVersion: v1
clusters:
- cluster:
    certificate-authority: <ca.crtへのパス>
    server: https://<minikube_serverのIP>:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: <client.crtへのパス>
    client-key: <client.keyへのパス>
```

上記の証明書関係は[kubernetesのユーザ認証関係](https://kubernetes.io/docs/reference/access-authn-authz/authentication/)を見ていい感じに作る(はず)。
今回は面倒だったので、デフォルトユーザの証明書をサーバ機から`scp`でパクってきて使用した。

### 接続テスト

`kubectl cluster-info`で情報が取れればok.
初回実行時は、あらかじめ設定されていた`https_proxy`に阻まれてレスポンスが返ってこなかったため、`no_proxy`にサーバのIPを追加したところ無事に動いた。
`kubectl proxy`を打つと、ポートフォワーディング状態になるので、その状態でdashboardのURLを打ち込んだところ、見えた。