ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

Kubernetesで解放すべきポートを確認する

DebianやUbuntuはサービスを起動したときに必要なポートは自動的に良きに計らってくれますが、全てのLinuxがそうであるとも限りません。

例えばRHELやCentOSの場合、デフォルトの設定ではiptablesコマンドやfirewall-cmdコマンドなどを使って、ポートを解放する必要があります(デフォルトではSSHアクセス用にTCP 22番ポートしか空いていないはず)。

Kubernetesクラスターで利用するために解放すべきポートの一覧は次に掲載されています。

kubernetes.io

だからということで、次のようにノードの役割別にポート解放してみるわけですが、その後 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が必要そうです。実際これらのポート解放をすることでうまく動作することを確認しています。

rancher.com

Calicoの場合は、動作モードによって必要なポートが変わるものもあります。

docs.projectcalico.org

これに気がつかず、数日時間を無駄にしました。まあこれも経験ですね。

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。