IBM Cloud Docs
將以 VM 為基礎的應用程式移動到 Kubernetes

將以 VM 為基礎的應用程式移動到 Kubernetes

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

本指導教學將逐步引導您使用 Kubernetes Service將 VM 型應用程式移至 Kubernetes 叢集。Kubernetes Service 透過結合容器與 Kubernetes 技術、直覺式使用者體驗以及內建安全與隔離,來提供功能強大的工具,以自動化運算主機叢集裡容器化應用程式的部署、作業、調整及監視。

本指導教學中的課程包括關於如何選取現有應用程式、將應用程式容器化以及將應用程式部署到 Kubernetes 叢集的概念。 若要將以 VM 為基礎的應用程式容器化,可以在下列兩個選項中進行選擇。

  1. 識別單一應用程式中可分拆為各自微服務的元件。 您可以將這些微服務容器化,並部署到 Kubernetes 集群。
  2. 將整個應用程式容器化,然後將應用程式部署到 Kubernetes 叢集。

根據您擁有的應用程式的類型不同,移轉應用程式的步驟也可能不同。 您可以使用此指導教學來瞭解在移轉應用程式之前必須執行的一般步驟和必須考慮的事項。

目標

  • 瞭解如何識別基於虛擬機器的應用程式中的微服務,並學習如何在虛擬機器和 Kubernetes 之間映射元件。
  • 瞭解如何將以 VM 為基礎的應用程式容器化。
  • 瞭解如何在 Kubernetes Service 中將容器部署到 Kubernetes 叢集。
  • 將學到的所有作法付諸實踐,在叢集裡執行 JPetStore 應用程式。

架構

使用 VM 的傳統應用程式架構

下圖顯示了以虛擬機器為基礎的傳統應用程式架構範例。

傳統應用架構圖
教學架構圖

  1. 使用者傳送要求至應用程式的公用端點。 公用端點由負載平衡器服務代表,該負載平衡器可對各個可用應用程式伺服器實例之間的送入網路資料流量進行負載平衡。
  2. 負載平衡器選取一個在 VM 上執行的執行狀況良好的應用程式伺服器實例,並轉遞要求。 應用程式程式碼、組態檔案和相依性等應用程式檔案儲存在應用程式伺服器虛擬機器上。
  3. 應用程式伺服器將應用程式資料儲存於在資料庫虛擬機器上執行的 MySQL 資料庫中。

容器化的架構

下圖顯示了在 Kubernetes 叢集裡執行的現代容器架構的範例。

現代儲存器架構的圖表
現代儲存器架構的圖表

  1. 使用者傳送要求至應用程式的公用端點。 公用端點由 Ingress 應用程式負載平衡器 (ALB) 代表,該負載平衡器對叢集裡各個應用程式 Pod 之間的送入網路資料流量進行負載平衡。 ALB 是一組規則,容許入埠網路資料流量進入公用的公開應用程式。
  2. ALB 將要求轉遞到叢集裡某個可用的應用程式 Pod。 應用程式 Pod 在工作者節點上執行,這些節點可以是虛擬機器,也可以是實體機器。
  3. 應用程式 Pod 將資料儲存在持續性磁區中。 持續性磁區可用於在應用程式實例或工作者節點之間共用資料。
  4. 應用程式 Pod 將資料儲存在 IBM Cloud 資料庫服務中。 您可以在 Kubernetes 叢集裡執行自己的資料庫,但使用受管理的資料庫即服務 (DBaaS) 通常更容易進行配置,並且提供了內建的備份和調整。 您可以在 IBM Cloud 型錄 中找到許多類型的資料庫。

VM、容器和 Kubernetes

Kubernetes Service 提供了在 Kubernetes 叢集裡執行容器化應用程式的功能,並交付了下列工具和功能:

  • 直觀的使用者體驗和強大的工具。
  • 內建安全性與隔離功能,可快速傳送安全的應用程式。
  • 包含 IBM® Watson™ 認知功能的雲端服務。
  • 能夠為無狀態應用程式和有狀態工作負載管理專用群集資源。

