rkeクラスタのcidrを弄ったら、以下のようなエラーが出てクラスタの作成が失敗した。

1
{"log":"F1203 01:36:22.168496  1 node_ipam_controller.go:115] Controller: Invalid --cluster-cidr, mask size of cluster CIDR must be less than or equal to --node-cidr-mask-size configured for CIDR family\n","stream":"stderr","time":"2021-12-03T01:36:22.16859524Z"}

cluster.yamlの関連部分は以下のようになっています。

1
2
3
4
5
6
services:
  kube-controller:
    cluster_cidr: 10.42.0.0/25
    service_cluster_ip_range: 10.43.0.0/25
  kube-api:
    service_cluster_ip_range: 10.43.0.0/25

問題になる場所はCIDRのマスクサイズです。このマスクサイズは--node-cidr-mask-sizeで設定され、クラスタのCIDRのマスクサイズより大きく(IP範囲が少なく)なる必要があります。デフォルトは24のため、上記の設定の25より小さい(IP範囲が溢れた)のでエラーとなりました。

この--node-cidr-mask-sizeは、以下のようにextra_argsで変更することができます。

1
2
3
4
5
6
services:
    kube-controller:
      cluster_cidr: 10.42.0.0/25
      service_cluster_ip_range: 10.43.0.0/25
      extra_args:
        node-cidr-mask-size: 25

25, 26のような数字に設定したら、クラスタの作成ができるようになります。

このマスクサイズとノードあたりで利用できるPod数の関係として、Pod の追加 / 削除などを考慮し、確保したIPアドレスの数の半分ぐらいが実際に作成できるPodの数となります。

例えば、cluster_cidrのマスクが25なので、クラスタレベルのIPアドレス数は128個です。

1ノードの場合、--node-cidr-mask-sizeを同じく25を設定したら128個のIPアドレスが確保され、3364のPodが作成できます。

3ノードの場合、ノードあたりのIP数は42個までしか使えなくて、--node-cidr-mask-size27に設定しなければいけません。そうすると、Pod数は 916になります。 システムレベルのPod(corednsなど)も10個程度あるので、28にしたら業務Pod用のIPアドレスが足りなくなります。

また、上記にあわせてmax-podsの設定も必要です。

1
2
3
    kubelet:
      extra_args:
        max-pods: 40

参考まで https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr