このブログを検索

この記事の内容は、個人の見解、検証の範囲のものであり、誤りがある可能性があります。
個人の責任において情報活用をお願いします。


2021年7月30日金曜日

俺とkubernetesと時々vSphere ーKubernetesで扱うことになるPod、Service、StrageClassやPersistentVolume、PersistentVolumeClaimってなんでしょう?ー

このブログは、コンテナのオーケストレーターであるkubernetesについて

自分の知識をまとめることを目的として記事を書いています。

もともとなが~くvSphereのあれやこれやに携わってきたのでvSphereとの類似点や相違点についてもちょっと混ぜていけたりしたらいいかなぁとかも思っています。

今回は前回構築したkubernetesクラスターに構築するPod(コンテナ)、Service(Podのネットワーク)、

Podのストレージ(Strageclass、PersistentVolume、PersistentVolumeClaim)についての説明をしたいと思います。


1.Pod

 Podは実際にアプリケーションが動作する場所(vSphereで言うと仮想マシン)となりますが、Kubernetes上で動くコンテナといったところです。

 Pod中には複数のコンテナを展開することもできますが、基本系は1Pod1コンテナですので、最初はPod=コンテナと思っても大丈夫だと思います。

  Pod単体でアプリケーションを起動することはできますが、外部との通信はできません。

 また、Pod内部にデータが保存されている場合Podを停止(Kubernetesの世界ではPodの停止=Podの削除)すると保存していたデータも一緒に消えてしまいます。

 その問題点を解消するのが以下の2つになります。


2.Service

 ServiceはPodとPodを接続したり、Podと外部の接続を行うPod用のネットワークです。

 Kubernetes内部でのみ使用する場合(外部とのやり取りが発生しない)や外部と通信する場合等の用途に合わせてタイプを指定することができますが、外部と通信を行う場合はどのように外部との中継を行うか種類が選べます。


   内部通信用のService

    ClusterIP


  外部通信用のService

   ExternalIP →任意のマスターorワーカーを指定して外部からPodへ通信を行う

   NodePort →Kubernetesクラスタ内のノードどれにアクセスしても外部からPodへ通信が可能

   Loadbarancer →外部ロードバランサが利用できるクラウドプロバイダ用ですが、ロードバランサーを自動で作成して連携してくれます。※そのため自分で作成したKubernetesクラスタだとそのままでは使えません。


3.Podのストレージ

 Pod内の動作によって出力されたデータなどを保存しておきたい場合、Pod外部にデータを保存する必要があり、具体的には以下の作業が必要です。


     Podで使えるストレージを定義(vSphereで言うとデータストアに近い)

   →定義されたストレージにPod用の領域を作成(vSphereで言うと仮想ディスクに近い)

    →Pod用のの領域をPodに紐付ける(しいて言えば、仮想マシンの設定と編集でディスクを手動追加するイメージ)


 この作業はKubernetes的な言い方をすると以下の様になります。


   StrageClass(SC)を作成する。

    →PersistentVolume(PV)を作成する。

    →PersistentVolumeClaim(PVC)を作成する。


これらをくっ付けて、Pod内のアプリケーションへ外部からアクセスしたり行わせた処理を保存したりできるようになるのですが、PodもServiceも作成しただけでは、お互いに紐ついてくれません。

これらをくっ付けるために必要なラベルとラベルセレクターという存在があります。

また、ストレージもそのままでPodと紐ついてくれません。

こちらも、yamlというPodやServiceを作る際に使用する設計書の様なものを利用する必要があります。


というわけで、次回はこれらの作り方やお互いが利用しあえるための設定、yamlの書き方について説明したいと思います。