arrow_back

利用命名空间管理 GKE 多租户集群

登录 加入
访问 700 多个实验和课程

利用命名空间管理 GKE 多租户集群

实验 1 小时 15 分钟 universal_currency_alt 5 个积分 show_chart 中级
info 此实验可能会提供 AI 工具来支持您学习。
访问 700 多个实验和课程

GSP766

Google Cloud 自学实验的徽标

概览

在为任何围绕 Google Kubernetes Engine (GKE) 集群构建的 Google Cloud 基础设施规划成本优化方案时,关键在于确保已计费资源得到高效利用。一个常见误区是将用户或团队与集群按 1:1 的比例绑定,最终导致集群数量泛滥。

多租户集群支持多个用户或团队共享一个集群来运行工作负载,同时能保障租户间的隔离性与资源公平分配。这一目标可通过创建命名空间来实现。命名空间允许多个虚拟集群在同一个物理集群中共存。

在本实验中,您将学习如何使用多个命名空间来设置多租户集群,从而优化资源利用率,并最终实现成本优化。

目标

在本实验中,您将学习如何完成以下操作:

  • 在一个 GKE 集群内创建多个命名空间。
  • 为命名空间访问配置基于角色的访问控制。
  • 配置 Kubernetes 资源配额,以实现跨多个命名空间的公平资源共享。
  • 查看和配置监控信息中心,以查看各命名空间的资源使用情况。
  • 在 Looker Studio 中生成 GKE 计量报告,获取各命名空间资源利用率的精细化指标。

设置和要求

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。

如何开始实验并登录 Google Cloud 控制台

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项:

    • “打开 Google Cloud 控制台”按钮
    • 剩余时间
    • 进行该实验时必须使用的临时凭据
    • 帮助您逐步完成本实验所需的其他信息(如果需要)
  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示“登录”页面。

    提示:将这些标签页安排在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在“实验详细信息”窗格中找到“用户名”。

  4. 点击下一步

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在“实验详细信息”窗格中找到“密码”。

  6. 点击下一步

    重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 继续在后续页面中点击以完成相应操作:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。 “导航菜单”图标和“搜索”字段

实验启动流程

点击开始实验按钮后,您会看到一条蓝色的正在配置实验资源消息,消息中还说明了预计剩余时间。此时系统正在创建并配置实验所需的环境,您将在这个环境中测试多租户集群的管理操作。大约 5 分钟后,系统会完成以下准备工作:创建一个集群、复制 BigQuery 数据集、生成代表不同团队的服务账号。

准备完成后,系统将不再显示这条消息。

请等待启动流程完全结束且消息消失后,再继续进行本实验。

激活 Cloud Shell

Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

  1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell “激活 Cloud Shell”图标

  2. 在弹出的窗口中执行以下操作:

    • 继续完成 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 自动补全功能。

  1. (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
  1. 点击授权

输出:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (可选)您可以通过此命令列出项目 ID:
gcloud config list project

输出:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 gcloud CLI 概览指南

任务 1. 下载所需文件

  1. 在本实验中,有些步骤会使用 yaml 文件配置 Kubernetes 集群。在 Cloud Shell 中,从 Cloud Storage 存储桶下载这些文件:
gsutil -m cp -r gs://spls/gsp766/gke-qwiklab ~
  1. 将当前工作目录切换到 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 个系统命名空间。

  1. 您可以使用如下命令获取当前集群命名空间的完整列表:
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 系统创建的组件

并非所有内容都归属于命名空间。例如,节点、永久性卷和命名空间本身均不归属于命名空间。

  1. 如需查看命名空间级资源的完整列表,请运行以下命令:
kubectl api-resources --namespaced=true

在创建时,命名空间级资源必须与一个命名空间关联。为此,需要在 yaml 的元数据字段中包含 --namespace 标志,或者指明命名空间。

  1. 另一种指定命名空间的方法是使用任意 kubectl get 子命令来显示命名空间的资源。例如:
kubectl get services --namespace=kube-system

这会输出 kube-system 命名空间内的所有服务。

创建新的命名空间

注意:在创建额外的命名空间时,请勿为其名称添加“kube”前缀,因为此前缀是为系统命名空间保留的。
  1. 创建两个命名空间,分别供 team-ateam-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 等资源的名称仅需在相应命名空间内保持唯一。

  1. 举例来说,您可以运行以下命令,在 team-a 命名空间内部署一个 Pod,并在 team-b 命名空间内部署一个同名的 Pod:
kubectl run app-server --image=quay.io/centos/centos:9 --namespace=team-a -- sleep infinity && \ kubectl run app-server --image=quay.io/centos/centos:9 --namespace=team-b -- sleep infinity
  1. 运行 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

点击检查我的进度,验证已完成上述任务。 创建命名空间

  1. 运行 kubectl describe 命令,同时使用 --namespace 标记指定命名空间,以查看新建的每个 Pod 的更多详细信息:
kubectl describe pod app-server --namespace=team-a
  1. 如果只需使用一个命名空间内的资源,您可以在 kubectl 上下文中一次性完成设置,而不必为每条命令设置 --namespace 标志:
kubectl config set-context --current --namespace=team-a
  1. 设置完毕后,后续的所有命令都会对指定命名空间运行,不必再指定 --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 实现有效限制,而 IAM 角色 Kubernetes Engine Cluster Viewer 仅为用户提供访问集群及命名空间级资源所需的最低权限。

您的实验项目有一个服务账号,代表将使用 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 等)的访问权限均由角色集群角色决定。其中,只有角色可以限定在某个命名空间范围内。角色用于明确可操作的资源类型及允许的对应操作,而角色绑定则用于明确将这些访问权限分配给哪些用户账号或群组。

