GSP766

概览
对于任何围绕 Google Kubernetes Engine (GKE) 集群构建的 Google Cloud 基础架构,在考虑费用优化解决方案时,都有必要确保有效利用计费的资源。一种常见的失策之举是按照一对一的比例将用户或团队分配到集群,这会造成集群数量激增。
多租户集群允许多个用户或团队共享一个集群来处理其工作负载,同时保持隔离和公平的资源共享。这是通过创建命名空间来实现的。命名空间允许多个虚拟集群在同一个物理集群中共存。
在本实验中,您将学习如何使用多个命名空间来设置多租户集群,从而优化资源利用率,并切实优化费用。
目标
在本实验中,您将学习如何完成以下操作:
- 在一个 GKE 集群内创建多个命名空间。
- 为命名空间访问配置基于角色的访问控制。
- 配置 Kubernetes 资源配额,以实现跨多个命名空间的公平资源共享。
- 查看和配置监控信息中心,以按照命名空间查看资源使用情况。
- 在 Looker Studio 中生成一份 GKE 计量报告,提供有关各命名空间资源利用率的精细指标。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。
如何开始实验并登录 Google Cloud 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:
- “打开 Google Cloud 控制台”按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示“登录”页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在“实验详细信息”窗格中找到“用户名”。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在“实验详细信息”窗格中找到“密码”。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
开始
按下开始实验按钮后,您会看到一条蓝色的正在配置实验资源
消息,消息中还说明了预计剩余时间。此时系统在为您创建和配置环境,后续您将使用这个环境来测试多租户集群的管理。在大约 5 分钟内,系统将完成集群的创建、BigQuery 数据集的复制,以及代表团队的多个服务账号的生成。
这些任务完成之后,系统将不会再显示这条消息。
请等待此初始流程完成并且消息消失之后,再继续进行本实验。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
-
点击 Google Cloud 控制台顶部的激活 Cloud Shell
。
-
在弹出的窗口中执行以下操作:
- 继续完成 Cloud Shell 信息窗口中的设置。
- 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。
如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 ID:
gcloud config list project
输出:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需查看在 Google Cloud 中使用 gcloud
的完整文档,请参阅 gcloud CLI 概览指南。
任务 1. 下载所需文件
- 在本实验中,有些步骤会使用
yaml
文件配置 Kubernetes 集群。在 Cloud Shell 中,从 Cloud Storage 存储桶下载这些文件:
gsutil -m cp -r gs://spls/gsp766/gke-qwiklab ~
- 将当前工作目录更改为
gke-qwiklab
:
cd ~/gke-qwiklab
任务 2. 查看并创建命名空间
- 运行以下命令,以设置默认计算可用区,并对所提供的
multi-tenant-cluster
集群进行身份验证:
export ZONE={{{project_0.default_zone|placeholder}}}
gcloud config set compute/zone ${ZONE} && gcloud container clusters get-credentials multi-tenant-cluster
默认命名空间
默认情况下,Kubernetes 集群有 4 个系统命名空间。
- 您可以使用如下命令获取当前集群命名空间的完整列表:
kubectl get namespace
输出应类似于以下内容:
NAME STATUS AGE
default Active 5m
kube-node-lease Active 5m
kube-public Active 5m
kube-system Active 5m
-
default - 在未指定其他命名空间的情况下使用的默认命名空间
-
kube-node-lease - 管理与集群各个节点的检测信号关联的租用对象
-
kube-public - 用于可能需要供整个集群内的所有用户查看或读取的资源
-
kube-system - 用于由 Kubernetes 系统创建的组件
并非所有内容都归属于命名空间。例如,节点、永久性卷和命名空间本身都并非归属于命名空间。
- 如需查看命名空间型资源的完整列表,请运行以下命令:
kubectl api-resources --namespaced=true
在创建时,命名空间型资源必须与一个命名空间关联。为此,需要在 yaml
的元数据资源中包含 --namespace
标志,或者指明命名空间。
- 另一种指定命名空间的方法是使用任意
kubectl get
子命令来显示命名空间的资源。例如:
kubectl get services --namespace=kube-system
这会输出 kube-system
命名空间内的所有服务。
创建新的命名空间
注意:在创建额外的命名空间时,请勿为其名称添加“kube”前缀,因为此前缀是为系统命名空间保留的。
- 创建两个命名空间,分别供
team-a
和 team-b
使用:
kubectl create namespace team-a && \
kubectl create namespace team-b
现在,kubectl get namespace
的输出应该包含您的两个新命名空间:
namespace/team-a created
namespace/team-b created
通过指定 --namespace
标记,您就可以在所提供的命名空间内创建集群资源。Deployment 或 Pod 等资源的名称仅需在相应命名空间内保持无重复即可。
- 举例来说,运行以下命令在 team-a 命名空间内部署一个 Pod,并在 team-b 命名空间内部署一个相同名称的 Pod:
kubectl run app-server --image=centos --namespace=team-a -- sleep infinity && \
kubectl run app-server --image=centos --namespace=team-b -- sleep infinity
- 运行
kubectl get pods -A
命令,查看两个名称同为 app-server
的 Pod,每个 Pod 对应一个团队命名空间:
kubectl get pods -A
输出如下:
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system event-exporter-gke-8489df9489-k2blq 2/2 Running 0 3m41s
kube-system fluentd-gke-fmt4v 2/2 Running 0 113s
kube-system fluentd-gke-n9dvn 2/2 Running 0 79s
kube-system fluentd-gke-scaler-cd4d654d7-xj78p 1/1 Running 0 3m37s
kube-system gke-metrics-agent-4jvn8 1/1 Running 0 3m33s
kube-system gke-metrics-agent-b4vvw 1/1 Running 0 3m27s
kube-system kube-dns-7c976ddbdb-gtrct 4/4 Running 0 3m41s
kube-system kube-dns-7c976ddbdb-k9bgk 4/4 Running 0 3m
kube-system kube-dns-autoscaler-645f7d66cf-jwqh5 1/1 Running 0 3m36s
kube-system kube-proxy-gke-new-cluster-default-pool-eb9986d5-tpql 1/1 Running 0 3m26s
kube-system kube-proxy-gke-new-cluster-default-pool-eb9986d5-znm6 1/1 Running 0 3m33s
kube-system l7-default-backend-678889f899-xvt5t 1/1 Running 0 3m41s
kube-system metrics-server-v0.3.6-64655c969-jtl57 2/2 Running 0 3m
kube-system prometheus-to-sd-d6dpf 1/1 Running 0 3m27s
kube-system prometheus-to-sd-rfdlv 1/1 Running 0 3m33s
kube-system stackdriver-metadata-agent-cluster-level-79f9ddf6d6-7ck2w 2/2 Running 0 2m56s
team-a app-server 1/1 Running 0 33s
team-b app-server 1/1 Running 0 33s
点击检查我的进度,验证已完成上述任务。
创建命名空间
- 使用
kubectl describe
命令并通过 --namespace 标记指定命名空间,查看新创建的每个 Pod 的更多详细信息:
kubectl describe pod app-server --namespace=team-a
- 如果只使用一个命名空间内的资源,您可以在
kubectl
上下文中进行一次设置,而不必为每条命令设置 --namespace
标志。
kubectl config set-context --current --namespace=team-a
- 设置完毕后,后续的所有命令都会对指定命名空间运行,不必再指定
--namespace
标志:
kubectl describe pod app-server
在下一部分中,您将为命名空间配置基于角色的访问控制,从而帮助组织集群。
任务 3. 命名空间内的访问权限控制
若要配置集群内的命名空间型资源访问权限,可授予 IAM 角色和 Kubernetes 内置基于角色的访问控制 (RBAC) 的组合。IAM 角色可为账号提供对项目的初始访问权限,RBAC 权限则会授予对集群的命名空间型资源(Pod、Deployment、Service 等)的精细访问权限。
IAM 角色
注意:如需在一个项目内授予 IAM 角色,您需要分配 Project IAM Admin 角色。我们已在您的 Qwiklabs 临时账号中设置好了此项。
在管理 Kubernetes 的访问权限控制时,Identity and Access Management (IAM) 用于管理更高的组织和项目级的访问权限和其他权限。
在 IAM 中可以向用户和服务账号分配一些角色,用于治理其 GKE 访问权限级别。RBAC 的精细权限基于 IAM 已提供的访问权限构建,不能限制 IAM 授予的访问权限。因此,对于多租户命名空间型集群,应为所分配的 IAM 角色授予最低限度的访问权限。
下表列示了您可以分配的常用 GKE IAM 角色:
角色 |
说明 |
Kubernetes Engine Admin |
提供对集群及其 Kubernetes API 对象的完整管理访问权限。具有此角色的用户可以在任意集群和后续命名空间内创建、修改和删除任何资源。 |
Kubernetes Engine Developer |
提供对集群内 Kubernetes API 对象的访问权限。具有此角色的用户可以在任意集群和后续命名空间内创建、修改和删除资源。 |
Kubernetes Engine Cluster Admin |
提供集群管理访问权限。具有此角色的用户不具备在任意集群或后续命名空间内直接创建或修改资源的访问权限,但可以创建、修改和删除任意集群。 |
Kubernetes Engine Viewer |
提供对 GKE 资源的只读访问权限。具有此角色的用户具有对命名空间及其资源的只读访问权限。 |
Kubernetes Engine Cluster Viewer |
拥有获取和列出 GKE 集群的访问权限。若要访问一个集群的命名空间内的资源,用户至少需要具备此角色。 |
大多数此类角色授予的访问权限过于宽松,无法通过 RBAC 加以限制,但 Kubernetes Engine Cluster Viewer 这个 IAM 角色授予用户的权限可以恰好满足用户访问集群和命名空间型资源的需要。
您的实验项目有一个服务账号,代表将使用 team-a
命名空间的开发者。
- 请运行以下命令,授予该账号 Kubernetes Engine Cluster Viewer 角色:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
--member=serviceAccount:team-a-dev@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com \
--role=roles/container.clusterViewer
Kubernetes RBAC
在一个集群内,对任何资源类型(Pod、Service、Deployment 等)的访问权限均由角色或集群角色决定。只有角色的适用范围可以限定为一个命名空间。角色将指明资源,以及允许对各资源执行的操作,角色绑定则指明要将访问权限分配给哪些用户账号或群组。
若要在当前命名空间内创建角色,请指定资源类型,以及指明将允许何种类型的操作的动词。
- 使用
kubectl create
可以创建具有单独一条规则的角色:
kubectl create role pod-reader \
--resource=pods --verb=watch --verb=get --verb=list
使用 yaml
文件可以创建具有多条规则的角色。您先前在本实验中下载的文件中提供了一个示例文件。
- 检查
yaml
文件:
cat developer-role.yaml
示例输出:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: team-a
name: developer
rules:
- apiGroups: [""]
resources: ["pods", "services", "serviceaccounts"]
verbs: ["update", "create", "delete", "get", "watch", "list"]
- apiGroups:["apps"]
resources: ["deployments"]
verbs: ["update", "create", "delete", "get", "watch", "list"]
- 应用以上角色:
kubectl create -f developer-role.yaml
- 在 team-a-developers 服务账号与 developer-role 之间创建角色绑定:
kubectl create rolebinding team-a-developers \
--role=developer --user=team-a-dev@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
测试角色绑定
- 下载用于模拟服务账号的服务账号密钥:
gcloud iam service-accounts keys create /tmp/key.json --iam-account team-a-dev@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
点击检查我的进度,验证已完成上述任务。
命名空间内的访问权限控制
-
在 Cloud Shell 内,点击 +
在您的终端内打开一个新标签页。
-
在新标签页中运行以下命令,激活服务账号。这将允许您以该账号的身份运行命令:
gcloud auth activate-service-account --key-file=/tmp/key.json
- 以该服务账号的身份获取您的集群的凭据:
export ZONE={{{project_0.default_zone|placeholder}}}
gcloud container clusters get-credentials multi-tenant-cluster --zone ${ZONE} --project ${GOOGLE_CLOUD_PROJECT}
- 现在,您将看到,作为 team-a-dev,您可以列出 team-a 命名空间内的 Pod:
kubectl get pods --namespace=team-a
输出如下:
NAME READY STATUS RESTARTS AGE
app-server 1/1 Running 0 6d
- 但列出 team-b 命名空间内的 Pod 这一操作会受到限制:
kubectl get pods --namespace=team-b
输出如下:
Error from server (Forbidden): pods is forbidden: User "team-a-dev@a-gke-project.iam.gserviceaccount.com" cannot list resource "pods" in API group "" in the namespace "team-b": requires one of ["container.pods.list"] permission(s).
-
返回到您的第一个 Cloud Shell 标签页,或者打开新标签页。
-
续订集群凭据,并将上下文重置为 team-a 命名空间:
export ZONE={{{project_0.default_zone|placeholder}}}
gcloud container clusters get-credentials multi-tenant-cluster --zone ${ZONE} --project ${GOOGLE_CLOUD_PROJECT}
任务 4. 资源配额
在多租户环境中共享一个集群时,务必确保用户使用的集群资源份额不会超过其公平份额。资源配额对象 (ResourceQuota) 界定了约束条件,限制一个命名空间内的资源使用。资源配额可以指定对象(Pod、Service、StatefulSet)数量、存储资源(永久性卷声明、临时存储、存储类别)总量或计算资源(CPU 和内存)总量的限制。
- 例如,以下代码会将
team-a
命名空间内允许的 Pod 数量限制设置为 2,并将 loadbalancers 数量限制设置为 1:
kubectl create quota test-quota \
--hard=count/pods=2,count/services.loadbalancers=1 --namespace=team-a
- 在 team-a 命名空间内创建第二个 Pod:
kubectl run app-server-2 --image=centos --namespace=team-a -- sleep infinity
- 现在尝试创建第三个 Pod:
kubectl run app-server-3 --image=centos --namespace=team-a -- sleep infinity
您应该会收到如下错误:
Error from server (Forbidden): pods "app-server-3" is forbidden: exceeded quota: test-quota, requested: count/pods=1, used: count/pods=2, limited: count/pods=2
- 您可以使用
kubectl describe
查看有关资源配额的详细信息:
kubectl describe quota test-quota --namespace=team-a
输出如下:
Name: test-quota
Namespace: team-a
Resource Used Hard
-------- ---- ----
count/pods 2 2
count/services.loadbalancers 0 1
在这里,您可以查看受资源配额限制的资源列表,以及已配置的硬性限制和目前已使用的数量。
- 运行以下命令更新
test-quota
,以设置 6 个 Pod 的限制:
export KUBE_EDITOR="nano"
kubectl edit quota test-quota --namespace=team-a
您可以修改 kubectl
将用于更新配额的 yaml
文件。硬性配额是 spec
下的 count/pods
值。
- 将 spec 下的
count/pods
值更新为 6:
apiVersion: v1
kind: ResourceQuota
metadata:
creationTimestamp: "2020-10-21T14:12:07Z"
name: test-quota
namespace: team-a
resourceVersion: "5325601"
selfLink: /api/v1/namespaces/team-a/resourcequotas/test-quota
uid: a4766300-29c4-4433-ba24-ad10ebda3e9c
spec:
hard:
count/pods: "6"
count/services.loadbalancers: "1"
status:
hard:
count/pods: "5"
count/services.loadbalancers: "1"
used:
count/pods: "2"
- 按 Ctrl + X、Y 和 Enter 键保存并退出。
现在,输出中应该会体现更新后的配额:
kubectl describe quota test-quota --namespace=team-a
输出如下:
Name: test-quota
Namespace: team-a
Resource Used Hard
-------- ---- ----
count/pods 2 6
count/services.loadbalancers 0 1
CPU 和内存配额
在为 CPU 和内存设置配额时,您可以为请求总量指定配额(一个容器可以获得的有保证的请求总量),或为限制总量指定配额(一个容器不得超过的限制总量)。
在本实验中,您的集群有 4 个 e2-standard-2 机器,各有 2 个核心和 8GB 内存。本实验提供了一个用于您的集群的示例资源配额 yaml 文件:
cpu-mem-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: cpu-mem-quota
namespace: team-a
spec:
hard:
limits.cpu: "4"
limits.memory: "12Gi"
requests.cpu: "2"
requests.memory: "8Gi"
- 应用文件配置:
注意:确保您仍在 gke-qwiklab 目录中。
kubectl create -f cpu-mem-quota.yaml
应用此配额之后,所有 Pod 的 CPU 和内存请求总量上限分别为 2 个 CPU 和 8GiB,其限制分别是 4 个 CPU 和 12GiB。
注意:一个命名空间内存在 CPU 或内存资源配额时,对于后续在该命名空间内创建的每个容器,在创建时都必须指定其自己的 CPU 和内存限制,或者具有在命名空间内以 LimitRange 的形式分配的默认值。
- 为了演示 CPU 和内存配额,使用
cpu-mem-demo-pod.yaml
创建一个新 Pod:
cpu-mem-demo-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: cpu-mem-demo
namespace: team-a
spec:
containers:
- name: cpu-mem-demo-ctr
image: nginx
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "400m"
memory: "512Mi"
- 应用文件配置:
kubectl create -f cpu-mem-demo-pod.yaml --namespace=team-a
- 在此 Pod 创建完毕后,运行以下命令查看其 CPU 和内存请求量,以及配额中体现的限制:
kubectl describe quota cpu-mem-quota --namespace=team-a
输出如下:
Name: cpu-mem-quota
Namespace: team-a
Resource Used Hard
-------- ---- ----
limits.cpu 400m 4
limits.memory 512Mi 12Gi
requests.cpu 100m 2
requests.memory 128Mi 8Gi
点击检查我的进度,验证已完成上述任务。
资源配额
任务 5. 监控 GKE 和 GKE 用量计量
对于大多数多租户集群,各租户的工作负载和资源需求将会发生变化,可能需要调整资源配额。利用 Monitoring,您可以获得各命名空间当前所用资源的总体视图。
通过 GKE 用量计量,您可以获得更精细的资源用量视图,从而更好地了解与各租户相关的费用。
Monitoring 信息中心
- 在 Cloud 控制台中,依次点击导航菜单 (
) > 查看所有产品。在可观测性部分下,点击 Monitoring。
系统会为您的项目构建工作区,请耐心等待片刻。
- 看到“概览”页面时,从左侧菜单中选择信息中心:

- 从信息中心概览页面中选择 GKE。
GKE 信息中心会显示一组表,提供了按多项资源汇总的 CPU、内存和磁盘利用率的详细信息。
例如,“命名空间”表将显示您的集群的各命名空间的利用率:

您还可以查看“工作负载”表,了解您的集群上运行的工作负载的利用率数据。
-
点击查看全部。
-
在添加过滤条件
框中,选择命名空间 > team-a。
-
然后点击应用。
这将会执行过滤,从而仅包含在 team-a 命名空间内运行的工作负载。
Metrics Explorer
-
从左侧窗格中选择 Metrics Explorer。
-
在“选择一个指标”字段中,点击指标下拉菜单。
-
在“按资源和指标名称进行过滤”框中输入 Kubernetes 容器。
-
点击 Kubernetes 容器 > 容器。
-
选择 CPU 使用时间
。
-
点击应用。
注意:在“指标”字段中输入 cp,您应该会看到下拉菜单中出现“CPU 使用时间”选项。
-
若要排除 kube-system 命名空间,请点击“过滤条件”部分中的添加过滤条件。
-
选择 namespace_name
作为标签。
-
选择 !=(不等于)
作为比较条件,选择 kube-system
作为值。
-
接下来,在汇总下拉菜单中,选择总和,在“方式”下拉菜单中选择 namespace_name,并点击确定。
您会看到一张图表,按命名空间显示容器 CPU 使用时间:

