DebianやUbuntuはサービスを起動したときに必要なポートは自動的に良きに計らってくれますが、全てのLinuxがそうであるとも限りません。
例えばRHELやCentOSの場合、デフォルトの設定ではiptablesコマンドやfirewall-cmdコマンドなどを使って、ポートを解放する必要があります(デフォルトではSSHアクセス用にTCP 22番ポートしか空いていないはず)。
Kubernetesクラスターで利用するために解放すべきポートの一覧は次に掲載されています。
だからということで、次のようにノードの役割別にポート解放してみるわけですが、その後 kubeadm init
したり kubeadm join
したりしてクラスターを作り、なんらかのコンテナーネットワークプラグイン(例えばFlannelとか)を投入してPodを作るわけですが、なんかそのPodが外と通信できなかったり名前解決に失敗するなんてことにあります。
コントロールプレーンノード(Master)
# firewall-cmd --zone=public --permanent --add-port={6443,2379,2380,10250,10251,10252}/tcp
ワーカーノード(Worker)
# firewall-cmd --zone=public --permanent --add-port=10250/tcp # firewall-cmd --permanent --add-port=30000-32767/tcp
通信がうまくいかない原因は必要なポートが解放されていないため
この問題はKubernetesをシングルノードで動かしている場合は特にはまりません。また、DebianやUbuntuなどでKubernetesクラスターを構成していると良きにはからっくれるのであまり意識するところじゃないと思います。
また、KubernetesのドキュメントにはKubernetesクラスターの実行に必要な解放すべきポートしか掲載されていません。したがって、選択したCNIが正常に通信するために必要なポートの解放をする必要があります(が、検索キーワードに注意しないとあまり情報を見つけられません)。
例えばFlannelの場合、UDP/8472とTCP/9099が必要そうです。実際これらのポート解放をすることでうまく動作することを確認しています。
Calicoの場合は、動作モードによって必要なポートが変わるものもあります。
これに気がつかず、数日時間を無駄にしました。まあこれも経験ですね。