落とし穴に立て札を立てるが如く

ハマりどころの解決が少しでも早くなることを願って書いていきます

KubernetesでCNIにFlannelを使うときに気を付けること

初めに結論

kubeadmでkubernetesクラスターを立ち上げてCNIプラグインにFlannelをインストールしようとすると以下のようなエラーが出ることがあります。

Error registering network: failed to acquire lease: subnet "10.244.0.0/16" specified in the flannel net config doesn't contain "<kubeadmの起動時に設定したpodCIDR>" PodCIDR of the "<自分のnode名>>" node  

これは、Flannelが通信を行う際に使用するCIDRである10.244.0.0クラスター内でPodが使用するCIDRが異なるために発生します。
そのため、Kubernetesを立ち上げる時に設定したPodのCIDRが10.244.0.0/16でない場合は、Flannel導入時に使うマニフェストを変更する必要があります。

  net-conf.json: |  
    {  
      "Network": "10.244.0.0/16", #←この行を変更します  
      "Backend": {  
        "Type": "vxlan"  
      }  
    }  

もう少し詳しい解説

Flannelをインストールするとき、おそらくFlannelの公式サイトにある以下のコマンドでインストールしているかと思います。

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml  

つまるところFlannelのパブリックのリポジトリ上のマニフェストファイルを適用して必要な機能をDaemonSetとしてそれぞれのNodeのPodで実行する形ですね。
ただ、この方法でインストールするとエラーを起こす場合があります。
そのエラーが以下のようなものです。

Error registering network: failed to acquire lease: subnet "10.244.0.0/16" specified in the flannel net config doesn't contain "<kubeadmの起動時に設定したpodCIDR>" PodCIDR of the "<自分のnode名>>" node  

これは、Flannelが通信を行う際に使用するCIDRである10.244.0.0クラスター内でPodが使用するCIDRが異なっていることが原因です。
通信時に使用するCIDRが食い違ってしまっているということのようです。
公式サイトにも以下のような説明があります。

If you use custom podCIDR (not 10.244.0.0/16) you first need to download the above manifest and modify the network to match your one.

podCIDRについて、カスタムのものを使用している場合は使用するマニフェストの中身を適宜書き換えてください、ということですね。
おそらく、このようなことが起きるときはKubernetesの立ち上げ時に以下のようなコマンドを実行したのではないでしょうか。

kubeadm init --pod-network-cidr=<希望のCIDR>  

おそらく、マシン外部のネットワークのサブネットの制約やら何やらでこのような設定をしているかと思います。
Flannelを導入してやる際は、Flannelが使用するCIDRとKubernetesが使用するCIDRを一致させてやる必要があります。
Kubernetesクラスターを再起動させて上記のオプションを変更する手もありますが大変なので、Flannelのマニフェストを変更しましょう。
https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml からマニフェストをダウンロードして、以下の部分を --pod-network-cidrで設定したCIDRに書き換えます。

  net-conf.json: |  
    {  
      "Network": "10.244.0.0/16", #←この行を変更します  
      "Backend": {  
        "Type": "vxlan"  
      }  
    }  

このマニフェストを適用すれば、CIDRが異なるエラーは発生しなくなります。

おわりに

今回はKubernetesクラスターにFlannelを導入しようとした際に発生しうるエラーとその解消法について解説しました。
同じエラーで詰まっている方の助けになれば幸いです。

参考