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


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

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

概览和目标

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

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

  • 创建使用 Autopilot 的 GKE 集群。

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

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

费用

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

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

准备工作

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

配置 shell 和工具

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

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

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

Cloud Shell

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

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

本地 shell

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

设置项目

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

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

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

    前往 Google Kubernetes Engine 页面

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

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

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

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

授予 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: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/

创建集群

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

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

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

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

    请替换以下内容:

    • 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 只是一个示例应用,用于展示 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 私钥创建令牌并进行签名,其他服务使用相应的公钥来验证用户。

    创建一个强度为 4,096 位的 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 以获取敏感数据,而无需在应用中对其进行硬编码。

    使用您在上一步创建的密钥文件为 Cymbal Bank 创建一个 Kubernetes Secret,以便在身份验证请求中使用:

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

    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.5
                - 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.5@sha256:d72050f70d12383e4434ad04d189b681dc625f696087ddf0b5df641645c9dafa
              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 集群并部署了 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. 如需查看从集群中流式传输的日志,请选择日志标签页。您可以按日志的严重级别进行过滤,也可以创建自己的过滤条件来查看特定的命名空间、服务或 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”页面

  2. 如需查找 Cymbal Bank Ingress,请点击 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 中的工作负载