Kubernetes学习之路1-概念
1.基本概念
Cluster
K8s集群,包含Master节点,Node节点。
Master
Master是k8s集群中主节点,负责应用访问调度,可集群部署,运行多个Master。
Node
Node归属于Master管理的节点,负责监控汇报容器状态,并根据Master要求管理容器生命周期。
Pod
容器组,可设置标签,K8s运行管理最小单元,一个容器组中运行一个或多个相关联的容器,各个容器之间共享一个网络中的namespace,可通过localhost进行通信,且共享存储。
controller
controller是K8s管理pod的模块,controller定义pod的属性,副本数量,在什么样的Node运行。
Deployment 可以管理Pod的多个副本,并确保Pod按照期望运行。
ReplicaSet 使用Deployment会直接创建ReplicaSet来管理副本。
DaemonSet 用于运行一个Pod场景,通常测试用。
StatefuleSet能够保证Pod的每个副本在整个生命名称不变,即重启后副本会按照固定的顺序启动,更新,删除。
Job用于运行完就删除的应用
整体来说用的最多的还是Deployment。
Service
Deployment可以部署多个pod与副本pod,每个pod都有自己的ip,外界访问pod服务,其实是访问service的ip与端口,再自动由Service提供负载均衡。
整体来说,Deployment实现了pod的部署,Service实现了pod的访问。
Namespace
多项目公用K8s集群,如何区分不同项目的Deployment与Pod,即利用Namespace。
Namespace将物理集群划分为多个虚拟集群,每个虚拟集群就是一个Namespace,不同Namespace中资源完全隔离。
K8s默认两个Namespace
default:创建资源不指定,则被放入该Namespace。
kube-system:k8s自己创建的系统资源将被放入这里。
2.K8s架构和集群
Master主节点:
API Server:K8S对外的唯一接口,提供HTTP/HTTPS RESTful API,即kubernetes API。所有的请求都需要经过这个接口进行通信。主要处理REST操作以及更新ETCD中的对象。是所有资源增删改查的唯一入口。 Scheduler:资源调度,负责决定将Pod放到哪个Node上运行。Scheduler在调度时会对集群的结构进行分析,当前各个节点的负载,以及应用对高可用、性能等方面的需求。 Controller Manager:负责管理集群各种资源,保证资源处于预期的状态。Controller Manager由多种controller组成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller等。 ETCD:负责保存k8s 集群的配置信息和各种资源的状态信息,当数据发生变化时,etcd会快速地通知k8s相关组件,ETCD一般采用集群方式部署 Pod网络:Pod要能够相互间通信,K8S集群必须部署Pod网络,flannel是其中一种的可选方案。
Node节点:
Kubelet:kubelet是node的agent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image、volume等)发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向master报告运行状态。 Kube-proxy:service在逻辑上代表了后端的多个Pod,外部通过service访问Pod。service接收到请求就需要kube-proxy完成转发到Pod的。每个Node都会运行kube-proxy服务,负责将访问的service的TCP/UDP数据流转发到后端的容器,如果有多个副本,kube-proxy会实现负载均衡,有2种方式:LVS或者Iptables。 Docker Engine:负责节点的容器的管理工作。
创建Pod流程
(1)客户创建请求,可通过API Server Restful API ,可通过kubectl命令行,支持yaml与json.
(2)API接收请求,存储Pod配置数据到etcd。
(3)调度器通过API Server查看未绑定Pod,准备为pod分配主机。
(4)调度预选:调度器用规则过滤一部分不符合的主机,比如Pod指定了所要资源配置等。
(5)调度优选:对符合要求的主机进行打分,调度器考虑整体优化策略,如部署负载等。
(6)确定主机:选择打分最高的主机,进行binding操作,结果存在etcd中。
(7)scheduler调用APIServer的API在etcd中创建一个boundpod对象,描述一个工作节点上绑定运行所有pod信息。运行在各个节点上的kubelet也会定期与etcd同步boundpod信息,一旦发现该工作节点上boundpod没有更新,则调用docker API 创建并启动pod内容器。
参考于CloudMan老师公众号《每天5分钟玩转Kubernetes》https://item.jd.com/26225745440.html