一、Master
集群的控制节点,每个kubenetes集群里需要有一个master节点来负责整个集群的管理和控制,基本上kubenetes所有控制命令都是发给它,它来负责具体的执行过程,是整个集群的大脑。
Master节点上运行着以下一组关键进程
- Kubenetes API(kube-apiserver),提供了HTTP接口的关键服务进程,是kubenetes里所有资源的增、删、改、查等操作的唯一接口,也是集群控制的入口进程。
- kubenetes controller manager(kube-controller-manager),kubenetes里所有资源对象的自动化控制中心,可以理解为对象的“大部管”。
- kubenetes scheduler(kube-scheduler),负责资源调度(POD)的进程,相当于公交公司的“调度室”。
其实master节点上往往还启动一个etcd server进程,因为kubenetes里所有的资源对象的数据全部保存在etcd中的。
二、Node
每个Node节点上都运行着以下一组关键进程
- kubelet:负责Pod对应的容的创建、启停等任务,同时与master节点密切协作,实现集群管理的基本功能。
- kube-proxy:实现kubenetes service的通信与负载均衡机制的重要组件。
- Docker Engine(docker):Docker引擎,负责本机的容器创建和管理工作。
Node节眯可以在运行期间动态增加到kubenetes集群中,一旦Node被纳入集群管理范围,kubelet进程会定时向master节点汇报自身的情报,如操作系统,docker版本,机器的CPU和内存情况,以及之前有哪些POD在运行等,这样master可以获知每个NODE的资源使用情况,关实现高效均衡的资源调度策略。而某个Node超过指定时间不上报信息时,会被master判定为失聪,Node的状态被标记为不可用(Not Ready),随后master会触发“工作负载大转移”的自动流程。
三、Pod
kubenetes的最重要也最基本的概念,每个pod都有一个特殊的被称为“根容器”的pause容器。pause容器对应的镜像属于kubenetes平台的一部分,除了pause容器,每个pod还包含一个或多个紧密相关的用户业务容器。
设计一个全新的pod容器的概念并且pod有这样特殊的组成结构
原因一:在一组容器作为一个单元的情况下,我们难以对整体简单地进行判断及有效地进行行动,如,一个容器列亡了,此时算是整体死亡么?引入业务无关并且不易死亡的pause容器作为pod的根容器,以它的状态代表整个容器组的状态,就简单,巧妙地解决了这个难题。
原因二:pod里的多个业务容器共享pause 容器的IP,共享pause容器挂载的volume,这样即简化了密切关联的业务容器之间的通信问题,也很好地解决了它们之间的文件共享问题。kubenetes为每个pod都分配了一个IP地址,称为podip,一个pod里的多个容器共享podip地址,要求底层网络支持集群内任意两个pod之间的tcp/ip直接通信。这通常采用的是虚拟二层网络技术来实现,例如:flannel,openvswitch等。因此我们需要牢记一点,在kubenetes里,一个pod里的容器与另外主机上的pod容器能直接通信。
pod分为两类型:普通的pod及静态的pod(static pod),后者比较特殊,它并不存放在kubenetes的etcd里,而是存放在某个具体的node上的一个具体文件中,并且只在此node上启动运行,而普通的pod一旦被创建,就会被放入到etcd中存储,然后会被kubenetes master调度到某个具体的node上并进行绑定,随后该pod被对应的node上的kubelet进程实例化成一组相关的docker容器并运行起来。在默认情况下,当pod里的某个容器停止时,kubenetes会自动检测到这个问题并且重新启动这个pod(重启pod里的所有容器),如果pod所在的node宕机,则会将这个node上的所有pod重新调度到其他节点上,pod、容器与node的关系如下图
我们可以执行以下命令查看集群中有多少个node
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 24m v1.16.4 node01 Ready <none> 13m v1.16.4 node02 Ready <none> 13m v1.16.4
通过kubectl describe node node02来查看某个node详细信息
[root@master ~]# kubectl describe node node02 Name: node02 #名称 Roles: <none> Labels: beta.kubernetes.io/arch=amd64 #标签 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=node02 kubernetes.io/os=linux Annotations: flannel.alpha.coreos.com/backend-data: {"VtepMAC":"1e:71:ab:d1:3f:f0"} flannel.alpha.coreos.com/backend-type: vxlan flannel.alpha.coreos.com/kube-subnet-manager: true flannel.alpha.coreos.com/public-ip: 192.168.1.222 kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock node.alpha.kubernetes.io/ttl: 0 volumes.kubernetes.io/controller-managed-attach-detach: true CreationTimestamp: Tue, 18 Feb 2020 23:06:05 +0800 #创建时间 Taints: <none> Unschedulable: false Conditions: Type Status LastHeartbeatTime (当前状态) LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- MemoryPressure False Tue, 18 Feb 2020 23:20:37 +0800 Tue, 18 Feb 2020 23:06:05 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Tue, 18 Feb 2020 23:20:37 +0800 Tue, 18 Feb 2020 23:06:05 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False Tue, 18 Feb 2020 23:20:37 +0800 Tue, 18 Feb 2020 23:06:05 +0800 KubeletHasSufficientPID kubelet has sufficient PID available Ready True Tue, 18 Feb 2020 23:20:37 +0800 Tue, 18 Feb 2020 23:08:36 +0800 KubeletReady kubelet is posting ready status Addresses: InternalIP: 192.168.1.222 Hostname: node02 Capacity: cpu: 1 #cpu个数 ephemeral-storage: 19266Mi hugepages-2Mi: 0 memory: 977812Ki #内存 pods: 110 #最大调度的pod数量 Allocatable: cpu: 1 ephemeral-storage: 18181678665 hugepages-2Mi: 0 memory: 875412Ki pods: 110 System Info: #可分配资源。 Machine ID: ef907a7e0bc44c678641abe2dc75995b System UUID: e8174d56-49af-9d5b-a726-e03cda7ed8d1 Boot ID: 33f7bb05-4f4d-4c74-a1fa-28476d66137f Kernel Version: 5.5.4-1.el7.elrepo.x86_64 OS Image: CentOS Linux 7 (Core) Operating System: linux Architecture: amd64 Container Runtime Version: docker://18.6.3 Kubelet Version: v1.16.4 Kube-Proxy Version: v1.16.4 PodCIDR: 10.244.2.0/24 PodCIDRs: 10.244.2.0/24 Non-terminated Pods: (2 in total) #正在运行的pod列表摘要。 Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE --------- ---- ------------ ---------- --------------- ------------- --- kube-system kube-flannel-ds-amd64-fmxbr 100m (10%) 100m (10%) 50Mi (5%) 50Mi (5%) 14m kube-system kube-proxy-2tctz 0 (0%) 0 (0%) 0 (0%) 0 (0%) 14m Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 100m (10%) 100m (10%) memory 50Mi (5%) 50Mi (5%) ephemeral-storage 0 (0%) 0 (0%) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Starting 14m kubelet, node02 Starting kubelet. Normal NodeHasSufficientMemory 14m (x2 over 14m) kubelet, node02 Node node02 status is now: NodeHasSufficientMemory Normal NodeHasNoDiskPressure 14m (x2 over 14m) kubelet, node02 Node node02 status is now: NodeHasNoDiskPressure Normal NodeHasSufficientPID 14m (x2 over 14m) kubelet, node02 Node node02 status is now: NodeHasSufficientPID Normal NodeAllocatableEnforced 14m kubelet, node02 Updated Node Allocatable limit across pods Normal Starting 14m kube-proxy, node02 Starting kube-proxy. Normal NodeReady 12m kubelet, node02 Node node02 status is now: NodeReady
三、Label
一个Label是一个key=value的键值对,其中key与value由用户自己指定
Label可以被附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。
一些常用的Label示例如下。
- 版本标签:"release":"stable"、"release":"canary"。
- 环境标签:"environment":"dev"、"environment":"qa"、"environment":"production"。
- 架构标签:"tier":"frontend"、"tier":"backend"、"tier":"middleware"。
- 分区标签:"partition":"customerA"、"partition":"customerB"。
- 质量管控标签:"track":"daily"、"track":"weekly"。