若要在当前命名空间内创建角色,请指定资源类型以及允许执行的操作类型(通过动词定义)。

  1. 使用 kubectl create 可以创建单规则角色:
kubectl create role pod-reader \ --resource=pods --verb=watch --verb=get --verb=list

使用 yaml 文件可以创建多规则角色。您先前在本实验中下载的文件中提供了一个示例文件。

  1. 检查 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"]
  1. 应用以上角色:
kubectl create -f developer-role.yaml
  1. 在 team-a-developers 服务账号与 developer-role 之间创建角色绑定:
kubectl create rolebinding team-a-developers \ --role=developer --user=team-a-dev@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

测试角色绑定

  1. 下载用于模拟服务账号的服务账号密钥:
gcloud iam service-accounts keys create /tmp/key.json --iam-account team-a-dev@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

点击检查我的进度,验证已完成上述任务。 命名空间内的访问权限控制

  1. 在 Cloud Shell 中,点击 + 在您的终端内打开一个新标签页。

  2. 在新标签页中运行以下命令,激活服务账号。这样,您便能以该账号的身份运行命令:

gcloud auth activate-service-account --key-file=/tmp/key.json
  1. 以该服务账号的身份获取您的集群的凭证:
export ZONE={{{project_0.default_zone|placeholder}}} gcloud container clusters get-credentials multi-tenant-cluster --zone ${ZONE} --project ${GOOGLE_CLOUD_PROJECT}
  1. 现在您会看到,以 team-a-dev 身份操作时,您能够列出 team-a 命名空间内的 Pod:
kubectl get pods --namespace=team-a

输出如下:

NAME READY STATUS RESTARTS AGE app-server 1/1 Running 0 6d
  1. 但列出 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).
  1. 返回到您的第一个 Cloud Shell 标签页,或者打开新标签页。

  2. 刷新集群凭证,并将上下文重置为 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 和内存)总量。

  1. 例如,以下代码会将 team-a 命名空间内允许创建的 Pod 数量限制设置为 2,将允许创建的负载均衡器 (loadbalancers) 数量限制设置为 1:
kubectl create quota test-quota \ --hard=count/pods=2,count/services.loadbalancers=1 --namespace=team-a
  1. 在 team-a 命名空间内创建第二个 Pod:
kubectl run app-server-2 --image=quay.io/centos/centos:9 --namespace=team-a -- sleep infinity
  1. 现在尝试创建第三个 Pod:
kubectl run app-server-3 --image=quay.io/centos/centos:9 --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
  1. 您可以使用 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

在这里,您可以查看受资源配额限制的资源列表,以及已配置的硬性限制和目前已使用的数量。

  1. 运行以下命令更新 test-quota,以设置 6 个 Pod 的限制:
export KUBE_EDITOR="nano" kubectl edit quota test-quota --namespace=team-a

您可以修改 kubectl 将用于更新配额的 yaml 文件。硬性配额是 spec 下的 count/pods 值。

  1. 将 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"
  1. 按 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"
  1. 应用文件配置:
注意:确保您仍在 gke-qwiklab 目录中。 kubectl create -f cpu-mem-quota.yaml

