简介
Kubernetes 系统基础
Last updated
Kubernetes 系统基础
Last updated
Kubernetes作为云原生应用的基石,相当于一个云操作系统,其重要性不言而喻。 2014年6月开源,GO语言开发,Kubernetes 简称“K8S”,正确的发音是[kubə’netis] 中文独译:[库伯奶踢死] 2015年7月,Kubernetes v1.0正式发布,目前最新稳定版本是v1.13 使用的话11或者12。 2019年9月,Kubernetes 迎来了 2019 年的第三个新版本 1.16,更新内容传送门。
一、Kubernetes介绍
Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署
和管理系统
。Kubernetes的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。 Kubernetes 具备完善的集群管理能力,包括多层次的安全防护
和准入机制
、多租户
应用支撑能力、透明的服务注册
和服务发现
机制、内建负载均衡
器、故障发现
和自我修复
能力、服务滚动升级
和在线扩容
、可扩展的资源自动调度机制、多粒度的资源配额管理能力。 Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。
数据卷
Pod中容器之间共享数据,可以使用数据卷。
应用程序健康检查
容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。
复制应用程序实例
控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。
弹性伸缩
根据设定的指标(CPU利用率)自动缩放Pod副本数。
服务发现
使用环境变量或DNS服务插件保证容器中程序发现Pod入口访问地址。
负载均衡
一组Pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他Pod可通过这个ClusterIP访问应用。
滚动更新
更新服务不中断,一次更新一个Pod,而不是同时删除整个服务。
服务编排
通过文件描述部署服务,使得应用程序部署变得更高效。
资源监控
Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示。
提供认证和授权
支持角色访问控制(RBAC)认证授权等策略。
二、Kubernetes和新对象概念
Pod
Pod是最小部署单元,一个Pod有一个或多个容器组成,Pod中容器共享存储和网络,在同一台Docker主机上运行。
Service
Service一个应用服务抽象,定义了Pod逻辑集合和访问这个Pod集合的策略。
Service代理Pod集合对外表现是为一个访问入口,分配一个集群IP地址,来自这个IP的请求将负载均衡转发后端Pod中的容器。
Service通过Lable Selector选择一组Pod提供服务。
Volume
数据卷,共享Pod中容器使用的数据。
Namespace
命名空间将对象逻辑上分配到不同Namespace,可以是不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。
命名空间也称为虚拟集群。
Lable
标签用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。
2.2 基于基本对象更高层次抽象
ReplicaSet
下一代Replication Controller。确保任何给定时间指定的Pod副本数量,并提供声明式更新等功能。
RC与RS唯一区别就是lable selector支持不同,RS支持新的基于集合的标签,RC仅支持基于等式的标签。
Deployment
Deployment是一个更高层次的API对象,它管理ReplicaSets和Pod,并提供声明式更新等功能。
官方建议使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,这就意味着可能永远不需要直接操作ReplicaSet对象。
StatefulSet
StatefulSet适合持久性的应用程序,有唯一的网络标识符(IP),持久存储,有序的部署、扩展、删除和滚动更新。
DaemonSet
DaemonSet确保所有(或一些)节点运行同一个Pod。当节点加入Kubernetes集群中,Pod会被调度到该节点上运行,当节点从集群中
移除时,DaemonSet的Pod会被删除。删除DaemonSet会清理它所有创建的Pod。
Job
一次性任务,运行完成后Pod销毁,不再重新启动新容器。还可以任务定时运行。
三、Kubernetes系统架构与组件功能
kube- - apiserver(网关)
Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd持久化存储。
kube- - controller- - manager(控制管理器)
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
常规后台任务
生命周期功能:例如,Namespace创建和生命周期、Event垃圾回收、node垃圾回收
API业务逻辑:例如,ReplicaSet执行的Pod扩展等。
kube- - scheduler ((死该救乐 调度器)
Pod发给apisever的请求确认后,便需要scheduler根据节点可用资源及容器资源需求,进行调度,然后根据调度算法为新创建的Pod选择一个Node节点。
node组件
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、
下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
kube- - proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker 或 cri-o/rkt
运行容器。
四、第三方服务(核心附件)
k8s集群还依赖与一组称为“附件”的组件,已提供完整的功能。
Etcd Etcd是独立的分布式键值存储系统。用于保持集群状态(服务发现,共享配置,一致性保障),比如Pod、Service等对象信息 etcd除了存储,还提供了(watch)监听机制,用于监听和推送变更,当etcd键值变化会通知apiserver,并通过watchapi向客户端输出。
CorsDNS CorsDNS主要作为动态名称解析服务出现,在集群中调度运行提供DNS服务的Pod。
Kubernetes Dashboard 提供WEB的UI,来管理集群中的应用设置是集群自身。
Heapster 主要是负责容器节点的性能监控
与分析
,1.1.2后由 Prometheus
结合其它组件所取代。
Ingress Contorller Ingress 实现http(s)负责均衡机制(7层),Ingress资源自身不能提供流量穿透
,要通过ingress控制器(controller)发挥作用;(可用项目Nginx,Haproxy等) service是四层负载均衡