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が割り当てていませんってなります。