Kubernetes1.12でFlannelと連携できなかった時の対処法

これまでの流れをぶった切って、いきなりKubernetesネタです。

Kubernetes1.12でFlannelがデプロイできないと悩んでる人は読んでください。

スポンサーリンク
レクタングル大

Kubernetes+Flannelで問題発生

最近のITインフラのトレンドを理解する上でKubernetesは避けられなくなってきました。なので、自宅ラボを使用して、時間があるときに色々試してます。

個人的にはKubernetesで最もややこしいのは「ネットワーク」だと思います。なので、近い内にKubernetesのネットワークについて色々紹介できればと考えています。

今回はKubernetesの基礎はいきなりすっ飛ばして、ネットワークソリューションの一つである「Flannelを使う」についてです。

Centos7+Kubernets+Flannelの組み合わせの手順については、色んなブログで紹介されているのですが・・・

なぜかFlannelのPodが起動しない。

Masterノードも、いつまでたっても「Not Ready」のままです。

ちなみに、Weave-netのデプロイなら上手くいく。普通にServiceも作成できるし、Worker-Nodeの追加もできる。

原因はTolerationsでした

数時間ハマったのですが、以下のリンクを参考にしてようやく解決できました。

Kubernetes 1.12 and flannel does not work out of the box

要約するとこんな感じです。

  • Kubernetesには「Taints&Tolerations」というvCenterの「Anti-Affinity Rule」みたいな仕組みがある。
  • NodeにTaintsを付けることができ、同じTolerationsを持つPod(Deployment yamlで設定できる)しかデプロイできない仕組み(本当はもう少しだけややこしいが、本質的にはこんな感じ)
  • Kubernetes 1.12では仕様が変わったっぽくて、NotReady状態のNodeは「node.kubernetes.io/not-ready:NoSchedule」Taintsが自動的に付与される。
  • kube-flannel.ymlのtoraletionsには「node-role.kubernetes.io/master」しか設定されていない。つまり、「node.kubernetes.io/not-ready」が設定されていない。
  • 従って、FlannelのPodがデプロイできない。

本当かよ!と疑って、実際に実機を見てみました。

init直後のTaintsの確認

v1.11とv1.12のVMを新規に準備して、kubeadm init直後のkubectl describe node MasterNodeのtaintsを見てみました。

[v1.11]

[v1.12] 確かに、v1.12の方は、init直後に「node.kubernetes.io/not-ready:NoSchedule」が付与されていました。

この状態だと、「node.kubernetes.io/not-ready:NoSchedule」のTolerationが設定されているPodしか起動できません。

(厳密には「node-role.kubernetes.io/master:NoSchedule」も。これは通常のPodがマスターノードにデプロイされるのを防ぐため。)

Deployment YAMLのTolerationsの確認

一方、flannelのDLした直後のyamlを見てみます。

確かにこれだけです。

ここを、以下に変更します。

これでデプロイしてみたところ、普通にNodeがReadyになりました。

なぜ、Weave-netは問題ないのか?

Weave-netのDeployment YAMLを見てみます。

こんな感じでKeyを指定していないから、とりあえずTaintsのKey名を気にしないで動作してるんですね。

つまり、FlannelもKey指定なしでTolerationsを書いてくれてたらなんの問題もないということです。(上記リンクのおじさんも、ポストにコメントしている人たちの意見もおおよそ同意見です)

少し解せないのが、この仕様の追加はv1.6からスタートしたとの記載もあります。

Kubernetes Taints and Tolerations

In addition, Kubernetes 1.6 introduced alpha support for representing node problems. In other words, the node controller automatically taints a node when certain condition is true. The following taints are built in:

node.kubernetes.io/not-ready: Node is not ready. This corresponds to the NodeCondition Ready being “False”.

うーん、謎です。

勉強を再会する方へ
スポンサーリンク
レクタングル大
  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">