应用此配额之后,所有 Pod 的 CPU 和内存请求总量上限分别为 2 个 CPU 和 8GiB,其限制分别是 4 个 CPU 和 12GiB。

注意:如果某命名空间中存在 CPU 或内存的资源配额,则此后在该命名空间内创建的每个容器都必须在创建时定义自身的 CPU 和内存限制,或通过该命名空间内 LimitRange 所分配的默认值获取 CPU 和内存限制。
  1. 为了演示 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"
  1. 应用文件配置:
kubectl create -f cpu-mem-demo-pod.yaml --namespace=team-a
  1. 在此 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 信息中心

  1. 在 Cloud 控制台中,依次点击导航菜单 (“导航菜单”图标) > 查看所有产品。在可观测性部分下,点击 Monitoring

系统会为您的项目构建工作区,请耐心等待片刻。

  1. 看到“概览”页面时,从左侧菜单中选择信息中心

“概览”页面,其中的“信息中心”选项处于突出显示状态。

  1. 信息中心概览页面中选择 GKE

GKE 信息中心会显示一组表,提供了按多项资源汇总的 CPU、内存和磁盘利用率的详细信息。

例如,“命名空间”表将显示您的集群的各命名空间的利用率:

“命名空间”表内列出了多个名称,包括“提醒”和“错误日志”。

您还可以查看“工作负载”表,了解您的集群上运行的工作负载的利用率数据。

  1. 点击查看全部

  2. 添加过滤条件框中,选择命名空间 > team-a

  3. 然后点击应用

此操作将过滤工作负载,仅显示那些在 team-a 命名空间中运行的工作负载:

Metrics Explorer

  1. 从左侧窗格中选择 Metrics Explorer

  2. 在“选择一个指标”字段中,点击指标下拉菜单。

  3. 在“按资源或指标名称进行过滤”框中输入 Kubernetes 容器

  4. 依次点击 Kubernetes 容器 > 容器

  5. 选择 CPU 使用时间

  6. 点击应用

注意:在“指标”字段中输入 cp,下拉菜单中应该即会出现“CPU 使用时间”选项。
  1. 若要排除 kube-system 命名空间,请点击“过滤条件”部分中的添加过滤条件

  2. 选择 namespace_name 作为标签。

  3. 选择 !=(不等于)作为比较条件,选择 kube-system 作为值。

  4. 接下来,在汇总下拉菜单中,选择总和,在“方式”下拉菜单中选择 namespace_name,并点击确定

    随即会出现一张图表,按命名空间显示容器 CPU 使用时间:

Metrics Explorer 中显示的图表,图表中的使用时间按命名空间名称和费率显示。

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 中设置一些环境变量。

  1. 设置所提供结算表的路径、所提供的用量计量数据集,并设置新费用明细表的名称:
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
  1. 接下来,指定在本实验开始时下载的用量计量查询模板的路径、将生成的用量计量查询对应的输出文件,以及数据的开始日期(数据中的最早日期是 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
  1. 现在,使用这些环境变量和查询模板生成用量计量查询:
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"
  1. 运行以下命令,使用您在上一步中生成的查询来设置费用明细表:
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)"
  1. 数据传输功能应该会提供一个授权链接。点击此链接,使用您的学生账号登录,按照说明操作并将 version_info 粘贴回 Cloud Shell。

完成上述操作后,系统应该会返回一条消息,指明已经成功创建传输配置。

在 Looker Studio 中创建数据源

  1. 打开 Looker Studio 的“数据源”页面

  2. 点击左上角的创建 > 数据源,以添加新数据源。

您首先会看到要开始使用,请先完成账号设置窗口。

  1. 选择国家/地区,输入公司名称,选中表示确认的框,然后点击继续

  2. 对于每个邮件接收设置,请选择,因为这是一个临时实验/账号。

  3. 点击继续

您将看到 Looker Studio 支持的 Google 连接器列表。

  1. 从列表中选择 BigQuery。

显示 BigQuery Google 连接器及“更多”图标的图片。

  1. 点击授权按钮,允许 Looker Studio 访问您的 BigQuery 项目。

  2. 在页面左上角,将数据源的名称从未命名数据源更改为 GKE 用量

  3. 从第一列中选择自定义查询

  4. 从“项目”列中选择您的项目 ID

  5. 在“自定义查询”框中输入以下查询(将 [PROJECT-ID] 替换为您的 Qwiklabs 项目 ID):

