Kubernetesのチュートリアルをやってみる

こんにちは、白々さじきです。
Kubernetesを触ったことがなかったので、Kubernetesの公式チュートリアルをやってKubernetesの理解を深めようと思います。

今回やるチュートリアルのURLは以下です。

https://minikube.sigs.k8s.io/docs/start/

環境は、Windows10 Homeです。

# Kubernetesとは
そもそもKubernetesに関して詳しくないので、最初に調べてみました。
Kubernetesは、分散システムを弾力的に実行するフレームワークです。ここでいう弾力的とは、利用可能なリソースを縮小する能力を意味します。例えば、動画配信を提供するアプリケーションコンテナを複数運用する時に、動画を見に来るユーザーが多い時間帯には、コンテナ数を増やし、少ない時間にはコンテナを減らして一つのコンテナの利用率を高くキープすることでリソースを節約することがあげられます。
アプリケーションのためのスケーリングとフェイルオーバーの面倒を見てくれて、カナリアデプロイを含むいくつかのデプロイ方法を提供してくれます。

Kubernetesで大まかにできることは以下です。
1. サービスディスカバリーと負荷分散
DNS名または独自のIPアドレスを使ってコンテナを公開することができます。
特定のコンテナのトラフィックが高い場合、デプロイされたアプリケーションを安定化させるために、トラフィックを分散させて負荷を減らします。
2. ストレージ オーケストレーション
ユーザーが選択したローカルやパブリッククラウドプロバイダーなどのストレージシステムに自動でマウントすることができます。
3. 自動化されたロールアウトとロールバック 
コンテナをKubernetesを使ってデプロイするコンテナの状態を情報を保存することができ、コンテナの実際の状態を保存した状態に戻すことができます。例えば、新しいコンテナの作成や既存コンテナの削除、新しいコンテナにリソースを適応する処理などのアプリケーションのデプロイのための処理を自動化できます。
4. 自動ビンパッキング
Kubernetesは、コンテナ化されたタスクを実行することができるノードを持ったクラスターを提供することができます。
Kubernetesに、それぞれのコンテナがどの程度のCPUとメモリを使用するかを宣言できます。Kubernetesは、コンテナをノードにあわせて調整することができ、リソースを最大限に活用してくれます。
5. 自己修復
Kubernetesは、処理が失敗したコンテナを再起動したり、コンテナを入れ替えたり、定義したヘルスチェックに応答しないコンテナを強制終了しますが、これらの処理が完了するまでクライアントには伝えません。
6. 機密情報と構成管理
Kubernetesは、パスワードやOAuthトークン、SSHキーのような機密の情報を保持、管理することができます。
機密情報やアプリケーションの構成をコンテナイメージの再作成せずにデプロイや更新をすることができます。この時、機密情報が露出することは、ありません。
以下を参考にしました。

https://kubernetes.io/docs/concepts/overview/

# チュートリアル
では、Kubernetesのチュートリアルをやっていきたいと思います。

## minikube start
最初にminikubeが動く環境を作ります。以下の参考にやっていきます。

https://minikube.sigs.k8s.io/docs/start/

minikubeは、ローカル環境で動くKubernetesで、Kubernetesでデプロイする方法やKubernetesを簡単に理解するために重点を置いたものです。
minikubeは、DokcerかVirtual Machineの環境が必要になります。また、Kubernetesは、以下のような1つのコマンドで動きます。
```
minikube start
```
### minikubeのインストール
参考サイトの1番の選択肢に従い自分の環境に合ったminikubeのインストーラをダウンロードしましょう。
私の環境は以下です。
![minikubedl.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/a1c8611f-2fa2-2f0d-51a5-42066b9c0d2f.jpeg)

今回は、Chocolateyを使用します。以下のコマンドを実行すると、インストールできます。

```
choco install minikube
```
この時、以下のように実行時のスクリプトを出すかどうかを確認する文言が出てくるので好きなものを選択してください。
```
Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint):
```

### Clusterの実行
今回は、クラスターをDokcerで起動します。
以下のコマンドを実行します。
管理者権限のPowerShellでコマンドを実行するとDockerで動作するようになりました。
```
minikube start --driver=docker
```

削除する場合は、以下のコマンドを実行します。
```
minikube delete
```


