Kubernetes 上的可調整 Web 應用程式

本指導教學可能會產生成本。 使用「成本估算器」根據您的預計用量生成成本估算。

本教學教導您如何在本機容器中執行 Web 應用程式,然後將其部署到使用 Kubernetes Service 建立的 Kubernetes 叢集。 作為選用步驟,您可以建置容器映像檔,並將映像檔推送至專用登錄。 此外,您將學習如何綁定自訂子網域、監控環境的健康狀況,以及擴充應用程式。

容器是包裝應用程式及其所有相依關係的標準方式,而此方式可讓您在環境之間無縫移動應用程式。 容器與虛擬機器不同,容器不會搭載作業系統。 只有應用程式碼、運行環境、系統工具、程式庫及設定才會包裝在容器中。 容器比虛擬機器更輕量、可攜性更高且更有效率。

目標

  • 將 Web 應用程式部署到 Kubernetes 叢集。
  • 連結自訂子網域。
  • 監視叢集的日誌和性能。
  • 調整 Kubernetes Pod。

架構
架構圖

  1. 開發人員下載或複製範例 Web 應用程式。
  2. 選擇性地建置應用程式以產生容器映像檔。
  3. 選擇性地將映像檔推送至 IBM Cloud Container Registry中的名稱空間。
  4. 應用程式部署到 Kubernetes 叢集。
  5. 使用者存取應用程式。

開始之前

本指導教學需要:

  • IBM Cloud CLI,
    • IBM Cloud Kubernetes Service 外掛程式 (kubernetes-service),
  • kubectl 以與 Kubernetes 叢集互動,
  • Helm 3 以部署圖表。

您將在 指導教學入門 手冊中找到針對您的作業環境下載及安裝這些工具的指示。

若要避免安裝這些工具,您可以從 IBM Cloud 主控台使用 Cloud Shell

此外:

  • 您將需要 Secrets Manager 實例。 透過 Secrets Manager,您可以建立、租賃及集中管理 IBM Cloud 服務或自訂應用程式中使用的機密。 密鑰儲存在專用 Secrets Manager 實例中,您可以使用內建特性來監視到期、排程或手動輪替密鑰。 在本指導教學中,您將使用 Kubernetes 操作器從 Secrets Manager 擷取 TLS 憑證,並注入至 Kubernetes 密鑰。 如果您已有現有實例,則可以遵循 建立 Secrets Manager 服務實例 中概述的步驟,來使用現有實例或建立新的實例。
  • 選擇性地 設定登錄名稱空間。 只有在您將建置自己的自訂容器映像檔時才需要。
  • 瞭解 Kubernetes的基本觀念。

啟用與 Secrets Manager 的服務對服務通訊

整合 Secrets Manager 與 IBM Cloud Kubernetes Service 叢集需要服務對服務通訊授權。 按照以下步驟設定授權。 如需相關資訊,請參閱 Secrets Manager的整合

  1. 在 IBM Cloud 主控台中,按一下管理 > 存取 (IAM)
  2. 按一下 授權
  3. 按一下建立
  4. 來源服務 清單中,選取 Kubernetes Service
  5. 選取選項以設定 所有資源的存取權範圍。
  6. 目標服務 清單中,選取 Secrets Manager
  7. 選取選項以設定 所有資源的存取權範圍。
  8. 服務存取權 區段中,勾選 管理程式 選項。
  9. 按一下授權

建立 Kubernetes 叢集

