はじめに
今回は、近年のモダナイゼーションにおいて広く使われている、Kubernetes について簡単に解説し、後半では Google Cloud の Kubernetes サービスである GKE を使うことで、簡単に構築ができるところをご紹介したいと思います。
モダナイゼーションとコンテナ
モダナイゼーションは、直訳すると「現代化」といった意味になりますが、コンピュータシステムにおけるモダナイゼーションとは、諸説あるものの、概ねいわゆる「オンプレミス」と呼ばれる古いシステムを最新技術を使って新しいものにしていく、といった意味になるかと思います。(モダナイズに関する記事は、近日別途ご紹介したいと思います)その際に使われるコンテナはモダナイゼーションの手法としては、コンテナ化といって、Docker とか Kubernetes を使うものが有名です。これまでは、VMWare などによりサーバ仮想化を行う方法が多く使われてきましたが、Broadcom による VMWare 社の買収やライセンス変更などにより、今後コンテナへのシフトが進んで行くのではないかと思っています。
Dockerとは
コンテナの実行環境(コンテナエンジン)を提供する代表的なソフトウェアが「Docker」です。
サーバ仮想化に比べ、
・オーバヘッドが小さく軽量
・コンテナ内に構成した内容をパッケージングして持ち運ぶことができる(ポータビリティ)
といった特徴があります。
ただ、Docker だけだと、基本的には1台のサーバをコンテナにするところまでの技術となります。
Kubernetes(K8s)とは
コンテナ(Docker)を商用システムとして活用するうえで生じた課題に対応したものになります。Docker の課題としては、下記のようなものがあります。
・デプロイが手作業で面倒
・複数コンテナの管理、連携、運用が難しい
・コンテナイメージの運用(リビルドなど管理が面倒)
・コンテナ障害発生時の対応が難しい
Kubernetes は、コンテナ(Docker)の課題を解決するための仕組みと言えます。
Kubernetes の仕組み
Kubernetes を実現するには、下記のような構成が必要となります。
コンテナを効率的に管理する仕組みではあるのですが、結構複雑になります。
・クラスター
Kubernetes のリソースを管理する集合体。ノード、ポッドなどで構成されます。
実際のシステムにおいては、複数のクラスターによって構成されています。
・ノード
ノードはマスターノードと通常のノードに分類されます。
・マスターノード:Kubernetes を管理するために利用するノード。
・ノード(通常の):アプリケーションなどを実際に実行するノード。
・ポッド
通常のノードの中に存在し、最低1つのコンテナを有しています。
Kubernetes にデプロイする場合は、ポッド単位で行われます。
・コンテナ
このコンテナは Docker コンテナのことです。
1つのアプリケーションの立ち上げが可能です。
Google Cloud の GKE とは
Kubernetes は、複数のコンテナを構成する際に非常に有用な仕組みですが、Kubernetes 自体が結構複雑な構成となっており、これらを実際にサーバを構成して使うには、難しいものとなります。
Kubernetes を簡単に構築する仕組みが、パブリッククラウド各社より提供されていますが、その一つがGloogle Cloud から提供されている GKE(Google Kubernetes Enjine)です。
実は、Kubernetes は Google のエンジニア、Rohit Seth氏がそのコンセプトを2006年のメールで説明したことから始まったもの。ということもあってか、Google Cloud の GKE が機能的にも料金面でも最適な選択肢ではないかと思います。
GKE クラスタのアーキテクチャ
GKE クラスタを作成すると、
・コントロールプレーン (マスターノード)
・ノード (ワーカーノード)
の 2 種類のコンポーネントが自動で構築されます。
※クラスタの運用モードに、Autopilot モードと Standard モード という 2 種類があり、Autopilot モードでは、マスターノード、ワーカーノードの両方とも自動で作成できます。
GKE クラスタをデプロイして公開する
前置きが長くなりましたが、Google より提供されている、Google Cloud Skills Boost にて、実際にクラスタを作成してみました。予想以上に簡単にできるので、見てみてください。
手順
①Cloud Shell を使用して GKE クラスタを生成する
②kubectrl コマンドを使って、イメージのデプロイを行う
③kubectrl コマンドを使って、公開(expose)を行う
①Cloud Shell を使用して GKE クラスタを生成する
Google Cloud の初期画面より、Cloud Shell を起動(下図赤丸部分)します。

デフォルトのコンピューティングゾーンを設定後、GKEのクラスタ生成コマンドを実行します。
gcloud container clusters create --machine-type=e2-medium --zone=us-central-c test-cluster
※上記の例で、
「e2-medium」部分は、ノードに使用する Compute Engine のマシンタイプ
「us-central-c」部分は、クラスタを構築するゾーン
「test-cluster」部分は、クラスタ名(任意)
となっており、適宜指定してください。
たったこれだけのコマンドで、指定したゾーンにクラスタ(マスターノード、ワーカーノード)を簡単に構築できてしまいます。
(以下は GKE のコンソールより test-cluster の「NODES」を表示した画面です。1つのポッドと3つのノードが作成されていることがわかります)
②kubectrl コマンドを使って、イメージのデプロイを行う
続いて、クラスタにアプリケーションイメージのデプロイを行います。まず、
gcloud container clusters get-credentials test-cluster
を実行して、クラスタとやり取りするために認証を行っておき、
kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0
で kubectl コマンドを使って、test-cluster 上に hello-server というアプリケーションを作成しています。
※上記の例で、
「hello-server」部分は、アプリケーション名
「gcr.io/google-samples/hello-app:1.0」部分は、アプリケーションが格納されている場所(リポジトリ)
となっています。(Google のサンプルを使用しています)
③kubectrl コマンドを使って、公開(expose)を行う
最後に、デプロイしたアプリケーションを外部に公開します。
kubectl expose deployment hello-server --type=LoadBalancer --port 8080
※上記の例で、
「hello-server」部分は、アプリケーション名
「--type=LoadBalancer」部分は、hello-server 用にロードバランサを作成する指示
「--port 8080」部分は、公開するポート番号を指示
となります。
最後に、公開したアプリケーション(hello server)にリクエストしてみます。
kubectl get service
を使用すると、下記のようにhello-server用に作成されたパブリックアドレスが表示されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-server loadBalancer 10.xx.244.36 35.xx.234.26 8080:31991/TCP 65s
kubernetes ClusterIP 10.xx.240.1 433/TCP 5m13s
上記の hello-server の EXTERNAL-IP に記載されるアドレス(上記例では 35.xx.234.26 部分)に対して、ブラウザよりアクセスすると、ブラウザに下のように表示されます。

たったこれだけの操作で、Kubernetes にアプリケーションが準備できるというのが驚きです。
まとめ
Google Cloud の GKE で Kubernetes を簡単に使ってみようことで、Kubernetes と GKE についてのご紹介と、簡単な実践について行ってみました。
引き続きいろいろ試して、より役に立つ情報をお伝えできるように頑張ります。