KubernetesでNodePortを作成してTomcatに接続する方法【minikube検証+port-forward図解】

kubenetesロゴ

Kubernetesで外部からアプリに接続する場合、まず理解しておきたいのが Service(NodePort) と port-forward です。

この記事では、以下を実際に検証しながら解説します。

  • NodePort Serviceの作成方法
  • Tomcat Deploymentの作成方法
  • NodePortでの疎通確認方法
  • port-forwardでブラウザ表示する方法(図解あり)

今回の作成する構成図

構成図

NodePort Serviceを作成する

まずはTomcatに接続するための NodePort Service を作成します。

vi apache-nodeip.yaml
apiVersion: v1
kind: Service
metadata:
  name: apache-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: tomcat
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30080   # 30000〜32767 の範囲で指定可能

作成します。

kubectl apply -f apache-nodeip.yaml

作成確認

kubectl get svc
作成確認

ここで NodePort 30080 が表示されていればOKです。

Tomcat Deploymentを作成する

次にTomcatを下記内容で作成しデプロイします。ファイル名は「tomcat.yaml」で作成します!

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:9.0
        ports:
        - containerPort: 8080

作成

kubectl apply -f tomcat.yaml

Podが8080で待ち受けしているか確認する

debug用のPodを作成してポート確認を行います。

kubectl debug node/minikube -it --image=alpine:latest -- sh

必要なパッケージをインストール

apk update && apk add iproute2

確認

netstat -nat | grep 8080

8080が表示されれば、Tomcatは正常に起動しています。

NodePortで疎通確認

minikubeにログインして確認します。

minikube ssh
curl http://localhost:30080

または

minikube service apache-service

Tomcatには接続できていますが、初期状態では表示されるページがありません。

テストページを配置する

Podにログインしてテストページを作成します。

kubectl get pod
kubectl exec -it tomcat-deployment-xxxx -- bash

テストページ作成

mkdir -p /usr/local/tomcat/webapps/ROOT
echo "Hello Tomcat!" > /usr/local/tomcat/webapps/ROOT/index.html

ブラウザで再度アクセスすると表示されます。

port-forwardでブラウザ表示する方法

NodePortがうまく接続できない場合は、port-forward を使えば確実に表示できます。

実行

kubectl port-forward svc/apache-service 8080:8080

※コマンド実行後、プロンプトは戻りませんが正常です。

webブラウザで「http://localhost:8080」と入力

NodePortで接続できない原因(minikubeの場合)

本来は以下で接続できるはずです。

http://<NodeIP>:30080

ただしminikube環境では、NodeIPが外部から直接アクセスできない場合があります。

そのため

minikube service apache-service

または

kubectl port-forward

を使う方法が最も確実です。

まとめ

この記事では以下を解説しました。

  • NodePort Serviceの作成方法
  • Tomcat Deploymentの作成方法
  • NodePortでの疎通確認方法
  • port-forwardでブラウザ表示する方法
  • minikubeでNodePortが接続できない理由