虛擬機器與容器

VM,傳統應用程式在原生硬體上執行。 單一應用程式通常不使用單一運算主機的完整資源。 大多數組織都嘗試在單一運算主機上執行多個應用程式以避免浪費資源。 您可以執行相同應用程式的多個副本,但要提供隔離,可以使用 VM 在相同的硬體上執行多個應用程式實例。 這些虛擬機器擁有完整的作業系統堆疊,由於在執行時和磁碟上都有重複,因此效率相對較低。

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

此外,使用容器可以共用主機作業系統。 這樣就能在減少重複的情況下仍提供隔離。 使用容器還可以捨棄不需要的檔案(如系統檔案庫和二進位檔)以節省空間並減少攻擊面。 進一步瞭解 何謂儲存器?中的虛擬機器及儲存器。

Kubernetes 編排

Kubernetes 是一個容器協調器,用來管理工作者節點群集中容器化應用程式的生命週期。 您的應用程式可能需要其他許多資源才能執行,如磁區、網路、可協助您連接其他雲端服務的密碼,以及安全金鑰。 Kubernetes 可協助您將這些資源新增至應用程式。 Kubernetes 的金鑰範例是其宣告的模型。 使用者提供所需的狀態,Kubernetes 試圖符合所說明的狀態,然後保持該狀態。

這個 自定步調的 Kubernetes 研討會可協助您獲得 Kubernetes 的首次實作經驗。 此外,請查看 Kubernetes 概念文件頁面,以瞭解 Kubernetes 概念的更多資訊。

IBM 為您做什麼

透過將 Kubernetes 叢集與 IBM Cloud Kubernetes Service 一起使用,您可獲得下列優點:

  • 可在其中部署叢集的多個資料中心。
  • 對 Ingress 和負載平衡器網路連線功能選項的支援。
  • 動態持續性磁區支援。
  • IBM 管理的高可用性 Kubernetes 主節點。

調整叢集大小

在設計叢集架構時,您希望平衡有關可用性、可靠性、複雜性和回復功能的成本。 IBM Cloud Kubernetes Service 中的 Kubernetes 叢集根據應用程式的需求來提供架構選項。 只需進行少量規劃,即可最充分地利用雲端資源,而不會過度架構或過度花費。 即使您高估或低估了,您也可以透過改變工作節點的數量或種類,輕鬆地擴大或縮小您的群集。

若要使用 Kubernetes 在雲端中執行正式作業應用程式,請考慮下列各項目:

  1. 您預期會有來自特定地理位置的資料流量嗎? 如果有,請選取實際離您最近的位置,以獲得最佳效能。
  2. 為了實現更高的可用性,需要有多少叢集抄本? 剛開始比較適合使用三個叢集,一個用於開發,一個用於測試,一個用於正式作業。 請參閱 組織資源及指派存取權的最佳作法 解決方案手冊,以建立多個環境。
  3. 工作者節點需要什麼硬體? 虛擬機器還是 Bare Metal Server?
  4. 需要多少個工作者節點? 這主要取決於應用程式規模,您擁有的節點數量越多,應用程式所具有的備援能力越高。
  5. 為了實現更高可用性,應該具備多少個抄本? 在多個位置部署抄本叢集以提高應用程式可用性,並防止應用程式因某個位置失敗而運作中斷。
  6. 您的應用程式在啟動時所需的最少資源是多少? 您可能要測試應用程式執行所需的記憶體數量和 CPU。 然後,您的工作者節點應該有足夠的資源來部署並啟動應用程式。 接著,作為 Pod 規格的一部分,確保設定資源配額。 Kubernetes 正是使用此設定來選取(或排定)有足夠容量來支援要求的工作者節點。 預估有多少個 Pod 會在工作者節點上執行,以及這些 Pod 的資源需求。
  7. 何時增加工作節點的數量? 您可以監視叢集使用情況,並根據需要增加節點數。 請參閱 監控叢集運作狀況
  8. 是否需要備援的可靠儲存空間? 如果是,請為 NFS 儲存建立持久卷聲明,或將 IBM Cloud 資料庫服務綁定到您的 pod。
  9. 您需要在 Virtual Private Cloud 基礎架構標準基礎架構 中部署叢集嗎? VPC 為您提供專用雲端環境的安全,同時具備公用雲端的動態可調整性。

