実際にラボを実施した際の記録を載せていきます。
学習の助けになったリンクや、後に見るための学習メモ、ちょっと迷った手順を書いていきます。
あと、コマンドも忘れたくないのでログしていきます。
- 学習の助けになったリンクは、「学習に役立つリンク」にまとめて書いてあります。
- 学習メモはアイコンをつけてます。
- 迷った手順は箇条書きでつらつら書いてます。
実際の手順については、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」になっていることを確認して、「ラボを終了」を押します。
## スキルバッジ獲得!!
クエストのページに戻ると、紙吹雪が舞いました。
バッジプロフィールを公開する
- SkillBoostの画面上部の[プロフィール」に遷移
- [バッジプロフィールを公開する]を押す