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時にデフォルトゲートウェイが毎回変更されます。