本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

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 访问服务。