kubernetes 简介
kubernetes 是什么?
kubernetes 是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署,自动扩缩容,维护等工具
通过kubernetes 你可以:
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源使用
目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担
kubernetes 特点
- 可移植:支持公有云,私有云,混合云,多重云(multi-cloud)
- 可扩展:模块化,插件化,可挂载。可组合
- 自动化:自动部署。自动重启,自动复制,自动伸缩扩展
Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。
为什么是容器
通过两图对比 ,总结下容器优势:
- 快速创建/部署应用:与vm虚拟机相比,容器镜像的创建更加容易。
- 持续开发,集成和部署:提供可靠且频繁的容器镜像构建、部署,并使用快速和简单的回滚(由于镜像不可变性)
- 开发和运行相分离:在build或者release 阶段创建容器镜像,使得应用和集成设施解耦。
- 开发,测试和生产环境一致性:在本地或者外网(生产环境)运行的一致性
- 云平台或其他操作系统:可以在Ubuntu,RHEL,CoreOS,on-prem,Google,Container Engine 或其他任何环境中运行
- loosely coupled,分布式,弹性,微服务化:应用程序分为更小的,独立的部件,可以动态部署和管理。
- 资源隔离
- 资源利用:更高效
使用kubernetes能做什么?
可以在物理或虚拟主机的kubernetes集群上运行容器化应用,kubernetes能提供一个以”容器为中心的基础架构“,满足生看环境中运行应用的一些常见需求,如:
- 多个进程(作为容器运行)协同工作。(Pod)
- 存储系统挂载
- Distributing secrets
- 应用健康检测
- 应用实例的复制
- Pod自动伸缩扩展
- Naming and discovering
- 负载均衡
- 滚动更新
- 资源监控
- 日志访问
- 调试应用程序
- 提供认证和授权
Kubernetes不是什么?
Kubernetes并不是传统的PaaS(平台即服务)系统。
- Kubernetes不限制支持应用的类型,不限制应用框架。限制受支持的语言runtimes (例如, Java, Python, Ruby),满足12-factor applications 。不区分 “apps” 或者“services”。 Kubernetes支持不同负载应用,包括有状态、无状态、数据处理类型的应用。只要这个应用可以在容器里运行,那么就能很好的运行在Kubernetes上。
- Kubernetes不提供中间件(如message buses)、数据处理框架(如Spark)、数据库(如Mysql)或者集群存储系统(如Ceph)作为内置服务。但这些应用都可以运行在Kubernetes上面。
- Kubernetes不部署源码不编译应用。持续集成的 (CI)工作流方面,不同的用户有不同的需求和偏好的区域,因此,我们提供分层的 CI工作流,但并不定义它应该如何工作。
- Kubernetes允许用户选择自己的日志、监控和报警系统。
- Kubernetes不提供或授权一个全面的应用程序配置 语言/系统(例如,jsonnet)。
- Kubernetes不提供任何机器配置、维护、管理或者自修复系统。
另一方面,大量的Paas系统都可以运行在Kubernetes上,比如Openshift、Deis、Gondor。可以构建自己的Paas平台,与自己选择的CI系统集成。
由于Kubernetes运行在应用级别而不是硬件级,因此提供了普通的Paas平台提供的一些通用功能,比如部署,扩展,负载均衡,日志,监控等。这些默认功能是可选的。
另外,Kubernetes不仅仅是一个“编排系统”;它消除了编排的需要。“编排”的定义是指执行一个预定的工作流:先执行A,之B,然C。相反,Kubernetes由一组独立的可组合控制进程组成。怎么样从A到C并不重要,达到目的就好。当然集中控制也是必不可少,方法更像排舞的过程。这使得系统更加易用、强大、弹性和可扩展。
kubernetes 设计架构
kebernetes集群包含有节点代理kubelet和Master组件(APIs,scheduler,etc),一切都基于分布式的存储系统。下面这张图是Kubernetes的架构图
Kubernetes节点
在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。
kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。
每次这个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。
kubernetes主要由以下几个核心的组件组成:
- etcd保存了整个集群的状态;
- apiserver提供了资源操作的唯一入口,并提供认证,授权,访问控制,API注册和发现等机制;
- controller manager负责维护集群的状态,比如故障检测,自动扩展,滚动更新等;
- scheduler负责资源的调度,按照预定的调度策略将Pod调度的响应的机器上;
- kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime 负责镜像管理以及Pod容器的真正运行(CRI);
- kube-proxy负责为Service 提供cluster内部服务发现和负载均衡;
除了核心组件,还有一个推荐的Add-ons
- kube-dns负责为整个集群提供DNS服务
- Ingress Controller为服务提供外网入口
- Heapster提供资源监控
- Dashboard提供GUI
- Federation提供跨可用区的集群
- Fluentd-elasticsearch提供集群日志采集,存储与查询
分层架构
Kubernetes 设计理念和功能其实就是一个类似linux的分层架构,如下图所示
- 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
- 应用层:部署(无状态应用,有状态应用,批处理任务,集群应用等)和路由(服务发现,DNS解析等)
- 管理层:系统度量(如基础设施,容器和网络的度量),自动化(如自动扩展,动态Provision等)以及策略管理(RBAC,Quota,PSP,NwtworkPolicy等)
- 接口层:kubectl命令行工具,客户端SDK以及集群联邦
- 生态系统:在接口层智商的庞大容器集群管理调度的生态系统,可以划分为两个范畴
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
kubernetes 组件
Master 组件
Master 组件提供集群的管理控制中心。
Master组件可以在集群中任何节点上运行,但是为了简单起见,通常在一台VM/机器上启动所有Master 组件,并且不会再此VM/机器上运行用户容器。
kube-apiserver
kube-apiserver用于暴露kubernetes API。任何的资源请求/调用操作都是通过kube-apiserver提供的借口进行。
ETCD
etcd是kubernetes 提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。
kube-controller-manager
kube-controller-manager 运行管理控制器,他们是集群中处理常规任务的后台县城。逻辑上,每个控制器是一个单独的进程,但是为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。
这些控制器包括:
- 节点(Node)控制器。
- 副本(Replication) 控制器:负责维护系统中每个副本中的pod。
- 端点(Endpoins)控制器:填充Endpoints对象(即链接Services&Pods)。
- Service Account和Token控制器:为新的Namespace 创建默认账户访问API Token。
cloud-controller-manager
云控制器管理负责与底层云提供商的平台交互。云控制器管理器是Kubernetes版本1.6中引入的。目前还是Alpha的功能。
云控制器管理器仅运行云提供商特定的(contriller loops)控制器循环。可以通过将--cloud-provider flag 设置为external 启动kube-controller-manager,来禁用控制器循环。
cloud-controller-manager 具体功能:
- 节点(Node) 控制器
- 路由(Route)控制器
- Service控制器
- 卷(Volume)控制器
kube-scheduler
kube-scheduler 监视新创建没有分配到Node的Pod,为Pod选择一个Node
插件 addons
插件(addon)是实现集群pod和Services功能的 。Pod由Deployments,ReplicationController等进行管理。Namespace 插件对象是在kube-system Namespace中创建。
DNS
虽然不严格要求使用插件,但Kubernetes集群都应该具有集群 DNS。
群集 DNS是一个DNS服务器,能够为 Kubernetes services提供 DNS记录。
由Kubernetes启动的容器自动将这个DNS服务器包含在他们的DNS searches中。
了解更多详情
用户界面
kube-ui提供集群状态基础信息查看。更多详细信息,请参阅使用HTTP代理访问Kubernetes API
容器资源监控
容器资源监控提供一个UI浏览监控数据。
Cluster-level Logging
Cluster-level logging,负责保存容器日志,搜索/查看日志。
节点(Node)组件
节点组件运行在Node,提供kubernetes 运行时环境,以及维护Pod。
kubelet
kubelet是主要的节点代理,它会监事已分配给节点的pod,具体功能:
- 安装Pod所需的volume。
- 下载Pod的Secrets。
- Pod中运行的docker(或experimentally,rkt)容器。
- 定期执行容器健康检查。
- Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.
- Reports the status of the node back to the rest of the system.
kube-proxy
kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。
docker
docker用于运行容器
RKT
rkt运行容器,作为docker工具一代方案。
supervisord
supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行。
fluentd
fluentd是一个守护进程,可提供cluster-level logging.