このエントリーをはてなブックマークに追加

概要

 KubernetesでNginxのPodを起動し、紐づくServiceの作成を行いました。 ブラウザからアクセスしようとしてリッスンしているポート番号を調べたところ、30615番でした。 それでブラウザからアクセスはできたのですが、いちいちポート番号を明示的に指定するのは煩雑だし、 ポート番号が分かりづらい。やはり普通に80番ポートでアクセスしたいので変更しようとして調査しました。 Serviceの「nodePort」というパラメータで設定できることが分かったのですが、 期待していた80番ポートは指定できず、決められた一定のポートレンジ「30000~32767」を使わなければならないようでした。 この辺りを実機で確認したので備忘録として残しておきます。

構成

利用環境

 サーバ環境はAWS(Amazon Web Services)のEC2インスタンスを利用しました。 サーバのスペックは以下のとおりです。

■サーバスペック
項目内容
AMICentOS 7 (x86_64) - with Updates HVM
インスタンスタイプt2.micro
vCPU1
メモリ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
ファイル名:/data/k8s/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.1              443/TCP        178d

有効な範囲の中でもちょとWebっぽい30080番ポートを指定する

 先ほど作成したYAMLファイルを対象にnodePortの値を80から30080に変更します。

# vi nginx-service.yaml
ファイル名:/data/k8s/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.1                443/TCP        178d
nginx-service   NodePort    10.104.195.115           80:30080/TCP   13s ←起動した
# exit
logout

 上記の通り80番を含むウェルノウンポートを指定できないのはイマイチだな~と思っていましたが、 外部からアクセスする場合はKubernetesノードの前段でポート変換(80→30080)をかければいいんだなと勝手に納得しました。 ただ、まだどんな構成がベストプラクティスなのか分かっていないので、今後の課題です。

参考にしたサイト