Kubernetesの世界ではNodePortという用語があり、チュートリアル等にて
$ kubectl expose deployment nginx-deployment --type=NodePort
のように利用するも意味が分かりにくかったりします。
本記事ではサービスタイプの一つであるNodePortとはなんぞや?という点を分かりやすく解説しました。
サービスタイプとは?
IPアドレスが変動するポッドに対してクライアントがアクセスするために作成するオブジェクトがサービスですが、以下のようなサービスタイプがあります。
- ClusterIP
- NodePort
- LoadBalancer
- ExternaName
k8sではデフォルトとして利用されるClusterIPとの比較から説明します。
ClusterIPとNodePortの違い
ClusterIPはポッド(Pod)の代表IPアドレスとして機能しますが、この違いはK8s外からアクセスができるか否かです。
要は、ClusterIPは各ポッド間の通信で利用するものですが、NodeIPはKubernetesクラスタ外からもアクセスが可能というわけです。よってNodeIPはClusterIPの機能は持ち合わせた上でさらに外部に公開用ポートを開いています。
ちなみにサービスのマニフェストにタイプを指定しない場合はClusterIPとして処理され、実機上でも以下コマンドで確認できます。
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP X nginx-deployment NodePort 10.96.148.62 <none> 80:30094/TCP X
NodePortとは?
再掲ですが、NodePortを作成することでK8sクラスタに所属していない端末からポッド内に通信することができます。
その公開用ポートはデフォルトでは30000~32767から採番されるので、上記の「80:30094」でいう後者が公開用ポートです。
用語を整理すると以下となります。
- nodePort : ノードが待ち受けるポート(クラスタ外からの通信)
- port : Serviceが待ち受けるポート(クラスタ内からの通信)
- targetPort : Podが待ち受けるポート(他のPodからの通信)
K8Sでは「30094」に来た通信を「80」に変換してポッドに届けるわけです。
よって例えばminikubeにログインしてnignxのサービスであるポート80へは疎通ができるものの
$ ssh -v -p 80 10.96.148.62 OpenSSH_7.9p1, LibreSSL 2.8.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: Connecting to 10.96.148.62 [10.96.148.62] port 80. debug1: Connection established. ...
外部公開用ポートにはアクセスできません。
$ ssh -v -p 30094 10.96.148.62 OpenSSH_7.9p1, LibreSSL 2.8.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: Connecting to 10.96.148.62 [10.96.148.62] port 30094. debug1: connect to address 10.96.148.62 port 30094: Connection timed out ssh: connect to host 10.96.148.62 port 30094: Connection timed out
これはあくまで外部公開用ポートいうわけです。
minikubeの仮想サーバのIPアドレス
$ minikube ip 192.168.99.100
に先ほどのポートを付与してブラウザからつつくと
$ curl 192.168.99.100:30094 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> ...
外部からアクセスが可能です。
終わりに
NodePortとはクラスタ外からアクセスを行う上で必要なサービスで、特にサービスを外部に公開する際には必要です。
以上、ご参考になれば幸いです。