GKE 用量计量
利用 GKE 用量计量,您可以将 GKE 集群资源利用率和使用量导出到 BigQuery 数据集,随后使用 Looker Studio 直观查看该数据集中的数据。这能提供更精细的资源用量视图。利用用量计量功能,您可以就资源配额和高效的资源配置制定更明智的决策。
注意:GKE 指标可能需要几个小时之后才能填充到 BigQuery 中,因此您的实验项目包括带有模拟资源用量和结算数据的 BigQuery 数据集,用于演示目的。
以下两个数据集已添加到您的项目中:
cluster_dataset - 这是在集群上启用 GKE 用量计量之前手动创建的数据集。此数据集包含 GKE 生成的 2 个表(gke_cluster_resource_consumption 和 gke_cluster_resource_usage),并且会持续更新集群用量指标。
billing_dataset - 这是在为结算启用 BigQuery Export 之前手动创建的数据集。此数据集包含 1 个表 (gcp_billing_export_v1_xxxx),每天都会更新项目的每日费用。
- 运行以下命令,在集群上启用 GKE 用量计量,并指定
cluster_dataset
数据集:
export ZONE={{{project_0.default_zone|placeholder}}}
gcloud container clusters \
update multi-tenant-cluster --zone ${ZONE} \
--resource-usage-bigquery-dataset cluster_dataset
创建 GKE 费用明细表
您可通过项目中的结算和资源用量表生成 cost_breakdown 表。您将使用 usage_metering_query_template.sql
文件,在集群数据集内生成此表。此模板可通过了解集群资源用量获得。
首先,在 Cloud Shell 中设置一些环境变量。
- 设置所提供的结算表的路径、所提供的用量计量数据集,并设置新费用明细表的名称:
export GCP_BILLING_EXPORT_TABLE_FULL_PATH=${GOOGLE_CLOUD_PROJECT}.billing_dataset.gcp_billing_export_v1_xxxx
export USAGE_METERING_DATASET_ID=cluster_dataset
export COST_BREAKDOWN_TABLE_ID=usage_metering_cost_breakdown
- 接下来,指定在本实验开头处下载的用量计量查询模板的路径、将生成的用量计量查询对应的输出文件,以及数据的开始日期(数据中的最早日期是 2020 年 10 月 26 日):
export USAGE_METERING_QUERY_TEMPLATE=~/gke-qwiklab/usage_metering_query_template.sql
export USAGE_METERING_QUERY=cost_breakdown_query.sql
export USAGE_METERING_START_DATE=2020-10-26
- 现在,使用这些环境变量和查询模板生成用量计量查询:
sed \
-e "s/\${fullGCPBillingExportTableID}/$GCP_BILLING_EXPORT_TABLE_FULL_PATH/" \
-e "s/\${projectID}/$GOOGLE_CLOUD_PROJECT/" \
-e "s/\${datasetID}/$USAGE_METERING_DATASET_ID/" \
-e "s/\${startDate}/$USAGE_METERING_START_DATE/" \
"$USAGE_METERING_QUERY_TEMPLATE" \
> "$USAGE_METERING_QUERY"
- 运行以下命令,使用您在上一步中呈现的查询来设置费用明细表:
bq query \
--project_id=$GOOGLE_CLOUD_PROJECT \
--use_legacy_sql=false \
--destination_table=$USAGE_METERING_DATASET_ID.$COST_BREAKDOWN_TABLE_ID \
--schedule='every 24 hours' \
--display_name="GKE Usage Metering Cost Breakdown Scheduled Query" \
--replace=true \
"$(cat $USAGE_METERING_QUERY)"
- 数据传输应该会提供授权链接。点击此链接,使用您的学生账号登录,按照说明操作并将
version_info
粘贴回 Cloud Shell。
在此之后,系统应该会返回一条消息,指明已经成功创建传输配置。
在 Looker Studio 中创建数据源
-
打开 Looker Studio 的“数据源”页面。
-
点击左上角的创建 > 数据源,以添加新数据源。
您首先会看到要开始使用,请先完成账号设置窗口。
-
选择国家/地区,输入公司名称,选中表示确认的框,然后点击继续。
-
对于每个电子邮件接收设置,请选择否,因为这是一个临时实验/账号。
-
点击继续。
您将看到 Looker Studio 支持的 Google 连接器列表。
- 从列表中选择 BigQuery。