実行時に参考にしたサイト

https://qiita.com/Mayumi_Pythonista/items/06b6a2b2393ccbd04f55

### クラスターを操作する
以下のコマンドを実行すると、すべての名前空間上にあるすべてのPodのリストを表示します。
```
kubectl get po -A
```
正式には以下のように記載するみたいです。
```
kubectl get pods --all-namespaces
```
これを実行すると以下のように、表示されます。
![スクリーンショット 2022-10-09 204629.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/296d1104-465a-ff4a-89d1-00ca48a30162.jpeg)

Podは、Kubernetesアプリケーションの基本的な実行単位です。
これは、作成またはデプロイするKubernetesオブジェクトモデルの中で最小かつ最も単純な単位です。Podは、クラスターで実行されているプロセスを表します。
Podの詳細は、以下です。

https://kubernetes.io/ja/docs/concepts/workloads/pods/pod-overview/

また、シェルの設定に以下を追加することで、より使いやすくなります。
```
alias kubectl="minikube kubectl --"
```

最初は、ストレージプロビジョナーなどの一部のサービスがまだ実行状態でない場合があります。これは、クラスタ起動時の正常な状態であり、すぐに解決します。クラスタの状態をさらに把握するために、minikubeはKubernetes Dashboardをバンドルしており、以下のコマンドを実行するとダッシュボードを起動できます。

```
minikube dashboard
```
実際に実行したときは、以下の状態で10分くらい経過したので再実行するとすぐに立ち上がりました。
立ち上がらなかった時のスクショ。
![スクリーンショット 2022-10-09 210256.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/d4321a23-8257-1fad-a3bf-9bb51512a624.jpeg)

再実行の時のスクショ。
![スクリーンショット 2022-10-09 210450.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/2c3d0597-ce78-c9b0-3228-2cd2859c6808.jpeg)
立ち上がったら開いているブラウザに以下のような画面が表示されます。

![スクリーンショット 2022-10-09 210546.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/4ed9cf72-75c6-e774-203e-629f53aae697.jpeg)

### アプリケーションのデプロイ
サンプルアプリケーションをデプロイして80番ポートからアクセスできるようにしましょう。
以下の2つのコマンドを実行しましょう。
```
kubectl create deployment hello-minikube --image=docker.io/nginx:1.23
kubectl expose deployment hello-minikube --type=NodePort --port=80
```
すると以下のように出て準備が完了します。
![スクリーンショット 2022-10-09 223008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/dbbbabd1-0a3c-1180-4b75-96edee327830.jpeg)


その後、以下のコマンドを実行すると、デプロイの状況を見ることができます。
```
kubectl get services hello-minikube

```
実行結果は以下です。
![スクリーンショット 2022-10-09 223212.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/371956e0-2df0-a6d1-c368-472551cb2fb7.jpeg)

このサービスに簡単にアクセスする方法は、ブラウザを使うことです。
以下のコマンドを実行するするとminikubeにブラウザを起動させてアクセスできるようになります。
```
minikube service hello-minikube
```
実行すると以下のように表示され、「http://127.0.0.1:53428」
が開いてnginxのwelcomeページが開きます。

コマンド実行後
![スクリーンショット 2022-10-09 224244.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/78fc475f-6d41-0ab7-7734-ba2c0c51af05.jpeg)
nginxのwelcomeページ（抜粋）
![スクリーンショット 2022-10-09 224334.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/403a9424-bf88-2b60-0df0-43db3247b98c.jpeg)

それか以下のコマンドを使用して好きなポート番号にポートフォワードできます。今回は、7080番に変更しました。
```
kubectl port-forward service/hello-minikube 7080:80
```

すると http://localhost:7080/ で問題なく開くことを確認することができました。

![スクリーンショット 2022-10-09 224549.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/d2c44e0e-129b-e013-de55-9659b3e0798b.jpeg)

#### LoadBalancer deployments
デプロイしたアプリケーションのロードバランサーにアクセスするためには、 “minikube tunnel” のコマンドを使用する。
デプロイメント例を以下に記載します。
```
kubectl create deployment balanced --image=docker.io/nginx:1.23
kubectl expose deployment balanced --type=LoadBalancer --port=80

```
（ターミナルからPower Shellを開くと文字化けが無くなったので、以下の実行結果からターミナルの画像に変わります。）
実行結果は以下です。
![スクリーンショット 2022-10-10 111110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/020cbdde-acef-08cb-db47-94ba76ba62db.jpeg)

