1.核心对象
NameSpaces
当集群有多个用户或一个用户有多个应用需要管理时,需要对被管理的对象进行隔离。不同的对象被划分到不同的namespaces后,可以通过权限控制来限制用户以何种权限访问namespaces的哪些对象,进而构建一个多租户,彼此隔离的通用集群。
namespaes,它提供一种内核级别的隔离方式,系统可以为进程分配不同的namespaces,并保证不同namespace资源独立分配,进程彼此隔离,即不同的namespace下的进程互不干扰。
namespace提供六项隔离:分别是ipc,network,pid,mount,uts,usr,分别为“system v ipc和posix消息队列”,“网络”,“进程”,“挂载点”,“主机名和域名”,“用户和用户组”。
Pod
容器云平台需要解决的最核心的问题就是应用运行,kubernetes将容器化应用运行的实例抽象为pod。它是一个或者多个容器镜像的组合。当应用启动后,容器镜像对应一组进程。并且在同一个pod中的容器共用同一网络标识。pod具有基本的自恢复能力,当每个副本出现问题时,它会按照预定策略重启。
pod分配原则是选择最佳节点运行。每个计算节点汇报自己的心跳信息,并上报节点的资源总量和可用资源。
pod分为静态pod和普通pod
静态pod:静态pod不经过apiserver,kubelet通过观测本地目录或者http url下的定义文本文件所创建的pod。静态pod始终绑定到kubelet所在节点上。比如我们通过kubelet绑定了静态pod目录,那么kubelet观测到该目录下的yaml文件会自动创建pod,删除的方法也就删除该yaml文件。
普通pod:通过api server创建的pod,是被scheduler调度到该节点上的。
ServiceAccount
pod运行中需要与kubernetes api通信,在启用了安全配置的集群后,pod一定要以某种身份与kubernetes通信,这个身份就是系统用户(serviceaccount),k8s会自动为每个namespaces创建一个default serviceaccount 并且为每个service account分配一个jwt token,这个token会存储在secret中。用户可以在pod定义中指定service account,其对应的token会被挂载在pod中,pod进程可以通过该token与k8s进行通信。
ReplicaSet
保证总是按照用户期望的数量保证pod正常运行,当某个副本宕机后,控制器建立一个新的副本。当业务发生变化后需要调整扩容缩容,可以方便调整副本数量。
Deployment
如何在更新的时候业务不中断,一直是需要解决的问题。
deployment就是描述发布过程的对象,其实现的机制是,当某个应用有新版本发布时,deployment会同时操作两个版本的replicaset。其内置多种滚动升级策略。
1.能够保证目标数量的pod运行,且使应用的服务在宕机后也不会降级。
2.即按照制定策略滚动升级,同时支持暂停,恢复和回滚。
3.可以便利的进行扩容和缩容,以应对负载的频繁变化。
service和ingress
待补充
persistenvolume和persistenvolumeclaim
pv是集群的一块存储卷,可以由管理员手动设置,或当用户创建pvc时根据storageclass动态设置。
pv和pvc的声明周期与pod无关,也就是说当pod出现重启,重新调度,删除时,pv和pvc不会受到影响,pod存储在pv中的数据得以保留.
纪要
1.采用本地静态存储
使用nfs挂载方式。
1.创建pv-绑定pvc-创建pod
特点:1.pod删除或者重启,数据都会存储在硬盘中,pod重启后pod中的数据依然在。
2.无法直接删除pvc因为pvc保护机制,pod还在使用这个pvc,必须先删除pod。删除pvc,pv后,数据依然保留。
2.动态存储storageclass
1.创建serviceaccount
2.rbc鉴权
3.创建storageclass
4.用户创建pv自动创建pvc
2.控制器
控制器模式是一个标准的生产者-消费者模式。一方面控制器在启动后,informer会监听其所关注的对象变化,一旦pod发生了创建,更新和删除等事件,这些事件会由核心组件api server推送给控制器,控制器会将对象保存在本地缓存中,将对象的信息推送给消息队列,此为生产者。
控制器会启动多个工作子进程(worker)从队列中依次获取对象信息,并从缓存中读取完整状态,并按照期望状态完整配置更改,并将最终状态回写至api server,此为消费者。
etcd
etcd是高可用的键值对的分布式安全存储系统,用于持久化存储集群中所有的资源对象。例如集群中的node,service,pod的状态和元数据,以及配置数据等。
apiserver
承担api的网关职责,是用户请求及其他系统组件与集群交互的唯一入口。所有资源的创建,更新和删除都需要通过调用api server中的api接口来完成。
对内,api server是各个模块之间数据交互的通信枢纽,api能够让其他组件监听到集群资源中的增删改查。
对外,充当网关作用,拥有集群的安全机制,完成客户端的身份验证,授权,并对资源进行准入控制。
controller manager
控制器是k8s集群自动化管理控制中心,里面包含了30多个控制器,有管理pod的控制器,有管理网络的控制器,有存储相关的控制器。
有很多场景需要多个控制器协同工作,比如某个节点宕机,kubelet会停止汇报状态到node对象,nodelifecycle控制器会发现状态没有按时更新,超过一段时间,它将驱逐节点上的pod。如果副本数量变少,控制器会补全pod副本数量,替换掉因为宕机而被删除掉的pod。
scheduler
集群中的调度器主要负责pod在集群节点中的调度分配。
scheduler通过运算查看node是否满足pod运行,不满足则被过滤
满足条件的node会按照端口占用,空闲资源,对实际资源的利用率等信息排序,评分最高的节点被更新到nodename属性中,该属性经api server保存到etcd中。
预选策略
podfitshostports:判断pod所要求的端口是否在节点中被占用。
podfitshost:判断node是否是pod中的spec.nodename指定的节点
podfitsresources:判断节点是否潘祖pod中申请的resource(例如cpu,memory的要求)。
podmatchnodeselector:判断节点是否满足spec.nodeselector限制。
novolumezoneconflict:评估pod spec.volume申请的存储卷是否在这个节点可用。
nodiskconflict:判断pod的volumes和该节点上挂载的磁盘是否有冲突。
maxcsivolumecount:判断节点是否已经在汇报是否有内存压力。
checknodediskpressure:判断节点是否已经在汇报有存储压力。
checknodecondition:根据节点的status.conditions判断节点状态,node节点是否可用。
podtoleratesnodetaints:判断pod上的toleration是否满足节点上的taints。
checkvolumebinding:检查节点是否满足pod所有的volume请求,包括bound和unbound的pvcs。
leastrequestedpriority:节点上的已有pod申请的资源越少,得分越高。
selectorspreadpriority:便利weighted的podaffinityterm的元素,如果节点满足相应的podaffinityterm条件。
还有一部分预选策略不再赘述,比如检查node是否已有pod所需的镜像,比如保证service后端的pod运行在不同的节点上。
kubelet
kubelet是运行在每个节点上的负责启动容器的重要的守护即成,在启动时,kubelet进程加载配置参数,向api server处创建一个node对象来注册自身信息。例如操作系统,kernel版本ÿ