IBM Cloud Kubernetes Service 是一種受管理的產品,可讓您在 IBM Cloud 上建立自己的 Kubernetes 計算主機群集,以部署和管理容器化應用程式。 在本指導教學中,具有一個 (1) 區域、一個 (1) 工作者節點及最小可用大小(規格)的最小叢集就足夠。

  1. 開啟 Kubernetes 叢集,然後按一下建立叢集

  2. 在您選擇的 基礎架構上建立叢集。

    • 如果您在 VPC 基礎架構上選取 VPC for Kubernetes,則會執行下列步驟。 在建立 Kubernetes 叢集之前,您需要先建立 VPC 和子網路。 如需詳細資料,請參閱 建立 VPC 叢集 文件。

      1. 按一下 建立 VPC
      2. 位置 區段下,選取 地理位置地區,例如 EuropeLondon
      3. 輸入 VPC 的 名稱,選取 資源群組,並選擇性地新增 標籤 以組織資源。
      4. 取消勾選預設安全群組中的允許 SSH允許 ping
      5. 取消勾選在每個區域建立子網路
      6. 按一下建立
      7. 工作者節點區域及子網路下,取消勾選未建立子網路的兩個區域。
      8. 每個區域的工作者節點 設定為 1,然後按一下 變更規格 以探索並變更為您選擇的工作者節點大小。
      9. Ingress 下,啟用 Ingress 密碼管理 並選取現有的 Secrets Manager 實例。
      10. 輸入 叢集名稱,並選取您用於 VPC 的相同 資源群組
      11. 在本指導教學中不需要記載或監視,請停用那些選項,然後按一下 建立
      12. 當您等待叢集變成作用中時,請將公用閘道連接至 VPC。 導覽至 虛擬專用雲端
      13. 按一下叢集所使用的 VPC 名稱,並向下捲動至子網路區段。
      14. 按一下先前建立的子網路名稱,然後在 Public Gateway 區段中按一下 分離,將狀態變更為 已連接
    • 下列步驟是您針對 Kubernetes on Classic 基礎架構選取 標準。 如需詳細資料,請參閱 建立標準叢集 文件。

      1. 位置 區段下,選取 地理位置、多區域 可用性Metro,例如 EuropeLondon
      2. 工作者節點區域及 VLAN 下,取消勾選除一個以外的所有區域。
      3. 每個區域的工作者節點 設定為 1,然後按一下 變更規格 以探索並變更為您選擇的工作者節點大小。
      4. 主要服務端點下,選取 專用及公用端點兩者
      5. Ingress 下,啟用 Ingress 密碼管理 並選取現有的 Secrets Manager 實例。
      6. 輸入 叢集名稱,並選取 資源群組 以在其下建立這些資源。
      7. 在本指導教學中不需要記載或監視,請停用那些選項,然後按一下 建立

複製範例應用程式

在此區段中,您將使用簡式 Helm型 NodeJS 範例應用程式來複製 GitHub 儲存庫,並具有登入頁面及兩個端點以開始使用。 您一律可以根據需求來延伸範例應用程式。

  1. 在終端機上,執行下列指令以複製 GitHub 儲存庫:
    git clone https://github.com/IBM-Cloud/kubernetes-node-app
    
  2. 變更至應用程式目錄:
    cd kubernetes-node-app
    

此範例應用程式碼包含用於本端開發及部署至 Kubernetes的所有必要配置檔。

使用 Helm Chart 將應用程式部署到叢集

使用 Helm 3 部署應用程式

應用程式的容器映像檔已建置並推送至 IBM Cloud Container Registry中的公用登錄。 在本節中,您將使用 Helm來部署範例應用程式。 Helm 可透過 Charts 協助您管理 應用程式,即使是最複雜的 應用程式,也能透過 Charts 協助您定義、安裝及升級。Helm Kubernetes Kubernetes

附註: 如果您想要建置應用程式並將其推送至您自己的容器登錄,則可以使用 Docker CLI 來執行此動作。 Dockerfile 在儲存庫中提供,映像檔可以推送至 IBM Cloud Container Registry 或任何其他容器登錄。

  1. 定義名為 MYAPP 的環境變數,並將位置保留元取代為您的起首字母,以設定應用程式的名稱:

    export MYAPP=<your-initials>kubenodeapp
    
  2. 識別叢集:

    ibmcloud ks cluster ls
    
  3. 使用群集名稱初始化變數:

    export MYCLUSTER=<CLUSTER_NAME>
    
  4. 起始設定 kubectl CLI 環境:

    ibmcloud ks cluster config --cluster $MYCLUSTER
    

    請確定已針對您使用 ibmcloud target -r <region> -g <resource_group> 建立叢集的地區及資源群組配置 CLI。 如需取得叢集的存取權及配置 CLI 以執行 kubectl 指令的相關資訊,請檢查 CLI configure 區段

  5. 您可以使用 default Kubernetes 名稱空間,或為此應用程式建立新的名稱空間。

    1. 如果您想要使用 default Kubernetes 名稱空間,請執行下列指令來設定環境變數:
      export KUBERNETES_NAMESPACE=default
      
    2. 如果您想要建立新的 Kubernetes 名稱空間,請遵循 Kubernetes 服務文件的 複製現有映像檔取回密碼儲存 Kubernetes 服務帳戶中所選取名稱空間的映像檔取回密碼 小節中所提及的步驟。 完成之後,請執行下列指令:
      export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
      
  6. 切換至範例應用程式目錄下的 chart 目錄:

    cd chart/kubernetesnodeapp
    
  7. 安裝 Helm 圖表:

    helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
    
  8. 切換回範例應用程式目錄:

    cd ../..
    

