Google Kubernetes Engine 上で Spring Boot を動かしてみる

高幡不動のあじさい

先日、珈琲仲間に誘われて高幡不動のあじさいを観に行ってきました。
あいにくの雨でしたが、色んな種類のあじさいが綺麗に咲いていて心が洗われました。

写真の右側のようなあじさいを「がくあじさい」と呼ぶそうです。
これまで中央部分が単に咲いていない(これから開花する)んだと思ってた… (´▽`*)

meet K8s

その内、GCPがAWSのシェアを塗り替えるんじゃないかと思っているのと
DockerやKubernetesとうワードを見かけない日がないので
GCP上でKubernetesを触って理解を深めたいと思います。


2018/8/1 追記
世界的にシェアを見ればAWS、Microsoft、Googleの順なんですね!
Alibabaの勢いもすごい…


Dockerとは

Docker enables true independence between applications and infrastructure and developers and IT ops to unlock their potential and creates a model for better collaboration and innovation.

Containers are an abstraction at the app layer that packages code and dependencies together. Multiple containers can run on the same machine and share the OS kernel with other containers, each running as isolated processes in user space. Containers take up less space than VMs (container images are typically tens of MBs in size), and start almost instantly.

Docker社が開発しているコンテナ型の仮想環境を作成/配布/実行するためのプラットフォーム。
「コンテナ」と呼ばれる技術によりホストマシンのカーネルを利用しプロセスを隔離することで、あたかも別のマシン上のように動かすことができる。
ゲストOSをインストールした上でミドルウェアやライブラリ、アプリケーションを動かすハイパーバイザ型やホスト型の仮想実行環境と比べリソースを効率的に利用できるのが特徴。

開発環境の準備/統一に便利だな〜くらいの認識でしたが、最近は運用にも使われているよう。
まさしくDevOpsですね。

ハイパーバイザ型やホスト型の仮想実行環境を使うことが多いのですが
確かに時間もリソースもかかるので、そこが簡略できるのはとても魅力的。

Kubernetesとは

It has a large, rapidly growing ecosystem.
Kubernetes provides a container-centric management environment. It orchestrates computing, networking, and storage infrastructure on behalf of user workloads. This provides much of the simplicity of Platform as a Service (PaaS) with the flexibility of Infrastructure as a Service (IaaS), and enables portability across infrastructure providers.

コンテナオーケストレーションツールと称されるKubernetes。
コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を行うために用いる。
コンテナオーケストレーションツールはKubernetesの他に、Docker SwarmやApache Mesosなどがある。

Kubernetesはクラスターが強力なのだそう。
GUIが用意されているし、オートスケーリングやロードバランシング、ヘルスチェック以外で自己修復もしてくれる。

オーケストレーション、賑やかな印象を受けます。

Kubernetes Clustersとは

KubernetesのアーキテクチャについてはTHENEWSTACKさんの図がわかりやすいです。
#ぱっと見た中では公式サイトのドキュメントから概要図を見つけられませんでした。

a Kubernetes cluster consists of at least one master and multiple compute nodes. The master is responsible for exposing the application program interface (API), scheduling the deployments and managing the overall cluster. Each node runs a container runtime, such as Docker or rkt, along with an agent that communicates with the master. The node also runs additional components for logging, monitoring, service discovery and optional add-ons. Nodes are the workhorses of a Kubernetes cluster. They expose compute, networking and storage resources to applications. Nodes can be virtual machines (VMs) running in a cloud or bare metal servers running within the data center.
A pod is a collection of one or more containers. The pod serves as Kubernetes’ core unit of management. Pods act as the logical boundary for containers sharing the same context and resources. The grouping mechanism of pods make up for the differences between containerization and virtualization by making it possible to run multiple dependent processes together. At runtime, pods can be scaled by creating replica sets, which ensure that the deployment always runs the desired number of pods.

Kubernetesのクラスターは少なくとも1つのマスターと複数のノードから構成されており、マスターはAPIの公開、デプロイのスケジューリング、すべてのクラスタの管理を行います。
各ノードはDockerなどのコンテナとマスターと通信するエージェントを実行します。加えて、ロギング、モニタリング、サービス検出やオプションのアドオンなど追加のコンポーネントも実行します。
ポッドは1つまたは複数のコンテナをグループ化します。このグループ化におけるメカニズムは、複数の依存プロセスを一緒に実行できるようにすることで、コンテナ化と仮想化の違いを補っています。実行時、ポッドはレプリカセットを作成することでスケールを可能にします。

…大雑把に言えば、マスターの配下にポッド、レプリカセット、サービス等Kubernetesオブジェクトがありロードバランシングを可能にしてしてくれているんですね。

実際に触ってみる

なんとなく概要をみたところでGCPのチュートリアルにトライします。
書いてあることを実行する中で2点エラーが発生したのでそこを中心に明記します。

Dockerizing your application

Creating a Dockerfile

ローカルでビルドした際にはうまくいったのですが、GCPでビルドを行った際にgradlewに権限がないとエラーが発生しました。


そこで実行権限を付与することで対応しました。

1
2
3
4
5
6
7
8
9
10
// Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
RUN mkdir /work
COPY . /work
WORKDIR /work
RUN chmod +x /work/gradlew
RUN /work/gradlew build
RUN mv /work/build/libs/*.jar /work/app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/.urandom", "-jar", "/work/app.jar"]

Create a cluster

クラスターを作成する際にzoneregionを指定してと言われました。

こちらは--zone=asia-northeast1をつけることで対応。
参照 => gcloud container clusters create

Deploy to the cluster

ポッドをデプロイ、デプロイしたポッドをロードバランシングで公開します。

EXTERNAL-IPに割り当てられたアドレスにアクセス、動作していることが確認できました。

Scaling and updating your application

Set the replica count

レプリカセットの値を3から2へ変更します。
スケールされていることが確認できました。

まとめ

難しいと思っていたK8sですが、触るだけなら簡単にできました。GCPのおかげですね!
動かすアプリケーションの規模が小さいこともあり、スケーリングの恩恵はあまり感じられませんでしたが
それでもお手軽さは感じることができました。

クラウド化によるPaas、IaaSでもすごいと感じるのに
さらにコンテナ化したものをオーケストレーションする技術まで出てきて
クラウドの技術革新には目を見張ります。

そもそも開発体制としてDockerを導入していないので
Kubernetesを業務で扱うことはないだろうけど
社内ツール類をコンテナ化してまとめられたらすっきりしそう。
弊社は(お客様の)鶴の一声がないと新しいツールの導入はまずないので難しいかな…。
少しでも便利に、安定に、なサイクルを模索していきたいところ。

The DevOps ハンドブック、読み始めました。

参考

Share