IBM Cloud Docs
使用 IBM Cloud Internet Services 的具備援能力且安全的多地區 Kubernetes 叢集

使用 IBM Cloud Internet Services 的具備援能力且安全的多地區 Kubernetes 叢集

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

在設計應用程式時若能考慮到備援能力,使用者就不太可能會遇到運作中斷時間。 使用 Kubernetes Service 實作解決方案時,可以利用各種內建功能(如負載平衡和隔離),提高對於主機、網路或應用程式潛在故障的備援能力。 透過建立多個群集,如果其中一個群集發生故障,使用者仍可存取部署在另一個群集中的應用程式。 透過位於不同地點的許多叢集,使用者也可以存取最近的叢集,減少網路延遲。 為了增加彈性,您也可以選擇多區群集,這表示您的節點部署在同一地點的多個區域中。

本教學重點介紹 Cloud Internet Services (CIS) 這個統一平台如何與 Kubernetes 叢集整合,以支援此方案,並提供跨多個地點的安全且具彈性的解決方案,該平台用於設定和管理網域名稱系統 (DNS)、全球負載平衡 (GLB)、Web 應用程式防火牆 (WAF),以及防止網際網路應用程式的分散式阻斷服務 ( DDoS )。

目標

  • 在不同地點的許多 Kubernetes 集群上部署應用程式。
  • 使用 Global Load Balancer 將流量分散到多個群集。
  • 將使用者遞送到距離最近的叢集。
  • 保護應用程式免受安全威脅。
  • 透過快取提高應用程式效能。

架構
教學的架構圖

  1. 開發人員為應用程式建立 Docker 映像。
  2. 影像被推送到 Container Registry。
  3. 應用程式會部署至達拉斯及倫敦的 Kubernetes 叢集。
  4. 一般使用者存取應用程式。
  5. IBM Cloud Internet Services 配置為截取對應用程式的要求,以及在叢集之間分散負載。 此外,已啟用 DDoS 保護和 Web 應用程式防火牆,保護應用程式抵禦常見威脅。 選擇性地快取資產,例如影像、CSS 檔。

開始之前

本指導教學需要:

  • IBM Cloud CLI,
    • IBM Cloud Kubernetes Service 外掛程式 (kubernetes-service),
  • kubectl 以與 Kubernetes 叢集互動,

您將在 開始使用解決方案指導教學 手冊中找到下載並安裝適用於您作業環境的這些工具的指示。

此外,請確定您:

  • 擁有自訂網域,因此您可以設定此網域的 DNS 指向 IBM Cloud Internet Services 名稱伺服器。
  • 瞭解 Kubernetes的基本觀念。

將應用程式部署到一個位置

本教學將 Kubernetes 應用程式部署到多個地點的叢集。 先部署到一個位置 - 達拉斯,然後對倫敦位置重複這些步驟。

建立 Kubernetes 叢集

對於本教學來說,具有一 (1) 個區域、一 (1) 個工作節點的最小叢集就足夠了。

建立下列 Kubernetes 叢集時:

  1. 叢集名稱設定為 my-us-cluster

  2. 北美洲達拉斯中找到

  3. 開啟 Kubernetes 群集,然後按一下建立群集

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

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

      1. 按一下 建立 VPC
      2. 位置 區段下,選取 地理位置地區,例如 North AmericaDallas
      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,例如 North AmericaDallas
      2. 工作者節點區域及 VLAN 下,取消勾選除一個以外的所有區域。
      3. 每個區域的工作節點設為 1 並點擊 “更改風格” 以探索並更改為您選擇的工作節點風格。
      4. 主要服務端點下,選取 專用及公用端點兩者
      5. Ingress 下,啟用 Ingress 密碼管理 並選取現有的 Secrets Manager 實例。
      6. 輸入 叢集名稱,並選取 資源群組 以在其下建立這些資源。
      7. 在本指導教學中不需要記載或監視,請停用那些選項,然後按一下 建立

叢集準備就緒後,接著將準備應用程式。

將應用程式部署到 Kubernetes 叢集

叢集應該已準備就緒。 可以在 Kubernetes Service 主控台中查看其狀態。

  1. 取得叢集的存取權,如叢集的「存取權」標籤上所述。 類似下列的內容:

    MYCLUSTER=my-us-cluster
    ibmcloud ks cluster config --cluster $MYCLUSTER
    
  2. 使用預先建置的應用程式映像檔來建立部署。 應用程式原始碼可以在此 GitHub 儲存庫中找到。

    kubectl create deploy hello-world-deployment --image=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes
    

    範例輸出:deployment "hello-world-deployment" created

  3. 透過建立服務,讓應用程式在叢集內可存取:

    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
    
  4. 使用兩個抄本在叢集中執行應用程式:

    kubectl scale deployment hello-world-deployment --replicas=2
    
  5. 可以使用下列指令檢查部署的狀態:

    kubectl get pods
    

