インフラ

Kubernetesに入門してみる

shio

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経由でインストールしています。
プラグインはそれぞれ下記になります

動かしてみる

準備ができたら早速動かしてみます。

Minikubeの起動

最初にMinikubeを起動してKubernetesの実行環境を用意します。

minikube start

しばらく待つと起動されるので、

minikube status

でステータスを確認できます。

これで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のダッシュボードが表示されて、
ワークロードの画面からデプロイメントなどの情報が確認できるはずです。

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

そうすると実行されている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

合わせてminikubeのダッシュボードのポッド画面をみると実行しているPodが確認できるはずです。

Podを増やす

ここでPodの数を増やしてみます。

下記のコマンドを実行してPodの数を4にします。

kubectl scale deployment/kubernetes-bootcamp --replicas=4

するとPodが4つに増えていることが確認できます。
Minikubeのダッシュボードでも確認可能です。

kubectl get pods

この状態で今度は、実行中の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

では下記のコマンドで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

ここでServiceに通信してみます。

Docker Desktop をコンテナードライバーとして使用して minikube を実行している場合は、minikube トンネルが必要です。これは、Docker Desktop 内のコンテナーがホスト コンピューターから分離されているためです。

https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-intro/

とのことで、下記のコマンドをまずは実行します。

minikube service kubernetes-bootcamp --url

上記で出力されたURLにリクエストしてみます。
ポートは上記のコマンドから出力されたものになります。

curl http://127.0.0.1:53562

複数回リクエストすると、違うPodに振り分けられているのが確認できるかと思います。
複数のPodをまとめて1つのServiceでアクセスできることが分かりました。

また補足となりますが、ServiceもDeploymentと同様に設定ファイルを用意しておいてkubectl applyコマンドから作成することも可能です。

ローリングアップデートをしてみる

アプリケーションの実行が確認できたので、今度は更新する際の挙動を確認します。

Kubernetesを利用するとローリングアップデートによるダウンタイムなしの更新ができます。

下記のコマンドを実行して、コンテナイメージを新しいイメージに更新します。

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

すぐにPodを確認するとアップデートが実施されていることが分かります。

kubectl get pods

更新が完了後に改めてリクエストをすると、無事に更新できていることが確認できます。

curl http://127.0.0.1:53562

お掃除

一連のチュートリアルが終わったので、最後に片付けをします。

DeploymentとServiceを削除します。

kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp

クラスターを削除します。

minikube delete

以上でお掃除も完了です。

終わりに

Kubernetesの入門として、チュートリアルを参考にまとめてみましたが、
まだまだ触りきれていない機能、設定があるので今後そちらも触っていきたいと思います。
また今回はローカル上での確認だったのですが、クラウド上のKubernetesのマネージド基盤も含めて確認をしていきたいです。
機会があれば記事にしていこうと思います。

AUTHOR
shio
shio
記事URLをコピーしました