Kubernetes 1.10.4でnodePortとして指定可能なポート番号
目次
概要
KubernetesでNginxのPodを起動し、紐づくServiceの作成を行いました。 ブラウザからアクセスしようとしてリッスンしているポート番号を調べたところ、30615番でした。 それでブラウザからアクセスはできたのですが、いちいちポート番号を明示的に指定するのは煩雑だし、 ポート番号が分かりづらい。やはり普通に80番ポートでアクセスしたいので変更しようとして調査しました。 Serviceの「nodePort」というパラメータで設定できることが分かったのですが、 期待していた80番ポートは指定できず、決められた一定のポートレンジ「30000~32767」を使わなければならないようでした。 この辺りを実機で確認したので備忘録として残しておきます。
構成
利用環境
サーバ環境はAWS(Amazon Web Services)のEC2インスタンスを利用しました。 サーバのスペックは以下のとおりです。
項目 | 内容 |
---|---|
AMI | CentOS 7 (x86_64) - with Updates HVM |
インスタンスタイプ | t2.micro |
vCPU | 1 |
メモリ | 1GiB |
ディスク | 汎用SSD(GP2) 8GiB |
リージョン | 日本 |
サーバ構成
OSバージョン
CentOS 7.5.1804 x86_64
ソフトウェア・パッケージ一覧
■Kubernetesマスタの構成 ※あとからマスタを作り直したのでノードより新しいリビジョンです
- docker-1.13.1-63.git94f4240.el7.centos.x86_64.rpm
- 3bfc22d32a20afc46175242700455a62bb88eda8edf0867295ec83098de09aaf-kubectl-1.10.4-0.x86_64.rpm
- 56f73d32965af49f582da3d790a145c121843c20e99fdcc6dc05a23f6afff338-kubeadm-1.10.4-0.x86_64.rpm
- 2d41bb10c7142326719c9052e9f0301f0875c3f25761fa4740ba862eaae0888e-kubelet-1.10.4-0.x86_64.rpm
■Kubernetesノードの構成
- docker-1.13.1-58.git87f2fab.el7.centos.x86_64.rpm
- 32e8bd812a3944ccf07750d52088a118fa11493d34e009e2873317e0f0b0dfd2-kubectl-1.10.2-0.x86_64.rpm
- b754a6990af7d7012189610b0dc69e6e950c13a8c415b9ebea8d56352e9719fd-kubeadm-1.10.2-0.x86_64.rpm
- bdee083331998c4631bf6653454c584fb796944fe97271906acbaacbf340e1d5-kubelet-1.10.2-0.x86_64.rpm
検証内容
無理やり80番ポートで起動するよう試してみた
NginxのPodにアクセスするためのServiceを作成します。 まずはServiceのYAMLファイルを作成します。 その中で、nodePortに期待の80番ポートを指定しておきます。
$ sudo su - Last login: Tue Dec 4 13:38:49 UTC 2018 on pts/0 # cd /data/k8s/ # vi nginx-service.yaml
※ファイルを新規作成※ apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 80 ←無理やり80番を指定
YAMLファイルからServiceを作成します。 ・・・するとやはりnodePortに80というのは無効な値だと怒られてエラーになりました。 当然Serviceは作成されていません。 nodePortとして有効な値の範囲は30000~32767と表示されています。
# kubectl create -f nginx-service.yaml The Service "nginx-service" is invalid: spec.ports[0].nodePort: Invalid value: 80: provided port is not in the valid range. The range of valid ports is 30000-32767 # kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP 178d
有効な範囲の中でもちょとWebっぽい30080番ポートを指定する
先ほど作成したYAMLファイルを対象にnodePortの値を80から30080に変更します。
# vi nginx-service.yaml
※該当箇所を変更※ apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30080 ←有効な30080番を指定
今度は無事にServiceが起動しました。ポートも指定した30080番でリッスンしています。 この状態でブラウザからKubernetesのノードの30080番ポートにアクセスすると、 Nginxで公開している画面が表示されます。
# kubectl create -f nginx-service.yaml service "nginx-service" created # kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP 178d nginx-service NodePort 10.104.195.115 80:30080/TCP 13s ←起動した # exit logout
上記の通り80番を含むウェルノウンポートを指定できないのはイマイチだな~と思っていましたが、 外部からアクセスする場合はKubernetesノードの前段でポート変換(80→30080)をかければいいんだなと勝手に納得しました。 ただ、まだどんな構成がベストプラクティスなのか分かっていないので、今後の課題です。