* この投稿は米国時間 5 月 26 日、Google Cloud Platform の Software Engineer である Fabio Yeon によって投稿されたもの(投稿はこちら)の抄訳です。


Google Container Engine(GKE)が目指しているのは、Kubernetes クラスタのセットアップおよび管理プラットフォームで最高の存在になることです。ところが、異種構成のクラスタを作成することは、これまでは非常に困難でした。

従来、クラスタを作るときには、ノードのマシン タイプやディスク サイズなどのオプションを選択できました。しかし、それがすべてのノードに適用されるため、クラスタは同種的になっていたのです。

このたび GA リリースされた GKE の新機能であるノード プールは、この問題を解決します。ノード プールは同じ構成のマシンのコレクション、すなわち “プール” です。これにより、クラスタはすべてのノードが同じでなければならない画一的なものではなくなり、複数のノード プールを持てるようになって、従来よりも細かくニーズに対応できるようになりました。

たとえば、n1-standard-2 マシンから構成されるクラスタを作ったところ、もっと CPU が必要だということが判明したとします。これからは、n1-standard-4(またはそれ以上)のマシンで構成されたノード プールを既存のクラスタに簡単に追加できます。

以上はすべて、gcloud コマンドライン ツールに新設される node-pools コマンドによって実現されます。この新機能の使い方を、もう少し突っ込んだ形で見ていきましょう。


クラスタの作成

ノード プールはクラスタに属していなければなりません。そして、すべてのクラスタは “default-pool” という名前のデフォルト ノード プールを持ちます。

それでは、新しいクラスタを作ってみましょう(すでに gcloud によってプロジェクトとゾーンを設定しているものとして話を進めます)。



> gcloud container clusters create work
NAME     ZONE           MASTER_VERSION  MASTER_IP        MACHINE_TYPE   
NODE_VERSION  NUM_NODES  STATUS
work     us-central1-f  1.2.3           123.456.789.xxx  n1-standard-1  
1.2.3         3          RUNNING

マシン タイプを指定する “--machine-type” や、初期状態のノード数を指定する “--num-nodes” などのノード構成オプションは、以前と同じように指定できます。


新しいノード プールの作成

クラスタを作成したら、新設の “node-pools” トップ レベル オブジェクトを使用してノード プールを見ることができます(注意 : これらの新オプションを使うには、“gcloud components update” によって gcloud コマンドをアップグレードしなければならない場合があります)。



> gcloud container node-pools list --cluster=work
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.2.3

ここでは、“--cluster” という新パラメータを指定しなければならないことに注意してください。ノード プールはクラスタに属するので、node-pools コマンドを実行するクラスタの指定が必要です。次のコマンドを実行すれば、これを構成のデフォルトに設定することも可能です。



> gcloud config set container/cluster 

GKE 上にすでに既存クラスタがある場合は、クラスタは自動的にオリジナルのクラスタ ノード構成で “default-pool” にマイグレートされます。

では、“work” クラスタに対して、2 CPU および 12 GB RAM のカスタム マシン タイプの新ノード プールを作ってみましょう。



> gcloud container node-pools create high-mem --cluster=work 
--machine-type=custom-2-12288 --disk-size=200 --num-nodes=4


これで、カスタム マシンの VM と 200 GB のブート ディスクを使って 4 ノードの新ノード プールが作成されます。以下は、ノード プールのリストを表示したところです。



> gcloud container node-pools list --cluster=work
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.2.3
high-mem      custom-2-12288 200           1.2.3

kubectl でノードのリストを表示すると、次のようになります。


> kubectl get nodes
NAME                                 STATUS    AGE
gke-work-high-mem-d8e4e9a4-xzdy       Ready     2m
gke-work-high-mem-d8e4e9a4-4dfc       Ready     2m
gke-work-high-mem-d8e4e9a4-bv3d       Ready     2m
gke-work-high-mem-d8e4e9a4-5312       Ready     2m
gke-work-default-pool-9356555a-uliq   Ready     1d

Kubernetes 1.2 に合わせる形で、各ノード プールのノードには “cloud.google.com/gke-nodepool=” というノード ラベルが自動的に与えられるようになりました。ノード ラベルによってクラスタ内に異種ノードを持てるようになり、ニーズに見合う特定のノードに pod をスケジュールすることができます。

大量のメモリを必要とする pod 群がある場合は、クラスタ内に high-mem ノード プールを確保し、そこにスケジュールします。あるいは、大きなローカル ディスク スペースが必要なら、ローカル ストレージ容量が大きいノード プールにスケジュールします。

