分享嘉宾:柴宗三,亚信大数据云平台部高级研发工程师。目前负责亚信 DataFoundry 大数据 PaaS 云平台。本文源自于 3 月 12 号《第三期 Kubernetes 沙龙》四个 Topic 之一,是《第三期 kubernetes 沙龙主题剖析系列·第一篇》。本文对如何将后端服务( backend service )接入kubernetes进行了比较详尽的介绍。
Kubernetes 不同组件的交互是异步的,不同组件负责不同的功能模块。 Kubernetes 集群目前为单 master 结构,一般情况下 master 节点上运行 APIServer 、 kube-controller-manager 、 kube-scheduler 、 etcd , node 节点上运行 kubelet 、 kube-proxy 、 flannel 。 Etcd 和 flannel 用于网络管理,不是 kubernetes 本身的组件,这里不做介绍。虽然 k8s 是单 master 结构,但是 master 的宕机并不会导致导致集群应用 service unavailable ,只是暂时无法从管理层面对容器应用进行操作。
• APIServer ( master 组件)的功能是作为集群的 Master ,提供集群管理的 API ,接收客户端的 REST 请求,读写 etcd 中的数据。
• kube-controller-manager ( master 组件)监听 Replication Controller 的变化,并创建对应的 Pod ,使其达到期望的运行状态。
• kube-scheduler ( master 组件)根据节点的资源和限制条件将 pod 分配给特定 slave 节点的 kubelet 。
• Kubelet ( node 组件)作为 daemon 运行在每个 slave 节点上,用来维持节点上的容器,保持与 APIServer 、 etcd 的数据同步。 Kubelet 默认集成 cadvisor 组件,用于搜集主机和容器的监控数据。
• kube-proxy ( node 组件)用于接收打给 service 的流量,根据 podSelector 分发给特定的 backend pods 。如果配置了 service 的 external endpoint ,则会将请求分发给外部服务。
backend service ,即后台服务,具有持久化、插件化、服务化的特点。对于 PaaS 平台,其 backend service 还要满足四个需求:需求多样、服务共享、按需分配、开箱即用。为了满足 PaaS 平台的这些需求,必须对 backend service 做一些规范规范。对此,亚信的 PaaS 平台采用了 CloudFoundry 的规范(如下)。每个 backend service 都会暴露自己的 REST API 供其它服务调用。通过 REST API 的方式,极大方便了 Resource Register 、 Controller Handler 、 Api Router 、 CLI 的实现。
Backend service(后台服务)与 kubernetes 通过两种方式集成。第一种,每个 backend service 作为 Pod 中的一个 container 运行在 kubernetes 中,不同的后端服务可以使用 Pod 级别的编排相互串联起来。 Backend service 的 REST API 通过 service 映射到外部,对外提供服务。为了保持服务的持久性,不能采用本地存储,建议将分布式文件系统的块挂载到后端服务对应的 Pod 上。第二种方式, backend service 作为一个独立的服务,与 kubernetes 集群分开。在 kubernetes 集群中创建 service ,将后台服务的访问方式设置到 service 的 external endpoint 中。
无论后端服务在 kubernetes 集群中作为 Container 运行,或者处于 kubernetes 集群之外,都通过 kubernetes 的 service 做请求分发。 Kubernetes 的 Service 本身非常灵活,可以选择暴露到外网,或者只是在内网访问。同时 Service 具备 load balance 功能,如果后端服务独立于 kubernetes 集群,那么可以充当简化版的 haproxy 使用。