kubernetes(K8S) master nodeをRaspberry piで作る方法の話

raspberry piでKubernetes(K8s) clusterを構築するにあたりメインとなるmaster nodeを構築するメモを書いておきます。
worker nodeとは異なり一度作成するとなかなか作り直すことがないです。
覚えているうちに書いておきます。

関連として前回worker nodeの作成メモを書きました。
前回 : kubernetes(K8S) Worker nodeをRaspberry piで作る方法の話 2022年5月2日

構築方法

前回記事を参考にしてください… joinまで全く同じです。
なので解説は略です!

kubernetes clusterの初期化

k8s clusterを作成するにはinitにて初期化すれば全て作成できます。

今回はTry & Errorsの結果を書いておきます…

結論から言うとkubeadm init時にpodネットワーク(pod-network-cidr)を指定しないと後々「pod cidr not assigned」が発生します。

pod-network-cidrの値はflannelのNETWORKとを合わせればOKです。

flannelを定義

wataru@k8s-master:~ $ sudo vi  /run/flannel/subnet.env
FLANNEL_NETWORK=10.196.0.0/12
FLANNEL_SUBNET=10.196.0.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

ここにまとめて思いましたが… FLANNEL_NETWORKとFLANNEL_SUBNETって普通一緒ですわねw
あえて放置

初期化

flannelで指定したネットワーク体系をpod-networkとして指定するだけでOKです。

wataru@k8s-master:~ $ sudo kubeadm init --pod-network-cidr=10.196.0.0/12

... 略 以下のjoin方法が出れば完了です
Your Kubernetes control-plane has initialized successfully!

kubeadm join 192.168.1.226:6443 --token sklads.7t55tqisx0l2iqd6 \
        --discovery-token-ca-cert-hash sha256:ce81eb04b1bafbf684a44850f2af8278e1228da179a08a357e6d5ad0f473a08c 

はい、これだけですw

終いに

出来上がればシンプルですが、試行錯誤がかなり多かったですね。
この記事を書くにあたり新しい環境を作りました。
しかし、確認するたびに想定しない「pod cidr not assigned」が発生します。
「pod-network-cidrをflannelと合わせて作成する。」これを忘れなければ発生しませんので作成時には必ず指定しましょう

まず、一番シンプルに全てRunning状態から始めようと思ったのですが…

corednsがPendingから動かないという状態に陥りました。

ともあれ、いろいろやっているとエラーなど想定しない状態になるので多かった部分を以降に書いておきます。

前回のk8s worker nodeと今回のk8s master nodeこれでk8s clusterが作成できました!

最終着地

