Kubernetes 上的可調整 Web 應用程式
本指導教學可能會產生成本。 使用「成本估算器」根據您的預計用量生成成本估算。
本教學教導您如何在本機容器中執行 Web 應用程式,然後將其部署到使用 Kubernetes Service 建立的 Kubernetes 叢集。 作為選用步驟,您可以建置容器映像檔,並將映像檔推送至專用登錄。 此外,您將學習如何綁定自訂子網域、監控環境的健康狀況,以及擴充應用程式。
容器是包裝應用程式及其所有相依關係的標準方式,而此方式可讓您在環境之間無縫移動應用程式。 容器與虛擬機器不同,容器不會搭載作業系統。 只有應用程式碼、運行環境、系統工具、程式庫及設定才會包裝在容器中。 容器比虛擬機器更輕量、可攜性更高且更有效率。
目標
- 將 Web 應用程式部署到 Kubernetes 叢集。
- 連結自訂子網域。
- 監視叢集的日誌和性能。
- 調整 Kubernetes Pod。
- 開發人員下載或複製範例 Web 應用程式。
- 選擇性地建置應用程式以產生容器映像檔。
- 選擇性地將映像檔推送至 IBM Cloud Container Registry中的名稱空間。
- 應用程式部署到 Kubernetes 叢集。
- 使用者存取應用程式。
開始之前
本指導教學需要:
- IBM Cloud CLI,
- IBM Cloud Kubernetes Service 外掛程式 (
kubernetes-service),
- IBM Cloud 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的整合。
- 在 IBM Cloud 主控台中,按一下管理 > 存取 (IAM)。
- 按一下 授權。
- 按一下建立。
- 在 來源服務 清單中,選取 Kubernetes Service。
- 選取選項以設定 所有資源的存取權範圍。
- 在 目標服務 清單中,選取 Secrets Manager。
- 選取選項以設定 所有資源的存取權範圍。
- 在 服務存取權 區段中,勾選 管理程式 選項。
- 按一下授權。
建立 Kubernetes 叢集
IBM Cloud Kubernetes Service 是一種受管理的產品,可讓您在 IBM Cloud 上建立自己的 Kubernetes 計算主機群集,以部署和管理容器化應用程式。 在本指導教學中,具有一個 (1) 區域、一個 (1) 工作者節點及最小可用大小(規格)的最小叢集就足夠。
-
開啟 Kubernetes 叢集,然後按一下建立叢集。
-
在您選擇的 基礎架構上建立叢集。
-
如果您在 VPC 基礎架構上選取 VPC for Kubernetes,則會執行下列步驟。 在建立 Kubernetes 叢集之前,您需要先建立 VPC 和子網路。 如需詳細資料,請參閱 建立 VPC 叢集 文件。
- 按一下 建立 VPC。
- 在 位置 區段下,選取 地理位置 及 地區,例如
Europe及London。 - 輸入 VPC 的 名稱,選取 資源群組,並選擇性地新增 標籤 以組織資源。
- 取消勾選預設安全群組中的允許 SSH 和允許 ping。
- 取消勾選在每個區域建立子網路。
- 按一下建立。
- 在 工作者節點區域及子網路下,取消勾選未建立子網路的兩個區域。
- 將 每個區域的工作者節點 設定為
1,然後按一下 變更規格 以探索並變更為您選擇的工作者節點大小。 - 在 Ingress 下,啟用 Ingress 密碼管理 並選取現有的 Secrets Manager 實例。
- 輸入 叢集名稱,並選取您用於 VPC 的相同 資源群組。
- 在本指導教學中不需要記載或監視,請停用那些選項,然後按一下 建立。
- 當您等待叢集變成作用中時,請將公用閘道連接至 VPC。 導覽至 虛擬專用雲端。
- 按一下叢集所使用的 VPC 名稱,並向下捲動至子網路區段。
- 按一下先前建立的子網路名稱,然後在 Public Gateway 區段中按一下 分離,將狀態變更為 已連接。
-
下列步驟是您針對 Kubernetes on Classic 基礎架構選取 標準。 如需詳細資料,請參閱 建立標準叢集 文件。
- 在 位置 區段下,選取 地理位置、多區域 可用性及 Metro,例如
Europe及London。 - 在 工作者節點區域及 VLAN 下,取消勾選除一個以外的所有區域。
- 將 每個區域的工作者節點 設定為
1,然後按一下 變更規格 以探索並變更為您選擇的工作者節點大小。 - 在 主要服務端點下,選取 專用及公用端點兩者。
- 在 Ingress 下,啟用 Ingress 密碼管理 並選取現有的 Secrets Manager 實例。
- 輸入 叢集名稱,並選取 資源群組 以在其下建立這些資源。
- 在本指導教學中不需要記載或監視,請停用那些選項,然後按一下 建立。
- 在 位置 區段下,選取 地理位置、多區域 可用性及 Metro,例如
-
複製範例應用程式
在此區段中,您將使用簡式 Helm型 NodeJS 範例應用程式來複製 GitHub 儲存庫,並具有登入頁面及兩個端點以開始使用。 您一律可以根據需求來延伸範例應用程式。
- 在終端機上,執行下列指令以複製 GitHub 儲存庫:
git clone https://github.com/IBM-Cloud/kubernetes-node-app - 變更至應用程式目錄:
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 或任何其他容器登錄。
-
定義名為
MYAPP的環境變數,並將位置保留元取代為您的起首字母,以設定應用程式的名稱:export MYAPP=<your-initials>kubenodeapp -
識別叢集:
ibmcloud ks cluster ls -
使用群集名稱初始化變數:
export MYCLUSTER=<CLUSTER_NAME> -
起始設定
kubectlCLI 環境:ibmcloud ks cluster config --cluster $MYCLUSTER請確定已針對您使用
ibmcloud target -r <region> -g <resource_group>建立叢集的地區及資源群組配置 CLI。 如需取得叢集的存取權及配置 CLI 以執行 kubectl 指令的相關資訊,請檢查 CLI configure 區段 -
您可以使用
defaultKubernetes 名稱空間,或為此應用程式建立新的名稱空間。- 如果您想要使用
defaultKubernetes 名稱空間,請執行下列指令來設定環境變數:export KUBERNETES_NAMESPACE=default - 如果您想要建立新的 Kubernetes 名稱空間,請遵循 Kubernetes 服務文件的 複製現有映像檔取回密碼 及 儲存 Kubernetes 服務帳戶中所選取名稱空間的映像檔取回密碼 小節中所提及的步驟。 完成之後,請執行下列指令:
export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
- 如果您想要使用
-
切換至範例應用程式目錄下的 chart 目錄:
cd chart/kubernetesnodeapp -
安裝 Helm 圖表:
helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes -
切換回範例應用程式目錄:
cd ../..
檢視應用程式
- 列出名稱空間中的 Kubernetes 服務:
kubectl get services -n $KUBERNETES_NAMESPACE - 列出命名空間中的 Kubernetes pod:
kubectl get pods -n $KUBERNETES_NAMESPACE
將 IBM 提供的網域用於叢集
叢集隨附 IBM網域。 這為您提供了一個更好的選擇,可以使用正確的 URL 在標準 HTTP/S 埠上公開應用程式。
使用 Ingress 設定叢集到服務的入埠連線。
-
識別 IBM提供的 Ingress 子網域 及 Ingress 密碼:
ibmcloud ks cluster get --cluster $MYCLUSTER以找到
Ingress subdomain: mycluster.us-south.containers.appdomain.cloud Ingress secret: mycluster -
定義環境變數
INGRESS_SUBDOMAIN以保留 Ingress 子網域的值:export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN> -
定義環境變數
INGRESS_SECRET以保留 Ingress 密碼的值:export INGRESS_SECRET=<INGRESS_SECRET> -
在範例應用程式目錄中執行下列 bash 指令,以建立一個 Ingress 檔
ingress-ibmsubdomain.yaml,指向 IBM網域,並支援 HTTP 和 HTTPS:./ingress.sh ibmsubdomain_https透過將包裝在位置保留元 (
$) 中的所有值取代為環境變數中的適當值,從 yaml-templates 資料夾下的範本檔案ingress-ibmsubdomain-template.yaml產生該檔案。 -
部署 Ingress:
kubectl apply -f ingress-ibmsubdomain.yaml -
在
https://<myapp>.<ingress-subdomain>/的瀏覽器中開啟您的應用程式,或執行以下指令查看 HTTP 輸出:curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
使用您自己的自訂子網域
本節需要您擁有自訂網域。 您需要建立 CNAME 記錄,以指向叢集的 IBM提供的 Ingress 子網域。 如果您的網域是 example.com,則 CNAME 會 <myapp>.<example.com> 指向 <myapp>.<ingress-subdomain>。
使用 HTTP
- 建立指向自訂網域的環境變數:
export CUSTOM_DOMAIN=<example.com> - 從範本檔
ingress-customdomain-http-template.yaml建立ingress-customdomain-http.yaml指向您網域的 Ingress 檔案:./ingress.sh customdomain_http - 部署 Ingress:
kubectl apply -f ingress-customdomain-http.yaml - 請至
http://<myapp>.<example.com>/網站存取您的申請表。
使用 HTTPS
如果您嘗試在此時使用 HTTPS 存取您的應用程式 https://<myapp>.example.com/,您的網頁瀏覽器很可能會發出安全警告,告訴您連線並非私密。
現在,將憑證匯入至先前配置給叢集的 Secrets Manager 實例。
-
從 資源清單 在 安全下存取 Secrets Manager 服務實例。
-
按一下左導覽中的 密鑰。
-
按一下新增。
-
您可以選取 公用憑證、匯入的憑證 或 專用憑證。 相關說明文件主題中提供了詳細步驟: 訂購 SSL/TLS 公用憑證、匯入 SSL/TLS 憑證 或 建立 SSL/TLS 專用憑證。 如果您選擇匯入憑證,請確保上傳憑證、私密金鑰及中繼憑證檔案。
-
尋找已匯入或已訂購憑證的項目,然後按一下它。
- 請驗證網域名稱是否符合您的 $CUSTOM_DOMAIN。 如果上傳的是萬用字元憑證,則網域名稱中會包含星號。
- 按一下證書 CRN 旁邊的複製圖示。
- 建立環境變數,指向您剛複製的值:
export CERTIFICATE_CRN=<certificate CRN> -
在叢集裡為 SSL/TLS 憑證建立 Ingress 密碼:
ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE -
建立指向自訂網域的環境變數:
export CUSTOM_DOMAIN=<example.com> -
從範本
ingress-customdomain-https-template-sm.yaml建立ingress-customdomain-https.yaml指向您網域的 Ingress 檔案:./ingress.sh customdomain_https_sm -
部署 Ingress:
kubectl apply -f ingress-customdomain-https.yaml -
請至
https://$MYAPP.$CUSTOM_DOMAIN/網站存取您的申請表。
curl -I https://$MYAPP.$CUSTOM_DOMAIN
監視應用程式性能
- 若要檢查應用程式的性能,請導覽至叢集以查看叢集清單,然後按一下叢集。
- 按一下 Kubernetes 儀表板,以在新標籤中啟動該儀表板。
- 按一下左側的 Pod,然後按一下符合 $MYAPP 的 pod-name
- 檢查 CPU 及記憶體用量。
- 請記下節點 IP 名稱。
- 按一下右上方動作功能表中的 檢視日誌,以查看應用程式的標準輸出及錯誤。
- 在左側窗格中選擇節點,按一下之前註明的節點名稱,然後檢視 Allocation Resources(分配資源 ),以查看節點的健康狀況。
- 若要執行進入儲存器,請在動作功能表中選取 執行進入
調整 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 -
刪除叢集。