Kubernetes 的主要优势在于,它提供了一个便捷有效的平台,让用户可以在物理机和虚拟机集群上调度与运行容器。进一步来说,Kubernctes 是一个支持弹性运行的分布式系统框架,是一种支撑其他平台的平台型基础设施,可以帮助用户在生产环境中依托容器实施的基础架构。Kubernetes 的本质在于实现操作任务自动化,包括应用扩展、故障转移和部署模式等,因而它能代替用户执行大部分烦琐的操作任务,减轻用户负担,降低出错的概率。
简言之,Kubernetes 整合并抽象了底层的硬件和系统环境等基础设施,对外提供了一个统一的资源池供终端用户通过 API 进行调用。Kubernetes 具有以下几个重要特性。
(1)自动装箱
构建于容器之上,基于资源依赖及其他约束自动完成容器部署且不能响其可用性,并在同一节点通过调度机制混合运行关键型应用和非关键型应用的工作负载,以提升资源利用率。
(2)自我修复(自愈)
支持容器故障后自动重启、节点故障后重新调度容器到其他可用节点、健康状态检查失败后关闭容器并重新创建等自我修复机制。
(3)水平扩展
支持通过简单命令或 UI 手动水平扩展,以及基于 CPU 等资源负载率的自动水平扩展机制。
(4)服务发现和负载均衡
Kubernetes 通过其附加组件之一的 KubeDNS(或 CoreDNS)为系统内置了服务发现功能,它会为每个 Service 配置 DNS 名称,并允许集群内的客户端直接使用此名称发出访问请求,而 Service 通过 iptables 或 ipvs 内置了负载均衡机制。
(5)自动发布和回滚
Kubernetes 支持“灰度”更新应用程序或其配置信息,它会监控更新过程中应用程序的健康状态,以确保不会在同一时刻杀掉所有实例,而此过程中一旦有故障发生,它会立即自动执行回滚操作。
(6)密钥和配置管理
Kubernetes 的 ConfigMap 实现了配置数据与 Docker 镜像解耦,需要时,仅对配置做出变更而无须重新构建 Docker 镜像,这为应用开发部署提供了很大的灵活性。此外,对于应用所依赖的一些敏感数据,如用户名和密码、令牌、密钥等信息,Kubernetes 专门提供了Secret 对象使依赖解耦,既便利了应用的快速开发和交付,又提供了一定程度上的安全保障。
(7)存储编排
Kubernetes 支持 Pod 对象按需自动挂载不同类型存储系统,这包括节点本地存储公有云服务商的云存储(如 AWS 和 GCP 等),以及网络存储系统,例如 NFS、iSCSI、Gluster、Ceph、Cinder 和 Flocker 等。
(8)批量处理执行
除了服务型应用,Kubernetes 还支持批处理作业、CI(持续集成),以及容器故障后恢复。另一方面,以应用为中心的 Kubernetes 本身并未直接提供一套完整的“开箱即用”的应用管理体系,需要基础设施工程师基于云原生社区和生态的实际需求手动构建。换句话说,在典型的生产应用场景中,Kubernetes 还需要同网络、存储、遥测(监控和日志)、镜像仓库、负载均衡器、CI/CD 工具链及其他服务整合,以提供完整且 API 风格统一的基础设施平台。
下面对容器编排系统中的要素进行简单介绍:
Docker Registry 和工件仓库:通过 Harbor 工件仓库、Docker Registry 等项目实现。
网络:借助 Flannel、Calico 或 WeaveNet 等项目实现。
遥测:借助 Prometheus 和 EFK 栈(或者由 Promtail、Loki 和 Grafana 组成的 PLG 栈)等项目实现。
容器化工作负载:借助 Kubernetes 内置的工作负载控制器资源,甚至由社区扩展而来的各种 Operator完成应用的自动化编排,包括自愈和自动扩缩容等;而便捷的应用打包则要借助 Helm 或 Kustomize 等项目完成。
基于容器编排系统的 CI/CD :借助 Jcnkins、Tekton、Flagger 或 Kepton 等项目,甚至遵循 GitOps 规范实现应用交付、发布和部署等。