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

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

今天的文章作者是 Sandhya Kapoor,IBM Watson Platform for Health 資深技術專家

一年多以來,IBM Watson Platform for Health 在我們的雲平台上的虛擬機器中部署醫療保健應用程式。由於虛擬機器對我們而言一直是成本高昂、笨重的解決方案,因此我們有興趣評估 Kubernetes 以進行部署。

我們的設計目的是在同一個命名空間中設定應用程式和資料容器,並搭配使用 sidecar 的必要代理程式,以符合醫療保健產業的安全性和合規性要求。

與使用虛擬機器相比,我能夠在單一實體伺服器上運行更多進程。此外,在容器中運行我們的應用程式可確保系統資源的最佳使用。

為了編排容器部署,我們正在使用 IBM Cloud Kubernetes Service 基礎架構,這是 IBM 提供的 Kubernetes 實作,用於自動化跨主機叢集的應用程式容器的部署、擴展和操作,並提供以容器為中心的基礎架構。

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

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

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

我們的叢集由一個或多個實體或虛擬機器(也稱為工作節點)組成,這些機器鬆散耦合、可擴展,且由 Kubernetes Master 節點集中監控和管理。當我們部署容器化應用程式時,Kubernetes Master 節點會考量部署需求和叢集中可用的容量,決定應用程式的部署位置。

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

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

流程圖

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

在流程圖中使用 GitLab

我們將所有 Artifact 儲存在 GitLab 中,其中包括建立映像檔所需的 Dockerfile、建立 Pod 所需的 YAML 檔案,以及使醫療保健應用程式運行的組態檔。

在流程圖中 GitLab 和 Jenkins 的互動

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

基本上,我們配置了一個 Jenkins 作業以與 GitLab 專案互動以取得最新的 Artifact,並根據需求,它將從頭開始建立新的 Docker 映像檔,或從 Docker/Bluemix 儲存庫拉取所需的中間映像檔,或更新 Docker 映像檔。

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

在流程圖中 Jenkins 和 UCD 的互動

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

在流程圖中使用 UCD

UCD 用於部署,且端對端部署流程在此處自動化。UCD 元件流程包含以下步驟

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

在 IBM Cloud Kubernetes Service 中部署應用程式

在 IBM Cloud Kubernetes Service 中佈建具有 <x> 個工作節點的叢集。建立 Kubernetes 控制器以在工作節點中部署容器,IBM Cloud Kubernetes Service 基礎架構從 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 Service:IBM 的 Kubernetes 實作。WH Docker Registry:Docker 私有映像檔儲存庫。通用代理程式容器:我們希望配置我們的服務以使用 WHC 強制代理程式。我們部署了所有 ion 容器。 |

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

Logmet 是一種雲端日誌服務,可協助收集、儲存和分析應用程式的日誌資料。它還彙總應用程式和環境日誌,以獲得整合的應用程式或環境見解並轉發它們。指標透過 collectd 傳輸。我們選擇在容器內運行 logmet 代理程式進程的模型。代理程式負責將日誌轉發到容器中配置的雲端日誌服務。

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

使用 Ingress 公開服務

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

為了將我們的服務公開到叢集外部,我們使用了 Ingress。在 IBM Cloud Kubernetes Service 中,如果我們建立付費叢集,將自動安裝 Ingress 控制器供我們使用。我們能夠透過建立指定服務路徑的 YAML 資源檔案,透過 Ingress 存取服務。

  • Stack Overflow 上發布問題(或回答問題)
  • 加入 K8sPort 上的倡導者社群入口網站
  • 在 Twitter 上追蹤 @Kubernetesio 以獲取最新更新
  • Slack 上與社群聯繫
  • GitHub 上參與 Kubernetes 專案