取得指派給叢集的 Ingress 子網域

當 Kubernetes 群集建立時,它會被指派一個 Ingress 子網域 (例如、my-us-cluster.us-south.containers.appdomain.cloud )和公共應用程式負載平衡器 IP 位址。

  1. 擷取叢集的 Ingress 子網域:
    ibmcloud ks cluster get --cluster $MYCLUSTER
    
    尋找 Ingress Subdomain 值。
  2. 記下此資訊以在稍後步驟中使用。

本指導教學使用「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

  1. 建立 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
    
  2. 新增入口實例:
    kubectl apply -f glb-ingress.yaml
    
    如指令中 ADDRESS 直欄的值所指示,入口可能需要幾分鐘才能變成可用:
    kubectl get ingress
    
  3. 現在,透過將 curl Host 標頭配置為 DNS 子網域名稱以置換預設值 <IngressSubdomain> 來進行測試:
    curl --header 'Host: <glb_name>.<your_domain_name>' <IngressSubdomain>/hostname
    
    curl 指令看起來如下: curl --header 'Host: hello-world-service.ibmom.com' my-us-cluster-e7f2ca73139645ddf61a8702003a483a-0000.us-south.containers.appdomain.cloud/hostname

然後對另一個位置執行作業

針對具有下列取代項目的倫敦位置,重複上述步驟:

配置多位置負載平衡

現在,應用程式在兩個叢集裡執行,但缺少一個元件,供使用者從單一進入點透明地存取任一叢集。

在此區段中,您將配置 IBM Cloud Internet Services (CIS),以在兩個叢集之間配送負載。CIS 是一站式購物服務,提供 廣域負載平衡器 (GLB)CachingWeb 應用程式防火牆 (WAF)頁面規則,以保護應用程式安全,同時確保雲端應用程式的可靠性及效能。

若要配置廣域負載平衡器,您將需要:

  • 將自訂網域指向 CIS 名稱伺服器,
  • 擷取 Kubernetes 叢集的 Ingress 子網域,
  • 配置性能檢查,以驗證應用程式的可用性,
  • 以及定義指向叢集的原始儲存區。

向 IBM Cloud Internet Services 登錄自訂網域

第一步是建立 CIS 實例,並將自訂網域指向 CIS 名稱伺服器。

  1. 如果您沒有網域,可以向註冊商購買。

  2. 導覽至 IBM Cloud 型錄中的 IBM Cloud Internet Services

  3. 挑選方案,設定服務名稱及資源群組,然後按一下 建立 以建立服務實例。

  4. 佈建服務實例時,請按一下 新增網域

  5. 輸入網域名稱,然後按 下一步

  6. 設定您的 DNS 記錄是可選步驟,本教學可略過此步驟,按一下下一步

  7. 指派名稱伺服器時,請配置註冊商或網域名稱提供者以便使用列出的名稱伺服器。

  8. 此時,您可以按一下 取消 以回到主頁面,在您配置登記員或 DNS 提供者之後,最多可能需要 24 小時,變更才會生效。

    當網域在總覽頁面上的狀態從 Pending 變為 Active 時,您可以使用 dig <your_domain_name> ns 指令驗證新的名稱伺服器是否已經生效。

為廣域負載平衡器配置性能檢查

健康檢查會依據設定的間隔,監控來源池對 HTTP / HTTPS 請求的回應。 它們和原始儲存區配合使用,以判斷儲存區是否仍正常執行。

  1. 在 IBM Cloud Internet Services 儀表板中,使用導覽功能表來選取 可靠性 > 廣域負載平衡器

  2. 選取 性能檢查 標籤,然後按一下 建立

    1. 名稱 設為 hello-world-service
    2. 監視類型設定為 HTTP
    3. 設為 80
    4. 設定路徑/
    5. Configure request headers (optional) 中加入 Header name: Host 和 Value:<glb_name>.<your_domain_name>
    6. 按一下建立

    建置您自己的應用程式時,可以定義一個專用的性能端點,例如 /heathz,在其中可以報告應用程式狀態。

定義原始儲存區

儲存區是在連接至 GLB 時將資料流量聰明地遞送至其中的原點伺服器群組。 在英國和美國使用叢集時,可以定義基於位置的儲存區,並配置 CIS 以根據使用者要求的地理位置,將使用者重新導向到距離最近的叢集。

一個儲存區用於達拉斯的叢集

  1. 選取 原始儲存區 標籤,然後按一下 建立
  2. 將名稱設定為 US
  3. 將產地名稱設定為 us-cluster
  4. 原點位址 設為 ibmcloud ks cluster get --cluster $MYCLUSTER 針對美國叢集所列印的 kubernetes 服務 <IngressSubdomain>
  5. 健康檢查設定為上一節所建立的檢查。
  6. 健康檢查區域設定為 Western North America
  7. 按一下儲存