檢視應用程式

  1. 列出名稱空間中的 Kubernetes 服務:
    kubectl get services -n $KUBERNETES_NAMESPACE
    
  2. 列出命名空間中的 Kubernetes pod:
    kubectl get pods -n $KUBERNETES_NAMESPACE
    

將 IBM 提供的網域用於叢集

叢集隨附 IBM網域。 這為您提供了一個更好的選擇,可以使用正確的 URL 在標準 HTTP/S 埠上公開應用程式。

使用 Ingress 設定叢集到服務的入埠連線。

Ingress
Ingress

  1. 識別 IBM提供的 Ingress 子網域Ingress 密碼:

    ibmcloud ks cluster get --cluster $MYCLUSTER
    

    以找到

    Ingress subdomain: mycluster.us-south.containers.appdomain.cloud
    Ingress secret:    mycluster
    
  2. 定義環境變數 INGRESS_SUBDOMAIN 以保留 Ingress 子網域的值:

    export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN>
    
  3. 定義環境變數 INGRESS_SECRET 以保留 Ingress 密碼的值:

    export INGRESS_SECRET=<INGRESS_SECRET>
    
  4. 在範例應用程式目錄中執行下列 bash 指令,以建立一個 Ingress 檔 ingress-ibmsubdomain.yaml,指向 IBM網域,並支援 HTTP 和 HTTPS:

    ./ingress.sh ibmsubdomain_https
    

    透過將包裝在位置保留元 ($) 中的所有值取代為環境變數中的適當值,從 yaml-templates 資料夾下的範本檔案 ingress-ibmsubdomain-template.yaml 產生該檔案。

  5. 部署 Ingress:

    kubectl apply -f ingress-ibmsubdomain.yaml
    
  6. https://<myapp>.<ingress-subdomain>/ 的瀏覽器中開啟您的應用程式,或執行以下指令查看 HTTP 輸出:

    curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
    

使用您自己的自訂子網域

本節需要您擁有自訂網域。 您需要建立 CNAME 記錄,以指向叢集的 IBM提供的 Ingress 子網域。 如果您的網域是 example.com,則 CNAME 會 <myapp>.<example.com> 指向 <myapp>.<ingress-subdomain>

使用 HTTP

  1. 建立指向自訂網域的環境變數:
    export CUSTOM_DOMAIN=<example.com>
    
  2. 從範本檔 ingress-customdomain-http-template.yaml 建立 ingress-customdomain-http.yaml 指向您網域的 Ingress 檔案:
    ./ingress.sh customdomain_http
    
  3. 部署 Ingress:
    kubectl apply -f ingress-customdomain-http.yaml
    
  4. 請至 http://<myapp>.<example.com>/ 網站存取您的申請表。

使用 HTTPS

如果您嘗試在此時使用 HTTPS 存取您的應用程式 https://<myapp>.example.com/,您的網頁瀏覽器很可能會發出安全警告,告訴您連線並非私密。

