这篇文章已经超过一年了。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

Watson Health Cloud 如何使用 Kubernetes 部署应用程序

今天的文章作者是Sandhya Kapoor,IBM Watson健康平台的高级技术专家

一年多来,IBM的Watson健康平台一直在我们的云平台上以虚拟机形式部署医疗保健应用程序。由于虚拟机对我们来说是一种昂贵且笨重的解决方案,我们有兴趣评估Kubernetes用于我们的部署。

我们的设计是将应用程序和数据容器设置在同一命名空间中,并使用sidecar来满足医疗保健行业的安全性和合规性要求。

我能够在单个物理服务器上运行比使用虚拟机时更多的进程。此外,在容器中运行我们的应用程序可以确保系统资源得到最佳利用。

为了编排容器部署,我们正在使用IBM Cloud Kubernetes Service基础设施,这是IBM提供的Kubernetes实现,用于自动化跨主机集群的应用程序容器的部署、扩展和操作,提供以容器为中心的基础设施。

借助Kubernetes,我们的开发人员可以利用容器的强大功能和灵活性快速开发高可用性应用程序,并通过集成且安全的卷服务,我们可以存储持久数据,在Kubernetes pod之间共享数据,并在需要时恢复数据。

以下是在Kubernetes集群中运行的Watson Care Manager的快照

在部署应用程序之前,用户必须创建一个工作节点集群。我可以使用kubectl cli命令创建集群,也可以从IBM Cloud仪表板创建。

我们的集群由一个或多个物理或虚拟机组成,也称为工作节点,它们是松散耦合的、可扩展的,并由Kubernetes主节点集中监控和管理。当我们部署容器化的应用程序时,Kubernetes主节点会考虑部署要求和集群中的可用容量,决定将应用程序部署到哪里。

用户向Kubernetes发出部署容器的请求,指定高可用性所需的副本数量。Kubernetes调度程序决定将pod(一个或多个容器的组)调度到哪里以及部署在哪个工作节点上,并将此信息内部存储在Kubernetes和etcd中。工作节点中pod的部署会根据运行时的负载进行更新,从而优化pod在集群中的位置。

在每个工作节点中运行的Kubelet会定期轮询kube API服务器。如果有新的工作要做,kubelet会提取配置信息并采取行动,例如,启动一个新的pod。

流程图

| | | UCD – IBM UrbanCode Deploy 是一个用于自动化应用程序在环境中部署的工具。WH Cluster – 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 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强制代理。我们部署了所有离子容器。 |

使用logmet容器读取和显示日志

Logmet是一种云日志服务,可帮助收集、存储和分析应用程序的日志数据。它还会聚合应用程序和环境日志,以进行整合的应用程序或环境见解并转发它们。指标使用collectd传输。我们选择了一种在容器内运行logmet代理进程的模型。该代理负责将日志转发到容器中配置的云日志服务。

应用程序pod将应用程序日志目录挂载到由持久卷声明创建的存储空间,并存储日志,即使pod死掉也不会丢失。Kibana是一个用于Elasticsearch的开源数据可视化插件。它在Elasticsearch集群上索引的内容之上提供可视化功能。

使用Ingress公开服务

Ingress控制器是反向代理,通过URL将服务暴露在集群外部。它们充当外部HTTP负载均衡器,使用唯一的公共入口点将请求路由到应用程序。

为了将我们的服务暴露在集群外部,我们使用了Ingress。在IBM Cloud Kubernetes Service中,如果我们创建一个付费集群,则会自动安装一个Ingress控制器供我们使用。我们能够通过创建指定服务路径的YAML资源文件,通过Ingress访问服务。