こんにちは。最近の京都はほぼ冬です。
今回は Ubuntu で Kubernetes を立てました。
Ubuntu にすると、Container Linux で ipset list
がうまく動かない件や flannel が動かないのが解決するのではと期待したためです(flannel に関しては、OS と関係ないことが後に明らかになりました)。
プロビジョニング
Container Linux では Ignition でプロビジョニングしましたが、 Ubuntu では cloud-init を使います。cloud-init では netplan の config を渡せば IP アドレスなども設定できて便利でした。時代は netplan。
Kubernetes ノードのセットアップ
kubespray を使う案もありましたが、Container Linux と同様 kubeadm を使うことにしました。
Ubuntu の場合、以下の3ステップで大体済むためです。 cloud-init User-Data の runcmd
に書けけば良いか、となりました。
- cloud-init で基本的な設定
- apt install で Docker や kubeadm を入れる
kubeadm init
Flannel を入れる
今回は Calico ではなく Flannel を使います。Flannel をドキュメントに従って入れていきましたが…。残念ながら立ち上がりませんでした。
ubuntu@k8s-flannel-ubuntu-1:~$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5644d7b6d9-2zh4r 0/1 ContainerCreating 0 4h9m
kube-system coredns-5644d7b6d9-5rktg 0/1 ContainerCreating 0 4h9m
kube-system etcd-k8s-flannel-ubuntu-1 1/1 Running 1 4h8m
kube-system kube-apiserver-k8s-flannel-ubuntu-1 1/1 Running 1 4h8m
kube-system kube-controller-manager-k8s-flannel-ubuntu-1 1/1 Running 1 4h9m
kube-system kube-flannel-ds-amd64-wqbn6 0/1 Error 3 65s
kube-system kube-proxy-z64gr 1/1 Running 1 4h9m
kube-system kube-scheduler-k8s-flannel-ubuntu-1 1/1 Running 1 4h8m
調査
flannel の Pod のログには、 pod cidr not assigned
と出ています。
ubuntu@k8s-flannel-ubuntu-1:~$ kubectl logs kube-flannel-ds-amd64-wqbn6 --namespace kube-system
...
E1105 16:49:02.840255 1 main.go:289] Error registering network: failed to acquire lease: node "k8s-flannel-ubuntu-1" pod cidr not assigned
I1105 16:49:02.840415 1 main.go:366] Stopping shutdownHandler...
確かに kubectl describe nodes
をしても node に PodCIDR が設定されていません。イベントには CIDRNotAvailable
という文字列が。
ubuntu@k8s-flannel-ubuntu-1:~$ kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
61s Normal CIDRNotAvailable node/k8s-flannel-ubuntu-1 Node k8s-flannel-ubuntu-1 status is now: CIDRNotAvailable
Node にこれを割り当てるのは Controller manager だろうということで、そのログを見ると there are no remaining CIDRs left to allocate in the accepted range
と書いてあります。/16
を指定したのになぜ…?
I1105 16:53:50.694030 1 event.go:255] Event(v1.ObjectReference{Kind:"Node", Namespace:"", Name:"k8s-flannel-ubuntu-1", UID:"10e9edda-b96a-42db-9970-...", APIVersion:"", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'CIDRNotAvailable' Node k8s-flannel-ubuntu-1 status is now: CIDRNotAvailable
E1105 16:54:50.749803 1 controller_utils.go:255] Error while processing Node Add/Delete: failed to allocate cidr from cluster cidr at idx:0: CIDR allocaE1105 12:49:11.530658 1 controller_utils.go:243] Error while processing Node Add: failed to allocate cidr from cluster cidr at idx:0: CIDR allocation failed; there are no remaining CIDRs left to allocate in the accepted range
I1105 12:49:11.531584 1 event.go:255] Event(v1.ObjectReference{Kind:"Node", Namespace:"", Name:"k8s-flannel-ubuntu-1", UID:"10e9edda-b96a-42db-9970-...", APIVersion:"", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'CIDRNotAvailable' Node k8s-flannel-ubuntu-1 status is now: CIDRNotAvailable
解決
原因は、デフォルトの --service-cluster-ip-range
(10.96.0.0/12) と指定した --pod-network-cidr
(10.100.0.0/16) が重複していた結果、node に割り当てられるレンジ(/24
)が無くなって PodCIDR
が付かなくなったのが原因でした。
kube-apiserver のドキュメントにも overlap しないようにと書いてあります(今回指しているデフォルト値は kubeadm のデフォルト値です)。
–service-cluster-ip-range string Default: “10.0.0.0/24”
https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
A CIDR notation IP range from which to assign service cluster IPs. This must not overlap with any IP ranges assigned to nodes for pods.
以下の filterOutServiceRange
がその処理で、Cluster CIDR から Service CIDR 分を専有しています。
試しに --pod-network-cidr
を変えてみたら全てが上手く動いたので気づきました。Calico は 10.101.0.0/16
に設定していて PodCIDR
がついてなくとも動いていていましたが、これも他のレンジに変えておいたほうが良さそうです。