RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Kubernetes / Pod とは【まとめ】

はじめに

こんにちは。mst_78710と申します。
今回は、初見では発音の仕方が分からない"kubernetes"について書いてみようと思います。
今となってはご存じの方も多いと思いますが、発音は「クバネティス」や「クーベネティス」でいいようです。
また「k8s」とも表現され、「k + 8 文字(ubernete) + s」から取ったとのことで、なかなかユニークな表現ですね。

さて、そのkubernetesですが、内容が膨大でブログの一記事では到底収まりきらないです。
なので、今回はkubernetesの概要と特徴の一部(主にPod)について、一例を交えながら説明できればと思います。

この記事のターゲットとしては、以下のような方が対象になります。
kubernetesって聞いたことはあるけど詳しくは知らない
・ちょっと調べてみたけど複雑でイメージがわかない

少しでもkubernetesについての理解の補助になれば幸いです。
それではいきましょう。

目次

これまでとどう違うのか

まず、これまでとどう違うかをざっくりと理解するため、
一般的なサーバとkubernetesをすごく簡略化した図にしてみました。

一般的なサーバの方は説明するまでもないかと思います。
kubernetes側で"master"と"node"という言葉がありますが、仮想サーバを表しています。(AWS環境であれば、EC2になります。)
masterでは、kubernetesを動かすために必要な機能が稼働します。
詳細な機能を書いてしまうと長くなってしまうので、公式にお任せします。
Kubernetesのコンポーネント | Kubernetes

一方のnodeでは、アプリケーションが"Pod"という枠で稼働します。
こちらは後ほど説明します。

簡単なまとめとして、kubernetesではmaster上で稼働する管理機能を利用して、node上でアプリを稼働させることになりそうですね。

kubernetesとは

公式でさらっと書かれているこの一言を掘り下げて、kubernetesの概要を説明していこうと思います。

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

わかったようで結局よくわからない感じですね。分解してみましょう。

  • 宣言的な構成管理と自動化を促進

構成管理と自動化はお馴染みかもしれないですが、"宣言的"という言葉はそれほど使わないかもしれないですね。
これまでのサーバ構築であれば、一般的にはサーバを構築してミドルウェアやアプリケーションなどのインストール、設定をしたうえで稼働させていたと思います。
kubernetesでは、マニフェストと呼ばれるファイルを作成し、それをkubernetesに読み込ませることでミドルウェアなどを設定・実行させることができます。
この「マニフェスト」ですが、英単語の意味としては以下のような意味があります。

明らかにする、明示する
manifestの意味・使い方・読み方|英辞郎 on the WEB

つまり、kubernetesで稼働させるアプリやミドルウェアの設定などを明示して(①マニフェスト作成)、kubernetesに「明示した通りに稼働させて」と宣言すると(②マニフェスト実行)、kubernetes上で想定通りにアプリやミドルウェアを稼働させることができる(③Pod作成)ということです。
コマンド実行したり、シェルスクリプトを流して結果確認などして設定していたのが、 マニフェストというファイルを作ればアプリやミドルウェアを効率的に設定して稼働させることができるようになる、ということになります。

図にすると以下のようになります。
マニフェスト作成

ここでは、nginxのPodを2個作成するというマニフェストを作成しています。
(記載している内容は例としているだけなので、実際には正しい記載方法があります。)

マニフェスト実行

kubernnetesにマニフェスト通りに稼働させるよう宣言します。

③Pod生成

マニフェストに記載された内容でPodを生成します。

Podの設定を変更したければ、マニフェストを編集してkubernetesに宣言すると変更内容が反映されます。
マニフェストをバージョン管理することで、戻したい内容のマニフェストを実行すればkubernetesが即座に自動でその通りに再作成してくれるので、万が一トラブルがあった際にも最小限の被害で対応できそうですね。

  • コンテナ化されたワークロードやサービスを管理する

ワークロードという言葉はkubernetesではどういう意味で使われるのか、調べてみます。

ワークロードとは、Kubernetes上で実行中のアプリケーションです。ワークロードが1つのコンポーネントからなる場合でも、複数のコンポーネントが協調して動作する場合でも、KubernetesではそれらはPodの集合として実行されます。
ワークロード | Kubernetes

kubernetesの世界ではワークロードという言葉を使っていますが、いわゆるアプリケーションのことを表していて、アプリケーションは先ほど出てきた"Pod"として管理します。
"複数のコンポーネントが協調して動作する場合でも"という言葉について少し補足すると、
同じPodでも、アプリケーションとして稼働させるもの以外に、LBの役割やcronのjob実行などで稼働させることも可能です。
ものすごくざっくり言うと、kubernetesでは"Pod"という形式にすることで様々な機能を持ったコンテナをまとめて管理できる、ということになりそうです。

管理というと曖昧になってしまうので、例えばPodの状態確認とするとわかりやすくなるかもしれません。
上記でNginxのPodを作成したので、その状態確認を実施すると以下のようになります。
kubernetes用のコマンドラインツール"kubectl"で確認します。

$ kubectl get pod
NAME                   READY     STATUS    RESTARTS   AGE
Nginx1                 1/1       Running   0          2m
Nginx2                 1/1       Running   0          2m

このように作成したPodが一覧で表示され、状態確認ができます。

