Vagrantでkubernetesを試す

February 01, 2019

Vagrantで作った仮想マシン(centos7、nicはNAT+ブリッジ)にkubernetesのワーカーノードを構築しようとしたところ、かなりハマってしまいました。解決するのに大体五日くらいかかってしまった・・。

kubernetesのインストールまではスムーズに行けたのですが、クラスタにジョインしても、ずっとNot Readyのままになり、どうやらcniプラグインがうまく動いてないことがわかりました。Weaveを使っていたので、ジョインしたら自動的にワーカーノードにプラグイン(/opt/cni/bin/weave-plugin-x.x.x)が入るはずなんですが、configファイル(/etc/cni/net.d/10-weave/conflist)がずっと作られない状態になってました(podは入ってましたがkubectl get pod –all-namespaceで確認すると、CrashLoopBackOffになっていた)。

いろいろ調べた結果、ワーカーノードのweaveのpod(weave-net)がAPIサーバにアクセスできないとこのような状態になるとのこと(関連URL)。理由はわかりませんが、vagrantで作られたNATインターフェース(eth0)にデフォルトゲートウェイ(dhcpで10.0.2.2などになる)が割り当てられるとアクセスできなくなるようです。なので、クラスタにジョインする前に、ルーティングテーブルを編集して、デフォルトゲートウェイがブリッジインターフェイスのものになるように変更すれば良いです(ちなみに、Vagrantにはこのようなルーティングテーブルの設定を行う機能はないとのこと)。

sudo ip route del default dev eth0 && ¥
 sudo ip route add default via 192.168.0.1 && ¥
 sudo systemctl daemon-reload && ¥
 sudo systemctl restart kubelet

この後にワーカーノードでクラスタにジョイン(kubeadm join…)すれば、プラグインは落ちてきて、無事Ready状態になります。ただ、ワーカーノードを再起動するとこの設定は元に戻ってしまいますので、weaveのpodはエラーで再びCrashLoopBackOffになるみたいです(systemctl status kubelet -l)。毎回実行するのも面倒ですので、Vagrantfileに

   config.vm.provision "shell",
     run: "always",
     inline: "sudo ip route del default dev eth0 && sudo ip route add default via 192.168.1.1"

のようなプロビジョンを追加しておけば良いかと思います。このようにすれば、vagrant up時にデフォルトゲートウェイが毎回変更されます。