使用 IBM Cloud Internet Services 的具備援能力且安全的多地區 Kubernetes 叢集
本指導教學可能會產生成本。 使用「成本估算器」根據您的預計用量生成成本估算。
在設計應用程式時若能考慮到備援能力,使用者就不太可能會遇到運作中斷時間。 使用 Kubernetes Service 實作解決方案時,可以利用各種內建功能(如負載平衡和隔離),提高對於主機、網路或應用程式潛在故障的備援能力。 透過建立多個群集,如果其中一個群集發生故障,使用者仍可存取部署在另一個群集中的應用程式。 透過位於不同地點的許多叢集,使用者也可以存取最近的叢集,減少網路延遲。 為了增加彈性,您也可以選擇多區群集,這表示您的節點部署在同一地點的多個區域中。
本教學重點介紹 Cloud Internet Services (CIS) 這個統一平台如何與 Kubernetes 叢集整合,以支援此方案,並提供跨多個地點的安全且具彈性的解決方案,該平台用於設定和管理網域名稱系統 (DNS)、全球負載平衡 (GLB)、Web 應用程式防火牆 (WAF),以及防止網際網路應用程式的分散式阻斷服務 ( DDoS )。
目標
- 在不同地點的許多 Kubernetes 集群上部署應用程式。
- 使用 Global Load Balancer 將流量分散到多個群集。
- 將使用者遞送到距離最近的叢集。
- 保護應用程式免受安全威脅。
- 透過快取提高應用程式效能。
- 開發人員為應用程式建立 Docker 映像。
- 影像被推送到 Container Registry。
- 應用程式會部署至達拉斯及倫敦的 Kubernetes 叢集。
- 一般使用者存取應用程式。
- IBM Cloud Internet Services 配置為截取對應用程式的要求,以及在叢集之間分散負載。 此外,已啟用 DDoS 保護和 Web 應用程式防火牆,保護應用程式抵禦常見威脅。 選擇性地快取資產,例如影像、CSS 檔。
開始之前
本指導教學需要:
- IBM Cloud CLI,
- IBM Cloud Kubernetes Service 外掛程式 (
kubernetes-service
),
- IBM Cloud Kubernetes Service 外掛程式 (
kubectl
以與 Kubernetes 叢集互動,
您將在 開始使用解決方案指導教學 手冊中找到下載並安裝適用於您作業環境的這些工具的指示。
此外,請確定您:
- 擁有自訂網域,因此您可以設定此網域的 DNS 指向 IBM Cloud Internet Services 名稱伺服器。
- 及 瞭解 Kubernetes的基本觀念。
將應用程式部署到一個位置
本教學將 Kubernetes 應用程式部署到多個地點的叢集。 先部署到一個位置 - 達拉斯,然後對倫敦位置重複這些步驟。
建立 Kubernetes 叢集
對於本教學來說,具有一 (1) 個區域、一 (1) 個工作節點的最小叢集就足夠了。
建立下列 Kubernetes 叢集時:
-
將叢集名稱設定為 my-us-cluster。
-
在北美洲及達拉斯中找到
-
開啟 Kubernetes 群集,然後按一下建立群集。
-
在您選擇的 基礎架構上建立叢集。
-
如果您在 VPC 基礎架構上選取 VPC for Kubernetes,則會執行下列步驟。 在建立 Kubernetes 叢集之前,您需要先建立 VPC 和子網路。 如需詳細資料,請參閱 建立 VPC 叢集 文件。
- 按一下 建立 VPC。
- 在 位置 區段下,選取 地理位置 及 地區,例如
North America
及Dallas
。 - 輸入 VPC 的 名稱,選取 資源群組,並選擇性地新增 標籤 以組織資源。
- 取消勾選預設安全群組中的允許 SSH 和允許 ping。
- 取消勾選在每個區域建立子網路。
- 按一下建立。
- 在 工作者節點區域及子網路下,取消勾選未建立子網路的兩個區域。
- 將每個區域的工作節點設為
1
並點擊 “更改風格” 以探索並更改為您選擇的工作節點風格。 - 在 Ingress 下,啟用 Ingress 密碼管理 並選取現有的 Secrets Manager 實例。
- 輸入 叢集名稱,並選取您用於 VPC 的相同 資源群組。
- 在本指導教學中不需要記載或監視,請停用那些選項,然後按一下 建立。
- 當您等待叢集變成作用中時,請將公用閘道連接至 VPC。 導覽至 虛擬專用雲端。
- 按一下叢集所使用的 VPC 名稱,並向下捲動至子網路區段。
- 按一下先前建立的子網路名稱,然後在 Public Gateway 區段中按一下 分離,將狀態變更為 已連接。
-
下列步驟是您針對 Kubernetes on Classic 基礎架構選取 標準。 如需詳細資料,請參閱 建立標準叢集 文件。
- 在 位置 區段下,選取 地理位置、多區域 可用性及 Metro,例如
North America
及Dallas
。 - 在 工作者節點區域及 VLAN 下,取消勾選除一個以外的所有區域。
- 將每個區域的工作節點設為
1
並點擊 “更改風格” 以探索並更改為您選擇的工作節點風格。 - 在 主要服務端點下,選取 專用及公用端點兩者。
- 在 Ingress 下,啟用 Ingress 密碼管理 並選取現有的 Secrets Manager 實例。
- 輸入 叢集名稱,並選取 資源群組 以在其下建立這些資源。
- 在本指導教學中不需要記載或監視,請停用那些選項,然後按一下 建立。
- 在 位置 區段下,選取 地理位置、多區域 可用性及 Metro,例如
-
叢集準備就緒後,接著將準備應用程式。
將應用程式部署到 Kubernetes 叢集
叢集應該已準備就緒。 可以在 Kubernetes Service 主控台中查看其狀態。
-
取得叢集的存取權,如叢集的「存取權」標籤上所述。 類似下列的內容:
MYCLUSTER=my-us-cluster ibmcloud ks cluster config --cluster $MYCLUSTER
-
使用預先建置的應用程式映像檔來建立部署。 應用程式原始碼可以在此 GitHub 儲存庫中找到。
kubectl create deploy hello-world-deployment --image=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
範例輸出:
deployment "hello-world-deployment" created
。 -
透過建立服務,讓應用程式在叢集內可存取:
kubectl expose deployment/hello-world-deployment --type=ClusterIP --port=80 --name=hello-world-service --target-port=3000
這將傳回類似於
service "hello-world-service" exposed
的訊息。 若要查看服務,請執行下列動作:kubectl get services
-
使用兩個抄本在叢集中執行應用程式:
kubectl scale deployment hello-world-deployment --replicas=2
-
可以使用下列指令檢查部署的狀態:
kubectl get pods
取得指派給叢集的 Ingress 子網域
當 Kubernetes 群集建立時,它會被指派一個 Ingress 子網域 (例如、my-us-cluster.us-south.containers.appdomain.cloud )和公共應用程式負載平衡器 IP 位址。
- 擷取叢集的 Ingress 子網域:
尋找ibmcloud ks cluster get --cluster $MYCLUSTER
Ingress Subdomain
值。 - 記下此資訊以在稍後步驟中使用。
本指導教學使用「Ingress 子網域」來配置「廣域負載平衡器」。 您也可以將「Ingress 子網域」取代為叢集的公用「應用程式負載平衡器 (ALB)」。 <IngressSubdomain>
看起來像是 my-us-cluster-e7f2ca73139645ddf61a8702003a483a-0000.us-south.containers.appdomain.cloud
配置 DNS 子網域的 Ingress
將需要具有您自己的 DNS 網域名稱,並且將在下列作業中建立廣域負載平衡器子網域: <glb_name>.<your_domain_name>
。 類似 hello-world-service.example.com <glb_name> = hello-world-service
和 <your_domain_name> = example.com
- 建立 glb-ingress.yaml 檔案,並將位置保留元取代為其個別值:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: <glb-name> annotations: spec.ingressClassName: "public-iks-k8s-nginx" spec: rules: - host: <glb-name>.<your_domain_name> http: paths: - path: / pathType: Prefix backend: service: name: hello-world-service port: number: 80
- 新增入口實例:
如指令中 ADDRESS 直欄的值所指示,入口可能需要幾分鐘才能變成可用:kubectl apply -f glb-ingress.yaml
kubectl get ingress
- 現在,透過將 curl Host 標頭配置為 DNS 子網域名稱以置換預設值
<IngressSubdomain>
來進行測試:
curl 指令看起來如下:curl --header 'Host: <glb_name>.<your_domain_name>' <IngressSubdomain>/hostname
curl --header 'Host: hello-world-service.ibmom.com' my-us-cluster-e7f2ca73139645ddf61a8702003a483a-0000.us-south.containers.appdomain.cloud/hostname
然後對另一個位置執行作業
針對具有下列取代項目的倫敦位置,重複上述步驟:
- 在建立 Kubernetes 叢集中:
- 將叢集名稱 my-us-cluster 取代為 my-uk-cluster;
- 來自 北美 和 達拉斯 的位置,具有 歐洲 和 倫敦。
- 在 將應用程式部署至 Kubernetes 叢集 取代中:
- 將 MYCLUSTER= my-us-cluster 取代為 my-uk-cluster
- 配置 DNS 子網域的 Ingress
配置多位置負載平衡
現在,應用程式在兩個叢集裡執行,但缺少一個元件,供使用者從單一進入點透明地存取任一叢集。
在此區段中,您將配置 IBM Cloud Internet Services (CIS),以在兩個叢集之間配送負載。CIS 是一站式購物服務,提供 廣域負載平衡器 (GLB)、Caching、Web 應用程式防火牆 (WAF) 及 頁面規則,以保護應用程式安全,同時確保雲端應用程式的可靠性及效能。
若要配置廣域負載平衡器,您將需要:
- 將自訂網域指向 CIS 名稱伺服器,
- 擷取 Kubernetes 叢集的 Ingress 子網域,
- 配置性能檢查,以驗證應用程式的可用性,
- 以及定義指向叢集的原始儲存區。
向 IBM Cloud Internet Services 登錄自訂網域
第一步是建立 CIS 實例,並將自訂網域指向 CIS 名稱伺服器。
-
如果您沒有網域,可以向註冊商購買。
-
導覽至 IBM Cloud 型錄中的 IBM Cloud Internet Services。
-
挑選方案,設定服務名稱及資源群組,然後按一下 建立 以建立服務實例。
-
佈建服務實例時,請按一下 新增網域。
-
輸入網域名稱,然後按 下一步。
-
設定您的 DNS 記錄是可選步驟,本教學可略過此步驟,按一下下一步。
-
指派名稱伺服器時,請配置註冊商或網域名稱提供者以便使用列出的名稱伺服器。
-
此時,您可以按一下 取消 以回到主頁面,在您配置登記員或 DNS 提供者之後,最多可能需要 24 小時,變更才會生效。
當網域在總覽頁面上的狀態從 Pending 變為 Active 時,您可以使用
dig <your_domain_name> ns
指令驗證新的名稱伺服器是否已經生效。
為廣域負載平衡器配置性能檢查
健康檢查會依據設定的間隔,監控來源池對 HTTP / HTTPS 請求的回應。 它們和原始儲存區配合使用,以判斷儲存區是否仍正常執行。
-
在 IBM Cloud Internet Services 儀表板中,使用導覽功能表來選取 可靠性 > 廣域負載平衡器。
-
選取 性能檢查 標籤,然後按一下 建立。
- 將 名稱 設為 hello-world-service
- 將監視類型設定為 HTTP。
- 將 埠 設為 80。
- 設定路徑為 /。
- 在 Configure request headers (optional) 中加入 Header name:
Host
和 Value:<glb_name>.<your_domain_name>
- 按一下建立。
建置您自己的應用程式時,可以定義一個專用的性能端點,例如 /heathz,在其中可以報告應用程式狀態。
定義原始儲存區
儲存區是在連接至 GLB 時將資料流量聰明地遞送至其中的原點伺服器群組。 在英國和美國使用叢集時,可以定義基於位置的儲存區,並配置 CIS 以根據使用者要求的地理位置,將使用者重新導向到距離最近的叢集。
一個儲存區用於達拉斯的叢集
- 選取 原始儲存區 標籤,然後按一下 建立。
- 將名稱設定為
US
。 - 將產地名稱設定為
us-cluster
。 - 將 原點位址 設為
ibmcloud ks cluster get --cluster $MYCLUSTER
針對美國叢集所列印的 kubernetes 服務<IngressSubdomain>
。 - 將健康檢查設定為上一節所建立的檢查。
- 將健康檢查區域設定為
Western North America
。 - 按一下儲存。
一個儲存區用於倫敦的叢集
- 選取 原始儲存區 標籤,然後按一下 建立。
- 將名稱設定為
UK
。 - 將產地名稱設定為
uk-cluster
。 - 針對英國叢集,將 原點位址 設為
ibmcloud ks cluster get --cluster $MYCLUSTER
所列印的 kubernetes 服務<IngressSubdomain>
。 - 將健康檢查設定為上一節所建立的檢查。
- 將健康檢查區域設定為
Western Europe
。 - 按一下儲存。
建立廣域負載平衡器
定義原始儲存區後,可以完成負載平衡器的配置。
-
選取 負載平衡器 標籤,然後按一下 建立。
-
在 Global Load Balancer 的 Name(名稱 )下輸入名稱,
<glb_name>
。 此名稱也會成為您的通用應用程式 URL (http://<glb_name>.<your_domain_name>
) 的一部分,不論位置為何。 -
在「地理路徑」下,按一下 新增路徑。
- 從 地區 下拉清單中選取 預設值。
- 選取儲存區 US。
- 按一下新增。
重複此程序來建立下列項目:
要建立的地理路徑清單 地區 原點儲存區 預設值 美國 西歐 英國 東歐 英國 東北亞 英國 東南亞 英國 北美洲西部 美國 北美洲東部 美國 透過此配置,歐洲和亞洲的使用者將重新導向到倫敦的叢集,美國的使用者將重新導向到達拉斯叢集。 當請求與任何定義的路由不符時,它將被重定向到預設區域中的池。
-
按一下建立。
在此階段,您已成功設定全域負載平衡器,並將 Kubernetes 群集橫跨多個地點。 您可以存取 GLB URL http://<glb_name>.<your_domain_name>/hostname
來檢視您的申請。 根據您的位置,您會被重定向到最近的群集,如果 CIS 無法將您的 IP 位址對應到特定位置,則會從預設群集池中選取一個群集。
保護應用程式
開啟 Web 應用程式防火牆
Web 應用程式防火牆 (WAF) 可保護 Web 應用程式免受 ISO 第 7 層攻擊。 通常,WAF 與分組規則集組合使用,這些規則集旨在過濾掉惡意資料流量,以避免應用程式中有漏洞。
- 在 IBM Cloud Internet Services 儀表板中,導覽至 安全,然後在 WAF 上。
- 確保 WAF 已開啟。
- 按一下 OWASP 規則集。 在此頁面中,可以檢閱 OWASP 核心規則集,並分別啟用或停用規則。 啟用規則後,如果傳入的要求觸發規則,全局威脅分數就會增加。 靈敏度設定將決定是否針對該要求觸發動作。
- 保留預設 OWASP 規則集不變。
- 將靈敏度設定為
Low
。 - 將動作設定為
Simulate
以記錄所有事件。
- 按一下 CIS 規則集。 此頁面顯示基於管理網站的常見技術堆疊的其他規則。
要使用 HTTPS 進行安全連線,您可以從 Let's Encrypt 取得證書,或透過 IBM Cloud Secrets Manager.
提高效能並防止阻斷服務攻擊
分散式拒絕服務 ( DDoS )攻擊是一種惡意的企圖,通過用大量的互聯網流量壓倒目標或其周圍的基礎設施,從而擾亂伺服器、服務或網絡的正常流量。CIS 裝備,以保護您的域名免受 DDoS。
-
在 CIS 儀表板中,選取可靠性 > 廣域負載平衡器。
-
在負載平衡器表格中找到建立的 GLB。
-
啟用Proxy直欄中的「安全和效能」特性:
CIS Proxy 切換開啟
GLB 現在已受到保護。 一個直接的好處就是,叢集的原點 IP 位址將對用戶端隱藏。 如果 CIS 偵測到未來的要求存在威脅,則在將使用者重新導向到應用程式之前,使用者可能會看到類似下面的畫面:

此外,現在可以控制 CIS 快取的內容以及保持快取的時間。 移至效能 > 快取以定義廣域快取層次和瀏覽器有效期限。 可以使用頁面規則來自訂廣域安全和快取規則。 頁面規則使用特定網域路徑來啟用精細配置。 例如,透過頁面規則,可以決定將 /assets 下的所有內容快取 3 天:

移除資源
移除 Kubernetes 叢集資源
- 移除 Ingress,您可以執行下列指令來執行此動作:
kubectl delete -f glb-ingress.yaml
- 移除服務,您可以執行下列指令來執行此動作:
kubectl delete service hello-world-service
- 移除部署,您可以執行下列指令來執行此動作:
kubectl delete deployment hello-world-deployment
- 如果專門為此指導教學建立了叢集,則刪除這些叢集。
移除 CIS 資源
- 移除 GLB。
- 移除原點儲存區。
- 移除性能檢查。
- 更新自訂網域的 DNS。
- 如果您專為本教學建立了 CIS,請刪除該實例。