学习路线:可伸缩应用 - 创建集群


本系列教程适用于想要部署、运行和管理在 Google Kubernetes Engine (GKE) Enterprise 版本上运行的现代应用环境的 IT 管理员和运维人员。在学习本系列教程的过程中,您将学习如何使用 Cymbal Bank 示例微服务应用配置监控和提醒、扩缩工作负载以及模拟故障。

  1. 创建集群并部署示例应用(本教程)
  2. 使用 Google Cloud Managed Service for Prometheus 进行监控
  3. 扩缩工作负载
  4. 模拟故障

概览和目标

Cymbal Bank 使用 Python 和 Java 运行各种服务,并且包含一个 PostgreSQL 后端。您无需具备这些语言或数据库平台方面的经验便可完成本系列教程,因为 Cymbal Bank 只是一个示例应用,用于展示 GKE Enterprise 如何为您的业务需求提供支持。

在本教程中,您将学习如何创建单个 GKE 集群,并将名为 Cymbal Bank 的基于微服务的示例应用部署到 GKE 集群。您将学习如何完成以下任务:

  • 创建使用 Autopilot 的 GKE 集群。

  • 部署一个名为 Cymbal Bank 的基于微服务的示例应用。

  • 使用 Google Cloud 控制台探索 Cymbal Bank 示例应用使用的 GKE 资源。

费用

您将为本系列教程启用 GKE Enterprise 并部署 Cymbal Bank 示例应用,这意味着您需要按照我们价格页面中列出的价格,按集群为 GKE Enterprise on Google Cloud 付费,直到您停用 GKE Enterprise 或删除项目。

您还需要负责运行 Cymbal Bank 示例应用时产生的其他 Google Cloud 费用,例如 Compute Engine 虚拟机和负载均衡器的费用。

准备工作

本系列的第一个教程主要使用供所有 GKE 用户使用的核心功能,但在学习这些教程的过程中,您将使用只能通过 Enterprise 层级提供的更多其他功能。

在本系列的第一个教程中,请在开始之前完成以下所有“准备工作”设置步骤。您只需完成以下“准备工作”步骤一次。

配置 shell 和工具

在本系列教程中,您将使用以下工具部署和管理环境:

  • gcloud CLI:创建和管理 GKE 集群和舰队以及其他 Google Cloud 服务。
  • kubectl:管理 Kubernetes(即 GKE Enterprise 使用的集群编排系统)。

如需运行此页面中的命令,请在以下开发环境之一中设置 Google Cloud CLI 和 kubectl

Cloud Shell

如需使用已设置 gcloud CLI 和 kubectl 的在线终端,请激活 Cloud Shell:

Cloud Shell 会话会在页面底部启动,并显示命令行提示符。该会话可能需要几秒钟来完成初始化。

本地 shell

如需使用本地开发环境,请按照以下步骤操作:

设置项目

请按照以下步骤设置 Google Cloud 项目,包括启用结算功能和 GKE 服务。您将在此项目中启用 GKE Enterprise。

您可能需要组织中的 Google Cloud 管理员授予您创建或使用项目以及启用 API 的权限。

  1. 在 Google Cloud 控制台中,转到 Google Kubernetes Engine 页面:

    转到 Google Kubernetes Engine 页面

  2. 创建或选择项目。 这是您在其中启用 GKE Enterprise 的项目。

  3. 如果出现提示,请启用 GKE Enterprise API。

  4. 稍作等待,让 API 和相关服务完成启用过程。 此过程可能耗时几分钟。

  5. Make sure that billing is enabled for your Google Cloud project.

启用 GKE 后,启用 Google Kubernetes Engine (GKE) 企业版:

  1. 在 Google Cloud 控制台中,转到 GKE Enterprise 页面:

    前往 GKE Enterprise 页面

  2. 选择了解 Google Kubernetes Engine (GKE) 企业版

  3. 如果符合条件,您可以勾选开始 90 天的免费试用选项。

  4. 选择启用 GKE Enterprise,然后选择确认

授予 IAM 角色

如果您是项目所有者(例如,如果您自己创建了项目),那么您已拥有完成这些教程所需的所有权限。如果您不是所有者,请确保您的 Google Cloud 账号对这组教程的所选项目具有所需的 IAM 角色。同样,您可能需要组织中的 Google Cloud 管理员来帮助授予所需角色。