-
点击授权按钮,允许 Looker Studio 访问您的 BigQuery 项目。
-
在页面左上角,将数据源的名称从未命名数据源
更改为 GKE 用量
。
-
从第一列中选择自定义查询。
-
从“项目”列中选择您的项目 ID。
-
在“自定义查询”框中输入以下查询,将 [PROJECT-ID]
替换为您的 Qwiklabs 项目 ID:
SELECT * FROM `[PROJECT-ID].cluster_dataset.usage_metering_cost_breakdown`
- 点击连接。
点击检查我的进度,验证已完成上述任务。
监控 GKE 和 GKE 用量计量
- 随后在右上角处点击。
我们已经添加了数据源,接下来该使用它来创建报告了。
- 在您的数据源页面的顶端,点击创建报告。

注意:如果您在此处收到错误,原因可能是您的数据传输作业尚未完成。请稍等片刻,然后重试。
从数据源创建新报告时,系统会提示您为报告添加数据。
- 点击添加到报告。
创建 Looker Studio 报告
在这份报告中,您可以基于 BigQuery 表直观呈现数据源的用量指标。
您将从一个简单的表入手:

您将配置此表,以按照命名空间显示费用明细。选中此表之后,您将在右侧面板中看到其相关数据。
- 在该面板中更改以下内容:
-
日期范围维度:
usage_start_time
-
维度:
namespace
-
指标:
cost
其他所有字段都保留默认值。
若要将表限制为命名空间型资源,您可以应用过滤条件。
- 在数据面板中,点击“过滤条件”部分下的添加过滤条件。创建一个过滤条件,排除未分配给一个命名空间的资源:

-
点击保存。
-
再次点击添加过滤条件,并点击创建过滤条件,以创建第二个过滤条件,将数据限制为请求:

- 点击保存应用过滤条件。所得到的表应如下所示:

接下来,您将为报告添加一个饼图,按命名空间显示费用明细。
-
右键点击您创建的表,并选择复制。
-
将复制的表对象拖动到报告中的任意位置。
-
随后点击配置面板的标题:

- 在显示的选项中点击饼图图标:

所得到的饼图应如下所示:

接下来,您要添加一个圆环图,按资源类型显示费用明细。
-
在顶部的工具栏中点击添加图表,并选择
(圆环图)以创建圆环图。
-
将该图表拖动到您报告中的任意位置,并为其进行如下配置:
-
日期范围维度:
usage_start_time
-
维度:
resource_name
-
指标:
cost
- 点击添加过滤条件,选择您为先前的图表应用的两个过滤条件。所得到的圆环图应如下所示:

-
若要添加按命名空间划分的明细,请在顶部的工具栏中点击添加控件,再选择下拉列表。
-
将其拖动到您的圆环图旁边,并为其进行如下配置:
-
日期范围维度:
usage_start_time
-
控制字段:
namespace
-
指标:
无
-
点击添加过滤条件。
-
从列表中选择未分配(命名空间过滤条件)。
-
为了配置控件,从而仅影响圆环图,请使用选择器光标在控件对象和圆环图周围绘制一个矩形,选中这两个对象。
-
右键点击并选择群组,将其绑定到一个群组中:

- 若要预览报告,请点击顶部工具栏中的查看。
在查看模式下,您可以将圆环图的视图调整为特定命名空间:

- 从页面顶端的共享菜单中,点击下载报告,以 PDF 文件格式下载完整报告的副本。
恭喜!
利用命名空间,您得以将集群配置为多租户集群,尽可能降低了资源利用率低下、集群数量激增的风险,并避免了产生额外的费用。此外,利用监控和 GKE 计量功能,您按命名空间直观呈现了资源利用率,从而就资源配额和集群配置制定更明智的决策。
后续步骤/了解详情
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
本手册的最后更新时间:2025 年 7 月 18 日
本实验的最后测试时间:2023 年 7 月 18 日
版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。