minikube構築時のメモ

いい加減kubenetesを触りたかったけれど、ホストマシンをあんまり汚したくなかったので仮想マシン上に構築した際のメモ。

minikubeをvirtualbox+vagrant上のCentOSにインストールして動かすのに結構苦戦したので記録として残す。

# 実行環境

- macOS 10.14.6 (Mojave)
- virtualbox 6.1.12
- vagrant 2.2.10

# 構築した環境

- CentOS 7.5
- docker 19.03.12
- minikube 1.13.0

# 作業手順

基本的には公式の「[Minikubeのインストール](https://kubernetes.io/ja/docs/tasks/tools/install-minikube/)」に従った。

以下手順は全てrootユーザーで実行。

## 構築前準備

いきなりよくわからなくて困った。

```
$ grep -E --color 'vmx|svm' /proc/cpuinfo
```

これ実行してなんかしらの結果が返ってこないとminikubeは動かせないらしい。何も返ってこない。

### 解決策

どうやら、VM内でVMを作成できるような設定(`Nested Virtualization`)を許可しないとならないらしい。

`virtualbox`は`v6.1`以降から対応してるらしい。よかった。

ということで`Vagrantfile`に以下の項目を追記し、`vagrant reload`を実行。

```ruby
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.customize ["modifyvm", :id, "--nested-hw-virt", "on"]
  end
```

さっきのコマンドを実行。

```
[root@kube ~]# grep -E --color 'vmx|svm' /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow flexpriority fsgsbase avx2 invpcid rdseed clflushopt flush_l1d
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow flexpriority fsgsbase avx2 invpcid rdseed clflushopt flush_l1d
```

いけた。

## dockerのインストール

`none`driverでminikubeを動かすことにする。

ということで[dockerのドキュメント](https://docs.docker.com/engine/install/centos/)に従いdockerをインストール。

```
$ yum install docker-ce docker-ce-cli containerd.io
```

## kubectlのインストール

公式ドキュメントに従い、バイナリをダウンロードして構築する。

## minikubeのインストール

公式ドキュメントに従い、スタンドアロンバイナリをダウンロードして構築する。

## minikube実行

minikubeバイナリをインストールして、以下のコマンドを実行。

```
$ minikube start --vm-driver=none
```

```
😄  minikube v1.13.0 on Centos 7.5.1804
✨  Using the none driver based on user configuration

❌  Exiting due to GUEST_MISSING_CONNTRACK: Sorry, Kubernetes 1.19.0 requires conntrack to be installed in root's path
```

なにやらエラーとなった。

### 解決策

どうやらk8s v1.18以降は`conntrack`なるものをインストールしないとならないらしい。

https://github.com/kubernetes/minikube/issues/7179

それは失礼しました。ということでインストール。

```
$ yum install conntrack -y
```

## 再度minikube実行

晴れて開始コマンドを実行。

```
$ minikube start --vm-driver=none
```

```
stderr:
W0906 11:40:23.265166   14424 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
	[WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
	[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
	[WARNING Swap]: running with swap on is not supported. Please disable swap
	[WARNING FileExisting-socat]: socat not found in system path
	[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher


😿  If the above advice does not help, please let us know:
👉  https://github.com/kubernetes/minikube/issues/new/choose
```

🤔???

ものすごいたくさん警告が出た。正直この時点でやっぱ辞めようかという気になってきた。

仕方ないんで一つ一つ解決していく。

### docker周りの警告を解決していく

まず、dockerのエラーに対処する。

```
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
```

どうやらdockerのcgroup driverをsystemdにしろと言ってるらしい。

というか、対処法が公式ドキュメントの[CRIのインストール](https://kubernetes.io/docs/setup/cri/)に書いてあったので、そっくりそのまま従う。

```
$ cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
$ mkdir -p /etc/systemd/system/docker.service.d
$ systemctl daemon-reload
$ systemctl restart docker
```

あと、どうやらdockerをenableにしないといけないらしいので、やっておく。

```
[WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
```

```
$ systemctl enable docker
```

### swap周りの警告を解決していく

次はswapに問題があるようなので、対処していく。

若干へっぴり腰でメモリの設定に触れる。

```
[WARNING Swap]: running with swap on is not supported. Please disable swap
```

[kubeadmのドキュメント](https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)に注意書きがあった。

どうやら、kubeadmの要件に、swapメモリが無効になっている必要があるとのこと。そういえばminikube起動時にkubeadmも入ってきたっけ。

ということで、[こちらのQiita記事](https://qiita.com/murata-tomohide/items/be2171ac459f8f7d54f0)を参考にして、swapメモリを無効化する。

```
$ swapoff -a
```

### socatをインストールする

```
[WARNING FileExisting-socat]: socat not found in system path
```

`socat`なるパッケージをインストールして対応する。

```
$ yum install -y socat
```

### bridge周りのエラーを解決していく

最後はこれである。

```
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
```

どうやら、bridgeアダプターの設定を有効にしてあげないとならないらしい。

[Oracleのドキュメント](https://docs.oracle.com/cd/F22978_01/docker/docker-issue-29328497.html)によると、docker infoとか実行すると有効化してないと警告が出るとのこと。

ということで`/etc/sysctl.conf`を編集し、以下を追加。

```
net.bridge.bridge-nf-call-iptables = 1
```

```
$ sysctl -p
```

を実行して、`net.bridge.bridge-nf-call-iptables = 1`が返ってくることを確認。

## 再びminikube実行

エラーに対応したので、再びコマンドを実行。

```
minikube start --vm-driver=none
```

実行結果である。

```
😄  minikube v1.13.0 on Centos 7.5.1804
✨  Using the none driver based on existing profile

🧯  The requested memory allocation of 2200MiB does not leave room for system overhead (total system memory: 2342MiB). You may face stability issues.
💡  Suggestion: Start minikube with less memory allocated: 'minikube start --memory=2200mb'

👍  Starting control plane node minikube in cluster minikube
🔄  Restarting existing none bare metal machine for "minikube" ...
ℹ️  OS release is CentOS Linux 7 (Core)
🐳  Preparing Kubernetes v1.19.0 on Docker 19.03.12 ...
🤹  Configuring local host environment ...

❗  The 'none' driver is designed for experts who need to integrate with an existing VM
💡  Most users should use the newer 'docker' driver instead, which does not require root!
📘  For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/

❗  kubectl and minikube configuration will be stored in /root
❗  To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:

    ▪ sudo mv /root/.kube /root/.minikube $HOME
    ▪ sudo chown -R $USER $HOME/.kube $HOME/.minikube

💡  This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube" by default
```

動いた!!

これでminikubeを弄れる。