別のタブを開いた後に以下のコマンドを実行し、minikubeのトンネルを開始し、「バランス型」配置のルーティング可能な IP を作成します。
ルーティング可能なIPを見つけるために以下のコマンドを実行します。
```
kubectl get services balanced

```
実行すると以下のように表示されました。
![スクリーンショット 2022-10-10 112246.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/7f7af12e-7b57-0556-70bb-cf8515d232c5.jpeg)
今回のデプロイでは、EXTERNAL-IPに記載のある「127.0.0.1:80」を使用することができます。

### クラスターの管理
ここではクラスターの管理に便利なコマンドを紹介します。

デプロイされたアプリケーションに影響を与えることなくKubernetesを一時停止することができます。
以下のコマンドを使用します。
```
minikube pause
```
実行すると以下のように表示されました。
![スクリーンショット 2022-10-10 113137.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/9ac3f022-e38b-4583-652d-0b7f901156b8.jpeg)
再開したい場合は以下のコマンドを実行します。
```
minikube unpause
```
実行すると以下のように表示されました。
![スクリーンショット 2022-10-10 113259.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/03d13068-c571-b7dd-7b52-78a86b2eebfb.jpeg)

クラスターを停止する場合は以下のコマンドを使用します。
```
minikube stop
```
実行すると以下のように表示されました。
![スクリーンショット 2022-10-10 113855.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/516c31a9-b151-967f-dd2f-d908be8d8c46.jpeg)

この時、「電源をオフにしています」から「停止しました」までの間は少し時間がかかることを確認しました。

minikubeのデフォルトのメモリーの大きさを以下のコマンドで変更できます。
```
minikube config set memory 9001
```
実行すると以下のように表示されました。
![スクリーンショット 2022-10-10 114435.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/bc2eb439-5ab4-69cf-57ac-5de90572c253.jpeg)

変更を反映する場合は、以下のコマンドを実行する必要があります。
```
minikube delete
minikube start
```
実行すると以下のように表示されました。
![スクリーンショット 2022-10-10 114714.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/132af160-3dcc-e7f3-f57e-fa102d8c40a3.jpeg)

赤丸の通りにクラスター作成時のメモリが、増えていることを確認することができます。

Kubernetesに簡単にインストール可能なアドオンの一覧を見ることができるコマンドが以下です。
```
minikube addons list
```
以下のように表示されました。（一部抜粋）
![スクリーンショット 2022-10-10 115321.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/f1f252f4-ed21-150d-3356-db53e5d5e553.jpeg)

古いバージョンのKubernetesを実行する場合は以下のコマンドを使用します。この時、既存のKubernetesクラスターではなく新規に別のクラスターが作成されます。
```
minikube start -p aged --kubernetes-version=v1.16.1
```
これを実行して少し待つと以下のように表示されました。
![スクリーンショット 2022-10-10 115757.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/eb540270-da61-a477-45cb-f3a4f331878f.jpeg)

以下のコマンドですべてのクラスターを削除することができます。
```
minikube delete --all
```
実行すると以下のように表示されました。
![スクリーンショット 2022-10-10 120327.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521126/15e7e501-6360-cbf7-f163-74214c645df3.jpeg)

これで、最初に作成したminikubeも追加で作成した古いminikubeも削除されました。これでチュートリアルは終わりです。

# 感想
完走した感想ですが、作成自体はコマンドで簡単にできることがわかりました。minikubeではないアプリケーションをどのように操作するのかや、Podに関する理解がまだまだ低いので今後もっと勉強していきたいと思いました。

#　参考資料一覧
今回やったチュートリアル

https://minikube.sigs.k8s.io/docs/start/

Kubernetesについての資料

https://kubernetes.io/docs/concepts/overview/

Windows HomeにKubernetesを入れるときに参考にしたサイト

https://qiita.com/Mayumi_Pythonista/items/06b6a2b2393ccbd04f55

Podの概観

https://kubernetes.io/ja/docs/concepts/workloads/pods/pod-overview/