KubernetesでのTomcatクラスタ展開

Kubernetes (K8s) 環境が正常にセットアップされ、すべてのノードが 'Ready' 状態であることを確認してから、以下の手順に進みます。

既存Podの確認と削除

まず、現在実行中のPodが存在するか確認し、もしあれば削除します。

kubectl get pod
kubectl get deployment

必要なリソースの準備

JDK、Tomcat、およびデプロイするWebアプリケーション(WARファイル)を用意します。以下のリンクからダウンロードできます。

Dockerfileの作成

Dockerfile という名前で新しいファイルを作成します。

touch Dockerfile

Dockerfileの編集

作成した Dockerfile に以下の内容を記述します。JDKおよびTomcatのバージョンは、ダウンロードしたものと一致させてください。

# ベースイメージとしてCentOS 7を使用
FROM daocloud.io/centos:7

# メンテナンス情報
MAINTAINER Your Name your.email@example.com

# タイムゾーン設定
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  && echo 'Asia/Shanghai' >/etc/timezone

# JDKとTomcatの展開
ADD jdk-8u131-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-7.0.68.tar.gz /usr/local/

# Tomcatの不要なファイルを削除
RUN rm -f /usr/local/apache-tomcat-7.0.68/webapps/ROOT/favicon.ico

# データディレクトリ作成
RUN mkdir -p /data

# 環境変数の設定
ENV JAVA_HOME=/usr/local/jdk1.8.0_131
ENV JRE_HOME=${JAVA_HOME}/jre
ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH=${JAVA_HOME}/bin:$PATH
ENV CATALINA_HOME=/usr/local/apache-tomcat-7.0.68
ENV LC_ALL=en_US.UTF-8

# アプリケーションWARファイルの配置
ADD *.war /usr/local/apache-tomcat-7.0.68/webapps/

# Tomcatスクリプトに実行権限を付与
RUN chmod +x /usr/local/apache-tomcat-7.0.68/bin/*

# ポート公開
EXPOSE 8080
EXPOSE 9000

# コンテナ起動時のエントリーポイント
ENTRYPOINT ["/usr/local/apache-tomcat-7.0.68/bin/catalina.sh", "run"]

Dockerイメージのビルド

Dockerfileを使用してDockerイメージをビルドします。

docker build -t tomcattest .

イメージへのタグ付けとプッシュ

ビルドしたイメージにタグを付け、プライベートリポジトリにプッシュします。これにより、クラスター内の他のノードでイメージを取得できるようになります。

docker tag tomcattest your-registry.example.com/k8s/tomcat:1.2
docker push your-registry.example.com/k8s/tomcat:1.2

プライベートリポジトリのイメージを確認するには、以下のコマンドを使用します。

curl http://your-registry.example.com:5000/v2/_catalog

注意: プッシュするには、Dockerプライベートリポジトリを事前にセットアップしておく必要があります。

# 1. Docker公式のregistryイメージをプル
docker pull registry

# 2. registryコンテナを起動
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry

Kubernetesリソース定義ファイルの作成

PodとServiceを定義するYAMLファイルを作成します。

tomcat-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-app
spec:
  replicas: 3 # 必要に応じてレプリカ数を調整
  selector:
    matchLabels:
      app: tomcat-app
  template:
    metadata:
      labels:
        app: tomcat-app
    spec:
      containers:
        - name: tomcat-container
          image: your-registry.example.com/k8s/tomcat:1.2 # プッシュしたイメージを指定
          imagePullPolicy: Always
          ports:
            - containerPort: 8080

tomcat-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
      name: http
      nodePort: 32012 # 必要に応じてポート番号を調整 (デフォルトは 30000-32767)
  selector:
    app: tomcat-app

Podのデプロイ

作成したYAMLファイルを使用してPodをデプロイします。

kubectl create -f tomcat-deployment.yaml

Podのデプロイを削除する場合は、以下のコマンドを使用します。

kubectl delete -f tomcat-deployment.yaml

デプロイ中にエラーが発生した場合は、Podの詳細情報を確認して原因を調査します。

kubectl describe pod 

ログにイメージのプルに失敗する旨のエラーが表示される場合、DockerデーモンがプライベートリポジトリをHTTPSではなくHTTPで扱っている可能性があります。この問題を解決するには、Dockerデーモンの設定を次のように変更します。

/etc/docker/daemon.json ファイルを編集(なければ作成)し、以下の内容を追加します。


{
  "insecure-registries": ["your-registry.example.com:5000"]
}

その後、Dockerサービスを再起動します。

systemctl daemon-reload
systemctl restart docker

設定変更後、再度イメージのプルを試みてください。

ポートマッピングサービスの起動

Service定義ファイルを適用して、ポートマッピングを設定します。

kubectl create -f tomcat-service.yaml

注意: KubernetesのデフォルトのNodePort範囲は 30000-32767 です。この範囲外のポートを使用したい場合は、kube-apiserverの設定を変更する必要があります。具体的には、/etc/kubernetes/manifests/kube-apiserver.yaml ファイル内の --service-cluster-ip-range の後に、以下の行を追加します。

# --service-cluster-ip-range=xxxxxx
- --service-node-port-range=1-65535

変更後、kubeletサービスを再起動します。

systemctl daemon-reload
systemctl restart kubelet

アクセス

上記の手順が完了すると、クラスターのノードIPアドレスとServiceで指定したNodePort(例: 32012)を使用して、Tomcatアプリケーションにアクセスできるようになります。

タグ: Kubernetes Docker Tomcat Deployment service

8月18日 18:16 投稿