一、k8s架构
master/node两层架构;service-client架构
k8s官网架构图如下
简化后如下
二、k8s核心组件
master节点:apiserver,scheduler,controller-manager,etcd
node节点: kubelet,kube-proxy,docker
1、API Server
供Kubernetes API接口,主要处理 REST操作以及更新ETCD中的对象
所有资源增删改查的唯一入口。
2、Scheduler
资源调度,负责Pod到Node的调度。
3、Controller Manager
所有其他群集级别的功能,目前由控制器Manager执行。资源对象的自动化控制中心。
4、ETCD
所有持久化的状态信息存储在ETCD中。etcd组件作为一个高可用、强一致性的服务发现存储仓库。
5、Kubelet
管理Pods以及容器、镜像、 Volume等,实现对集群对节点的管理。
6、Kube-proxy
提供网络代理以及负载均衡,实现与Service通信
7、Docker Engine
负责节点的容器的管理工作
三、k8s常用控制器
控制器:用来控制pod的具体状态和行为;控制器又被称为工作负载,pod通过控制器实现应用的运维,比如伸缩、升级等
1、deployment
适合无状态的部署,用来管理pod和replicaset,具有上线部署、副本设定、滚动更新、回滚等功能,还可提供声明式更新,例如只更新一个新的Image
2、statefulset
适合部署有状态应用
--解决Pod的独立生命周期,保持Pod启动顺序和唯一性
--稳定,唯一的网络标识符,持久存储(例如:etcd配置文件,节点地址发生变化,将无法使用)
--有序,优雅的部署和扩展、删除和终止(例如:mysql主从关系,先启动主,再启动从)
--有序,滚动更新
3、daemonset
一次部署,所有node节点都会部署;适合以下场景
--运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph
--在每个Node上运行日志收集 daemon,例如 fluentd、 logstash
--在每个Node上运行监控 daemon,例如 Prometheus Node Exporter
4、job
一次性的执行任务
5、cronjob
周期性的执行任务
6、replicaset
用来确保容器应用的副本数量始终保持在用户自定义的副本数,即如果有容器异常退出,会自动创建新的pod来替代;而异常多出的容器也会自动回收;支持集合式的selector
四、常见服务的特点
1、无状态服务的特点:
1)deployment 认为所有的pod都是一样的
2)不用考虑顺序的要求
3)不用考虑在哪个node节点上运行
4)可以随意扩容和缩容
2、有状态服务的特点:
1)实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd,zookeeper
2)实例之间不对等的关系,以及依靠外部存储的应用。
3、常规的service服务和无头服务的区别:
service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
Headless service 无头服务,不需要cluster-IP,直接绑定具体的Pod的IP,无头服务经常用于statefulset的有状态部署