1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GCP スキルバッジをもらおう!Advent Calendar 2021

Day 25

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

Posted at

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

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

クエスト「Security & Identity Fundamentals」の最後のラボです。
SkillBoostの始め方は記事「GCP スキルバッジをもらおう 1Google Cloud Skill Boostをはじめよう」をどうぞ。

この記事は「GCP スキルバッジをもらおう! 〜Security & Identity Fundamentals Advent Calendar 2021」の一部として公開しています。
25日にスキルバッジが獲得できるペースで公開していきます。

##ラボの情報
ラボの名前:限定公開 Kubernetes クラスタのセットアップ
所要時間:1時間30分 レベル:Advanced 必要なクレジット:7
概要:
外部に公開しないKubeクラスタを作成する。
結果をComputeEngineから確認する。

##学習に役立つリンク
参考URL:
Google Kubernetes Engine (GKE)
Kubernetes Engine 限定公開クラスタをベータ リリース
限定公開クラスタの作成
関連SDK:
gcloud container clusters
gcloud beta container

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

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

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

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クラスタを削除する
このコマンドは2,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].

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

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

サブネットワークとセカンダリ範囲を指定している
--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:

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

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

バッジプロフィールを公開する

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?