現在,將憑證匯入至先前配置給叢集的 Secrets Manager 實例。

  1. 資源清單安全下存取 Secrets Manager 服務實例。

  2. 按一下左導覽中的 密鑰

  3. 按一下新增

  4. 您可以選取 公用憑證匯入的憑證專用憑證。 相關說明文件主題中提供了詳細步驟: 訂購 SSL/TLS 公用憑證匯入 SSL/TLS 憑證建立 SSL/TLS 專用憑證。 如果您選擇匯入憑證,請確保上傳憑證、私密金鑰及中繼憑證檔案。

  5. 尋找已匯入或已訂購憑證的項目,然後按一下它。

    • 請驗證網域名稱是否符合您的 $CUSTOM_DOMAIN。 如果上傳的是萬用字元憑證,則網域名稱中會包含星號。
    • 按一下證書 CRN 旁邊的複製圖示。
    • 建立環境變數,指向您剛複製的值:
    export CERTIFICATE_CRN=<certificate CRN>
    
  6. 在叢集裡為 SSL/TLS 憑證建立 Ingress 密碼:

    ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE
    
  7. 建立指向自訂網域的環境變數:

    export CUSTOM_DOMAIN=<example.com>
    
  8. 從範本 ingress-customdomain-https-template-sm.yaml 建立 ingress-customdomain-https.yaml 指向您網域的 Ingress 檔案:

    ./ingress.sh customdomain_https_sm
    
  9. 部署 Ingress:

    kubectl apply -f ingress-customdomain-https.yaml
    
  10. 請至 https://$MYAPP.$CUSTOM_DOMAIN/ 網站存取您的申請表。

curl -I https://$MYAPP.$CUSTOM_DOMAIN

監視應用程式性能

  1. 若要檢查應用程式的性能,請導覽至叢集以查看叢集清單,然後按一下叢集。
  2. 按一下 Kubernetes 儀表板,以在新標籤中啟動該儀表板。
  3. 按一下左側的 Pod,然後按一下符合 $MYAPP 的 pod-name
    • 檢查 CPU 及記憶體用量。
    • 請記下節點 IP 名稱。
    • 按一下右上方動作功能表中的 檢視日誌,以查看應用程式的標準輸出及錯誤。
  4. 在左側窗格中選擇節點,按一下之前註明的節點名稱,然後檢視 Allocation Resources(分配資源 ),以查看節點的健康狀況。
  5. 若要執行進入儲存器,請在動作功能表中選取 執行進入

調整 Kubernetes Pod

隨著應用程式負載的增加,可以手動增加部署中的 Pod 抄本數。 抄本由 ReplicaSet管理。 若要將應用程式擴展為兩個抄本,請執行下列指令:

kubectl scale deployment kubernetesnodeapp-deployment --replicas=2

一小會兒之後,您會在 Kubernetes 的儀表板中看到應用程式的兩個 Pod (或使用 kubectl get pods )。 群集中的 Ingress 控制器將處理兩個副本之間的負載平衡。

透過 Kubernetes,您可以啟用 水平 Pod 自動擴充功能,根據 CPU 自動增加或減少應用程式的實體數量。

若要建立自動調整器並定義原則,請執行以下指令:

kubectl autoscale deployment kubernetesnodeapp-deployment --cpu-percent=5 --min=1 --max=5

一旦成功建立自動平衡器,您應該會看到 horizontalpodautoscaler.autoscaling/<deployment-name> autoscaled.

移除資源

  • 刪除水平 Pod Autoscaler:

    kubectl delete horizontalpodautoscaler.autoscaling/kubernetesnodeapp-deployment
    
  • 刪除已套用的資源:

    kubectl delete -f ingress-customdomain-https.yaml
    kubectl delete -f ingress-customdomain-http.yaml
    kubectl delete -f ingress-ibmsubdomain.yaml
    
  • 刪除為此應用程式建立的 Kubernetes 構件:

    helm uninstall $MYAPP --namespace $KUBERNETES_NAMESPACE
    
  • 刪除 Kubernetes 秘密:

    kubectl -n $KUBERNETES_NAMESPACE delete secret kubernetesnodeapp-api-key
    
  • 刪除外部密鑰操作員:

    helm uninstall external-secrets
    
  • 刪除服務 ID:

    ibmcloud iam service-id-delete $SERVICE_ID
    
  • 刪除叢集。

相關內容