在以下命令中,将 PROJECT_ID 替换为您在上一部分创建或选择的项目的自动生成 ID。项目 ID 通常与项目名称不同。例如,您的项目可能是 scalable-apps,但项目 ID 可能是 scalable-apps-567123

Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/resourcemanager.projectIamAdmin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser, roles/iam.securityAdmin, roles/serviceusage.serviceUsageAdmin, roles/container.admin, roles/logging.logWriter, roles/gkehub.admin, roles/viewer, roles/monitoring.viewer

$ gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
  • Replace PROJECT_ID with your project ID.
  • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

  • Replace ROLE with each individual role.

克隆示例应用

克隆包含 Cymbal Bank 的所有示例清单的 Git 代码库:

  git clone https://github.com/GoogleCloudPlatform/bank-of-anthos
  cd bank-of-anthos/

创建集群

完成前面部分中的所有前提步骤后,您现在可以开始创建 Google Kubernetes Engine 集群并部署示例应用。

GKE 是一种托管式 Kubernetes 服务,可用于部署和操作容器化应用。GKE 环境由节点组成,节点是 Compute Engine 虚拟机 (VM),它们组合在一起构成集群

GKE 集群也可以分组到舰队中,舰队是可以共同管理的集群的逻辑组。许多 GKE Enterprise 功能(包括本教程系列稍后要使用的功能)都基于舰队以及舰队采用的相同性和信任原则。

  • 创建您在本系列教程的其余部分中使用的 GKE 集群:

    gcloud container clusters create-auto scalable-apps \
      --project=PROJECT_ID \
      --region=REGION \
      --enable-fleet
    

    请替换以下内容:

    • PROJECT_ID 替换为您在上一部分中创建的项目的自动生成 ID。项目 ID 通常与项目名称不同。例如,您的项目可能是 scalable-apps,但项目 ID 可能是 scalable-apps-567123
    • REGION 替换为要在其中创建集群的区域,例如 us-central1

    创建集群并验证一切是否正常运行需要几分钟时间。

在这组教程中,您将在创建集群时使用 Autopilot 模式集群和一些默认 IP 地址范围。您自己应用的生产部署需要更加谨慎的 IP 地址规划。在 Autopilot 模式下,Google 会管理您的集群配置,包括自动扩缩、安全性和其他预配置的设置。Autopilot 模式中的集群经过优化,可运行大多数生产工作负载并根据 Kubernetes 清单预配计算资源。

部署 Cymbal Bank

您将应用(也称为工作负载)打包到容器中。您可以将多个容器作为 Pod 部署到节点。

在本系列教程中,您需要将名为 Cymbal Bank 的基于微服务的示例应用部署到一个或多个 GKE 集群。Cymbal Bank 使用 Python 和 Java 运行各种服务,并且包含一个 PostgreSQL 后端。您无需具备这些语言或数据库平台方面的经验便可完成本系列教程。Cymbal Bank 只是一个示例应用,用于展示 Google Kubernetes Engine (GKE) 企业版如何支持您的业务需求。

在本系列教程中使用 Cymbal Bank 时,将以下服务部署到 GKE 集群中:

服务 语言 说明
frontend Python 公开 HTTP 服务器以为网站提供服务。包含登录页面、注册页面和首页。
ledger-writer Java 接受并验证传入的交易,然后再将其写入账目。
balance-reader Java 提供从 ledger-db 读取的用户余额的高效可读缓存。
transaction-history Java 提供从 ledger-db 读取的历史交易的高效可读缓存。
ledger-db PostgreSQL 所有交易的总账。用于为演示用户预填充交易的选项。
user-service Python 管理用户账号和身份验证。为用于其他服务进行身份验证的 JWT 签名。
contacts Python 存储与用户关联的其他账号列表。用于“发送付款”和“存款”表单中的下拉菜单。
accounts-db PostgreSQL 用户账号和关联数据的数据库。用于预填充演示用户的选项。
loadgenerator Python / Locust 持续将模拟用户的请求发送到前端。定期创建新账号并模拟账号之间的交易。

