Google Cloud GKEを使ってみた

皆さん、Google Kubernetes Engineはお使いでしょうか？
今回は、それぞれにウェブサーバーが含まれた複数のコンテナを含む Google Kubernetes Engine クラスタを作成します。
また、クラスタの手前にロードバランサを配置してコンテンツを参照させます。

## 全体像

①Kubernetes Engine を使用して Kubernetes クラスタをプロビジョニングする。

②kubectl を使用して Docker コンテナをデプロイおよび管理する。

### ①Kubernetes Engine を使用して Kubernetes クラスタをプロビジョニングする。

##### まず、必要な API が有効であることを確認しましょう。

GCP Console のナビゲーション メニュー（ナビゲーション メニュー）で、[API とサービス] をクリックします。

有効になっている API のリストを下にスクロールして、次の API が両方とも有効になっていることを確認します。

![スクリーンショット 2021-07-17 13.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/e1dbffd0-e67b-5646-519e-de6c13cc99a1.png)

![スクリーンショット 2021-07-17 13.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/a0b36869-dd73-ecd6-e15e-6e3afc1be3bd.png)



```
Kubernetes Engine API
Container Registry API
```

API がない場合は、上部にある [API とサービスを有効化] をクリックします。
上記の API を名前で検索し、現在のプロジェクトでそれぞれを有効にします。

### ②kubectl を使用して Docker コンテナをデプロイおよび管理する。

##### Kubernetes Engine クラスタを開始する
GCP Console の右上のツールバーにある「Cloud Shell をアクティブにする」ボタンをクリックします。

[続行] をクリックします。 

ゾーンを MY_ZONE という環境変数に配置します。Cloud Shell プロンプトで、次のコマンドを入力します。
今回は、私はus-central1-aで設定しています。任意のゾーンで実行してください。

```
$ export MY_ZONE=us-central1-a
```

Kubernetes Engine で管理されている Kubernetes クラスタを起動します。
このクラスタに (例) webfrontend という任意の名前を付けて、2 つのノードを実行するように構成します。

```
$ gcloud container clusters create webfrontend --zone $MY_ZONE --num-nodes 2
```

Kubernetes Engine によって仮想マシンがプロビジョニングされるため、クラスタの作成には数分かかります。

クラスタが作成されたら、kubectl version コマンドを使用して、インストール済みの Kubernetes のバージョンを確認します。

```
$ kubectl version
```

GCP Console で実行中のノードを表示します。
ナビゲーション メニュー（ナビゲーション メニュー）で、[Compute Engine] > [VM インスタンス] をクリックします。

Kubernetes クラスタを使用する準備が整いました。

##### コンテナを実行してデプロイする
Cloud Shell プロンプトで、nginx コンテナの単一インスタンスを起動します。

```
$ kubectl create deploy nginx --image=nginx:1.17.10
```

Kubernetes では、すべてのコンテナはポッドで実行されます。
kubectl create コマンドを使用すると、Kubernetes で、nginx コンテナを含む単一のポッドで構成された Deployment が作成されます。Kubernetes の Deployment は、ポッドが実行されているノード間で障害が発生した場合でも、指定した数のポッドを稼動状態に保ちます。このコマンドでは、デフォルトの数（1）の Pod が起動されました。

nginx コンテナを実行している Pod を表示します。

```
$ kubectl get pods
```

nginx コンテナをインターネットに公開します。

```
$ kubectl expose deployment nginx --port 80 --type LoadBalancer
```

Kubernetes によって、サービスと、パブリック IP アドレスが関連付けられた外部ロードバランサが作成されました。
この IP アドレスは、サービスの存続期間中は変更されません。そのパブリック IP アドレスへのネットワーク トラフィックは、サービスの背後にあるポッド（今回の場合は nginx ポッド）にルーティングされます。

新しいサービスを表示します。

```
$ kubectl get services
```

表示された外部 IP アドレスを使用して、nginx コンテナをリモートでテストしてアクセスすることができます。

Service の External-IP フィールドに入力されるまでに数秒かかる場合がありますので、少し待ちましょう。
このフィールドに入力されるまで何回か kubectl get services コマンドを再実行します。

新しいウェブブラウザ タブを開き、クラスタの外部 IP アドレスをアドレスバーに貼り付けます。
Nginx ブラウザのデフォルトのホームページが表示されます。

サービスで実行するポッドの数をスケールアップします。

```
$ kubectl scale deployment nginx --replicas 3
```

Deployment のスケールアップは、利用が拡大しているアプリケーションで使用できるリソースを増やす場合に役立ちます。

Kubernetes でポッドの数が更新されたことを確認します。

```
$ kubectl get pods
```

外部 IP アドレスが変更されていないことを確認します。

```
$ kubectl get services
```

クラスタの外部 IP アドレスを表示したウェブブラウザ タブに戻ります。
ページを更新して、nginx ウェブサーバーが応答していることを確認します。

これで、Kubernetes Engine で Kubernetes クラスタを構成、アプリケーションを含む複数の Pod をこのクラスタに配置し、アプリケーションの公開とスケーリングができました。

いかがだったでしょうか。
なんとな〜く雰囲気を掴めたかと思います。これを機にGoogle Cloudを更に使ってみませんか？楽しいですよ！w