(O+P)ut

アウトプット



(O+P)ut

Output Log

【Kubernetes入門】NodePortとは?

スポンサーリンク

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とはクラスタ外からアクセスを行う上で必要なサービスで、特にサービスを外部に公開する際には必要です。

f:id:mtiit:20200506151418p:plain
Pod群に紐づくService
LoadBalancerもNodePortと同様に外部に公開する際に利用できるサービスタイプなので別途記事にしたいと思います。

以上、ご参考になれば幸いです。


他の記事を読む