11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

初めてのKubernetes KubernetesでHello World!をやってみて基本的な概念について理解してみた

Last updated at Posted at 2022-03-09

はじめに

アプリケーションの開発を行うエンジニアであっても、インフラに関する事もある程度は知っておく必要がありそう…。
というわけでコンテナオーケストレーションについて理解を深めておこうと思い、kubernetesの基本概念について理解してみたので、その備忘録を残す。

※本記事内の操作は以下のように、docker/minikube/kubectlのそれぞれが利用可能な状態である事が前提となっている。環境構築については今後記事を執筆予定。

[root@control-plane docker-kubernetes]# docker version
Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 ...

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  ...
[root@control-plane docker-kubernetes]# kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:59:11Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7", GitCommit:"132a687512d7fb058d0f5890f07d4121b3f0a2e2", GitTreeState:"clean", BuildDate:"2021-05-12T12:32:49Z", GoVersion:"go1.15.12", Compiler:"gc", Platform:"linux/amd64"}

[root@control-plane docker-kubernetes]# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

kubernetesでHello World!

まずは最初になる事としてはお決まりの"Hello World!"をやってみたいと思う。

やる事としては、hello-worldのDockerイメージをkubernetes(k8s)上で実行し、k8s内のログを確認して削除する、というもの。
実際にk8s上で動かしてみると以下の画像のようになる。
image.png

※一応、コマンドで何をしているか?を見ていくと、

という感じ。コマンド実行時に出てきたpodなどのkubernetesの概念は以下の章で見ていく。

基本概念

kubernetesとは

一言で言うと「コンテナオーケストレーション(実際の物理リソースに対し、大量のコンテナをデプロイ・管理していく)」仕組み。これだけだと?になると思うのでもう少し概念について詳細を見ていく。

そもそも何でkubernetesというものが登場したのか?という背景としては、今までのシステム運用での課題が分かると分かりやすい気がしたのでその観点でまとめてみると、以下のようになるだろう。

# 今までは… kuberbetesになると…
1 :x:
システムのリソースの利用率に無駄がある…
:white_check_mark:
複数のコンテナを共存させ、リソースを最大限効率的に利用できるように!
2 :x:
突発的な大量アクセスでシステムが応答しなくなった…
:white_check_mark:
システムを構成するサーバーの台数を増やし、システム全体の処理能力を高める事ができるように!(水平スケール)
3 :x:
突然、一部のシステムがダウンしてしまいサービスが利用不可になってしまった…
:white_check_mark:
システムの稼働状況を監視・必要であれば自動デプロイができるようになり、継続的なサービス運用が可能に!
4 :x:
リリースのたびにサービス停止が発生してしまう…
:white_check_mark:
複数の稼働中サーバーに対して一定数づつ新しいアプリケーションをデプロイ・リリースができるように!(ローリングデプロイ)

※詳細についてはWhat is Kubernetes?(日本語はここ)を参照。

どのような仕組みで動いているか?

kuberbetesで複数のリソースサーバをどのように管理していくか?だが、以下の図のようにnodeという単位が登場し、実際のリソースサーバはworker nodeと呼ばれ、そのworker nodeを束ねて管理するものとしてmaster nodeというものがある、という構成になっている。
image.png

そして各リソースサーバであるworker nodeは、master nodeからの命令を受ける形で管理される(ユーザーがリソースサーバを管理する際には、master nodeに対して、kubectl(日本語はここ)を利用して各リソースサーバ(worker node)に対して命令を行う)。
image.png

※上記の事を見て分かるが、kubernetesの各Node=実サーバ(サーバーの実態)である

kubernetesのリソース

上記のどのような仕組みで動いているか?でリソースサーバという言い方をしていたが、kubernetesにはいったいどんなリソースがあるのか(リソースサーバー上で動くリソースとは)?についてここでは見ていく(どのような仕組みで動いているか?でkubectlでリソースへの操作・命令できるといったが、以下のようなリソースを管理するためのコマンドがkubectl)。

一覧としては以下のようなものがある(ようである)。

分類 リソースの種別
ワークロード ・Pod:最小単位。コンテナの集合。
・ReplicaSet:Podのレプリカ(複製品)の集合
・Deployment:Pod(ReplicaSet)の集合(ReplicaSetを管理するもの)
・StatefulSet:Podの集合。Podの識別子が順序付けされる。
サービス ・Service:Podの論理的なセットや、そのPodのセットにアクセスするためのポリシー(IPアドレスなど)を定義する。L4ロードバランサー。
・Ingress:L7ロードバランサー。
設定 ・ConfigMap:機密性のない設定情報を保存
・Secret:機密性のある設定情報を保存
ストレージ ・PersistentVolume:永続データそのもの(実態)
・PersistentVolumeClaim:永続データを要求するもの

ワークロード

Pod

kubernetesでDockerコンテナを管理するための最小単位で、Dockerコンテナの集合。Dockerコンテナを単独で管理するのではなく、グループとして管理することで、Dockerコンテナの使いにくさを解消することができる。
image.png

ReplicaSet

複数のPodのレプリカ(複製品)をセットで作成する機能で、Podの集合と言える。例えば、kubernetes起動時のレプリカ数を3にすると、kubernetesは同じ機能のPodを3つ自動的に起動する。
image.png