SELECT * FROM `[PROJECT-ID].cluster_dataset.usage_metering_cost_breakdown`
  1. 点击连接

点击检查我的进度,验证已完成上述任务。 监控 GKE 和 GKE 用量计量

  1. 随后在右上角处点击。

我们已经添加了数据源,接下来该使用它来创建报告了。

  1. 在您的数据源页面的顶端,点击创建报告

GKE 计量的数据源页面,“创建报告”按钮处于突出显示状态。

注意:如果您此时收到错误消息,原因可能是您的数据传输作业尚未完成。请稍等片刻,然后重试。

从数据源创建新报告时,系统会提示您为报告添加数据。

  1. 点击添加到报告

创建 Looker Studio 报告

在这份报告中,您可以基于 BigQuery 表直观呈现数据源的用量指标。

您将从一个简单的表入手:

一个两列的表,列标题 cluster_location 和 Record Count 下有两行数据。

您需要配置此表,以按命名空间显示费用明细。选中此表之后,右侧面板中会显示相关数据。

  1. 在该面板中更改以下内容:
  • 日期范围维度usage_start_time
  • 维度namespace
  • 指标cost

其他所有字段都保留默认值。

若要将表限制为仅包含命名空间级资源,您可以应用过滤条件。

  1. 在数据面板中,点击“过滤条件”部分下的添加过滤条件。创建一个过滤条件,排除未分配给命名空间的资源:

过滤选项设置为“排除”,并且选择了“命名空间”。

  1. 点击保存

  2. 再次点击添加过滤条件,然后点击创建过滤条件,以创建第二个过滤条件,将数据限制为请求:

过滤选项设置为“包含”,并且选择了“类型”。

  1. 点击保存应用过滤条件。最终的表应如下所示:

一个两列的表,列标题 namespace 和 cost 下有四行数据。

接下来,您将为报告添加一个饼图,按命名空间显示费用明细。

  1. 右键点击您创建的表,并选择复制

  2. 将复制的表对象拖到报告中的任意位置。

  3. 随后点击配置面板的标题:

配置面板的“图表”部分,“表”类别处于突出显示状态。

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

多个图块,显示各种图表类型,饼图处于突出显示状态。

生成的饼图应如下所示:

表中的四行数据以饼图形式显示。

接下来,您要添加一个圆环图,按资源类型显示费用明细。

  1. 在顶部的工具栏中点击添加图表,并选择 23497d0573f8232a.png(圆环图)以创建圆环图。

  2. 将该图表拖到报告中的任意位置,并为其进行如下配置:

  • 日期范围维度usage_start_time
  • 维度resource_name
  • 指标cost
  1. 点击添加过滤条件,选择您为先前的图表应用的两个过滤条件。生成的圆环图应如下所示:

圆环图,显示在应用过滤条件后留下的两行数据。

  1. 若要添加按命名空间划分的明细,请在顶部的工具栏中点击添加控件,再选择下拉列表

  2. 将其拖到您的圆环图旁边,并为其进行如下配置:

  • 日期范围维度usage_start_time
  • 控制字段namespace
  • 指标
  1. 点击添加过滤条件

  2. 从列表中选择未分配(命名空间过滤条件)

  3. 若要将该控件配置为仅对圆环图生效,请使用选择器光标在控件对象和圆环图周围绘制一个矩形,从而同时选中这两个对象。

  4. 点击右键并选择群组,将其绑定到一个群组中:

框住对象的矩形,右键菜单内的“群组”选项处于突出显示状态

  1. 若要预览报告,请点击顶部工具栏中的查看

在查看模式下,您可以将圆环图的视图调整为特定命名空间:

一个包含三列的表以及两个饼图,各包含不同的数据。

  1. 从页面顶端的共享菜单中,点击下载报告,以 PDF 文件格式下载完整报告。

恭喜!

利用命名空间,您能够将集群配置为多租户模式,这不仅最大限度降低了资源利用率不足和集群过度扩张的风险,还避免了产生额外成本。此外,利用监控和 GKE 计量功能,您还可以直观呈现各命名空间的资源使用情况,从而在资源配额和集群配置方面做出更明智的决策。

后续步骤/了解详情

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

本手册的最后更新时间:2025 年 8 月 25 日

本实验的最后测试时间:2025 年 8 月 25 日

版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

请使用无痕模式或无痕式浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。