為了讓前面的步驟更具體,我們假設您要在雲端執行一個生產型 Web 應用程式,並預期會有中等到較高的流量負載。 讓我們看一下您將需要哪些資源:

  1. 設定三個叢集,一個用於開發,一個用於測試,一個用於正式作業。
  2. 開發和測試叢集可以最低的 RAM 和 CPU 選項(例如每個叢集 2 個 CPU、4GB RAM 和 1 個 Worker 節點)開始。
  3. 對於正式作業叢集,可能需要有更多資源才能具有高效能、高可用性和備援能力。 我們可能會選擇專用或甚至是裸金屬選項,並至少有 4 個 CPU、16GB 記憶體和兩個工作者節點。

確定要使用的資料庫選項

利用 Kubernetes,您可以使用兩個選項來處理資料庫:

  1. 您可以在 Kubernetes 叢集裡執行資料庫,以執行建立微服務來執行資料庫所需的作業。 例如,如果使用 MySQL 資料庫,則需要完成下列步驟:
    • 建立 MySQL Dockerfile,在此查看 MySQL Dockerfile 的範例。
    • 您需要使用密碼來儲存資料庫認證。 請參閱此 這裡的範例。
    • 您需要有 deployment.yaml 檔案,其中包含要部署到 Kubernetes 的資料庫的配置。 請參閱此 這裡的範例。
  2. 第二個選項是使用受管理的資料庫即服務 (DBaaS) 選項。 此選項通常更容易配置,並提供內建備份和調整功能。 您可以在 IBM Cloud 型錄 中找到許多類型的資料庫。 若要使用此選項,請執行下列動作:

確定儲存應用程式檔案的位置

Kubernetes Service 提供了用於在不同 Pod 中儲存和共用資料的幾個選項。 在災難情況下,並非所有儲存空間選項提供的持續性和可用性層次都是相同的。

非持續資料儲存空間

根據設計,容器和 Pod 的生存時間短,並且可能會非預期故障。 您可以在容器的本端檔案系統中儲存資料。 容器內的資料不能與其他容器或 Pod 共用,並且在容器當機或被移除時會遺失。

瞭解如何為應用程式建立持續資料儲存空間

您可以使用原生 Kubernetes 持久卷,在 NFS 檔案儲存 或區塊儲存上持久化應用程式資料和容器資料。

若要佈建 NFS 檔案儲存空間或區塊儲存空間,必須透過建立持續性磁區要求 (PVC) 來為 Pod 要求儲存空間。 在 PVC 中,您可以選擇預先定義的儲存類別,這些類別定義了儲存類型、以 GB 為單位的儲存容量、IOPS、資料保留政策,以及儲存的讀寫權限。 PVC 動態佈建持續性磁區 (PV),用於代表 IBM Cloud 中的實際儲存裝置。 您可以將 PVC 裝載到 Pod 中以在 PV 中進行讀寫。 儲存在 PV 中的資料即使在容器當機或者 Pod 重新排定的情況下也是可用的。 支援 PV 的 NFS 檔案儲存和區塊儲存由 IBM,為您的資料提供高可用性。

若要瞭解如何建立 PVC,請遵循 Kubernetes Service 儲存空間文件中的步驟。

瞭解如何將現有資料移動到持續性儲存空間