wataru@k8s-master:~ $ kubectl get node
NAME          STATUS   ROLES                  AGE     VERSION
k8s-master    Ready    control-plane,master   12h     v1.23.6
k8s-worker1   Ready    <none>                 11h     v1.23.6
k8s-worker2   Ready    <none>                 11h     v1.23.6
k8s-worker3   Ready    <none>                 9h      v1.23.6
k8s-worker4   Ready    <none>                 5h18m   v1.23.6
k8s-worker5   Ready    <none>                 97m     v1.23.6
k8s-worker6   Ready    <none>                 97m     v1.23.6
k8s-worker7   Ready    <none>                 97m     v1.23.6
wataru@k8s-master:~ $ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                 READY   STATUS    RESTARTS        AGE     IP              NODE          NOMINATED NODE   READINESS GATES
kube-system   coredns-64897985d-2m92m              1/1     Running   0               12h     10.244.0.2      k8s-master    <none>           <none>
kube-system   coredns-64897985d-bqpgl              1/1     Running   0               12h     10.244.0.3      k8s-master    <none>           <none>
kube-system   etcd-k8s-master                      1/1     Running   5               12h     192.168.1.221   k8s-master    <none>           <none>
kube-system   kube-apiserver-k8s-master            1/1     Running   5               12h     192.168.1.221   k8s-master    <none>           <none>
kube-system   kube-controller-manager-k8s-master   1/1     Running   0               12h     192.168.1.221   k8s-master    <none>           <none>
kube-system   kube-flannel-ds-2jqzf                1/1     Running   1 (3m15s ago)   11h     192.168.1.223   k8s-worker2   <none>           <none>
kube-system   kube-flannel-ds-6bf2x                1/1     Running   1 (2m52s ago)   5h19m   192.168.1.225   k8s-worker4   <none>           <none>
kube-system   kube-flannel-ds-7c28z                1/1     Running   1 (3m23s ago)   9h      192.168.1.224   k8s-worker3   <none>           <none>
kube-system   kube-flannel-ds-8wpcp                1/1     Running   0               98m     192.168.1.227   k8s-worker6   <none>           <none>
kube-system   kube-flannel-ds-gstkp                1/1     Running   0               12h     192.168.1.221   k8s-master    <none>           <none>
kube-system   kube-flannel-ds-rdc6r                1/1     Running   1 (11m ago)     98m     192.168.1.226   k8s-worker5   <none>           <none>
kube-system   kube-flannel-ds-sp9t9                1/1     Running   0               98m     192.168.1.228   k8s-worker7   <none>           <none>
kube-system   kube-flannel-ds-x98rl                1/1     Running   0               12h     192.168.1.222   k8s-worker1   <none>           <none>
kube-system   kube-proxy-bk4hj                     1/1     Running   0               98m     192.168.1.227   k8s-worker6   <none>           <none>
kube-system   kube-proxy-bld9c                     1/1     Running   0               12h     192.168.1.221   k8s-master    <none>           <none>
kube-system   kube-proxy-cd6wg                     1/1     Running   1 (2m52s ago)   5h19m   192.168.1.225   k8s-worker4   <none>           <none>
kube-system   kube-proxy-gft8k                     1/1     Running   0               98m     192.168.1.228   k8s-worker7   <none>           <none>
kube-system   kube-proxy-p7n22                     1/1     Running   1 (11m ago)     98m     192.168.1.226   k8s-worker5   <none>           <none>
kube-system   kube-proxy-qc8r8                     1/1     Running   0               12h     192.168.1.222   k8s-worker1   <none>           <none>
kube-system   kube-proxy-r7942                     1/1     Running   1 (3m23s ago)   9h      192.168.1.224   k8s-worker3   <none>           <none>
kube-system   kube-proxy-wx6c7                     1/1     Running   1 (3m15s ago)   11h     192.168.1.223   k8s-worker2   <none>           <none>
kube-system   kube-scheduler-k8s-master            1/1     Running   5               12h     192.168.1.221   k8s-master    <none>           <none>

次は… どうしようかな…

corednsがPendingから動かない

initした直後に状態を確認するとcoredns以外はRunningになります。
しかし、corednsはPending状態で止まったままになっています。

原因としては…

CoreDNSを完全にデプロイする前にPodネットワークをインストールする必要があります。したがって、ネットワークがセットアップされる前の Pending状態

https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/

initした直後はPodがないのでnetworkが作れずにPending状態ということです。

不具合ではなく普通な状態ということです。

一度でもnode追加したりflennelを入れたりするとこの状態にはならないです。

corednsがContainerCreatingから上がらない

wataru@k8s-master:~ $ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                 READY   STATUS              RESTARTS          AGE   IP              NODE          NOMINATED NODE   READINESS GATES
kube-system   coredns-64897985d-2ksrc              0/1     ContainerCreating   0                 13h   <none>          k8s-master    <none>           <none>
kube-system   coredns-64897985d-tdxdd              0/1     ContainerCreating   0                 13h   <none>          k8s-master    <none>           <none>

と、ContainerCreatingからいくら経っても動かない状態になることがあります。

その原因としては…

wataru@k8s-master:~ $ kubectl describe pod --all-namespaces 

  Warning  FailedCreatePodSandBox  3m46s (x15877 over 13h)  kubelet  (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "dfacfd4bf846f8aafb6c44ae51db2bb985692a1e03df612481f06a547e877d13" network for pod "coredns-64897985d-2ksrc": networkPlugin cni failed to set up pod "coredns-64897985d-2ksrc_kube-system" network: open /run/flannel/subnet.env: no such file or directory

flannelの設定がないってことです。

/run/flannel/subnet.envファイルを定義するとRunningになります!
その時にcni0が上がるのを確認できます

wataru@k8s-master:~ $ ip a
6: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000

cni0がない場合

flannelの設定がなくk8sにflennel.yamlを入れるとcni0が作成されずにflannel.1のみが作成される状態になります

wataru@k8s-master:~ $ ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
5: flannel.1: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN group default 

抜粋していますが、flannelのみでcni0がありません。

この状態ではそれぞれのkube-flannel-dsがCrashします。

wataru@k8s-master:~ $ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                 READY   STATUS              RESTARTS      AGE     IP              NODE          NOMINATED NODE   READINESS GATES
...
kube-system   kube-flannel-ds-gfmhh                0/1     CrashLoopBackOff    2 (20s ago)   64s     192.168.1.226   k8s-master    <none>           <none>
kube-system   kube-flannel-ds-jvh5z                0/1     CrashLoopBackOff    2 (18s ago)   64s     192.168.1.227   k8s-worker6   <none>           <none>
kube-system   kube-flannel-ds-rkdbs                0/1     CrashLoopBackOff    2 (20s ago)   64s     192.168.1.228   k8s-worker7   <none>           <none>

この時のkube-flannel-dsを確認すると…

wataru@k8s-master:~ $ kubectl logs -n kube-system kube-flannel-ds-gfmhh
...
E0502 06:40:48.407981       1 main.go:317] Error registering network: failed to acquire lease: node "k8s-master" pod cidr not assigned

