動かざることバグの如し

近づきたいよ 君の理想に

KubernetesでCIDRNotAvailableエラーでうまく接続できない問題

問題

なんかMySQL構築して、サービスリソース作ってCulsterIP振ってもアクセスできない問題が発生した

設定何も間違ってないんだが???と思ってふとnodeのイベントログ見てると「CIDRNotAvailable」の文字が沢山。。。

❯ kubectl get events
LAST SEEN   TYPE     REASON             OBJECT          MESSAGE
71s         Normal   CIDRNotAvailable   node/ubuntu01   Node ubuntu01 status is now: CIDRNotAvailable
3m17s       Normal   CIDRNotAvailable   node/ubuntu02   Node ubuntu02 status is now: CIDRNotAvailable
3m3s        Normal   CIDRNotAvailable   node/ubuntu03   Node ubuntu03 status is now: CIDRNotAvailable

ServiceのIP範囲とPodのIP範囲は重複してはいけない

これが原因

まずはクラスタのIP範囲を確認

❯ kubectl cluster-info dump | grep -m 1 service-cluster-ip-range
                            "--service-cluster-ip-range=10.96.0.0/12"

そしてpodのIP範囲を確認。イキってデフォルトの設定変えたのが良くなかった。。。

❯ kubectl cluster-info dump | grep -m 1 cluster-cidr
                            "--cluster-cidr=10.100.0.0/16",

対応

最初はマスターノードの /etc/kubernetes/manifests/kube-apiserver.yaml のargs弄ってCIDR範囲被らないようにしたんだけど 結果的にクラスタが壊れてしまった。。。ので再インストールしてしまった

デフォルトのIP範囲は?

これが面倒くさいことに公式ドキュメントで明記されていない

goのパッケージのドキュメントに記載されてた。ここをソースと言っていいと思う

v1beta3 package - k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3 - Go Packages

それを見ると、

networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "10.244.0.0/24"
  dnsDomain: "cluster.local"

てかプリフライトの段階でエラーになってくれよkubeadmさん

参考リンク