本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Watson Health Cloud 如何使用 Kubernetes 部署應用程式

今天的文章作者是 Sandhya Kapoor,IBM Watson Health 平臺高階技術專家

一年多以來,IBM 的 Watson Health 平臺一直在我們的雲平臺上使用虛擬機器部署醫療保健應用程式。由於虛擬機器對我們來說是昂貴且笨重的解決方案,我們有興趣評估 Kubernetes 在我們的部署中的表現。

我們的設計是將在同一名稱空間中設定應用程式和資料容器,並使用 sidecar 來滿足醫療保健行業的安全和合規性要求。

我能夠在單個物理伺服器上執行比使用虛擬機器更多的程序。此外,在容器中執行我們的應用程式確保了系統資源的最佳利用。

為了協調容器部署,我們正在使用 IBM Cloud Kubernetes 服務基礎設施,這是 IBM 實現的 Kubernetes,用於自動化跨主機叢集的應用程式容器的部署、擴充套件和操作,提供以容器為中心的基礎設施。

藉助 Kubernetes,我們的開發人員可以利用容器的強大功能和靈活性快速開發高可用性應用程式,並且藉助整合的安全卷服務,我們可以儲存持久資料,在 Kubernetes Pod 之間共享資料,並在需要時恢復資料。

以下是 Watson Care Manager 在 Kubernetes 叢集中執行的快照

在部署應用程式之前,使用者必須建立一個工作節點叢集。我可以使用 kubectl cli 命令建立叢集,或者從 IBM Cloud 儀表板建立叢集。

我們的叢集由一個或多個物理或虛擬機器組成,也稱為工作節點,它們鬆散耦合、可擴充套件,並由 Kubernetes 主節點集中監控和管理。當我們部署容器化應用程式時,Kubernetes 主節點會根據部署要求和叢集中的可用容量來決定應用程式的部署位置。

使用者向 Kubernetes 發出部署容器的請求,指定高可用性所需的副本數量。Kubernetes 排程程式決定 Pod(一個或多個容器組)的排程位置以及它們將部署到哪個工作節點上,並將此資訊內部儲存在 Kubernetes 和 etcd 中。工作節點中 Pod 的部署會根據執行時的負載進行更新,從而最佳化 Pod 在叢集中的放置。

每個工作節點中執行的 Kubelet 會定期輪詢 kube API 伺服器。如果有新的工作要做,kubelet 會拉取配置資訊並採取行動,例如,啟動一個新的 Pod。

流程圖

| | | UCD – IBM UrbanCode Deploy 是一個用於自動化應用程式在您的環境中部署的工具。WH 叢集 – Kubernetes 工作節點。 |

GitLab 在流程圖中的使用

我們將所有工件儲存在 GitLab 中,其中包括建立映象所需的 Docker 檔案、建立 Pod 所需的 YAML 檔案以及使醫療保健應用程式執行的配置檔案。

GitLab 和 Jenkins 在流程圖中的互動

我們使用 Jenkins 進行持續整合和構建自動化,以建立/拉取/重新標記 Docker 映象,並將映象推送到雲中的 Docker 登錄檔。

基本上,我們配置了一個 Jenkins 作業與 GitLab 專案互動以獲取最新工件,並根據要求,透過從 Docker/Bluemix 倉庫拉取所需的中間映象來從頭開始建立新的 Docker 映象,或者更新 Docker 映象。

映象建立/更新後,Jenkins 作業將映象推送到 Bluemix 倉庫,以儲存最新的映象,供 UrbanCode Deploy (UCD) 元件拉取。

Jenkins 和 UCD 在流程圖中的互動

Jenkins 作業配置為使用 UCD 元件及其各自的應用程式、應用程式流程和 UCD 環境來部署應用程式。UCD 元件將使用的 Docker 映象版本檔案也透過 Jenkins 作業傳遞給 UCD 元件。

UCD 在流程圖中的使用

UCD 用於部署,這裡實現了端到端部署流程的自動化。UCD 元件流程包括以下步驟:

  • 從 Gitlab 下載部署所需的工件。
  • 登入 Bluemix 並根據用於建立 Pod 的 Kubernetes 叢集設定 KUBECONFIG。
  • 使用 kubectl create 命令在叢集中建立應用程式 Pod。
  • 如果需要,執行滾動更新以更新現有 Pod。

在 IBM Cloud Kubernetes 服務中部署應用程式

在 IBM Cloud Kubernetes 服務中預置一個包含 <x> 個工作節點的叢集。建立 Kubernetes 控制器以在工作節點中部署容器,IBM Cloud Kubernetes 服務基礎設施從 IBM Cloud Container Registry 拉取 Docker 映象以建立容器。我們嘗試部署一個應用程式容器並執行一個 logmet 代理(參見下面的“使用 logmet 容器讀取和顯示日誌”)在容器內部,該代理將應用程式日誌轉發到 IBM Cloud 日誌服務。作為此過程的一部分,YAML 檔案用於為 UrbanCode Deploy (UCD) 建立控制器資源。UCD 代理作為 DaemonSet 控制器部署,用於連線到 UCD 伺服器。應用程式的整個部署過程在 UCD 中進行。為了支援應用程式的公共訪問,我們建立了一個服務資源,用於 Pod 之間的互動和訪問容器服務。為了支援儲存,我們建立了持久卷宣告併為容器掛載了卷。

| | | UCD:IBM UrbanCode Deploy 是一個用於自動化應用程式在您的環境中部署的工具。IBM Cloud Kubernetes 服務:IBM 的 Kubernetes 實現。WH Docker 登錄檔:Docker 私有映象登錄檔。通用代理容器:我們期望配置我們的服務以使用 WHC 強制代理。我們部署了所有 ion 容器。 |

使用 logmet 容器讀取和顯示日誌

Logmet 是一種雲日誌服務,有助於收集、儲存和分析應用程式的日誌資料。它還聚合應用程式和環境日誌,以實現整合的應用程式或環境洞察並轉發它們。指標透過 collectd 傳輸。我們選擇了一種在容器內部執行 logmet 代理程序的模型。該代理負責將日誌轉發到容器中配置的雲日誌服務。

應用程式 Pod 將應用程式日誌目錄掛載到持久卷宣告建立的儲存空間,並存儲日誌,即使 Pod 死亡也不會丟失。Kibana 是 Elasticsearch 的開源資料視覺化外掛。它在 Elasticsearch 叢集中索引的內容之上提供視覺化功能。

使用 Ingress 公開服務

Ingress 控制器 是反向代理,透過 URL 將服務暴露在叢集外部。它們充當外部 HTTP 負載均衡器,使用唯一的公共入口點將請求路由到應用程式。

為了將我們的服務暴露到叢集外部,我們使用了 Ingress。在 IBM Cloud Kubernetes 服務中,如果我們建立一個付費叢集,會自動為我們安裝一個 Ingress 控制器。透過建立指定服務路徑的 YAML 資原始檔,我們可以透過 Ingress 訪問服務。