若要將資料從本端機器複製到持續性儲存空間中,必須將 PVC 裝載到 Pod。 然後可以將資料從本端機器複製到 Pod 中的持續性磁區。

  1. 若要複製資料,首先,您需要建立類似這樣的設定:

    kind: Pod
    apiVersion: v1
    metadata:
      name: task-pv-pod
    spec:
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
           claimName: mypvc
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/mnt/data"
              name: task-pv-storage
    
  2. 然後,若要將資料從本端機器複製到 Pod,需要使用如下指令:

     kubectl cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath>
    
  3. 將資料從叢集裡的 Pod 複製到本端機器:

    kubectl cp <namespace>/<pod>:<pod_filepath>/<filename> <local_filepath>/<filename>
    

為持續性儲存空間設定備份

檔案共用和區塊儲存空間會佈建到叢集所在的相同位置。 儲存空間本身由 IBM 在叢集伺服器上管理以提供高可用性。 但是,檔案共用和區塊儲存空間不會自動進行備份,因此它們在整個位置發生故障時可能無法進行存取。 為了防止資料遺失或損壞,可以設定定期備份,以便在需要時可用於還原資料。

如需詳細資訊,請參閱 儲存規劃 NFS 檔案儲存和區塊儲存的選項。

準備程式碼

套用 12 因子原則

十二要素應用程式是建立雲端原生應用程式的方法論。 當您要將應用程式容器化、將此應用程式移動到雲端,以及利用 Kubernetes 編排應用程式時,請務必瞭解並套用其中一些原則。 IBM Cloud 中要求使用其中一些原則。

需要下列主要原則:

  • 程式碼庫 - 在版本控制系統(如 Git 儲存庫)中追蹤所有原始碼和配置檔,這在使用 DevOps 管線進行部署時是必要的。
  • 建置、發佈、執行 - 12 因子應用程式在建置、發佈和執行階段之間使用嚴格分離。 這可以使用整合的 DevOps Delivery Pipeline 自動化,以在將應用程式部署到叢集之前先建置和測試應用程式。 請參閱 在 Kubernetes 指導教學,以瞭解如何設定持續整合及交付管線。 它涵蓋了原始碼控制、建立、測試和部署階段的設定,並教您如何新增整合,例如安全掃描器、通知和分析。
  • 配置 - 所有配置資訊都儲存在環境變數中。 任何服務認證都不會在應用程式程式碼中進行硬編碼。 若要儲存認證,可以使用 Kubernetes 密碼。 稍後將進一步瞭解認證。

將認證儲存在 Kubernetes 密碼中

將認證儲存在應用程式碼中絕不是一個好的作法。 相反地,Kubernetes 提供所謂的 「秘密」 來保存敏感資訊,例如密碼、OAuth 令牌或 SSH 金鑰。 Kubernetes 秘密預設是加密的,這使得秘密成為儲存敏感資料的更安全、更靈活的選項,而不是將這些資料逐字儲存於 pod 定義或容器映像中。

在 Kubernetes 中使用秘密的一種方法是像這樣做:

  1. 建立稱為 cloud-secrets.txt 的檔案,並儲存其中任何雲端服務的服務認證。

    {
        "url": "<SERVICE_URL>",
        "api_key": <API_Key>
    }
    
  2. 然後,執行下列指令建立 Kubernetes secret,並在執行下列指令後使用 kubectl get secrets 驗證是否已建立 secret:

    kubectl create secret generic cloud-service-secret --from-file=cloud-secrets.txt=./cloud-secrets.txt
    

將應用程式容器化

若要將應用程式容器化,您必須建立一個容器影像。

映像從 Dockerfile 建立,這是一個包含建立映像的指示和指令的檔案。 Dockerfile 可能會參照其指示中個別儲存的建置構件(例如應用程式、應用程式的配置及其相依關係)。

