※途中ですが、順次更新します。
【背景】
- 業務でAWSにEKSを導入していく中で、Kubernetesの仕様理解をする必要が出てきました。
- Kubernetes内部のアーキテクチャや処理を把握するため、VMWareの仮想マシンに、minukubeを導入し、スケーリングを可能とするアーキテクチャを導入します。
- minikubeを導入するメリットは、KubernetesはCPU・メモリを消費するアーキテクチャでありながら、低スペックPCでも構築が可能な点です。
- 通常の公式サイトのdockerイメージは、サイズが大きいものが多い上、CPU・メモリの消費量も大きいため、podのスケールアウト時にOSのリソース上限に抵触してしまうデメリットがあります。その対策として、軽量化ディストリビューションであるapline Linuxをベースとし、Apache、Tomcat、MySQLをインストールしたコンテナイメージを作成し、Dockerコンテナとして導入することがゴールとなります。
【構成】
以下のスペックで仮想マシンを用意します。
- CPU:2コア/メモリ:3GB/ディスク:20GB/ホストOS:CentOS7.5
- 仮想ロードバランサ(Ingress)→Web(Apache)→AP(Tomcat)→DB(mysql)
- Dockerバージョン:20.10.5
[root@t_kyn029 ~]# docker --version
Docker version 20.10.5, build 55c4c88
[root@t_kyn029 ~]#
- minikubeバージョン:1.2.0
minikube version: v1.2.0
[root@t_kyn029 ~]#
※最新バージョンはあるかもしれませんが、時間の都合上minikubeやDockerバージョンアップは今後検証する予定です…
【実施内容】
かなりやることが多かったため、別サイトで記載しています。
(更新後記載予定)
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~ディスク拡張編~
/varの逼迫防止に伴う対応として、/varを3GBから13GB増やしています。
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~MySQLレプリケーション(docker-compose構築)編~
docker-composeでMySQLのレプリケーション構成を作成(事前にレプリケーションを構築できるかを確認するため
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~外部公開用Ingressの作成編~
外部公開用Ingressを作成します。
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~Apacheのイメージビルド・DeploymentPod作成編~
httpd(Apache)のDeploymentPodを作成します。
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~Apache-Tomcat間のServiceの作成編~
Apache-Tomcat間のServiceを作成します。
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~Tomcatのイメージビルド・DeploymentPodの作成編~
TomcatのDeploymentPodを作成します。
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~MySQLのalpineLinux用のイメージ及びstatefulset用のpodの作成編~
TomcatのDeploymentPodを作成します。
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~MySQLのマスタデータベースとリードレプリカのPod作成編~
MySQLのStatefulSetのPodを作成します。
(PersistentVolumeとPersisteitVolumeClaimを作り、レプリケーション構成も追加します。)
alphineLinuxを用いたk8s構築(web/ap/dbサーバ)~疎通確認編~
疎通確認します。
【イメージのサイズ】
それぞれのイメージファイルです。
[root@t_kyn029 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
t_kyn_mysqltest v1.1.0 c18b1bca419a 7 days ago 196MB
t_kyn_mysql v1.1.0 277b7bff490f 7 days ago 196MB
t_kyn_mavensrv v1.1.0 b315bb12f349 13 days ago 431MB
t_kyn_apache v1.1.0 0a2b4277df31 13 days ago 15.4MB
t_kyn_tomcat v1.1.0 04440b44fa73 2 weeks ago 135MB
alpine 3.17 9ed4aefc74f6 4 weeks ago 7.05MB
maven 3.6.3-jdk-11 e23b595c92ad 2 years ago 658MB
alpine 3.9 78a2ce922f86 3 years ago 5.55MB
nginx 1.17.2-alpine 55ceb2abad47 3 years ago 21.1MB
k8s.gcr.io/kube-proxy v1.15.0 d235b23c3570 3 years ago 82.4MB
k8s.gcr.io/kube-apiserver v1.15.0 201c7a840312 3 years ago 207MB
k8s.gcr.io/kube-controller-manager v1.15.0 8328bb49b652 3 years ago 159MB
k8s.gcr.io/kube-scheduler v1.15.0 2d3813851e87 3 years ago 81.1MB
k8s.gcr.io/kube-addon-manager v9.0 119701e77cbc 4 years ago 83.1MB
k8s.gcr.io/coredns 1.3.1 eb516548c180 4 years ago 40.3MB
k8s.gcr.io/etcd 3.3.10 2c4adeb21b4f 4 years ago 258MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 5 years ago 742kB
[root@t_kyn029 ~]#
【これから実施予定】
- minikubeでダッシュボードを実装できるかやってみます。
【運用方法】
基本的には、普段からサーバは立ち上げせず必要なときだけ利用するため、以下のスクリプトを作成しました。
①minikube起動
kubernetes管理機能を起動します。
(これを起動しないと、minikubeのコンポーネントである、
Kubernetes内部の名前解決やデプロイはできません。)
※
minikube status
minikube start --vm-driver=none
minikube status
kubectl get all,svc,service,ing,pod
[root@t_kyn029 ~]#
minikubeのstatus確認
[root@t_kyn029 mysqldocker]# minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.139.161
[root@t_kyn029 mysqldocker]#
コンポーネント | 説明 |
---|---|
ホスト | 通常、Kubernetesクラスタが稼働しているマシンまたはサーバ。ホストマシンが起動していることを示します。 |
Kubelet | 各ノードで実行されるエージェント。PodSpecのセットを取得し、それらのPodSpecに記述されているコンテナが正常に実行されている状態を保証します。kubeletは、Kubernetesが作成したものではないコンテナは管理しません。 |
Apiserver | Kubernetesのリソースを管理するAPIサーバー。稼働している場合はコントロールプレーンのフロントエンドとして機能します。 |
Kubectl | Kubernetesクラスタと対話するためのCLIツール。kubectlが稼働している場合、Kubernetesクラスタ上でアプリケーションをデプロイおよび管理する用とで使用します。 |
②minikube停止
kubernetes管理機能を停止します。
[root@t_kyn029 ~]# cat ingress_disable_apply.sh
ep -v echo
kubectl get all,svc,service,ing,pod
kubectl get all,svc,service,ing,pod
minikube status
minikube stop
minikube status
③アプリケーション起動
kubernetesのアプリケーションを全起動します。
各マニフェストファイル(yamlファイル)をapplyすることにより、デプロイします。
今回の目的に合わせて、
apache、tomcat、mysql、maven-podをデプロイするマニフェストファイルを作成しています。
[root@t_kyn029 ~]# cat all_apply_pod.sh
#!/bin/bash
kubectl get all
kubectl apply -f /root/apachedocker/apache-deployment.yml
kubectl apply -f /root/tomcatdocker/tomcat-deployment.yml
kubectl apply -f /root/mysqldocker/mysqlstatefulset.yml
kubectl apply -f /root/javaapplicationmaking/maven-pod.yml
kubectl get all
③アプリケーション停止
kubernetesのアプリケーションを全停止します。
各マニフェストファイル(yamlファイル)をdeleteすることにより、podを削除します。
それまで起動していたApache、Tomcat、MySQL、mavenPodのコンテナログも削除されますので、事前にログを退避するfluentdPodを構築するなどの対応を必要に応じて行うと良いと思います。
(今回は導入が目的ですので、ログを残す運用は未考慮です。)
[root@t_kyn029 ~]# cat all_delete_pod.sh
#!/bin/bash
kubectl get all
kubectl delete -f /root/apachedocker/apache-deployment.yml
kubectl delete -f /root/tomcatdocker/tomcat-deployment.yml
kubectl delete -f /root/mysqldocker/mysqlstatefulset.yml
kubectl delete -f /root/javaapplicationmaking/maven-pod.yml
kubectl get all
[root@t_kyn029 ~]#
Webブラウザで接続
http://IPアドレスは秘密!/
各マニフェストファイルについては、
https://qiita.com/t_kyn/items/715982eb347c715078b9#%E5%AE%9F%E6%96%BD%E5%86%85%E5%AE%B9 を参照頂ければと思います。