如需将 Cymbal Bank 部署到 GKE 集群中,请完成以下步骤:

  1. Cymbal Bank 使用 JSON Web 令牌 (JWT) 来处理用户身份验证。JWT 使用非对称密钥对来签署和验证令牌。在 Cymbal Bank 中,userservice 会在用户登录时使用 RSA 私钥创建令牌并进行签名,其他服务会使用对应的公钥验证用户。

    创建一个强度为 4096 位的 RS256 JWT:

    openssl genrsa -out jwtRS256.key 4096
    openssl rsa -in jwtRS256.key -outform PEM -pubout -out jwtRS256.key.pub
    

    如果需要,请下载并安装适用于您的平台的 OpenSSL 工具

  2. Kubernetes Secret 可以存储密钥或密码等敏感数据。然后,在集群中运行的工作负载可以访问 Secret 以获取敏感数据,而不是在应用中对其进行硬编码。

    根据您在上一步中创建的密钥文件创建 Kubernetes Secret,以供 Cymbal Bank 用于身份验证请求:

    kubectl create secret generic jwt-key --from-file=./jwtRS256.key --from-file=./jwtRS256.key.pub
    
  3. 将 Cymbal Bank 部署到您的集群。以下命令会部署 kubernetes-manifests 目录中的所有清单文件。每个清单文件都会部署并配置一项 Service:

    kubectl apply -f kubernetes-manifests/accounts-db.yaml
    kubectl apply -f kubernetes-manifests/balance-reader.yaml
    kubectl apply -f kubernetes-manifests/config.yaml
    kubectl apply -f kubernetes-manifests/contacts.yaml
    kubectl apply -f extras/postgres-hpa/kubernetes-manifests/frontend.yaml
    kubectl apply -f kubernetes-manifests/ledger-db.yaml
    kubectl apply -f kubernetes-manifests/ledger-writer.yaml
    kubectl apply -f extras/postgres-hpa/loadgenerator.yaml
    kubectl apply -f kubernetes-manifests/transaction-history.yaml
    kubectl apply -f kubernetes-manifests/userservice.yaml
    

    当清单应用于您的集群时,您可能会在 kubectl 输出中看到有关 Autopilot 限制的消息。Autopilot 使用您在工作负载配置中指定的资源请求来配置运行工作负载的节点。Autopilot 会根据工作负载使用的计算类或硬件配置强制执行最小和最大资源请求。如果您没有为某些容器指定请求,则 Autopilot 会分配默认值以使这些容器正常运行。

    查看 frontend Service 的以下示例清单:

    # Copyright 2024 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        application: bank-of-anthos
        environment: development
        team: frontend
        tier: web
      name: frontend
    spec:
      ports:
        - name: http
          port: 80
          targetPort: 8080
      selector:
        app: frontend
        application: bank-of-anthos
        environment: development
        team: frontend
        tier: web
      type: LoadBalancer
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        application: bank-of-anthos
        environment: development
        team: frontend
        tier: web
      name: frontend
    spec:
      selector:
        matchLabels:
          app: frontend
          application: bank-of-anthos
          environment: development
          team: frontend
          tier: web
      template:
        metadata:
          annotations:
            proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'
          labels:
            app: frontend
            application: bank-of-anthos
            environment: development
            team: frontend
            tier: web
        spec:
          containers:
            - env:
                - name: VERSION
                  value: v0.6.4
                - name: PORT
                  value: "8080"
                - name: ENABLE_TRACING
                  value: "true"
                - name: SCHEME
                  value: http
                - name: LOG_LEVEL
                  value: info
                - name: DEFAULT_USERNAME
                  valueFrom:
                    configMapKeyRef:
                      key: DEMO_LOGIN_USERNAME
                      name: demo-data-config
                - name: DEFAULT_PASSWORD
                  valueFrom:
                    configMapKeyRef:
                      key: DEMO_LOGIN_PASSWORD
                      name: demo-data-config
                - name: REGISTERED_OAUTH_CLIENT_ID
                  valueFrom:
                    configMapKeyRef:
                      key: DEMO_OAUTH_CLIENT_ID
                      name: oauth-config
                      optional: true
                - name: ALLOWED_OAUTH_REDIRECT_URI
                  valueFrom:
                    configMapKeyRef:
                      key: DEMO_OAUTH_REDIRECT_URI
                      name: oauth-config
                      optional: true
              envFrom:
                - configMapRef:
                    name: environment-config
                - configMapRef:
                    name: service-api-config
              image: us-central1-docker.pkg.dev/bank-of-anthos-ci/bank-of-anthos/frontend:v0.6.4@sha256:f25db63509515fb6caf98c8c76e906f3c2868e345767d12565ab3750e52963f0
              livenessProbe:
                httpGet:
                  path: /ready
                  port: 8080
                initialDelaySeconds: 60
                periodSeconds: 15
                timeoutSeconds: 30
              name: front
              readinessProbe:
                httpGet:
                  path: /ready
                  port: 8080
                initialDelaySeconds: 10
                periodSeconds: 5
                timeoutSeconds: 10
              resources:
                limits:
                  cpu: 250m
                  memory: 128Mi
                requests:
                  cpu: 100m
                  memory: 64Mi
              securityContext:
                allowPrivilegeEscalation: false
                capabilities:
                  drop:
                    - all
                privileged: false
                readOnlyRootFilesystem: true
              volumeMounts:
                - mountPath: /tmp
                  name: tmp
                - mountPath: /tmp/.ssh
                  name: publickey
                  readOnly: true
          securityContext:
            fsGroup: 1000
            runAsGroup: 1000
            runAsNonRoot: true
            runAsUser: 1000
          serviceAccountName: bank-of-anthos
          terminationGracePeriodSeconds: 5
          volumes:
            - emptyDir: {}
              name: tmp
            - name: publickey
              secret:
                items:
                  - key: jwtRS256.key.pub
                    path: publickey
                secretName: jwt-key

    此清单用于 CPU 和 64Mifrontend 服务请求 100m,并设置每个 Pod 的 CPU 和 128Mi250m 限制。

    在 Autopilot 集群中部署工作负载时,GKE 会根据所选计算类或硬件配置(例如 GPU)允许的最小值和最大值来验证工作负载配置。如果请求小于最小值,则 Autopilot 会自动修改工作负载配置,以使请求在允许的范围内。这些消息表示正在自动分配适当的限制。

  4. 等待 Pod 准备就绪。使用 kubectl 检查 Pod 的状态:

    kubectl get pods
    

    STATUS 列从 Pending 更改为 ContainerCreating。需要几分钟才能使所有 Pod 都处于 Running 状态,如以下示例输出中所示:

    NAME                                  READY   STATUS    RESTARTS   AGE
    accounts-db-6f589464bc-6r7b7          1/1     Running   0          99s
    balancereader-797bf6d7c5-8xvp6        1/1     Running   0          99s
    contacts-769c4fb556-25pg2             1/1     Running   0          98s
    frontend-7c96b54f6b-zkdbz             1/1     Running   0          98s
    ledger-db-5b78474d4f-p6xcb            1/1     Running   0          98s
    ledgerwriter-84bf44b95d-65mqf         1/1     Running   0          97s
    loadgenerator-559667b6ff-4zsvb        1/1     Running   0          97s
    transactionhistory-5569754896-z94cn   1/1     Running   0          97s
    userservice-78dc876bff-pdhtl          1/1     Running   0          96s
    

    当所有 Pod 都处于 Running 状态时,继续执行下一步。同样,需要几分钟才能使所有 Pod 都处于 Running 状态。在 Cymbal Bank 准备好正确处理流量之前,某些 Pod 报告 READY 状态为 0/1 是正常情况。

  5. frontend 服务会公开一个 HTTP 服务器,用于为 Cymbal Bank 网站提供服务,包括登录页面、注册页面和首页。Ingress 对象定义了使用 Google Cloud HTTP(S) 负载均衡器将 HTTP(S) 流量路由到集群中运行的应用的规则。

    获取 frontend Ingress 的外部 IP 地址:

    kubectl get ingress frontend | awk '{print $4}'
    
  6. 在网络浏览器窗口中,打开 kubectl get ingress 命令输出中显示的 IP 地址,以访问您的 Cymbal Bank 实例。

    系统会自动填充默认凭据,因此您可以登录该应用并浏览一些示例交易和余额。您只需确认 Cymbal Bank 成功运行,无需执行任何其他操作。所有服务可能需要一两分钟才能正确通信并允许您登录。