若要為現有應用程式建置自己的 Dockerfile,請使用下列指令:

  • FROM - 選擇用於定義容器運行環境的主映像檔。
  • ADD/COPY - 將目錄內容複製到容器中。
  • WORKDIR - 在容器中設定工作目錄。
  • RUN - 安裝應用程式在執行時需要的套裝軟體。
  • EXPOSE - 使一個埠在容器外部可用。
  • ENV NAME - 定義環境變數。
  • CMD - 定義在容器啟動時執行的指令。

影像通常儲存在註冊表中,該註冊表可供公眾存取(公開註冊表)或設定成只限一組使用者存取(私人註冊表)。 公用登錄(例如 Docker Hub)可用來開始使用 Docker 及 Kubernetes 在叢集裡建立第一個容器化應用程式。 但是對於企業應用程式,請使用專用登錄(如在 IBM Cloud Container Registry 中提供的登錄),以保護映像檔不被未經授權的使用者使用和變更。

若要將應用程式容器化並將其儲存在 IBM Cloud Container Registry 中,請執行下列動作:

  1. 您需要建立 Dockerfile,以下程式碼是 Dockerfile 的範例。
    # Build JPetStore war
    FROM openjdk:8 as builder
    COPY . /src
    WORKDIR /src
    RUN ./build.sh all
    
    # Use WebSphere Liberty base image from the Docker Store
    FROM websphere-liberty:latest
    
    # Copy war from build stage and server.xml into image
    COPY --from=builder /src/dist/jpetstore.war /opt/ibm/wlp/usr/servers/defaultServer/apps/
    COPY --from=builder /src/server.xml /opt/ibm/wlp/usr/servers/defaultServer/
    RUN mkdir -p /config/lib/global
    COPY lib/mysql-connector-java-3.0.17-ga-bin.jar /config/lib/global
    
  2. 建立 Dockerfile 之後,接著需要建置容器映像檔並將其推送到 IBM Cloud Container Registry。 您可以使用以下指令建置容器:
    docker build . -t <image_name>
    docker push <image_name>
    

將應用程式部署到 Kubernetes 叢集

在建置容器映像檔並將其推送到雲端之後,接下來需要將其部署到 Kubernetes 叢集。 若要執行該動作,需要建立 deployment.yaml 檔案。

瞭解如何建立 Kubernetes deployment.yaml 檔案

若要建立 Kubernetes deployment.yaml 檔案,請執行下列動作:

  1. 建立 deployment.yaml 檔案,以下是 部署 YAML 檔案的範例。

  2. 在您的 deployment.yaml 檔案中,您可以為您的容器 定義資源配額,以指定每個容器需要多少 CPU 和記憶體才能正常啟動。 如果容器已指定資源配額,則 Kubernetes 排程器在決定將 Pod 放置在哪個工作者節點上時,可以做出更好的選擇。

  3. 接下來,您可以使用下列指令來建立和檢視已建立的部署和服務:

    kubectl create -f <filepath/deployment.yaml>
    kubectl get deployments
    kubectl get services
    kubectl get pods
    

摘要

在本指導教學中,您學到了下列內容:

  • VM、容器和 Kubernetes 之間的差別。
  • 如何針對不同的環境類型(開發、測試、正式作業)定義叢集。
  • 如何處理資料儲存空間以及持續資料儲存空間的重要性。
  • 對應用程式套用 12 因子原則並套用密碼作為 Kubernetes 中的認證。
  • 建立容器影像,並將其推送至 IBM Cloud Container Registry。
  • 建立 Kubernetes 部署檔案,並將容器影像部署到 Kubernetes。

將學到的所有作法付諸實踐,在叢集裡執行 JPetStore 應用程式。

若要實踐您所學到的一切,請按照 示範在您的集群上執行 JPetStore 應用程式,並應用所學到的概念。 JPetStore 應用程式具有一些擴充功能,可讓您在 Kubernetes 中透過執行影像分類作為獨立的微服務來擴充應用程式。