GCP スキルバッジをもらおう　Clear ！〜１０ 限定公開 Kubernetes クラスタのセットアップ

実際にラボを実施した際の記録を載せていきます。
学習の助けになったリンクや、後に見るための学習メモ、ちょっと迷った手順を書いていきます。
あと、コマンドも忘れたくないのでログしていきます。

* 学習の助けになったリンクは、「学習に役立つリンク」にまとめて書いてあります。
* 学習メモは:writing_hand:アイコンをつけてます。
* 迷った手順は箇条書きでつらつら書いてます。
実際の手順については、[Google Cloud Skills Boost](https://www.cloudskillsboost.google/)のラボの手順を参照してください。

クエスト「[Security & Identity Fundamentals](https://www.cloudskillsboost.google/quests/40)」の最後のラボです。
SkillBoostの始め方は記事「[GCP スキルバッジをもらおう　1Google Cloud Skill Boostをはじめよう](https://qiita.com/orange-tora/items/57d5fe3486f4c7e1a58a)」をどうぞ。

:::note info
この記事は「<a href="https://qiita.com/advent-calendar/2021/gcp-skill-boost-sif">GCP スキルバッジをもらおう！　〜Security & Identity Fundamentals Advent Calendar 2021</a>」の一部として公開しています。
２５日にスキルバッジが獲得できるペースで公開していきます。
:::

##ラボの情報
ラボの名前：[限定公開 Kubernetes クラスタのセットアップ](https://www.cloudskillsboost.google/focuses/867?parent=catalog)
所要時間：1時間３０分　レベル：Advanced　必要なクレジット:7
概要：
外部に公開しないKubeクラスタを作成する。
結果をComputeEngineから確認する。

##学習に役立つリンク
参考URL：
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine)
[Kubernetes Engine 限定公開クラスタをベータ リリース](https://cloud.google.com/blog/ja/products/gcp/kubernetes-engine-private-clusters-now)
[限定公開クラスタの作成](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters?hl=ja)
関連SDK：
[gcloud container clusters](https://cloud.google.com/sdk/gcloud/reference/container/clusters?hl=ja)
[gcloud beta container](https://cloud.google.com/sdk/gcloud/reference/beta/container?hl=ja)

##ラボの実施記録
ゾーンを設定する

```
gcloud config set compute/zone us-central1-a
```
```
Updated property [compute/zone].
```

private-cluster という名前のクラスタを作成して、Kubernetes Engine が自動的にサブネットワークを作成するようにします。
次のコマンドを実行する（１、２分かかります）

```
gcloud beta container clusters create private-cluster \
    --private-cluster \
    --master-ipv4-cidr 172.16.0.16/28 \
    --enable-ip-alias \
    --create-subnetwork ""
```

`--private-cluster`
限定公開
`--master-ipv4-cidr`
Kubernetes のマスター コンポーネントを実行するVMに対して CIDR 範囲を 172.16.0.16/28 と指定
`--enable-ip-alias`　
IP エイリアスを有効
`--create-subnetwork`
Kubernetes Engineが自動的にサブネットワークを作成する

###ゾーンの設定
デフォルト ネットワークのサブネットを一覧表示して、出力で、クラスタに対して自動的に作成されたサブネットワークの名前を確認（gke-private-cluster-subnet-xxxxxxxx ）
次で使うのでコピっておく。

```
gcloud compute networks subnets list --network default
```
```
~略~
NAME: gke-private-cluster-subnet-cc5fd483
REGION: us-central1
NETWORK: default
RANGE: 10.33.168.0/22
STACK_TYPE: IPV4_ONLY
IPV6_ACCESS_TYPE:
IPV6_CIDR_RANGE:
EXTERNAL_IPV6_CIDR_RANGE:
~略~
```

自動的に作成されたサブネットの情報を取得します。次のコマンドの [SUBNET_NAME] を対象のサブネットに置き換えて実行

```
gcloud compute networks subnets describe [SUBNET_NAME] --region us-central1
```
```
uster-subnet-cc5fd483 --region us-central1
creationTimestamp: '2021-12-21T20:31:37.362-08:00'
description: auto-created subnetwork for cluster "private-cluster"
fingerprint: 4eEJmV9Q318=
gatewayAddress: 10.33.168.1
id: '5154850465182061766'
ipCidrRange: 10.33.168.0/22
kind: compute#subnetwork
name: gke-private-cluster-subnet-cc5fd483
network: https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-00-1d25c8b8857f/global/networks/default
privateIpGoogleAccess: true
privateIpv6GoogleAccess: DISABLE_GOOGLE_ACCESS
purpose: PRIVATE
region: https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-00-1d25c8b8857f/regions/us-central1
secondaryIpRanges:
- ipCidrRange: 10.36.0.0/14
  rangeName: gke-private-cluster-pods-cc5fd483
- ipCidrRange: 10.33.176.0/20
  rangeName: gke-private-cluster-services-cc5fd483
selfLink: https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-00-1d25c8b8857f/regions/us-central1/subnetworks/gke-private-cluster-subnet-cc5fd483
stackType: IPV4_ONLY
```

セカンダリ範囲の 1 つ目がポッド用で、2 つ目がサービス用であることがわかる。
privateIPGoogleAccess が true に設定されているので、プライベート IP アドレスだけが指定されているクラスタホストが、Google API やサービスと通信できるようになります。

###マスター承認済みネットワークの有効化
この時点で、マスターにアクセスできる IP アドレスは、次の範囲のアドレスだけ。

* ノードに使用される、サブネットワークのプライマリ範囲。
* ポッドに使用される、サブネットワークのセカンダリ範囲。


選択したアドレス範囲を承認して、追加でマスターにアクセスできるようにする。

####VMインスタンスを作る
GKEインスタンスへの接続をテストするためのVMを`source-instance`という名前で作る

```
gcloud compute instances create source-instance --zone us-central1-a --scopes 'https://www.googleapis.com/auth/cloud-platform'
```
```
Created [https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-00-1d25c8b8857f/zones/us-central1-a/instances/source-instance].
NAME: source-instance
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 104.197.112.158
STATUS: RUNNING
```

上のコマンド出力でもでていますが、`source-instance`の外部IPを取得する
次のステップで使うのでコピーしておく

```
gcloud compute instances describe source-instance --zone us-central1-a | grep natIP
```
```
e us-central1-a | grep natIP
    natIP: 104.197.112.158
```

[MY_EXTERNAL_RANGE]を「さっき取得したIP/32」で置換して実行する。

```
gcloud container clusters update private-cluster \
    --enable-master-authorized-networks \
    --master-authorized-networks [MY_EXTERNAL_RANGE]
```
```
Updating private-cluster...done.     
Updated [https://container.googleapis.com/v1/projects/qwiklabs-gcp-00-1d25c8b8857f/zones/us-central1-a/clusters/private-cluster].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-a/private-cluster?project=qwiklabs-gcp-00-1d25c8b8857f
```

`source-instance`にSSH接続する。
`Y`を入力して続行、パスフレーズは空白です。

```
gcloud compute ssh source-instance --zone us-central1-a
```

**SSHシェルで実行**Kubeをインストールする。

```
gcloud components install kubectl
```
失敗した場合は、`sudo apt-get install kubectl`を試す

**SSHシェルで実行**Kubeクラスタへの接続を設定

```
gcloud container clusters get-credentials private-cluster --zone us-central1-a
```
```
Fetching cluster endpoint and auth data.
kubeconfig entry generated for private-cluster.
```

クラスタノードに外部 IP アドレスがないことを確認
ノードに内部 IP アドレスが指定されていて、外部アドレスが指定されていないことがわかる

```
kubectl get nodes --output yaml | grep -A4 addresses
```
```
    addresses:
    - address: 10.33.168.3
      type: InternalIP
    - address: gke-private-cluster-default-pool-6ff0d6a6-0320.us-central1-a.c.qwiklabs-gcp-00-1d25c8b8857f.internal
      type: InternalDNS
--
    addresses:
    - address: 10.33.168.2
      type: InternalIP
    - address: gke-private-cluster-default-pool-6ff0d6a6-4btx.us-central1-a.c.qwiklabs-gcp-00-1d25c8b8857f.internal
      type: InternalDNS
--
    addresses:
    - address: 10.33.168.4
      type: InternalIP
    - address: gke-private-cluster-default-pool-6ff0d6a6-qh6p.us-central1-a.c.qwiklabs-gcp-00-1d25c8b8857f.internal
      type: InternalDNS
```

このコマンドでも同じことがわかる。EXTERNAL-IP が空白の出力となる。

```
kubectl get nodes --output wide
```
```
NAME                                             STATUS   ROLES    AGE   VERSION            INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME
gke-private-cluster-default-pool-6ff0d6a6-0320   Ready    <none>   12m   v1.21.5-gke.1302   10.33.168.3   <none>        Container-Optimized OS from Google   5.4.144+         containerd://1.4.8
gke-private-cluster-default-pool-6ff0d6a6-4btx   Ready    <none>   12m   v1.21.5-gke.1302   10.33.168.2   <none>        Container-Optimized OS from Google   5.4.144+         containerd://1.4.8
gke-private-cluster-default-pool-6ff0d6a6-qh6p   Ready    <none>   12m   v1.21.5-gke.1302   10.33.168.4   <none>        Container-Optimized OS from Google   5.4.144+         containerd://1.4.8
```

sshは閉じる。

###クリーンアップ
**CloudShell**でkubeクラスタを削除する
このコマンドは２,3分時間がかかります。

```
gcloud container clusters delete private-cluster --zone us-central1-a
```
```
The following clusters will be deleted.
 - [private-cluster] in [us-central1-a]

Do you want to continue (Y/n)?  Y

Deleting cluster private-cluster...done.     
Deleted [https://container.googleapis.com/v1/projects/qwiklabs-gcp-00-1d25c8b8857f/zones/us-central1-a/clusters/private-cluster].
```

ここまでで、スコアは７０です。
次のステップは「（省略可）」と書いてありますが、どうやら必須のようなので続けていきます。

###カスタム サブネットワークを使用する限定公開クラスタの作成（省略可）
今までの手順では、サブネットを自動で作っていたが、カスタムでサブネットを作る。

サブネットワークとセカンダリ範囲を指定している
`--secondary-range my-svc-range=10.0.32.0/20,my-pod-range=10.4.0.0/14`

```
gcloud compute networks subnets create my-subnet \
    --network default \
    --range 10.0.4.0/22 \
    --enable-private-ip-google-access \
    --region us-central1 \
    --secondary-range my-svc-range=10.0.32.0/20,my-pod-range=10.4.0.0/14
```
```
NAME: my-subnet
REGION: us-central1
NETWORK: default
RANGE: 10.0.4.0/22
STACK_TYPE: IPV4_ONLY
IPV6_ACCESS_TYPE:
IPV6_CIDR_RANGE:
EXTERNAL_IPV6_CIDR_RANGE:
```

サブネットワークを使用する限定公開クラスタを作成
このコマンドの実行は２、３分時間がかかります。

```
gcloud beta container clusters create private-cluster2 \
    --private-cluster \
    --enable-ip-alias \
    --master-ipv4-cidr 172.16.0.32/28 \
    --subnetwork my-subnet \
    --services-secondary-range-name my-svc-range \
    --cluster-secondary-range-name my-pod-range
```
```
Creating cluster private-cluster2 in us-central1-a...done.     
Created [https://container.googleapis.com/v1beta1/projects/qwiklabs-gcp-00-d84bc8e5738d/zones/us-central1-a/clusters/private-cluster2].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-a/private-cluster2?project=qwiklabs-gcp-00-d84bc8e5738d
kubeconfig entry generated for private-cluster2.
NAME: private-cluster2
LOCATION: us-central1-a
MASTER_VERSION: 1.21.5-gke.1302
MASTER_IP: 35.232.204.35
MACHINE_TYPE: e2-medium
NODE_VERSION: 1.21.5-gke.1302
NUM_NODES: 3
STATUS: RUNNING
```

外部アドレス範囲を承認します。[MY_EXTERNAL_RANGE] は、前の手順の出力で取得した`source-instance`外部アドレスの CIDR 範囲に置き換え。

```
gcloud container clusters update private-cluster2 \
    --enable-master-authorized-networks \
    --master-authorized-networks [MY_EXTERNAL_RANGE]
```

この時点で、マスターにアクセスできる IP アドレスは、次の範囲のアドレスだけです。

* 作成したサブネットワークのプライマリの範囲で、ノードに使用される。この例のノードの範囲は 10.0.4.0/22 

* 作成したサブネットワークのセカンダリ範囲で、ポッドに使用される。この例のポッドの範囲は 10.4.0.0/14 

先の手順で作成した`source-instance`にSSH接続して、`private-cluster2`への接続を構成する。

```
gcloud container clusters get-credentials private-cluster2 --zone us-central1-a
```

作成したクラスタに外部IPがないことを確認する。

```
kubectl get nodes --output yaml | grep -A4 addresses
```
```
    addresses:
    - address: 10.0.4.2
      type: InternalIP
    - address: gke-private-cluster2-default-pool-0d7029bb-2cmf.us-central1-a.c.qwiklabs-gcp-00-d84bc8e5738d.internal
      type: InternalDNS
--
    addresses:
    - address: 10.0.4.3
      type: InternalIP
    - address: gke-private-cluster2-default-pool-0d7029bb-stf6.us-central1-a.c.qwiklabs-gcp-00-d84bc8e5738d.internal
      type: InternalDNS
--
    addresses:
    - address: 10.0.4.4
      type: InternalIP
    - address: gke-private-cluster2-default-pool-0d7029bb-x2dn.us-central1-a.c.qwiklabs-gcp-00-d84bc8e5738d.internal
      type: InternalDNS
student-03-d807d7e4227a@source-instance:~$
```

##お疲れさまでした
これでラボの手順は終了。
右上のスコア表示が「100/100」になっていることを確認して、「ラボを終了」を押します。

##　スキルバッジ獲得！！
クエストのページに戻ると、紙吹雪が舞いました。
![スクリーンショット 2021-12-22 14.32.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365170/cd9665b5-6cd1-f1a4-f1e5-811f7e16c6c2.png)

## バッジプロフィールを公開する
1. SkillBoostの画面上部の[プロフィール」に遷移
1. [バッジプロフィールを公開する]を押す