探索您的部署

创建 GKE 集群并部署工作负载后,您可能需要更改设置或查看应用的性能。在本部分中,您将学习如何使用 Google Cloud 控制台查看集群中的资源和 Cymbal Bank 示例应用。

如创建集群时所述,GKE Enterprise 功能围绕“舰队”概念构建:舰队是可以共同管理的 Kubernetes 集群的逻辑分组。例如,您可能拥有多个由不同团队使用的集群,可在不同区域保存应用副本以缩短延迟时间并提高可靠性,或者细分具有不同安全性要求的工作负载。舰队有助于整理这些相关集群的群组。

Google Cloud 控制台中的 GKE Enterprise 概览提供了整个舰队的概览视图。创建 GKE 集群时,系统会使用 --enable-fleet 参数自动将其注册到舰队。

如需查看 GKE Enterprise 和舰队信息,请转到 Google Cloud 控制台中的概览页面:

转到 GKE Enterprise 概览

概览页面会显示以下信息:

  • 舰队中有多少集群,以及运行状况是否良好。
  • 舰队的资源利用率,包括按舰队和集群汇总的 CPU、内存和磁盘用量。
  • 为舰队识别的任何安全问题、舰队范围内的 Policy Controller 覆盖范围,以及 Config Sync 软件包的同步状态。在本系列的后续教程中,您需要将 Policy Controller 和 Config Sync 添加到集群。

