Kubernetes 日記 2019/11/05

こんにちは。最近の京都はほぼ冬です。

今回は 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 に書けけば良いか、となりました。

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”

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.

https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/

以下の filterOutServiceRange がその処理で、Cluster CIDR から Service CIDR 分を専有しています。

https://github.com/kubernetes/kubernetes/blob/669dc0a/pkg/controller/nodeipam/ipam/range_allocator.go#L295-L314

試しに --pod-network-cidr を変えてみたら全てが上手く動いたので気づきました。Calico は 10.101.0.0/16 に設定していて PodCIDR がついてなくとも動いていていましたが、これも他のレンジに変えておいたほうが良さそうです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です