
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を活用するのが望ましいでしょう。