Kubernetesに入門してみる
![](https://blog.mmmcorp.co.jp/images/2024/02/AdobeStock_164447540_lo.png)
Kubernetesに入門してみる
こんにちは、しおです
今回は自分がKubernetes入門のためのチュートリアルを参考して、実施した内容を整理のためにまとめていこうと思います。
参考チュートリアルはこちらになります。
https://kubernetes.io/docs/tutorials/
Kubernetesとは
そもそもKubernetesとはなんでしょう?
Kubernetesはオープンソースのコンテナオーケストレーションツールです。
Kubernetesを利用することで、負荷分散や障害が発生したコンテナの自動復旧といったことができます。
詳細はドキュメントを参照です。
https://kubernetes.io/docs/concepts/overview/
それでは実際にチュートリアルを参考にして触っていこうと思います。
ツールの準備
まずKubernetesを触るためのツールとして、以下を準備します。
- kubectl
- Minikube
kubectlはKubernetesを使うためのCLIツールです。
また、MinikubeはKubernetesのクラスターをローカルで動かすためのツールになります。
ツールについては下記のドキュメントに記載があるもので、この後のチュートリアルで利用します。
https://kubernetes.io/docs/tasks/tools/
自分はパッケージマネージャにasdfを利用しているので、asdf経由でインストールしています。
プラグインはそれぞれ下記になります
- kubectl: https://github.com/asdf-community/asdf-kubectl
- Minikube: https://github.com/alvarobp/asdf-minikube
動かしてみる
準備ができたら早速動かしてみます。
Minikubeの起動
最初にMinikubeを起動してKubernetesの実行環境を用意します。
minikube start
しばらく待つと起動されるので、
minikube status
でステータスを確認できます。
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-21-22.48.08.png)
これでKubernetesのクラスターが用意できました。
クラスター・コントロールプレーン・ノードとは?
さてここで、クラスターとは何でしょう?というのをざっくりと整理しようと思います。
クラスターはKubernetesが管理する1つのまとまりです。
また、クラスターはコントロールプレーンとノードで構成されています。
コントロールプレーンはクラスターを管理を担うものです。
クラスター全体の制御を行っている部分です。
ノードはそのコントロールプレーンからの指示に応じてアプリケーションを実行するものです。
ノード上でコンテナが起動されて、アプリケーションが実行されます。
クラスター・コントロールプレーン・ノードについては下記が参考となります。
https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/
アプリをデプロイ
それでは実際にアプリケーションをクラスター上で動かしてみます。
デプロイをするにはkubectlを利用してdeploymentを作成します。
コマンドは下記の通りで、デプロイ名とアプリケーションのイメージを指定して実行します。
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
成功したら下記のコマンドで作成されたdeploymentが確認できます
kubectl get deployments
さらにここでMinikubeのダッシュボードを確認してみます。
minikube dashboard
するとブラウザでminikubeのダッシュボードが表示されて、
ワークロードの画面からデプロイメントなどの情報が確認できるはずです。
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-21-22.51.15-1024x894.png)
Deploymentとは?
上記で出てきたDeploymentについて簡単にまとめます。
Deploymentはアプリケーションの理想の状態を定義するもので、
Kubernetesはその設定を元にクラスターを管理します。
参考:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
例えば、Deploymentに定義されたPodの数が不足している場合は、足りない分を補うためにPodを自動で起動したりしてくれます。
※Podについては後述します。
また、今回はチュートリアルに沿ってkubectl create deployment
のコマンドを利用して作成しましたが、
Deploymentを定義するマニフェストファイルをあらかじめ作成しておいて kubectl apply
コマンドからマニフェストファイルを読んで作成することも可能です。
デプロイしたアプリケーションを確認する
Deploymentの作成ができたら、そのアプリケーションが動いているか確認してみます。
Kubernetesのクラスタ内にアクセスするにはプロキシが必要になるので、
下記のコマンドでプロキシを実行します。
kubectl proxy
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-21-23.23.03.png)
そうすると実行されているAPIにアクセスできる様になります。
curl http://localhost:8001/version
レスポンスが返ってくればAPIが無事に起動できています。
Podについて確認
ここまででアプリケーションが実行されていることを確認できました。
Kubernetesでは作成されたDeploymentの定義に沿ってPodが作成されます。
Podとは、Kubernetesで管理される最小の実行単位で、1つまたは複数のコンテナがまとまった集合です。
Podは前述のノードの上で実行されていて、ノードがコントロールプレーンによって管理されています。
KubernetesはDeploymentの定義にそってPodを起動してくれています。
参考:https://kubernetes.io/docs/concepts/workloads/pods/
下記のコマンドで実行中のPodを確認できます。
kubectl get pods
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-21-23.42.56-1024x107.png)
合わせてminikubeのダッシュボードのポッド画面をみると実行しているPodが確認できるはずです。
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-21-23.42.22-1024x168.png)
Podを増やす
ここでPodの数を増やしてみます。
下記のコマンドを実行してPodの数を4にします。
kubectl scale deployment/kubernetes-bootcamp --replicas=4
するとPodが4つに増えていることが確認できます。
Minikubeのダッシュボードでも確認可能です。
kubectl get pods
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-21-23.49.48.png)
この状態で今度は、実行中のPodを1つ消してみましょう。
{pod-name}は上記で取得したいずれかを指定してください。
kubectl delete pods {pod-name}
削除が完了した後に改めてPodを確認すると、数が4つに戻っているはずです。
指定したPodの数になるようにKubernetesが自動で起動してくれていることが分かります。
Serviceの公開
ここまででPodが4つ起動している状態になりました。
ただ、PodはそれぞれにKubernetesネットワーク内のIPが割り当てられているため、
それぞれのPodのIPを見つけて接続する必要があります。
また、Podが停止した場合はそのPodとの接続ができなくなってしまいます。
そこでServiceを利用して複数のPodをまとめて1つのサービスとして振る舞うようにします。
Serviceを作成することで共通のエンドポイントが利用できる様になります。
参考:https://kubernetes.io/docs/concepts/services-networking/service/
また、minikubeではデフォルトでkubernetesというサービスが1つ作成されています。
kubectl get services
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-22-0.12.39.png)
では下記のコマンドでServiceを作成します。
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
設定できるtypeはいくつかあり、下記が参考になります。
https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
今回はNodePortを指定して、外部のネットワークへ公開できるようにします。
改めてservicesを確認すると作成したものが確認できるはずです。
kubectl get services
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-22-0.21.44-1024x112.png)
ここでServiceに通信してみます。
Docker Desktop をコンテナードライバーとして使用して minikube を実行している場合は、minikube トンネルが必要です。これは、Docker Desktop 内のコンテナーがホスト コンピューターから分離されているためです。
https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-intro/
とのことで、下記のコマンドをまずは実行します。
minikube service kubernetes-bootcamp --url
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-22-0.25.06-1-1024x114.png)
上記で出力されたURLにリクエストしてみます。
ポートは上記のコマンドから出力されたものになります。
curl http://127.0.0.1:53562
複数回リクエストすると、違うPodに振り分けられているのが確認できるかと思います。
複数のPodをまとめて1つのServiceでアクセスできることが分かりました。
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-22-0.30.44-1024x227.png)
また補足となりますが、ServiceもDeploymentと同様に設定ファイルを用意しておいてkubectl apply
コマンドから作成することも可能です。
ローリングアップデートをしてみる
アプリケーションの実行が確認できたので、今度は更新する際の挙動を確認します。
Kubernetesを利用するとローリングアップデートによるダウンタイムなしの更新ができます。
下記のコマンドを実行して、コンテナイメージを新しいイメージに更新します。
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
すぐにPodを確認するとアップデートが実施されていることが分かります。
kubectl get pods
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-22-0.39.21-1024x298.png)
更新が完了後に改めてリクエストをすると、無事に更新できていることが確認できます。
curl http://127.0.0.1:53562
![](https://blog.mmmcorp.co.jp/images/2024/02/スクリーンショット-2024-02-22-0.41.16-1024x220.png)
お掃除
一連のチュートリアルが終わったので、最後に片付けをします。
DeploymentとServiceを削除します。
kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp
クラスターを削除します。
minikube delete
以上でお掃除も完了です。
終わりに
Kubernetesの入門として、チュートリアルを参考にまとめてみましたが、
まだまだ触りきれていない機能、設定があるので今後そちらも触っていきたいと思います。
また今回はローカル上での確認だったのですが、クラウド上のKubernetesのマネージド基盤も含めて確認をしていきたいです。
機会があれば記事にしていこうと思います。