※ReplicaSetの存在意義だが、それはmaster nodeがkubernetes上で指定した数のレプリカが動作することを保証する=何らかのトラブル(node障害など)でPodが減少した場合には別のnodeで自動的にPodを起動してレプリカ数を維持する、という事をやってくれるので障害に強くなるという事(だと思っている)。

※自動的にPodのレプリカ数を維持してくれるので、ある意味Podのスケールを行うものと考える事もできる?かも。

Deployment

Pod(ReplicaSet)をまとめたもの(集合体)(ReplicaSetを管理するもの)。kubernetesでは基本的にPodを単独で起動する事はなく、ReplicaSetなどの管理用のオブジェクトを介してPodを利用するようだが、DeploymentはそのReplicaSetの管理のためのもので、ReplicaSetの世代管理(ロールバック・ロールフォワード)をする役割を持つ。
image.png

※このDeploymentを作成すると、ある理想的な状態(目的の状態)を定義しておくだけでkubernetesのDeploymentコントローラが、現状の状態を目的の状態へ、指定された頻度で変更してくれる。実際にアプリケーションの本番リリースとかで使われる(と思っている)。

StatefulSet

これもDeploymentと同様に、Podの集合。ただし、Podの順序と一意性を保証するのでスケールする際の名前が一定になる(各Podにおいて管理が大変な同一性を維持する)。
image.png

※StatefulSetもDeployment同様にPodの集合であるが、Deploymentとの違いとしては、

  • DeploymentでReplicaSetを作成(レプリカ)した場合(Deploymentで管理されるPod)
    →PodにはランダムのIDが付与される
  • StatefulSetで管理されるPod
    →Podには順序付けされた一意の識別子が付与される

という感じ。

サービス

Service

Podの論理的なセットや、そのPodのセットにアクセスするためのポリシー(IPアドレスなど)を定義するもの。外部公開・名前解決(接続先のIPアドレスの解決)・L4ロードバランサー(送信元IP、送信元ポート、宛先IP、宛先ポート、プロトコルの5つ(5タプルハッシュ)の条件を利用して振り分け先を決めるもの、ロードバランサが送信先のipをapplicationサーバーに書き換える)を担うと思えばいい。
image.png

※このServiceが必要な理由としては、公式に書かれている通りで、そもそもPodはNodeに散らばっているため、それぞれのPodと通信するにはそのIPIPアドレスを知る必要がある。ただ、kubernetesの特性上、NodeのIPアドレスは一定にならないため、突然Podと通信できなくなる可能性がある(PodのIPアドレスを探し出したり、そのIPアドレスを記録し続けなければならなくなる)。
→そこで、複数のPod・NodeのIPアドレスをクライアントが意識せずに単一のエンドポイントで通信するできるようにするために、Pod,Nodeの存在を抽象化し、Podとの通信に単一のエンドポイントを提供する、という事をやる。このための仕組みがService。

Ingress

ServiceへのHTTPとHTTPSのルートを公開するもの。外部公開・L7ロードバランサー(URLのドメイン名(ホストベース)やパス名(パスベース)により振り分け先を決めるもの、ロードバランサがapplicationサーバーと通信を行う=applicationサーバーから見た送信元ipはロードバランサになる)を担うと思えばいい
image.png

設定

ConfigMap

機密性のない設定情報を保存するリソース。具体的には環境変数、コマンドライン引数、ボリューム内の設定ファイルとして使われる。

Secret

機密情報を保存するためのリソース。具体的には、パスワード、OAuthトークン、SSHキーのようなものを保存する。base64でエンコードされた文字列を保存するのがルール。

ストレージ

PersistentVolume

永続データの実態(永続化ボリュームそれ自体についてのリソース)。実際の物理ストレージへの接続情報を持ち、ストレージを抽象化する役割がある。
image.png

PersistentVolumeClaim

永続データの要求(取得する命令をする)もの(永続化ボリュームの利用請求をするリソース)。抽象化されたストレージを要求する役割がある

image.png

kubernetesのネットワークのイメージ

上記のどのような仕組みで動いているか?で見たように、リソース(kubernetesのリソースで取り上げたもの)は各ワーカーノードに分散されて配置される(以下のようなイメージ)。
image.png

上記の図において、各ワーカーノード間はネット―ワークでつながっており、そのネットワークはクラスターネットワークと呼ぶ(クラスターネットワークに対して、マスターノードとワーカーノード間のネットワークは外部ネットワークという事になる)。以下の図に書いたように、クラスターネットワークへは外部からは直接アクセスできない。
image.png

あるコンテナ(Pod内で起動しているコンテナ)の動作確認をするには以下の3つのアプローチがある。
image.png

# アプローチ詳細
1 kubectlを使ってマスターノード経由でPodのコンテナに直接入る
kubernetesでHello World!でやったhello-worldコンテナに対してkubectl logs pod/hello-worldとしたのがこれにあたる
image.png
2 踏み台に対してkubectlで直接入り、そのコンテナ経由でアクセスする image.png
3 サービス経由でアクセスする image.png

kubernetesでHello World!を実行した環境のネットワークとしては、以下のようにマスターノード/ワーカーノードの区別がないシングルノードのネットワークとなる(以下、公式からの引用)。

PC上のVM内でシングルノードのKubernetesクラスタを実行する

image.png

参考文献

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?