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選択画面

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

pingが通らなかったこと自体はこれらが原因

pingが通らなかったこと自体はこれらが原因

これらを削除すると、実際に ping が通った。 問題がL4レベルでの疎通にありそうなことが確認できたので、削除した設定を元に戻しておいた。

同一サブネット内からの通信を許可

続いて、本来やりたかった kubeadm join を成功させるため、ここに同一サブネット内からのTCP通信を許可する設定を加えたい。 …といいつつも、なんだかんだUDPは使われそうだし、ICMPも使いそう。 この画面からは、許可するプロトコルの複数選択はできなかったので、“All protocols” を許可することにした(同一サブネット内ならまぁ問題ないでしょう)。

サブネット内からの通信について全てのプロトコルを許可

サブネット内からの通信について全てのプロトコルを許可

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