GKE 集群页面会显示项目中的所有集群。注册到舰队的集群会在舰队列中列出其舰队。

在以下部分中,您将深入了解 Cymbal Bank 的 GKE 资源。

集群

在本教程中,您创建了一个 GKE 集群并部署了 Cymbal Bank 工作负载。

  1. 在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,转到集群页面。

    转到“集群”页面

  2. 点击新部署的 scalable-apps 集群。在打开的集群详情页面中,您可以查看基本集群详细信息以及集群的网络和安全配置。您还可以在功能部分中查看此集群中启用了哪些 GKE 功能。

可观测性

您可以查看集群的健康状况和性能的基本指标。在本系列的下一个教程中,您将启用 Google Cloud Managed Service for Prometheus,以实现更精细的监控和可观测性。

  1. 从 Google Cloud 控制台的 Google Kubernetes Engine 集群页面中选择您的集群,然后转到可观测性标签页。

  2. 检查一些指标图形,例如 CPU内存的指标图形。通过此视图,您可以监控集群工作负载不同部分的性能,而无需部署其他监控功能。

  3. 如需查看从集群流式传输的日志,请选择日志标签页。您可以按日志严重级别进行过滤,或创建自己的过滤条件以查看特定命名空间、Service 或 Pod。与 Pod 警告和事件一样,来自集群的这种整理日志视图可帮助您使用 Google Cloud 控制台快速调试问题。

    如果某些服务还无法通信,则在首次部署 Cymbal Bank 时看到日志条目属于正常现象。

  4. 选择应用错误标签页。工作负载运行时,您可以在 Google Cloud 控制台中查看整理的警告和事件。此方法有助于调试问题,而无需单独连接到集群、节点或 Pod。

    同样,如果某些服务还无法通信,则在首次部署 Cymbal Bank 时看到记录的事件属于正常现象。

工作负载

Google Cloud 控制台的 GKE 页面有一个工作负载部分,其中显示了在所有 GKE 集群上运行的工作负载的汇总视图。

  1. 在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,转到工作负载页面。

    转到“工作负载”页面

    概览标签页显示 GKE 集群中的工作负载和命名空间的列表。您可以按命名空间过滤以查看每个命名空间中运行的工作负载。

服务和入站流量

Service 和 Ingress 视图显示项目的 Service 和 Ingress 资源。Service 通过端点将一组 Pod 公开为网络服务,而 Ingress 管理对集群中服务的外部访问权限。

  1. 在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,转到网关、Service 和 Ingress 页面。

    转到“网关、Service 和 Ingress”页面

  2. 如需查找 Cymbal Bank 入站流量,请点击“Ingress”标签页,然后查找名为 frontend 的 Ingress。Ingress 管理应用的入站流量。您可以查看有关负载均衡器、端口和外部端点的信息。

  3. 点击 frontend Ingress 的 IP 地址,例如 198.51.100.143:80。此地址指向 Cymbal Bank 网页界面。

清理

Cymbal Bank 的这组教程需要逐个完成。在完成本系列教程的过程中,您将学习新技能并使用其他 Google Cloud 产品和服务。

如果您想在继续学习下一个教程之前休息一下,并避免系统因本教程中使用的资源向您的 Google Cloud 账号收取费用,请删除您创建的项目。

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

后续步骤

在下一教程中了解如何使用 Google Cloud Managed Service for Prometheus 和 Cloud Monitoring 监控 GKE Enterprise 中的工作负载