項目 詳細
READY 準備が完了しているかどうかを表します。1/1となっているので正常稼働しています。
STATUS Podの作成状況を表します。Runningとなっているので、正常稼働しています。
RESTART Podが再起動した回数を表示します。
AGE 作成されてどれくらい時間が経過したかを表します。上記では、2分前に作成されたことがわかります。

ここで他のPodも作成してみることにします。
LBとcronのPodを作成するマニフェストを新しく作り、実行したとします。

$ kubectl get pod
NAME                   READY     STATUS        RESTARTS   AGE
Nginx1                 1/1       Running       0          5m
Nginx2                 1/1       Running       0          5m
lb1                    1/1       Running       0          3m
cronjob1               1/1       Completed     0          1m

LBのPodが新たに作成されていることが分かります。
また、cronのPodも新たに作成されていますが、STATUSが他のPodとは異なっています。
定期実行の設定がされたPodは、指定した実行時間にのみ起動されます。
Completedの場合はcron実行されて処理が終わった状態を示しています。
このように、kubernetesではPodという単位にすることで、様々な機能をまとめて管理することが可能となります。

  • ポータブルで拡張性のある

こちらは上記の"宣言的"という言葉にも少し関連してきます。
例えば、上記で例に挙げたとおり「このアプリケーションをPod2個で稼働させて」とkubernetesに宣言すると、その通りに稼働します。
稼働させているうちにさらに2個Podが必要になった場合、「このアプリケーションをPod4個で稼働させて」と宣言すると、 即座にPodが2個追加され、4個のPodが稼働するようになります。
Pod追加時に、kubernetesがこの時点でのnodeのリソース状態を確認し、よりリソースの少ないnodeを選んで、
全体のnodeのリソースが均等になるようにPodを作成してくれます。

さらに、運用上でPodを毎日再起動する必要があったりすると、その都度各nodeに分散させてPodを再作成します。
また、Pod自体のリソース(メモリなど)も指定することができ、同様に宣言すればkubernetesが変更してくれます。

このように、マニフェストを実行することで、Podを簡単に稼働させることができたり、node上でのPod配置もその時に応じて変わったり、リソースの拡張や縮小も可能になります。
"ポータブルで拡張性のある"という言葉の持つイメージが湧いてきたかと思います。

Kubernetesの特徴

kubernetesの特徴について、公式の以下のリンクを確認してみます。
Kubernetesとは何か? | Kubernetes

今回は、上記で説明した内容とも関わってくる"自動化されたロールアウトとロールバック"と"自己修復"について見てみましょう。

  • 自動化されたロールアウトとロールバック
    Kubernetesを使うとデプロイしたコンテナのあるべき状態を記述することができ、制御されたスピードで実際の状態をあるべき状態に変更することができます。例えば、アプリケーションのデプロイのために、新しいコンテナの作成や既存コンテナの削除、新しいコンテナにあらゆるリソースを適用する作業を、Kubernetesで自動化できます。

  • 自己修復
    Kubernetesは、処理が失敗したコンテナを再起動し、コンテナを入れ替え、定義したヘルスチェックに応答しないコンテナを強制終了します。処理の準備ができるまでは、クライアントに通知しません。

Podについて自動作成したりできるのは、何となくイメージがついたかと思います。
ただ、マニフェストに記載して宣言すればPodが作成されるようだけど、実際はどのように動いているのかという疑問が浮かんでくると思います。

  • 具体例

AWS環境を例として、Podを作成するまでの段取りも含めて見てみましょう。

①dockerfileからdocker imageを作成
→自動で色々やってくれるkubernetesですが、元となるものはやはり必要です。なので、稼働させたいdocker imageを作成します。

②作成したdocker imageをECRにpushして格納
→ECRはdocker imageの保存場所です。

③格納したdocker imageを利用するようマニフェストに記載して、kubernetesに宣言
マニフェストにECRのどのリポジトリにあるどの名前のdocker imageを利用するのかを明示して、kubernetesに宣言します。

kubernetesマニフェストに従って、ECRに格納しているdocker imageをpullしPodを作成
マニフェストに記載されたdocker imageを利用して、Podを作成します。

マニフェストにどのdocker imageを使うのか明示しておくことで、
kubernetesは指定されたdockerを利用し、マニフェストに記載された通りに動作させようとしてくれます。
この時に、"自動化されたロールアウトとロールバック"が効果を発揮します。
新規作成したい時や変更を加えたい時など、対象のdocker imageで新しいPodを作成しつつ、古いPodがあれば自動で削除してくれます。

また、稼働させていたPodに何らかのトラブルが発生し、正常に稼働できなくなったとしても、
kubernetesの自己修復機能によって、問題のあるPodを削除して、同じdocker imageで新しいPodを作成してくれます。

kubernetesの特徴である"自動化されたロールアウトとロールバック"と"自己修復"を利用してうまく運用すれば、比較的障害に強いシステムを作ることができそうですね。

まとめ

"宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースのプラットフォーム"という言葉の意味やkubernetesの特徴やPodについて、少しでもイメージできたでしょうか?
今回の内容はほんの一部分なのでkubernetesを理解したということにはならないのですが、何かのお役に立てば幸いです。
最後までお読みいただき、ありがとうございました。

  • 参考情報

Kubernetesドキュメント | Kubernetes
KubernetesのWorkloadsリソース(その1) | Think IT(シンクイット)


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.