現在、ノードのそれ以外の構成オプションについても、操作できるようにすることが検討されています。


ノード プールのさらに面白い使い方

ノード プールのシナリオには、他にもっと高度なものが考えられます。

たとえば、クラスタ内のノードを Kubernetes の最新リリースにアップグレードしたいと考えているものの、それには移行の細かい制御が必要だとしましょう(A/B テストの実行、pod の緩やかなマイグレーションなど)。

そのような場合、GKE で Kubernetes の新リリースが公開されたら単純に新しいノード プールを作ります。すべてのノード プールはクラスタ マスターと同じバージョンになりますが、クラスタ マスターは自動的に Kubernetes の最新リリースにアップデートされます。適切なバージョンで新しいノード プールを作る方法は次のとおりです。


> gcloud container node-pools create my-1-2-4-pool --cluster=work 
--num-nodes=3 --machine-type=n1-standard-4

> gcloud container node-pools list --cluster=work
NAME           MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool   n1-standard-1  100           1.2.3
high-mem       custom-2-12288 200           1.2.3
my-1-2-4-pool  n1-standard-4  100           1.2.4

ここで “kubectl” に移り、“cloud.google.com/gke-nodepool=my-1-2-4-pool” というラベル セレクタで pod をスケジューリングするように、レプリケーション コントローラをアップデートします。すると、pod は古いノードから新しいプール ノードにスケジュールしなおされます。

確認が終わったら、古いノードがすべて空になるまで他の pod の移行を続けます。そして、元のノード プールを削除します。


> gcloud container node-pools delete default-pool --cluster=work

> gcloud container node-pools list --cluster=work
NAME             MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
high-mem         custom-2-12288 200           1.2.3
My-1-2-4-pool    n1-standard-4  100           1.2.4


これで完成です。すべての pod が、最新バージョンの Kubernetes が動くノードで実行されます。


複数のゾーンにまたがるノード プール

ゾーンの停止というあまり起きない問題が生じたときに、複数のゾーンでノードを実行できるようにしておけば、アプリケーションの可用性が向上します。そのため、複数ゾーンでのノード実行を望む声が、お客様から多数寄せられていました。

そうした要望に応えるべく、ノード プールはマルチゾーン クラスタを自動的にサポートします。マルチゾーン クラスタを作成するには、gcloud に “--additional-zones” フラグを渡し、クラスタと同じリージョンに含まれる 1 つ以上のゾーンを指定します。



> gcloud container clusters create multi-prod --zone us-central1-f 
--additional-zones=us-central1-a,us-central1-b
NAME        ZONE           MASTER_VERSION  MASTER_IP       
MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
multi-prod  us-central1-f  1.2.4           xxx.xxx.xxx.xx  
n1-standard-1  1.2.4         9          RUNNING

このクラスタで新たなノード プールを作成すると、そのノード プールはクラスタのすべてのゾーンに自動的に展開されるため、これらの追加ゾーンにも同じようにノードが作られます。

なお、“--num-nodes” オプションはゾーンごとの数字です。このオプションは、作成されるノード数を倍増させる効果があるので、クォータの限界を超えないように注意してください。


> gcloud container node-pools create larger-pool --cluster=multi-prod 
--num-nodes=2
NAME        ZONE           MASTER_VERSION  MASTER_IP       
MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
multi-prod  us-central1-f  1.2.4           xxx.xxx.xxx.xx  
n1-standard-1  1.2.4         6          RUNNING

Kubernetes API でリストを表示すると、指定したすべてのゾーンにノードが展開され、“failure-domain.beta.kubernetes.io/zone” というラベルが自動的に付加されていることがわかります。



# Use a go-template to filter to just the node name and zone.
> kubectl get nodes -o go-template='{{ range .items }}{{ 
.metadata.name }}, {{ index .metadata.labels 
"failure-domain.beta.kubernetes.io/zone" }}{{printf "\n"}}{{ end }}'

gke-multi-prod-default-pool-29bvd5cf-o73u, us-central1-b
gke-multi-prod-default-pool-b14r04c2-blx8, us-central1-c
gke-multi-prod-default-pool-ef1gde41-hzx5, us-central1-f
gke-multi-prod-larger-pool-6e67u678-etsz, us-central1-c
gke-multi-prod-larger-pool-70b6y344-1rz9, us-central1-b
gke-multi-prod-larger-pool-8b25kaa0-k1e3, us-central1-f

まとめ

GKE に新設されたノード プール機能により、Kubernetes クラスタは従来よりも強力で柔軟なシナリオを実現できるようになりました。ご要望がありましたら、いつものようにフィードバックをお寄せください。