(2)Kubernetes基本概念和术语
k8s中大部分概念如Node、Pod、Replication Controller、Service等都可以看作是一种 资源对象,几乎所有的资源对象都可以通过Kubernetes提供的kubectl工具执行增删改查并将其保存在etcd中持久化存储。 从这个角度看,k8s是一个高度自动化的资源监控系统,通过跟踪对比etcd库里保存的资源期望状态与当前环境中的实际资源状态的差异来实现自动控制与自动纠错的高级功能。
以下来解释一些常见术语
1、Master
集群控制节点 所有的控制命令都是发给这个节点,然后他来负责具体的执行过程,如果他宕机,则左右控制命令都会失败。
主要进程如下:
Kubernetes API Server(kube-apiserver)提供了标准的 Rest 接口,是k8s资源增删改查的唯一入口。
Kubernetes Controller Manager (kube-controller-manager) 所有资源的自动化控制中心。
Kubernetes Scheduler(kube-scheduler) 负责资源调度的进程。
etcd 资源对象的数据保存
2、Node
工作负载节点,每个Node都会被Master分配一些工作负载(Docker)容器,当某个Node宕机,其上的工作负载会被Master转到其它节点
主要进程入下:
kubelet 负责Pod对应容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
kube-proxy 实现k8s的通信与负载均衡的主要组件
Docker Engine (docker) Docker引擎,负责容器创建以及管理工作
在Master获取Node信息命令如下:
#查看集群中有多少个node
[root@node1 ~]# kubectl get nodes NAME STATUS AGE node2 Ready 24d node3 Ready 24d
#查看node2的详细信息 [root@node1 ~]# kubectl describe node node2 #名称、标签、创建时间
Name: node2 Role: Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/hostname=node2 Taints: <none> CreationTimestamp: Tue, 23 May 2017 09:04:05 +0800 Phase: #node当前的运行状态 比如:磁盘满了就会OutOfDisk就会标注True
Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- OutOfDisk False Fri, 16 Jun 2017 10:31:56 +0800 Tue, 23 May 2017 09:36:59 +0800 KubeletHasSufficientDisk kubelet has sufficient disk space available MemoryPressure False Fri, 16 Jun 2017 10:31:56 +0800 Tue, 23 May 2017 09:04:05 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Fri, 16 Jun 2017 10:31:56 +0800 Tue, 23 May 2017 09:04:05 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure Ready True Fri, 16 Jun 2017 10:31:56 +0800 Tue, 23 May 2017 09:36:59 +0800 KubeletReady kubelet is posting ready status #node的IP地址和主机名
Addresses: 192.168.59.12,192.168.59.12,node2 #资源总量
Capacity: alpha.kubernetes.io/nvidia-gpu: 0 cpu: 8 memory: 3882344Ki pods: 110 #可分配的资源
Allocatable: alpha.kubernetes.io/nvidia-gpu: 0 cpu: 8 memory: 3882344Ki pods: 110 #主机系统信息
System Info: Machine ID: 241163503ce842c489360d0a48a606fc System UUID: D55867F7-F78F-4C50-A691-414BBCAE6141 Boot ID: a6f0316a-d7ff-415a-9fb3-4c82c8b5c2cd Kernel Version: 3.10.0-229.el7.x86_64 OS Image: CentOS Linux 7 (Core) Operating System: linux Architecture: amd64 Container Runtime Version: docker://1.12.6 Kubelet Version: v1.5.2 Kube-Proxy Version: v1.5.2 ExternalID: node2 #正在运行的Pod
Non-terminated Pods: (0 in total) Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits --------- ---- ------------ ---------- --------------- ------------- #Requests表示该资源的最小申请量 limit为最大使用量
Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted. CPU Requests CPU Limits Memory Requests Memory Limits ------------ ---------- --------------- ------------- 0 (0%) 0 (0%) 0 (0%) 0 (0%) #event记录了资源的一些事件信息,对排错有很大的用
No events
3、Pod
Pod是k8s最重要也是最基本的概念
每个Pod都有一个特殊的被称为跟容器的Pause容器 ,Pause容器属于k8s平台一部分,初此之外,每个Pod还包含一个或多个紧密相关的用户业务容器。
为什么设计一个全新的Pod概念:
1.在一组容器为一个单元的情况下,难以对整体简单进行判断,引入业务无关切不容易死亡的Pause容器作为Pod根容器,以它状态来代表容器组的状态。
2.Pod里多个业务容器共享Pause容器的IP、挂接的Volume、简化了密切关联容器通信和文件共享问题。
注:k8s要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,通常采用虚拟二层网络技术实现,如Flannel、Openvswitch等 使一个Pod里的容器于其它主机Pod容器能够直接通信
3.Pod 资源限额 以千分之一个cpu来划分 100~300m 指0.1到0.3个CPU 内存 64Mi 分配64M
4、Label
标签 一个Label是一个key=value的键值对,可附加到各个资源对象上,以后可以通过Label Selector(标签选择器) 来查询和筛选用有某些标签的资源对象
使用Label可以对对象创建多组标签,Label和Label Selector共同构成了Kubernetes系统中最核心的应用模块,使得被管理对象能够精细的分组管理,同时实现了整个集群的高可用性。
5、Replication Controller (RC)
RC 简单来说定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值。
RC包括以下几个部分:
1. replicas Pod期待的副本数 注:如果为了删除所有的Pod,可以将replicas设置为0,然后更新该RC
2.selector 用于筛选目标Pod的Label Selector
3.template 当Pod的副本数小于预期数量的时候,用于创建新Pod的Pod模板。
由于Replication Controller与kubernetes中的模块Replication Controller同名,所以在kubernetes 1.2 ,它升级为Replica Set ,与之前的RC的唯一区别是支持基于集合的Label selector ,而RC只支持基于等式的Label Selector 这使得Replica Set的功能更强。
总结RC(Replica Set)的一些特性及作用:
在大多数情况下,我们通过定义一个RC实现Pod的创建过程以及副本数量的自动控制。
RC里包括完整的Pod定义模板
RC通过Label Selector 机制实现对Pod副本的自动控制
通过改变RC的Pod副本数量,可以实现Pod的扩容和缩容功能
通过改变RC里Pod模板中的镜像版本,可以实现Pod的滚动升级功能
6、Deployment
Deployment是kubernetes1.2引入的概念,为了更好的解决Pod编排问题。相比于RC是我们可以随时知道当前Pod部署的进度
典型适用场景:
创建一个Deployment对象来生成对应的Replica Set并完成Pod副本的创建过程
检查Deployment的状态来看部署动作是否完成(Pod副本的数量是否达到预期的值)
更新Deployment以创建新的Pod(比如镜像升级)
如果当前的Depoyment不稳定,则回滚到一个早先的Deployment版本
挂起或者回复一个Deployment
7、Horizontal Pod Autoscaler (HPA)
简称HPA,意思是Pod横向自动扩容,也属于k8s的一种资源对象
实现原理: 通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性的调整目标Pod的副本数
HPA有以下两种方式来作为HPA的负载指标
1.CPUUtilizationPercentage 是指Cpu利用率的平均值(通常是1分钟,目前是通过Heapster扩张组件来得到这个值),用当前CPU的使用量除以它的Pod Request值 ,高于指定值(targetCPUUtilizationPercentage)就会创建新的Pod副本数(最大不超过设置的maxReplication)
2.应用程序自定义的度量标准,比如服务在每秒内的响应的请求数(TPS或QPS)
8、Service
服务,k8s的每个Service就是我们经常提起的微服务架构中的一个微服务
1.Service与其后端Pod副本集群之间通过label Selector 来实现无缝对接的,k8s通过在每个node节点的kube-proxy实现智能负载均衡,Service不是共用一个负载均衡器的ip,而是每个Service分配了一个全局的唯一的虚拟IP(Cluster IP)
Cluster IP:
1.Cluster IP仅仅作用于Kubernetes Service这个对象,并由kubernetes管理和分配IP池
2.Cluster IP无法被ping,因为没有一个实体网络对象来相应
3.Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP 不具备TCP/IP通信的基础,并且它们只属于Kubernetes集群这样一个封闭的空间,集群之外的节点要访问这个通信端口,则要做一些额外的工作
4.在Kubernetes集群之内,Node IP网、Pod IP网与Cluster IP网之间的通信,采用的是Kubernetes自己设计的一种编程方式的特殊的路由规则,与我们熟知的IP路由有很大的不同。
外部网络访问service是通过Nodeport来访问的。
9、Volume
存储卷(Volume)是Pod中能够被多个容器访问的共享目录。与Pod的生命周期相同,支持多种类型的volume,例如GlusterFS,Ceph等。
Volume类型:
1.emptyDir pod分配到Node时创建的。 用途:临时空间、长时间任务的中断过程CheckPoint的临时保存目录、多容器共享目录
2.hostPath pod挂在宿主机上的文件和目录
3.gcePersistentDisk
4.NFS
10、Persisten Volume
kubernetes集群中某个网络存储中对应的一块存储,它与Volume很类似,区别如下:
PV只能是网络存储,不属于任何node,但可以在每个node上访问
不是定义在Pod上的
目前只有几种类型 GCE Persistent Disks 、NFS、RBD、iSCSCI、GlusterFS等。
11、Namespace
用于实现多租户的资源隔离,Namespace通过将集群内部的资源对象分配到不同的namespace中,形成逻辑上分组的不同项目、小组和用户组
默认分配到名为default的NameSpace中,一旦创建了namespace就可以指定哪些资源属于哪个namespace
还可以结合k8s的资源配额管理,限定不同租户能占用的资源。
以上即为k8s的核心组件,他们共同组成了k8s的系统的框架和计算模型,通过对他们进行灵活组合,用户可快速方便的对容器集群进行配置、创建、和管理。