Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。 Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。 Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。
一. 总体架构图
1. 核心组件
-
kube-apiserver
提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制 -
controller manager
负责维护集群的状态,比如故障检测、自动扩展、滚动更新等 -
scheduler
负责资源的调度,按照预定的调度策略将pod调度到相应的node上 -
etcd
保存了整个集群的状态信息 -
kubelet[节点上的pod管家]
a. 负责node节点上pod的创建、修改、监控、删除等生命周期的管理
b. 定时上报本node的状态信息给kube-apiserver
c. 接收kube-apiserver下发的指令
d. 通过kube-apiserver简介与etcd集群交互,读取配置信息 -
kube-proxy
a. kube-proxy提供TCP/UDP sockets的proxy,每创建一种service,kube-proxy主要从etcd获取service和endpoints的配置信息,然后根据配置信息从node上启动一个porxy的进程并监听相应的服务端口,当外部请求发生时kube-proxy会根据load balancer将请求分发到后端正确的容器处理
b. kube-proxy不但解决了同一服务端口冲突的问题,还提供了service转发服务端口对外提供服务的能力,kube-proxy后端使用了随机/轮询负载均衡算法 -
container runtime(docker)
负责镜像管理以及pod和容器的真正运行(CRI)
2. 附加组件[Add-ons]
- kube-dns负责为整个集群提供DNS服务
- Ingress Controller为服务提供外网入口
- Heapster提供资源监控
- Dashboard提供GUI
- Federation提供跨可用区的集群
- Fluentd-elasticsearch提供集群日志采集、存储与查询
二、kubernetes的核心资源和API对象
API对象是kubernetes集群中的管理操作单元。kubernetes集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作。例如副本集Replica Set对应的API对象是RS。
每个API对象都有3大类属性:元数据metadata、规范spec和状态status。
-
元数据metadata
用来标识API对象,每个对象至少有3个元数据:namespace name uid
除此之外还有各种各样的标签labels用来标识和匹配不同的对象
-
规范spec
描述了用户期望kubernetes集群中的分布式系统达到的理想状态
kubernetes中所有的配置都是通过API对象的spec去设置的,这是kubernetes重要设计理念之一,即所有的操作都是声明式(declarative)的而不是命令式(imperative)的 -
状态status
描述了系统实际当前达到的状态。
kubernetes资源分类:
类别 | 名称 |
---|---|
资源对象 | Pod、ReplicaSet、 ReplicationController、 Deployment、 StatufulSet、 DaemonSet、 Job、 CronJob、 HorizontalPodAutoscaling、 Node、 Namespace、 Service、 Ingress、 Label、 CustomResourceDefinition |
存储对象 | Volume、 PersistentVolume、 Secret、 ConfigMap |
策略对象 | SecurityContext、 ResourceQuota、 LimitRange |
身份对象 | ServiceAccount、Role、ClusterRole |
kubernetes核心资源介绍:
1、Pod
在kubernetes集群中,pod是所有业务类型的基础,它是一个或多个容器的组合。这些容器共享存储、网络和命名空间以及如何运行的规范。在pod中,所有容器都被统一安排和调度,并运行在共享的上下文中。pod的上下文可以理解成多个linux命名空间的联合:
- PID 命名空间(同一个pod中应用可以看到其他进程)
- 网络命名空间(同一个pod中的应用对相同的IP地址和端口有权限)
- IPC命名空间(同一个pod中的应用可以通过vpc或POSIX进行通信)
- UTS命名空间(同一个pod中的应用共享一个主机名称)
2. Replication Controller(副本控制器,RC)
RC是Kubernetes较早期的技术概念。是kubernetes集群中最早的保证Pod高可用的API对象,通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。
3. ReplicaSets
下一代Replication Controller,与Replication Controller唯一的区别在对匹配模式的支持上,ReplicaSets支持更多的匹配模式。
4. Deployment(无状态应用)
为Pod和ReplicaSet提供了一个声明式(declarative)方法,用来替换以前的Replication Controller来方便的管理应用,你只需要在Deployment中描述你想要的目标状态,Deployment Controller就会帮你将Pod和Replica Set的实际状态改变到你的目标状态。典型应用场景包括:
- 定义Deploymeng来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
- …
5. StatefulSet(有状态应用)
对于RC和RS中的Pod,一般不挂载存储或者挂载共享存储,保存的是所有Pod共享的状态,Pod和畜牲一样没有分别;对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续以它的状态提供服务。
适合于StatefulSet的业务包括数据库服务MySQL和PostgreSQL,集群化管理服务Z哦哦Keeper、etcd等有状态服务。StatefulSet做的只是将确定的Pod与确定的存储关联起来保证状态的连续性
6. DaemonSet
DaemonSet服务的核心关注点在Kubernetes集群中的节点(物理机或虚拟机),要保证每个节点上都有一个此类Pod运行。节点可能是所有集群节点也可能是通过nodeSelector选定的一些特定节点。典型的DaemonSet服务包括:存储、日志和监控等在每个节点上支持Kubernetes集群运行的服务
7. Job(任务)
Job是Kubernetes用来控制批处理型人物的API对象。Job和DaemonSet服务最大的区别在于:Job任务完成之后就自动退出,而DaemonSet服务在用户不停止的情况下永远运行。Job成功完成的标志根据不同的spec.completions策略而不同。
8. CronJob(定时任务)
类似linux系统的crontab,在指定的时间周期运行指定的任务。在某些版本的kubernetes中需要开启batch/v2alpha1 API,即-runtime-config=batch/v2alpha1
9. Service(服务)
Service定义了一组Pod的策略抽象,这些被标记的Pod都是通过label Selector决定的。Service提供了外部服务访问Pod的入口。在集群中表现为一组iptables规则。
10. ConfigMap
ConfigMap是存储通用的配置变量的,类似与配置文件,是用户可以将分布式系统中用于不同模块的环境变量同意到一个对象中管理;而它与配置文件的区别在于它是存在集群的环境中的,并且支持K8S集群中所有通用的操作调用方式。从数据角度来看,ConfigMap的类型只是键值组,用于存储被Pod或者其他资源对象访问的信息。
11. Secret
和ConfigMap一样,只不过Secret用来保存和传递密码、密匙、认证凭证等敏感信息的对象,可以避免将敏感信息明文写在配置文件里。
12. Namespace(命名空间)
命名空间Namespace为Kubernetes集群提供虚拟的隔离作用,Kubernetes集群初始有两个命名空间,分别是default和kube-system,除此之外,管理员可以创建新的命名空间满足需要
13. Node
Kubernetes集群中的计算能力由Node提供,最初Node称为服务节点Minion,后来改名为Node。