【15分でできる】ローカルのKubernetes上でデモアプリケーションを動かしてみる

こんにちは。今回は、Kubernatesに関する記事です。ずっと気になるなぁ気になるなぁと思っていながら手がついてきていなかったので、今年こそは・・!ということで触ってみましたので、手順など忘れぬようまとめておこうと思います。

それではまいります

前提

  • Mac OS
  • Gitがインストールされていること

参考書籍

今回、以下の書籍のハンズオンをベースに手元で動かしてみました。(一部うまく動かないコマンドがあったりしたのでそこは変えています)。

この本では、これからご紹介する「とりあえずKubernetes動かしてみた」レベルではない、登場の背景から運用のプラクティス、Kubernetes活用をDevOpsに昇華させていくまでとても分かりやすく解説されていて個人的にはとても良書でした。おすすめです。

*Amazon レビューでも評価とても良いですね・・!

Kubernatesでアプリを動かすまで

デモアプリケーションのDockerイメージを作成する

Docker Desktopをインストールする

https://www.docker.com/products/docker-desktop

docker desktopをインストールすると、Dockerもインストールされます。Desktopインストールが完了したら、以下のコマンドを打ってDockerがインストールされたことを確認しておきます。

docker version

コンテナイメージのダウンロードと実行

今回は、上のテキストで紹介されているコンテナイメージを拝借して、これを実行してみようと思います。

ローカルのターミナルで、以下のコマンドを実行します。

docker run -p 9999:8888 --name hello cloudnatived/demo:hello

この状態でブラウザにアクセスすると、アプリの実行結果が表示されていることが確認できます。

また、このコマンドを打った後、Docker Desktopをみると、ダウロードしてきたイメージが一覧に追加されていることが確認できます。

イメージのビルド

一応、一通りのプロセスを試すという意味で、上のコードをローカルに落としてきて、これをもとに独自のイメージを作ってみたいと思います。

コード

https://github.com/cloudnativedevops/demo

コマンド

## リポジトリのクローン
git clone https://github.com/cloudnativedevops/demo.git

## イメージのビルド
cd demo/hello
docker image build -t myhelloworld

作成したイメージは、Docker Desktop上からも確認できるようになりました!

Docker ImageをDocker Hubにプッシュ

最後に、ローカルで作成したイメージをコンテナレジストリ(Docker Hub)にPushして公開します。

docker login #Dockerアカウントがなければ作成します。
docker image tag myhelloworld <DOCKER ID>/myhelloworld
docker image push <DOCKER ID>/myhelloworld

これで、Docker Hub上にイメージが公開されました。最後に、このイメージを実行してみます。

docker run <DOCKER ID>/myhelloworld

Kubernetes上でアプリイメージを実行する

いよいよKubernetesの登場です。なんとDocker HubではKubernetesがサポートされているため、設定画面からボタン一つでKubernetesのインストールを行うことができます。

有効化して待つこと数分。。

有効化が完了したら、kubernetesのコマンドが使えるようになっているので、以下のコマンドを実行していきます。

## アプリケーションの実行
kubectl run demo --image=<DOCKER ID>/myhelloworld --port=8888 --labels app=demo

## ポートフォワーディング(ローカルの9999ポートをコンテナの8888ポートに割り当てる)
kubectl port-forward pods/demo 9999:8888

すると以下のログが出てきて、ポートフォワードが開始されたことが分かります。

Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888

この状態で、先ほどと同様にブラウザでlocalhost:9999にアクセスしてみると、同様にアプリの実行結果が確認できました。これで、Kubernetesを介してコンテナ上のアプリにアクセスすることができました!

ちなみに、この時Kubernetesクラスターで実行されているアプリは以下のコマンドで確認することができます。

kubectl get pods
Podsとは?

さて、ここで初めて出てきたPods。なんやそら、ということでちょっと調べてみました。

これはKubernetesの公式ドキュメントに説明がありました。

https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/

公式Docより

Podは、アプリケーション固有の「論理ホスト」をモデル化し、比較的密接に結合されたさまざまなアプリケーションコンテナを含むことができます。 たとえば、Podには、Node.jsアプリケーションを含むコンテナと、Node.js Webサーバによって公開されるデータを供給する別のコンテナの両方を含めることができます。Pod内のコンテナはIPアドレスとポートスペースを共有し、常に同じ場所に配置され、同じスケジュールに入れられ、同じノード上の共有コンテキストで実行されます。

なるほど、アプリの単位、ということなのかな・・?(複数のコンテナがまとまって一つのアプリを構成している場合、そのまとまりのことをPodという?)

そしてこのPodは、Kubernetesのノード上、つまりワーカーマシン上で動作するとのこと。

Podは常にノード上で動作します。ノードはKubernetesではワーカーマシンであり、クラスターによって仮想、物理マシンのどちらであってもかまいません。各ノードはマスターによって管理されます。ノードは複数のPodを持つことができ、Kubernetesマスターはクラスター内のノード間でPodのスケジュールを自動的に処理します。マスターの自動スケジューリングは各ノードで利用可能なリソースを考慮に入れます。

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。