kubeadm joinがAPIサーバー認証で失敗していたときの対応
公式のガイドではさらっと説明されている kubeadm join でつまづいたが、ネットワークの設定を見直すことで解決できた。
コンテキスト
- Oracle Cloud Infrastructure(OCI)上に3ノード(1 master、2 workers)構成のオンプレKubernetesクラスタを立てようとしていた
- masterノードと2基のworkerノードは同一のサブネット上に存在
- masterノードはセットアップ済み
- クラスタにworkerノードを追加するため、workerノード用インスタンスから
kubeadm joinを試みている
状況
kubeadm join に対して以下のエラーが出ていた:
[preflight] Running pre-flight checks
error execution phase preflight: couldn't validate the identity of the API Server: Get "https://10.0.0.94:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
To see the stack trace of this error execute with --v=5 or higher
対応
L3疎通を確認
そもそも疎通しているのかを確認する必要があると判断:
ping 10.0.0.94
ping に対してmasterノードからの応答はなかった。
続いて、L3レベルでの疎通を確認するためにARPテーブルを確認した:
arp
ubuntu@worker-node1:~$ arp
Address HWtype HWaddress Flags Mask Iface
10.244.0.0 ether MAC-ADDRESS CM flannel.1
10.244.2.0 ether MAC-ADDRESS CM flannel.1
_gateway ether MAC-ADDRESS C enp0s3
master-node ether MAC-ADDRESS C enp0s3
169.254.169.254 ether MAC-ADDRESS C enp0s3
worker-node ether MAC-ADDRESS C enp0s3
ARPテーブルにはmasterノードが登録されていることから、L3レベルでは疎通していることが確認できた。
そこで、L4レベルでの断を疑い、ノードが接続されているサブネットのセキュリティ設定を確認することにした。
Virtual Cloud Networkのセキュリティ設定を見直し
- OCIのVirtual Cloud Network(VCN)にアクセス
- 左カラムの “Security Lists” にアクセス
- 対象VCNインスタンス(サブネット)にアクセス
- サブネット内からのアクセスを全プロトコルについて許可

Security Lists選択画面
“Security Lists” から目的のサブネットのIngress設定を確認すると、全サブネットおよび同一サブネット内からのICMPプロトコル( ping が利用)が “Destination unreachable” となるような設定があった。

pingが通らなかったこと自体はこれらが原因
これらを削除すると、実際に ping が通った。
問題がL4レベルでの疎通にありそうなことが確認できたので、削除した設定を元に戻しておいた。
同一サブネット内からの通信を許可
続いて、本来やりたかった サブネット内からの通信について全てのプロトコルを許可kubeadm join を成功させるため、ここに同一サブネット内からのTCP通信を許可する設定を加えたい。
…といいつつも、なんだかんだUDPは使われそうだし、ICMPも使いそう。
この画面からは、許可するプロトコルの複数選択はできなかったので、“All protocols” を許可することにした(同一サブネット内ならまぁ問題ないでしょう)。

これで ping も通るようになったし、無事 kubeadm join も成功した。