Kubernetesの構成や挙動を整理する

Kubernetesの構成や挙動を整理する

2021年11月28日
Kubernetes

Kubernetesについて理解を深めるため、を実際に動かしてみてその構成や挙動を整理してみました。

Kubernetesとは

Kubernetesとは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースのプラットフォームです。

参考:https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/

Composeのように単一のDockerホスト上でコンテナ群を動かすのではなく、冗長性を得るため複数のホストを束ねてクラスタを構築し、その上で冗長化されたコンテナを動かします。

このようにKubernetesの登場により、複数のDockerなどのコンテナの管理や自動化が進み、この仕組みは「コンテナオーケストレーション」と呼ばれています。

サッカーの例えがわかりやすい

といってもなかなかイメージがつかないところ、Docker/Kubernetes超入門という本でKubernetsをサッカーで例えており、わかりやすくイメージしやすくなりました。

サッカーで例えるとコンテナが選手だとすると、Kubernetesは監督にあたります。グラウンドの正しい位置に選手(コンテナ)を配置し、チーム(アプリ)として連携を取れる形を作ります。

それだけでなく、怪我した選手(調子の悪いコンテナ)の交代や選手(コンテナ)をを減らしたり増やしたり(これはサッカーのルールから外れるが。。)などの仕事をします。

エンジニアはチームオーナーとして監督(Kubernetes)に「こういう方針でいきます」と頼んでおけばあとは任せておけるといった感じです。

 

Kubernetesの構成

参考:Docker/Kubernetes超入門

Kubernetesの構成は主に図の左側のコントロールプレーンと右側のデータプレーンにわかれます。大まかな担当は左側のマスターノードが頭脳として使われ、右側のワーカーノードは処理する肉体として使われます。

また、Kubernetesでシステムを構築する場合は、Kubernetes上だけで構築するのではなく右の図にある仮想マシンやクラウドが提供するマネージドサービスなども併用して開発するのが一般的です。

サービスやポッドのところは実際に動かしながら理解を深めていきます。

 

実際に触ってみる

というわけで実際にKubernetesを触っていきます。Docker Desktopが既にインストールされていれば環境設定から「Enable Kubernetes」にチェックを入れて有効化するだけで使えます。

マニフェストファイルを使ってNginxを動かす

Kubernetesのアプリ展開はマニフェストファイルと呼ばれる構成ファイルで行われるのが一般的です。今回はDocker/Kubernetes超入門の本を参考にポッドのマニフェストとそれを外部に公開するサービスのマニフェストを使ってNginxを展開します。

マニフェストファイルはYAML形式で記述します。それぞれの意味は以下のようになっています。

  • apiVersion: マニフェストのバージョン
  • kind: リソースの種類
  • metadata: リソース名などのメタデータ
  • spec: リソースの詳細

・pod.yml

サービスのマニフェストも上の部分はポッドと同じですが、重要なのはspecの下にある「selector」で、これを使ってサービスが接続するポッドを指定します。

先程ポッドのマニフェストで定義した「svc2pod: web」を指定し、このサービスの接続先を定義します。

selectorの下の「ports」は外部に公開するポートと接続先のポートを指定しています。portがKubernetes内部から接続で利用するポートでnodePortがホスト外から接続で利用するポートです。

・service.yml

 

リソースを展開する

作成したマニフェストファイルを元にリソースを展開していきます。展開コマンドでは「kubectl apply -f」コマンドを使うのが一般的です

 

サービスリソースを確認するとweb-serviceが立ち上がっていることが確認できます。

 

nodePortで指定したポートを指定し、http://127.0.0.1:30000/にアクセスするとNginxのページを見ることができます。

 

デプロイメントを試してみる

実際の運用ではポッドを機能拡張したデプロイメントというリソースを使うことが一般的なようなため、実際に動かして試してみます。

デプロイメントは内部に下位リソースとしてレプリカセットというリソースを持ち、それが水平スケールや自動復旧機能を担当します。デプロイメントの主要機能としては、ポッドのアップグレードで、バージョンアップなど発生した際に古いポッドを入れ替えてくれます。

Docker/Kubernetes超入門の本を参考に動かしてみます。

spec.replicasフィールドで指定された通り、5つのレプリカPodを作成します。

spec.strategy.rollingUpdateフィールドでPodの数を指定した個数ずつ増減させてアップデートしていきます。

spec.strategy.typeにRollingUpdateと指定し、spec.strategy.rollingUpdateにmaxSurgeとmaxUnavailableを指定します。

  • maxSurge: replicasで指定した数よりも増やしていい最大Pod数(デフォルト値25%・絶対値 or %を設定)
  • maxUnavailable: replicasで指定した数よりも減らしていい最大Pod数(デフォルト値25%・絶対値 or %を設定)

 

・db.yml

 

・app.yml

 

kubectl applyで展開し、ポッドを確認すると5つ起動していることが確認できます。

 

デプロイメントの詳細情報は以下のコマンドで取得できます。