k8s理念
声明式API是k8s最核心的设计理念。
在k8s中推崇的使用方法是:
- 首先通过一个任务编排对象,比如Pod,Job,CronJob等,描述你试图管理的应用。
- 然后,为它定义一些运维能力对象,比如Service、Ingress等,这些对象会负责具体的运维能力侧功能。
这种使用方法就是所谓的“声明式API”,这种API对应的编排对象和服务器对象,都是k8s项目中的API对象。
“声明式API和控制器模式”的本质是将底层基础设施能力和运维能力接入k8s的一种手段。这个手段达成的最终效果就是如今k8s生态中数以千计的插件化能力,让用户能够基于k8s轻松构建出各种各样,面向用户的上层平台。
k8s组件
组件架构图
Master组件
kube-apiserver
k8s ApI,集群的统一入口,各组件的协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给etcd存储。
kube-controller-manger
处理集群中的常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
k8s控制器类型:
Deployment:适合无状态的服务部署 deployment详解
StatefulSet:适合有状态的服务部署 StatefulSet详解
DaemonSet:一次部署,所有的node节点都会部署 daemonSet详解
例如一些典型的应用场景:
运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph
在每个Node上运行日志收集 daemon,例如 fluentd、 logstash
在每个Node上运行监控 daemon,例如 Prometheus Node Exporter
Job:一次性的执行任务
Cronjob:周期性的执行任务
kube-scheduler
根据算法为新创建的pod选择一个Node节点,可以任意部署,可以部署在同一个节点上也可以部署在不同节点上。
etcd
分布式键值存储系统。用户保存集群状态,比如pod、service等对象信息。
Node组件
kubelet
kubelet是Master在Node节点上的Agent,管理本级运行容器的生命周期,比如创建容器、pod挂载数据卷,下载secret,获取容器和节点状态等工作。kubelet将每个pod转换成一组容器。
kube-proxy
在Node节点上实现pod网络代理,维护网络规则和四层负载均衡工作。
第三方容器引擎
例如:docker、containerd、podman
容器引擎,运行容器
k8s资源
Pod
k8s中的最小部署单元,一组容器的集合 pod详解
Deployment
最常见的控制器,用于更高级别部署和管理pod
Service
为一组pod提供负载均衡,对外提供统一的访问入口 service详解
Label
标签,附加在某个资源上,用于关联对象,查询和筛选
NameSpace
命名空间,将对象逻辑上分离,也有利于权限控制
k8s核心功能“全景图”
我们从最基础的容器出发,首先遇到了容器间紧密协作的难题,于是扩展到了pod;
有了pod之后,我们希望能一次性多启动几个应用实例,这样就需要deployment这个pod的多实例管理器;
而有了这样一组pod之后,我们又需要规定的IP和端口去以负载均衡的方式访问它,于是有了service;
两个pod之间不仅有访问关系,还要求在发起时加上授权信息,典型的比如web应用访问数据库,需要Credential(数据库的用户名密码)。Secret对象其实是保存在etcd里的键值对数据,这样你把Credential信息以Secret的方式存在etcd中,k8s就会在你指定的pod(web应用的pod)启动时,自动把Secret里的数据以Volumn的方式挂载到容器里,这样web应用就可以访问数据库了;
除了应用和应用之间的关系,应用的运行形态是影响“如何容器化这个应用”的第二个重要因素,比如Job用来描述一次性运行任务。DaemonSet用来描述每个宿主机上必须且只能运行一个副本的守护进程服务。CronJob用来描述定时任务等。