本文已发表一年多。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否已失效。
Watson Health Cloud 如何使用 Kubernetes 部署应用
今天的博文作者是 Sandhya Kapoor,IBM Watson Platform for Health 高级技术专家
一年多以来,IBM 的 Watson Platform for Health 一直在我们的云平台上通过虚拟机部署医疗应用。由于虚拟机对我们来说是一种成本高昂、重量级的解决方案,我们有兴趣评估 Kubernetes 用于我们的部署。
我们的设计是在同一个命名空间中设置应用和数据容器,并使用 sidecar 注入所需的 Agent,以满足医疗行业中的安全和合规性要求。
与使用虚拟机相比,我能够在单个物理服务器上运行更多进程。此外,在容器中运行我们的应用确保了系统资源的最佳利用。
为了编排容器部署,我们使用了 IBM Cloud Kubernetes Service 基础设施,这是 IBM 提供的一种 Kubernetes 实现,用于自动化跨主机集群的应用容器部署、扩缩容和运维,提供以容器为中心的基础设施。
借助 Kubernetes,我们的开发者可以利用容器的强大和灵活性快速开发高可用应用;通过集成且安全的卷服务,我们可以存储持久化数据,在 Kubernetes Pod 之间共享数据,并在需要时恢复数据。
以下是 Watson Care Manager 在 Kubernetes 集群中运行的快照
在部署应用之前,用户必须创建一个 Worker 节点集群。我可以使用 kubectl CLI 命令创建集群,或者从 IBM Cloud 控制台创建集群。
我们的集群由一个或多个物理机或虚拟机(也称为 Worker 节点)组成,这些节点是松耦合、可扩展的,并由 Kubernetes Master 集中监控和管理。当我们部署容器化应用时,Kubernetes Master 会根据部署要求和集群中的可用容量决定将应用部署在哪里。
用户向 Kubernetes 发出部署容器的请求,指定高可用所需的副本数量。Kubernetes 调度器决定将 Pod(一个或多个容器的组)调度到哪里以及部署到哪些 Worker 节点上,并将此信息存储在 Kubernetes 和 etcd 内部。Pod 在 Worker 节点上的部署会根据运行时负载进行更新,从而优化 Pod 在集群中的位置。
每个 Worker 节点上运行的 Kubelet 会定期轮询 kube API server。如果有新的工作要做,Kubelet 会拉取配置信息并采取行动,例如启动一个新的 Pod。
流程图
| | | UCD – IBM UrbanCode Deploy 是一种用于自动化应用在您的环境中的部署的工具。WH Cluster – Kubernetes Worker 节点。|
GitLab 在流程图中的使用
我们将所有 Artifact 存储在 GitLab 中,包括创建镜像所需的 Dockerfile、创建 Pod 所需的 YAML 文件以及运行医疗应用的配置文件。
GitLab 和 Jenkins 在流程图中的交互
我们使用 Jenkins 进行持续集成和构建自动化,以创建/拉取/重新标记 Docker 镜像,并将镜像推送到云中的 Docker 仓库。
基本上,我们配置了一个 Jenkins Job 与 GitLab 项目交互以获取最新的 Artifact,并根据需求,它会通过从 Docker/Bluemix 仓库拉取所需的中间镜像从头创建新的 Docker 镜像,或者更新 Docker 镜像。
镜像创建/更新后,Jenkins Job 将镜像推送到 Bluemix 仓库,以便保存最新的镜像供 UrbanCode Deploy (UCD) 组件拉取。
Jenkins 和 UCD 在流程图中的交互
Jenkins Job 被配置为使用 UCD 组件及其相应的应用、应用流程和 UCD 环境来部署应用。将由 UCD 组件使用的 Docker 镜像版本文件也通过 Jenkins Job 传递给 UCD 组件。
UCD 在流程图中的使用
UCD 用于部署,并且端到端部署流程在这里是自动化的。UCD 组件流程包含以下步骤
- 从 Gitlab 下载部署所需的 Artifact。
- 登录 Bluemix 并根据用于创建 Pod 的 Kubernetes 集群设置 KUBECONFIG。
- 使用 kubectl create 命令在集群中创建应用 Pod。
- 如果需要,运行滚动更新以更新现有 Pod。
在 IBM Cloud Kubernetes Service 中部署应用
在 IBM Cloud Kubernetes Service 中配置一个包含 <x> 个 Worker 节点的集群。创建 Kubernetes 控制器以在 Worker 节点中部署容器,IBM Cloud Kubernetes Service 基础设施从 IBM Cloud Container Registry 拉取 Docker 镜像以创建容器。我们尝试部署一个应用容器并运行一个 logmet Agent(参见下文“使用 logmet 容器读取和显示日志”)在容器内部,该 Agent 将应用日志转发到 IBM Cloud 日志服务。作为流程的一部分,使用 YAML 文件为 UrbanCode Deploy (UCD) 创建一个控制器资源。UCD Agent 作为 DaemonSet 控制器部署,用于连接到 UCD 服务器。整个应用部署流程在 UCD 中进行。为了支持应用的公共访问,我们创建了一个 Service 资源,用于 Pod 之间的交互和访问容器服务。对于存储支持,我们创建了持久卷声明 (Persistent Volume Claims) 并为容器挂载了卷。
| | | UCD: IBM UrbanCode Deploy 是一种用于自动化应用在您的环境中的部署的工具。IBM Cloud Kubernetes Service: IBM 的 Kubernetes 实现。WH Docker Registry: Docker 私有镜像仓库。通用 Agent 容器:我们希望配置我们的服务使用 WHC 强制性 Agent。我们部署了所有 ion 容器。|
使用 logmet 容器读取和显示日志
Logmet 是一种云日志服务,有助于收集、存储和分析应用日志数据。它还汇总应用和环境日志,以便提供整合的应用或环境洞察并转发它们。指标使用 collectd 传输。我们选择了一种模型,即在容器内部运行 logmet Agent 进程。该 Agent 负责将日志转发到在容器中配置的云日志服务。
应用 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 项目