見出し画像

kube-apiserver の --kubernetes-service-node-port とは?

Kubernetesを使っていると、APIサーバーへのアクセス方法について考えることがありますよね。普段はクラスター内部からアクセスするだけで十分ですが、外部からAPIサーバーに直接アクセスしたい場合もあるかもしれません。そんなときに関係してくるのが、--kubernetes-service-node-port フラグです。

今回は、このフラグの役割や注意点について見ていきましょう。


--kubernetes-service-node-port の役割

Kubernetesの kube-apiserver を起動すると、自動的に kubernetes という名前のServiceが作成されます。これは、クラスター内の各コンポーネントがAPIサーバーに通信するためのものです。

通常、この kubernetes サービスは**ClusterIP** という種類になっていて、クラスター内部のPodからのみアクセスできます。

kubectl get service kubernetes -n default
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   10d
  • TYPE: ClusterIP → クラスター内のPodからのみアクセス可能

  • PORT(S): 443/TCP → APIサーバーのデフォルトポート(HTTPS)

では、--kubernetes-service-node-port を使うと何が変わるのでしょうか?


--kubernetes-service-node-port を指定すると?

このフラグを使うと、デフォルトの kubernetes サービスのタイプが NodePort になり、クラスター外部からもアクセスできるようになります

例えば、以下のように kube-apiserver を起動すると、

kube-apiserver --kubernetes-service-node-port=32000

kubernetes サービスの設定が変更され、各ノードの 32000 番ポートを通じてAPIサーバーにアクセスできるようになります。

kubectl get service kubernetes -n default
NAME         TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
kubernetes   NodePort   10.96.0.1    <none>        443/TCP, 32000/TCP   10d
  • TYPE: NodePort → クラスター外部からもアクセス可能

  • PORT(S): 32000/TCP → ノードの 32000 番ポート経由でアクセス可能

つまり、<ノードのIP>:32000 にアクセスすると、APIサーバーに直接リクエストを送れるようになります。


--kubernetes-service-node-port を使う際の注意点

(1) セキュリティリスクがある
NodePort を開放すると、外部からAPIサーバーにアクセスできるため、不正なリクエストのリスクが高まります。適切な認証・認可の設定をしないと、誰でもAPIサーバーにアクセスできてしまう可能性があるため、ファイアウォールなどで不要なアクセスを制限することが必須です。

(2) ポートの範囲が決まっている
デフォルトでは、NodePort に設定できるポートは 30000-32767 の範囲内に限定されています。この範囲を変更したい場合は、--service-node-port-range を指定する必要があります。

(3) 基本的には ClusterIP のままでOK
APIサーバーに外部からアクセスする必要がある場合、多くのケースではロードバランサーやIngressを利用するのが一般的です。特別な理由がない限り、直接 NodePort を使う必要はないでしょう。


まとめ

--kubernetes-service-node-port を指定しない場合、kubernetes サービスのタイプは ClusterIP となり、クラスター内部のPodからのみアクセス可能です。一方で、--kubernetes-service-node-port=<ポート番号> を指定すると、NodePort に変更され、クラスター外部から <ノードIP>:<指定ポート> でAPIサーバーにアクセスできるようになります。

ただし、NodePort を使用すると外部からのアクセスが可能になるため、適切なセキュリティ対策を行う必要があります。基本的には ClusterIP のままで運用し、外部アクセスが必要な場合はロードバランサーやIngressを活用するのが望ましいでしょう。

いいなと思ったら応援しよう!