皆様、こんにちは!
アイレット株式会社 DX開発事業部の楊林と申します。
前回の投稿では、コンテナについて紹介しました。
今回ではGoogle Kubernetes Engine(GKE) を紹介する準備として、まずは Kubernetes の基礎について整理していきます。
Kubernetesとは
Kubernetes は、コンテナ化されたワークロードとサービスを管理するためのオープンソースプラットフォームです。
Kubernetes を利用すると、複数ホストに分散したコンテナのオーケストレーションや、マイクロサービス構成のスケーリング、ロールアウト/ロールバックなどのアプリケーションデプロイを簡単に行えます。
Kubernetes を理解するうえで、まず「クラスタ」という概念が必要になります。クラスタはノードの集合で構成され、Kubernetes API を通じてコンテナをデプロイできる環境のことです。クラスタは、主要コンポーネントが動作するコントロールプレーンと、実際にコンテナを動かすノードに分かれています。ノードは、Compute Engine VM などの計算リソースとして機能します。
ユーザーがアプリケーションの構成や関係性を定義すると、Kubernetes がその望ましい状態を維持するように自動で調整してくれます。
また、Kubernetes にはクラスタを操作するための仕組みが整っており、コマンドやリソースを用いてアプリケーションのデプロイや管理、運用タスクの実行、ポリシー設定、ヘルスモニタリングが行えます。
Kubernetes の利用を始める際には、自分でクラスタを構築することもできますが、GKE を使うことで大幅に手間を減らしてブートストラップできます。
オブジェクト
Kubernetes の管理対象はすべて「オブジェクト」として表されます。ユーザーはこれらのオブジェクトの属性や状態を確認したり変更したりできます。中でも Pod は最小単位のデプロイ可能オブジェクトです。
Kubernetes オブジェクトは、クラスタ内で実行される内容の「望ましい状態」と「現在の状態」を表す永続的なエンティティとして扱われます。オブジェクトは以下の2つの要素で定義されます。
- オブジェクト仕様:ユーザーが定義する望ましい状態
- オブジェクトステータス:コントロールプレーンが提供する現在の状態
オブジェクトにはそれぞれ「Kind」があり、アプリケーション、リソース、またはその動作ポリシーを表します。
Pod
Pod は Kubernetes の基本的な実行単位であり、デプロイ可能な最小のオブジェクトです。Kubernetes 上のすべてのコンテナは Pod の内部で動作します。
Pod はコンテナの実行環境を提供し、1つまたは複数のコンテナを保持することができます。複数コンテナを含む場合、それらは密に連携し、同じネットワークとストレージを共有します。
Kubernetes は Pod 単位で一意の IP アドレスを割り当てます。Pod 内のコンテナは同じネットワーク名前空間を共有するため、localhost(127.0.0.1)で通信できます。また、Pod では共有ストレージボリュームを指定することも可能です。
簡単な Pod 実行には kubectl run を使うことができますが、このコマンドは現在では Deployment を作成して Pod を管理する形が一般的です。
Deployment
Deployment は複数の Pod レプリカをまとめて管理するためのオブジェクトです。ノード障害が発生しても Pod を自動的に再作成し、アプリケーションを継続的に稼働させることを目的としています。
Deployment の作成により、Pod に対して安定したアクセスを提供する Service を併用するのが一般的です。Service は内部向けの仮想 IP(ClusterIP)を持ちますが、外部公開が必要な場合には LoadBalancer タイプの Service を指定し、クラウド側でロードバランサが自動作成されます。
GKE では、この外部ロードバランサは Google Cloud の外部 HTTP(S) LB または L4 LB などとして構築され、クライアントはその IP アドレスを通じて背後の Pod にアクセスします。
Deployment のスケールは kubectl scale コマンドで変更可能です。
Service
Service は、Pod の集合に対して安定したアクセス手段を提供するためのオブジェクトです。
Deployment によって生成される Pod は短命であり、再作成のたびに IP が変わります。そこで、Service が固定の仮想 IP(ClusterIP)を提供し、クライアントが安定してアクセスできるようにします。
また、外部向け公開が必要な場合は LoadBalancer タイプの Service を使うことで、クラウド側で外部アクセス用のパブリック IP を持つロードバランサが自動で作成されます。
現在のクラスタで稼働中の Service 一覧は kubectl get service で確認できます。
コンポーネント
Kubernetes のクラスタは複数のコンピュータ(多くは VM)で構成されます。そのうち 1 台がコントロールプレーンを担い、それ以外がノードとして Pod を実行します。
コントロールプレーンは Kubernetes を動作させるための中枢で、以下の主要コンポーネントが動作します。
- kube-apiserver:唯一ユーザーが直接操作する API。クラスタ状態の読み書きを受け付け、各種操作の入口となります。
- kubectl:kube-apiserver と通信する CLI で、ユーザーが操作する際のインタフェースです。
- etcd:クラスタの永続データストアとして cluster state を確実に保存します。
- kube-scheduler:Pod をどのノードに配置するかを決める役割を持ちます。
- kube-controller-manager:kube-apiserver を通じてクラスタの状態を監視し、望ましい状態との差分を調整します。
ノード側では以下のコンポーネントが動作します。
- kubelet:ノードのエージェントで、Pod の実行指示を受け取り、コンテナランタイムと連携します。
- kube-proxy:Pod 間のネットワーク通信を維持するためのプロキシ。iptables などを利用して Service の転送ルールを実現します。
最後に
今回は、コンテナの基礎に続いて Kubernetes の基礎について紹介しました。
次回は Kubernetes の構成方法についてお話しします。
ぜひ続けて読んでいただけると嬉しいです!
以前の投稿
【Google Cloud入門】クラウドサービスの特徴とGoogle Cloudの触り方
【Google Cloud入門】リソースマネージメント
【Google Cloud入門】アクセス管理の基本 - IAM
【Google Cloud入門】サービスアカウントとCloud Identity
【Google Cloud入門】Compute Engineの基礎
【Google Cloud入門】コンピューティングオプションとマネージドインスタンスグループ
【Google Cloud入門】GKE入門の前準備-コンテナの基礎