一個儲存區用於倫敦的叢集

  1. 選取 原始儲存區 標籤,然後按一下 建立
  2. 將名稱設定為 UK
  3. 將產地名稱設定為 uk-cluster
  4. 針對英國叢集,將 原點位址 設為 ibmcloud ks cluster get --cluster $MYCLUSTER 所列印的 kubernetes 服務 <IngressSubdomain>
  5. 健康檢查設定為上一節所建立的檢查。
  6. 健康檢查區域設定為 Western Europe
  7. 按一下儲存

建立廣域負載平衡器

定義原始儲存區後,可以完成負載平衡器的配置。

  1. 選取 負載平衡器 標籤,然後按一下 建立

  2. 在 Global Load Balancer 的 Name(名稱 )下輸入名稱,<glb_name>。 此名稱也會成為您的通用應用程式 URL (http://<glb_name>.<your_domain_name>) 的一部分,不論位置為何。

  3. 在「地理路徑」下,按一下 新增路徑

    1. 地區 下拉清單中選取 預設值
    2. 選取儲存區 US
    3. 按一下新增

    重複此程序來建立下列項目:

    要建立的地理路徑清單
    地區 原點儲存區
    預設值 美國
    西歐 英國
    東歐 英國
    東北亞 英國
    東南亞 英國
    北美洲西部 美國
    北美洲東部 美國

    透過此配置,歐洲和亞洲的使用者將重新導向到倫敦的叢集,美國的使用者將重新導向到達拉斯叢集。 當請求與任何定義的路由不符時,它將被重定向到預設區域中的池。

  4. 按一下建立

在此階段,您已成功設定全域負載平衡器,並將 Kubernetes 群集橫跨多個地點。 您可以存取 GLB URL http://<glb_name>.<your_domain_name>/hostname 來檢視您的申請。 根據您的位置,您會被重定向到最近的群集,如果 CIS 無法將您的 IP 位址對應到特定位置,則會從預設群集池中選取一個群集。

保護應用程式

開啟 Web 應用程式防火牆

Web 應用程式防火牆 (WAF) 可保護 Web 應用程式免受 ISO 第 7 層攻擊。 通常,WAF 與分組規則集組合使用,這些規則集旨在過濾掉惡意資料流量,以避免應用程式中有漏洞。

  1. 在 IBM Cloud Internet Services 儀表板中,導覽至 安全,然後在 WAF 上。
  2. 確保 WAF 已開啟
  3. 按一下 OWASP 規則集。 在此頁面中,可以檢閱 OWASP 核心規則集,並分別啟用或停用規則。 啟用規則後,如果傳入的要求觸發規則,全局威脅分數就會增加。 靈敏度設定將決定是否針對該要求觸發動作
    1. 保留預設 OWASP 規則集不變。
    2. 靈敏度設定為Low
    3. 動作設定為Simulate以記錄所有事件。
  4. 按一下 CIS 規則集。 此頁面顯示基於管理網站的常見技術堆疊的其他規則。

要使用 HTTPS 進行安全連線,您可以從 Let's Encrypt 取得證書,或透過 IBM Cloud Secrets Manager.

提高效能並防止阻斷服務攻擊

分散式拒絕服務 ( DDoS )攻擊是一種惡意的企圖,通過用大量的互聯網流量壓倒目標或其周圍的基礎設施,從而擾亂伺服器、服務或網絡的正常流量。CIS 裝備,以保護您的域名免受 DDoS。

  1. 在 CIS 儀表板中,選取可靠性 > 廣域負載平衡器

  2. 負載平衡器表格中找到建立的 GLB。

  3. 啟用Proxy直欄中的「安全和效能」特性:

    CIS Proxy 切換開啟
    CIS Proxy 切換開啟

GLB 現在已受到保護。 一個直接的好處就是,叢集的原點 IP 位址將對用戶端隱藏。 如果 CIS 偵測到未來的要求存在威脅,則在將使用者重新導向到應用程式之前,使用者可能會看到類似下面的畫面:

驗證- DDoS 保護
驗證- DDoS 保護

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

頁面規則
頁面規則

移除資源

移除 Kubernetes 叢集資源

  1. 移除 Ingress,您可以執行下列指令來執行此動作:
    kubectl delete -f glb-ingress.yaml
    
  2. 移除服務,您可以執行下列指令來執行此動作:
    kubectl delete service hello-world-service
    
  3. 移除部署,您可以執行下列指令來執行此動作:
    kubectl delete deployment hello-world-deployment
    
  4. 如果專門為此指導教學建立了叢集,則刪除這些叢集。

移除 CIS 資源

  1. 移除 GLB。
  2. 移除原點儲存區。
  3. 移除性能檢查。
  4. 更新自訂網域的 DNS。
  5. 如果您專為本教學建立了 CIS,請刪除該實例。

相關內容