wataru@k8s-master:~ $ kubectl logs -n kube-system kube-flannel-ds-jvh5z
...
E0502 06:40:49.328636       1 main.go:317] Error registering network: failed to acquire lease: node "k8s-worker6" pod cidr not assigned

みんな大好きな「pod cidr not assigned」が出ます。pod network cidrが割り当てていませんってなります。

flannel.yaml applyすると cniにはflannelの定義は作成されます。

wataru@k8s-master:~ $ ls /etc/cni/net.d/10-flannel.conflist 
/etc/cni/net.d/10-flannel.conflist

この設定があるのでflannel.1は発生しています。

この状態でflannelの設定を組んでからcniを組み直す時に設定がないのでcni0が上がっていないのでしょうね。

“registering network: failed to acquire lease: node “node名” pod cidr not assigned”がでる。

flannelを追加してもkube-flannel-dsが Runningにならないことがあります。
その時はそっとログを確認してみましょう。
きっとpod cidr not assignedが出ています。

init作成時にcidrを指定指定すれば解消できます。
理由としては…

initの–pod-network-cidrの値を指定しないデフォルト値が 何らかあって、それがflannel
flennelで指定できていないからでしょうね。わかったらそれで flennelネットワークを設定すればOKだとは思います…

なので、手動でk8sのpod network cidrとflennelネットワークを合わせましょう

pod network ipが10.96.0.0の場合の動作

Flannelの設定で、10.96.0.0を指定いるサンプルがネット上でありました。
これって動きません…
10.96.0.0はk8s serviceで使っています。

–service-cidr string Default: “10.96.0.0/12”

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

kubeadm initでも利用していることが確認できます。

[certs] apiserver serving cert is signed for DNS names [k8s-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.1.226]

そのためpod networkで指定すると、サービスとバッティングしますのでPodが作成できずにERRORとなります。

wataru@k8s-master:~ $ sudo vi  /run/flannel/subnet.env
FLANNEL_NETWORK=10.96.0.0/12
FLANNEL_SUBNET=10.96.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

↑ これはダメな例!

10.96.0.0をpod networkにして初期化

wataru@k8s-master:~ $ sudo kubeadm init --pod-network-cidr=10.96.0.0/12

作成後、podを確認します

wataru@k8s-master:~ $ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
kube-system   coredns-64897985d-qdlpw              1/1     Running   0          17s   10.96.0.2       k8s-master   <none>           <none>
kube-system   coredns-64897985d-w47gx              1/1     Running   0          17s   10.96.0.3       k8s-master   <none>           <none>

init指定通りに10.96.0.0に作成できます。

でも、flannelを追加するとERRORが発生します

wataru@k8s-master:~ $ kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                 READY   STATUS    RESTARTS      AGE     IP              NODE          NOMINATED NODE   READINESS GATES
kube-system   coredns-64897985d-qdlpw              1/1     Running   0             3m35s   10.96.0.2       k8s-master    <none>           <none>
kube-system   coredns-64897985d-w47gx              1/1     Running   0             3m35s   10.96.0.3       k8s-master    <none>           <none>
kube-system   kube-flannel-ds-f4hwp                0/1     Error     2 (20s ago)   30s     192.168.1.228   k8s-worker7   <none>           <none>
kube-system   kube-flannel-ds-gktj2                0/1     Error     2 (19s ago)   30s     192.168.1.226   k8s-master    <none>           <none>
kube-system   kube-flannel-ds-zjf5m                0/1     Error     2 (20s ago)   30s     192.168.1.227   k8s-worker6   <none>           <none>

原因を確認すると

wataru@k8s-master:~ $ kubectl logs -n kube-system kube-flannel-ds-gktj2
...
E0502 06:56:55.907291       1 main.go:317] Error registering network: failed to acquire lease: node "k8s-master" pod cidr not assigned

みんな大好きな「pod cidr not assigned」が出ます。pod network cidrが割り当てていませんってなります。