架构概览
最后更新于
最后更新于
Kubernetes
(通常称为 K8s) 是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。Google 设计并捐赠给 Cloud Native Computing Foundation(CNCF,今属 Linux 基金会)来使用的。它旨在提供 “跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具, 包括 Docker 等。 -- 摘自维基百科 Kubernetes 词条
Kubernetes 控制平面由一系列组件组成,可以运行在一个单独的主节点上,也可以分布部署以支持高可用集群,或者运行在 Kubernetes 之上。
kube-apiserver
API server 提供 Kubernetes API。API server 扮演集群网关的角色,它主要处理 REST 操作,验证并更新到 etcd
存储。
etcd
etcd
是一个分布式 key-value 数据库,Kubernetes 用 etcd
作为后端数据存储。集群所有的持久性状态都存储在 etcd
实例中。etcd
提供了可靠配置数据存储。通过 watch
的支持,可以非常快速地通知协调组件变更。
kube-controller-manager
集群内部的管理控制中心,如 Node、Volume、Deployment 、Service 等资源管理,以及空间生命周期,Pod GC、节点 GC 等。
kube-scheduler
执行 pod 的相关调度。调度程序监视未调度的 pod,并根据所请求资源的可用性,服务质量要求、亲和性和反亲和性设置以及其它约束,通过 /binding
pod 子资源 API 绑定到相应节点。
Kubelet 是 Kubernetes 中最重要和突出的控制器,它是驱动容器执行层的 Pod 和 Node API 的主要实现者。没有这些 API,Kubernetes 只是一个后端由键值存储支持的面向 CRUD 的 REST 应用程序框架。
Kubelet 决定 Pod 是否可以运行在给定的节点上的最终决策者,不是调度器也或者 DaemonSets。此外,Kubelet 还集成了 cAdvisor 资源监控 agent。
每一个节点运行一个容器运行时,负责下载镜像和运行容器。Kubelet 不集成容器运行时。作为替代,定义了一个 Container Runtime Interface 控制底层运行时并促进该层的可插拔性。当前支持的有 docker、rkt、cri-o、frakti。
service 的抽象提供了一种在公共访问策略(如负载均衡)下对 pod 进行分组的方式。Service 通过创建 VIP,提供给客户端访问,再透明代理到 Service 中的 pods。每个节点都运行一个 kube-proxy 进程,该进程维护一套 iptables 规则,以捕获对服务 IPs 的访问,并重定向到正确的后端(1.12.x ipvs 正式 GA,性能相对 iptables 有很大的提升)。
附上华为关于 Service 性能这块的介绍,主要是对比 ipvs 和 iptables:
DNS 提供集群内部解析和服务发现
Ingress controller 提供内部服务七层代理到外部
Kubernetes Metrics Server 替换 Heapster 监控
Dashboard Kubernetes GUI
以及包括 kube-state-metrics 等其它 add-ons 组件。
Kubernetes GUI 从体验上来说还是相对比较差的,可以使用一些开源的替代版本:
Multi-Cluster Kubernetes Management -- Rancher
Rancher 团队是做的比较早的,现在已经发布 2.x 版本了,支持中文,具体可以参考文档 Rancher 2.0-CN
Web UI for Kubernetes multi-clusters -- Wayne
360 开源的 Kubernetes 多集群 Web UI