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アプリケーションにアクセスできるようになります。