學習路徑:可擴充的應用程式 - 建立叢集


IT 管理員和營運人員可以透過這個系列的教學課程,瞭解如何部署、執行及管理 Google Kubernetes Engine (GKE) 中運作的現代化應用程式環境。在本系列教學課程中,您將瞭解如何設定監控和快訊、擴充工作負載,以及模擬失敗,所有操作都使用 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 叢集費用,直到停用 GKE 或刪除專案為止。如需相關費用,請參閱定價頁面。 Google Cloud

您也必須支付執行 Cymbal Bank 範例應用程式時產生的其他 Google Cloud 費用,例如 Compute Engine VM 和負載平衡器的費用。

事前準備

在本系列的第一個教學課程中,請先完成下列所有「開始使用」設定步驟,再開始操作。「事前準備」步驟只需要完成一次。

設定殼層和工具

在本系列教學課程中,您將使用下列工具部署及管理環境:

  • gcloud CLI:建立及管理 GKE 叢集和車隊,以及其他 Google Cloud 服務。
  • kubectl:管理 Kubernetes,這是 GKE 使用的叢集自動化調度管理系統。

如要在本頁面執行指令,請在下列其中一個開發環境中設定 Google Cloud CLI 和 kubectl

Cloud Shell

如要使用已設定 gcloud CLI 和 kubectl 的線上終端機,請啟動 Cloud Shell:

頁面底部會開啟 Cloud 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 Token (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 可儲存金鑰或密碼等機密資料。在叢集中執行的工作負載隨後就能存取密鑰,取得機密資料,而不必在應用程式中硬式編碼。

    從您在上一個步驟中建立的金鑰檔案,為 Cymbal Bank 建立 Kubernetes 密鑰,以用於驗證要求:

    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.7
                - 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.7@sha256:6d92f3ce81a389738baf236477c6795831a0802c7a007697d7121f10eab9a2cc
              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

    這個資訊清單會為每個 Pod 的 CPU frontend服務要求100m64Mi 設定 CPU 250m128Mi 的限制。

    在 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 頁面中,前往「Clusters」(叢集) 頁面。

    前往「Clusters」(叢集) 頁面

  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 頁面設有「Workloads」(工作負載) 專區,可顯示所有 GKE 叢集上執行的工作負載匯總檢視畫面。

  1. 在 Google Cloud 控制台的「Google Kubernetes Engine」頁面中,前往「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載) 頁面

    「總覽」分頁會顯示 GKE 叢集的工作負載和命名空間清單。您可以依命名空間篩選,查看每個命名空間中執行的工作負載。

Service 與 Ingress

「Services & Ingress」(Service 與 Ingress) 檢視畫面會顯示專案的 Service 和 Ingress 資源。Service 會將一組 Pod 公開為具有端點的網路服務,而 Ingress 則會管理叢集中服務的外部存取權。

  1. 在 Google Cloud 控制台的「Google Kubernetes Engine」頁面中,前往「閘道、Service 與 Ingress」頁面。

    前往「Gateways, Services & Ingress」(閘道、Service 與 Ingress) 頁面

  2. 如要找出 Cymbal Bank Ingress,請按一下「Ingress」分頁標籤,然後找出名為 frontend 的 Ingress。Ingress 會管理應用程式的連入流量。您可以查看負載平衡器、連接埠和外部端點的相關資訊。

  3. 點選 frontend Ingress 的「IP address」(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 中的工作負載