GCP入門のためのgcloudコマンドメモ

# GCP入門のためのgcloudコマンドメモ
GCP入門者のコマンドメモです。

## 基本情報の確認
```bash
$ gcloud auth list  // account確認
$ gcloud config list project // projectの確認
$ gcloud config --help // ヘルプ
```

## GCE

### インスタンスの作成
リージョンとゾーンは[こちら](https://cloud.google.com/compute/docs/regions-zones/regions-zones?hl=ja)で確認。

```bash
// us-central1-cにVM作成起動
$ gcloud compute instances create <任意名前> --zone us-central1-c
// 作成したVMにssh。globalに作った場合はzone省略可
$ gcloud compute ssh <任意名前> --zone us-central1-c
```
### インスタンスにDiskの追加
Diskの作成する。

```bash
$ gcloud compute disks create <任意名前> --size=200GB --zone us-central1-c
// 作成したDiskをVMに適用
$ gcloud compute instances attach-disk <VM名> --disk <Disk名> --zone us-central1-c
// デバイス名を変更したい時は--device-nameを指定すると任意の名前に変更可能
$ gcloud compute instances attach-disk <VM名> --disk <Disk名> --device-name <デバイス名> --zone us-central1-c
```
Diskのフォーマットとマウント。

```bash
$ sudo mkdir /mnt/mydisk // 任意のマウントポイントを作成
// mkfsでフォーマット（scsi-0Google_PersistentDisk_persistent-disk-1はDisk名を指定していない時のデフォルトDisk名)
$ sudo mkfs.ext4 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1
// マウント
$ sudo mount -o discard,defaults /dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1 /mnt/mydisk
```
VM再起動時に自動的にマウントさせたい場合はよしなに/etc/fstabに設定書く。

### VMインスタンスの情報を確認

```bash
$ gcloud compute instances list
```
### テンプレートの作成
複数のインスタンス作成時に共通で実行したいものなどをテンプレート化することができる。
ここではシェルスクリプトを使ったテンプレートの作成コマンドを記載します。

```bash
$ gcloud compute instance-templates create <テンプレート名> --metadata-from-file startup-script=hoge.sh
```
使う時はインスタンス作る時に--template <テンプレート名>で指定したスクリプトが実行されます

# Cloud Strage
基本scpと同じように利用できそう。

```bash
$ gsutil mb gs://hoge            // 作成
$ gsutil cp hoge.txt gs://hoge   // コピー
```

# GKE
Container RegistryにDocker imageをpush。
タグ名は**\<Strageリージョン\>/\<PROJECT_ID\>/\<docker-image-name\>**にする必要があります。
詳しくはhttps://cloud.google.com/container-registry/docs/#pushing_to_the_registry

```bash
$ gcloud docker -- push <タグ名>
```

クラスタを作成

```bash
// プロジェクト切り替え
$ gcloud config set project <PROJECT_ID>
// 標準マシンのノード２つを持つ、クラスタを作成
$ gcloud container clusters create <クラスタ名> \
                --num-nodes 2 \
                --machine-type n1-standard-1 \
                --zone us-central1-a
```

Podsを作成。
*ここでは簡単なWebサーバーのimageを作成したのでオプションにportを指定しています。*

```bash
$ kubectl run <クラスタ名> --image=<タグ名> --port=8080
```

外部ネットワークからのアクセスを許可する

```bash
$ ubectl expose deployment <image-name> --type="LoadBalancer"
```

Podsの数を増やす
*ここではreplicaを３つに指定して１→3に変更します。*

```bash
$ kubectl scale deployment <image-name> --replicas=3
```

imageの更新と反映

```bash
$ docker build -t <タグ名>:v2 .
$ gcloud docker -- push <タグ名>:v2
$ kubectl edit deployment <image-name>
// containers:imageの箇所をv2に変更
```

各種状態を確認

```bash
$ kubectl get deployments // deploymentオブジェクトを表示
$ kubectl get services    // クラスタが実行しているserviceを表示（ipやport情報）
$ kubectl get pods        // クラスタが実行しているpodsを表示
$ kubectl cluster-info    // クラスター情報を表示
$ kubectl config view     // configをダンプ
$ kubectl get events      // エラーなどeventの確認
$ kubectl logs <pod-name> // ログ
```


# ロードバランサー
GCPにはネットワークロードバランサとHTTPロードバランサという２つのロードバランサがある。
それぞれの設定方法を試します。

## 下準備
ロードバランサのお試しに２つのインタンスグループを作成します。

###ターゲットプールの作成。
*ターゲットプールは複数のインスタンスに一箇所からアクセスできるようにする玄関みたいなもの。*

```bash
$ gcloud compute target-pools create <ターゲットプール名任意>
```

###インスタンスグループの作成
*以下のコマンドでターゲットプールにひもづく、インスタンスを２つ持つマネージドなグループを作る。*

```bash
$ gcloud compute instance-groups managed create <グループ名> \
         --base-instance-name <インスタンス名のprefix> \
         --size 2 \
         --template <テンプレート名> \
         --target-pool <ターゲットプール名> \
```
###ファイアウォールの設定
ロードバランサのお試しように80番を解放

```
$ gcloud compute firewall-rules create <ファイアウォール名> --allow tcp:80
```

## ネットワークロードバランサ

```bash
$ gcloud compute forwarding-rules create <ロードバランサ名> \
         --region <インスタンスグループのリージョン> \
         --ports=80 \
         --target-pool <ターゲットプール名>
```

設定の確認

```bash
$ gcloud compute forwarding-rules list
```

## HTTP(S)ロードバランサ
HTTPSロードバランサは色々複雑なので[ドキュメント](https://cloud.google.com/load-balancing/docs/https/)の図を見ながらの方が良さそう

###ヘルスチェックを作成

```bash
$ gcloud compute http-health-checks create <ヘルスチェック名>
```
### バックエンドサービスを作成

```bash
$ gcloud compute backend-services create <バックエンドサービス名> \
      --protocol HTTP --http-health-checks <ヘルスチェック名> --global
```

作成したバックエンドサービスにインタンスグループを追加

```bash
$ gcloud compute backend-services add-backend <バックエンドサービス名> \
    --instance-group <インスタンスグループ名> \
    --instance-group-zone <インスタンスグループのzone> \
    --global
```

### URLマップの作成
URLマップを設定すると特定のURLを特定のインタンスやバックエンドサービスに振り分けることができる。
今回は全てのURLリクエストをバックエンドサービスに割り振り。
*URLマップにバックエンドサービスを設定*

```bash
gcloud compute url-maps create <URLマップ名> \
    --default-service <バックエンドサービス名>
```

### HTTPプロキシの作成

```bash
$ gcloud compute target-http-proxies create <プロキシ名> \
    --url-map <URLマップ名>
```

フォワーディングルールの設定
設定するとIP、portなどから特定のURLマップに振り分けることができる。
今回80番は全て作成したプロキシに振り分け

```bash
$ gcloud compute forwarding-rules create <ルール名> \
        --global \
        --target-http-proxy <プロキシ名> \
        --ports 80
```

### 確認

```bash
gcloud compute forwarding-rules list
```


# 終わりに

今日はGCPの基礎を勉強してきましたが、やっぱり愚直にIaaSぽく使うよりもGKEなど使った方が楽にインフラ構築できそうです。引き続き勉強して行きたいと思います。