概要
このラボでは、GKE クラスタ内に Namespace を作成し、ロールベース アクセス制御を使用して、管理者以外のユーザーが特定の Namespace 内の Pod を操作できるようにします。
目標
このラボでは、次のタスクの実行方法について学びます。
- ユーザー用の Namespace を作成してクラスタ リソースへのアクセスを制御する
- ロールと RoleBinding を作成して Namespace 内でのアクセスを制御する
注: このラボ用に、[接続の詳細] ダイアログで使用できる 2 つのユーザー名が用意されています。 このラボでは、これらのアカウントを Username 1 および Username 2 とします。
タスク 1. クラスタ リソースへのユーザー アクセスを可能にするための Namespace を作成する
1 人目のユーザーとして Google Cloud コンソールにログインする
- Qwiklabs であらかじめ用意されている Username 1 を使用して、シークレット ウィンドウで通常どおりに Google Cloud Console にログインします。どちらのユーザー名でも同じパスワードを使用します。
- Google Cloud コンソールのタイトルバーで、[Cloud Shell をアクティブにする] アイコン(
)をクリックします。
- 画面の指示に従って [続行] をクリックします。
Cloud Shell が起動するのを待たずに、ただちに次のタスクに進むことができます。
注: この時点では、Username 2 はプロジェクトにアクセスできますが、閲覧者 ロールだけを持っているので、プロジェクト内のすべてのリソースは表示されても読み取り専用です。
2 人目のユーザーとして Google Cloud コンソールにログインする
- シークレット ウィンドウで別のタブを開きます。
-
console.cloud.google.com に移動します。
- 画面右上にあるユーザー アイコンをクリックし、[アカウントを追加] をクリックします。
- 提供されている Username 2 を使用して Google Cloud コンソールにログインします。先ほど説明したように、両方の Username が同じパスワードを使用します。
- Google Cloud コンソールのタイトルバーで、「Cloud Shell をアクティブにする」アイコン(
)をクリックします。
- 画面の指示に従って [続行] をクリックします。
Cloud Shell が起動するのを待たずに、ただちに次のタスクに進むことができます。
ラボの GKE クラスタに接続する
- Google Cloud コンソールの Username 1 のタブに戻ります。
注: Google Cloud コンソールの Username 1 タブで作業していることを確認してください。
- Cloud Shell で次のコマンドを入力して、ゾーンとクラスタ名の環境変数を設定します。
export my_zone={{{ project_0.default_zone | ZONE }}}
export my_cluster=standard-cluster-1
- kubectl コマンドライン ツールのタブ補完を構成します。
source <(kubectl completion bash)
- kubectl がクラスタにアクセスできるよう構成します。
gcloud container clusters get-credentials $my_cluster --zone $my_zone
- Cloud Shell で次のコマンドを入力して、ラボの Cloud Shell にラボのリポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
- 作業ディレクトリへのショートカットとしてソフトリンクを作成します。
ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s
- このラボのサンプル ファイルが入っているディレクトリに移動します。
cd ~/ak8s/RBAC/
名前空間を作成する
用意されている my-namespace.yaml
というマニフェスト ファイルによって、production
という新しい Namespace が作成されます。
apiVersion: v1
kind: Namespace
metadata:
name: production
- 次のコマンドを使用して、クラスタ内の現在の Namespace を一覧表示します。
kubectl get namespaces
出力:
NAME STATUS AGE
default Active 17m
kube-node-lease Active 17m
kube-public Active 17m
kube-system Active 17m
- Cloud Shell で次のコマンドを実行して、新しい Namespace を作成します。
kubectl create -f ./my-namespace.yaml
- 次のコマンドを実行して、作成した Namespace があるかどうかを確認します。
kubectl get namespaces
出力:
NAME STATUS AGE
default Active 6m
kube-node-lease Active 6m
kube-public Active 6m
kube-system Active 6m
production Active 4s
リストの一番下に新しい Namespace が表示されます。
- 次のコマンドを実行して、この Namespace の詳細を確認できます。
kubectl describe namespaces production
出力:
Name: production
Labels:
Annotations:
Status: Active
Resource Quotas
Name: gke-resource-quotas
Resource Used Hard
-------- --- ---
count/ingresses.extensions 0 100
count/jobs.batch 0 5k
pods 0 1500
services 0 500
No LimitRange resource.
Namespace 内にリソースを作成する
Pod の Namespace を指定しない場合、「default」という Namespace が使用されます。このタスクでは、新しい Pod を作成する際に、先ほど作成した Namespace の場所を指定します。用意されている my-pod.yaml
というシンプルなマニフェスト ファイルによって、nginx コンテナを含む Pod が作成されます。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- Cloud Shell で次のコマンドを実行して、
production
という Namespace 内にリソースを作成します。
kubectl apply -f ./my-pod.yaml --namespace=production
または、yaml ファイルで Namespace を指定することもできます。その場合、metadata: セクションに namespace: production
を指定する必要があります。
例:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
namespace: production
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- 次のコマンドを使用して Pod を表示してみます。
kubectl get pods
出力:
No resources found in default namespace.
新しい Namespace ではなくデフォルトの Namespace を kubectl で確認したため、Pod が表示されません。
- 新しい Namespace を指定してもう一度コマンドを実行します。
kubectl get pods --namespace=production
出力:
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 20s
今度は、新しく作成された Pod が表示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Namespace と Pod を作成する
タスク 2. ロールと RoleBinding について
このタスクでは、カスタムロールのサンプルを作成した後、production Namespace で Username 2 に編集者のロールを付与する RoleBinding を作成します。
ロールは、用意されている pod-reader-role.yaml
ファイルで定義されます。このマニフェストでは、production
Namespace 内の Pod オブジェクトに create、get、list、watch 権限を付与する pod-reader
というロールを定義します。なお、このロールでは Pod を削除することはできません。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "get", "list", "watch"]
カスタムロールを作成する
ロールを作成するには、そのロールに含まれる権限が、お使いのアカウントに付与されている必要があります。クラスタ管理者の場合は、次の RoleBinding を作成して自分のユーザー アカウントに cluster-admin のロールを付与することで、簡単にこれを実現できます。
-
Username 1 アカウントに cluster-admin 権限を付与するには、次のコマンドを実行します。
[USERNAME_1_EMAIL]
は Username 1 アカウントのメールアドレスに置き換えます。
kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user [USERNAME_1_EMAIL]
出力例:
kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user gcpstaging28307_student@qwiklabs.net
- Cloud Shell で次のコマンドを実行して、ロールを作成します。
kubectl apply -f pod-reader-role.yaml
- 次のコマンドを実行してロールを一覧表示し、作成されていることを確認します。
kubectl get roles --namespace production
出力:
NAME AGE
pod-reader 3m
RoleBinding を作成する
ロールは権限を割り当てるために使用されますが、ロール自体は何も行いません。RoleBinding でユーザーとオブジェクトにロールをバインドする必要があります。
username2-editor-binding.yaml
マニフェスト ファイルによって username2-editor
という RoleBinding が作成され、先ほど作成した pod-reader
のロールがラボの 2 番目のユーザーにバインドされます。このロールでは Pod を作成および表示できますが、削除することはできません。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: username2-editor
namespace: production
subjects:
- kind: User
name: [USERNAME_2_EMAIL]
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
このファイルにはプレースホルダ [USERNAME_2_EMAIL]
が含まれています。これを Username 2 のメールアドレスに置き換えてから適用する必要があります。
- Cloud Shell で、Username 2 のメールアドレス全体を格納する環境変数を作成します。
export USER2=[USERNAME_2_EMAIL]
出力例:
export USER2=gcpstaginguser68_student@qwiklabs.net
- Cloud Shell で
sed
を使用して、ファイル内のプレースホルダを環境変数の値に置き換えます。
sed -i "s/\[USERNAME_2_EMAIL\]/${USER2}/" username2-editor-binding.yaml
- Cloud Shell で次のコマンドを実行して、適切に変更されたことを確認します。
cat username2-editor-binding.yaml
subjects セクションが次のように表示されるようになります。
出力例:
subjects:
- kind: User
name: gcpstaginguser68_student@qwiklabs.net
apiGroup: rbac.authorization.k8s.io
後でこの RoleBinding を適用します。
アクセスをテストする
次に、Username 2 が production Namespace で Pod を作成できるかどうかをテストします。テストとして、Username 2 で production-pod.yaml
マニフェスト ファイルを使って Pod を作成してみます。このマニフェストによって、nginx コンテナを 1 つ含むシンプルな Pod がデプロイされます。
apiVersion: v1
kind: Pod
metadata:
name: production-pod
labels:
name: production-pod
namespace: production
spec:
containers:
- name: production-pod
image: nginx
ports:
- containerPort: 8080
これは別個のユーザー アカウントであるため、ラボのリポジトリから取得したサンプル ファイルやクラスタにアクセスできるように、Cloud Shell 環境をもう一度準備する必要があります。
- Google Cloud コンソールの Username 2 のタブに戻ります。
注: Google Cloud コンソールの Username 2 タブで作業していることを確認してください。
-
Username 2 の Cloud Shell で次のコマンドを入力して、ゾーンとクラスタ名の環境変数を設定します。
export my_zone={{{ project_0.default_zone | ZONE }}}
export my_cluster=standard-cluster-1
- kubectl コマンドライン ツールのタブ補完を構成します。
source <(kubectl completion bash)
- kubectl がクラスタにアクセスできるよう構成します。
gcloud container clusters get-credentials $my_cluster --zone $my_zone
- Cloud Shell で次のコマンドを入力して、ラボの Cloud Shell にラボのリポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
- 作業ディレクトリへのショートカットとしてソフトリンクを作成します。
ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s
- このラボのサンプル ファイルが入っているディレクトリに移動します。
cd ~/ak8s/RBAC/
- 次のコマンドを使用して、Username 2 で production という Namespace が表示されるかどうかを確認します。
kubectl get namespaces
出力:
NAME STATUS AGE
default Active 29m
kube-node-lease Active 29m
kube-public Active 29m
kube-system Active 29m
production Active 23m
リストの一番下に production という Namespace が表示されていれば、次に進むことができます。
- Cloud Shell で次のコマンドを実行して、production という Namespace 内にリソースを作成します。
kubectl apply -f ./production-pod.yaml
この処理は失敗します。これは、Pod を作成するための適切な権限が Username 2 にないことを示しています。Username 2 には他のロールがまだバインドされていないため、この時点で付与されているのはラボ開始時からあった閲覧権限のみです。これを変更します。
- Google Cloud コンソールの Username 1 のタブに戻ります。
注: Google Cloud コンソールの Username 1 タブで作業していることを確認してください。
-
Username 1 の Cloud Shell で次のコマンドを実行して、Username 2 に
pod-reader
ロールを付与する RoleBinding を作成します。このロールには、production
Namespace で Pod を作成する権限が含まれます。
kubectl apply -f username2-editor-binding.yaml
-
Username 1 の Cloud Shell で次のコマンドを実行して、新しい RoleBinding を探します。
kubectl get rolebinding
出力:
No resources found in default namespace.
kubectl がデフォルトの Namespace を参照しているため、RoleBinding は表示されません。
-
Username 1 の Cloud Shell で、production という Namespace を指定して次のコマンドを実行します。
kubectl get rolebinding --namespace production
出力:
NAME AGE
username2-editor 23s
- Google Cloud コンソールの Username 2 のタブに戻ります。
注: Google Cloud コンソールの Username 2 タブで作業していることを確認してください。
-
Username 2 の Cloud Shell で次のコマンドを実行して、production という Namespace でリソースを作成します。
kubectl apply -f ./production-pod.yaml
Username 2 には production Namespace で Pod を作成する権限があるので、今回は成功します。
- 次のコマンドを使用して、production Namespace で Pod が適切にデプロイされたことを確認します。
kubectl get pods --namespace production
出力:
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 16m
production-pod 1/1 Running 0 20s
新しく作成された Pod が表示されます。
- pod-reader ロールによって付与された特定の RBAC 権限のみが Username 2 に対して有効になっていることを確認します。そうするには、次のように production-pod を削除してみます。
kubectl delete pod production-pod --namespace production
Username 2 には Pod の削除権限がないので、この処理は失敗します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
ロールと RoleBinding
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。