kubenetes基本概念和术语

一、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"。

 

posted @ 2020-02-18 22:30  星火撩原  阅读(557)  评论(0编辑  收藏  举报