【Kubernetes構築】alphineLinuxを用いたk8s構築（web/ap/dbサーバ）

※途中ですが、順次更新します。

## 【背景】
* 業務で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
```[root@t_kyn029 ~]# minikube version
minikube version: v1.2.0
[root@t_kyn029 ~]#
```
※最新バージョンはあるかもしれませんが、時間の都合上minikubeやDockerバージョンアップは今後検証する予定です…

---

## 【実施内容】
かなりやることが多かったため、別サイトで記載しています。
（更新後記載予定）

---

####  [alphineLinuxを用いたk8s構築（web/ap/dbサーバ）～ディスク拡張編～](https://qiita.com/t_kyn/private/5872f0907653598122a6)
/varの逼迫防止に伴う対応として、/varを3GBから13GB増やしています。

---

#### [alphineLinuxを用いたk8s構築（web/ap/dbサーバ）～MySQLレプリケーション（docker-compose構築）編～](https://qiita.com/t_kyn/items/e5ba93471451c9e95efa)
 docker-composeでMySQLのレプリケーション構成を作成（事前にレプリケーションを構築できるかを確認するため

---

#### [alphineLinuxを用いたk8s構築（web/ap/dbサーバ）～外部公開用Ingressの作成編～](https://qiita.com/t_kyn/items/800603919f994c537a74)
外部公開用Ingressを作成します。

https://qiita.com/t_kyn/items/800603919f994c537a74

---

#### [alphineLinuxを用いたk8s構築（web/ap/dbサーバ）～Apacheのイメージビルド・DeploymentPod作成編～](https://qiita.com/t_kyn/private/1e4d2a319197ed37591d)
httpd（Apache）のDeploymentPodを作成します。

https://qiita.com/t_kyn/private/1e4d2a319197ed37591d

---

#### alphineLinuxを用いたk8s構築（web/ap/dbサーバ）～Apache-Tomcat間のServiceの作成編～
Apache-Tomcat間のServiceを作成します。

---

#### [alphineLinuxを用いたk8s構築（web/ap/dbサーバ）～Tomcatのイメージビルド・DeploymentPodの作成編～](https://qiita.com/t_kyn/private/98fd60b94f204fe7b3ed)
TomcatのDeploymentPodを作成します。

https://qiita.com/t_kyn/private/98fd60b94f204fe7b3ed

---

#### 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内部の名前解決やデプロイはできません。）
※

```[root@t_kyn029 ~]# cat ingress_enable_apply.sh
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 を参照頂ければと思います。