Kubernetes是谷歌以Borg为前身,基于谷歌15年生产环境经验的基础上开源的一个项目,Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。
一、资源对象概述
Kubernetes中的基本概念和术语大多是围绕资源对象(Resource Object)来说的,而资源对象在总体上可分为以下两类。
(1)某种资源的对象,例如节点(Node)、Pod、服务(Service)、存储(Volume)。
(2)与资源对象相关的事物与动作,例如标签(Label)、注解(Annotation)、命名空间(Namespace)、部署(Deployment)、HPA、PVC。
一些资源对象有自己的生命周期及相应的状态,比如Pod,我们通过kubectl客户端工具创建一个Pod并将其提交到系统中后,它就处于等待调度的状态,调度成功后为Pending状态,等待容器镜像下载和启动、启动成功后为Running状态,正常停止后为Succeeded状态,非正常停止后为Failed状态。同样,PV也是具有明确生命周期的资源对象。对于这类资源对象,我们还需要了解其生命周期的细节及状态变更的原因,这有助于我们快速排查故障。
二、集群类
集群(Cluster)表示一个由Master和Node组成的Kubernetes集群。
1.Master
Master指的是集群的控制节点。在每个Kubernetes集群中都需要有一个或一组被称为Master的节点,来负责整个集群的管理和控制。
Master通常占据一个独立的服务器(在高可用部署中建议至少使用3台服务器),是整个集群的“大脑”,如果它发生宕机或者不可用,那么对集群内容器应用的管理都将无法实施。
在Master上运行着以下关键进程。
- ◎ Kubernetes API Server(kube-apiserver):提供HTTP RESTful API接口的主要服务,是Kubernetes里对所有资源进行增、删、改、查等 操作的唯一入口,也是集群控制的入口进程。
- ◎ Kubernetes Controller Manager(kube-controller-manager):Kubernetes里所有资源对象的自动化控制中心,可以将其理解为资源对象的“大总管”。
- ◎ Kubernetes Scheduler(kube-scheduler):负责资源调度(Pod 调度)的进程,相当于公交公司的调度室。
另外,在Master上通常还需要部署etcd服务。
- Kube-APIServer:集群的控制中枢,各个模块之间信息交互都需要经过Kube-APIServer,同时它也是集群管理、资源配置、整个集群安全机制的入口。
- Controller-Manager:集群的状态管理器,保证Pod或其他资源达到期望值,也是需要和APIServer进行通信,在需要的时候创建、更新或删除它所管理的资源。
- Scheduler:集群的调度中心,它会根据指定的一系列条件,选择一个或一批最佳的节点,然后部署我们的Pod。
- Etcd:键值数据库,报错一些集群的信息,一般生产环境中建议部署三个以上节点(奇数个)。建议用ssd磁盘,否则之后越来越大,影响etcd的性能。
2.Node
Kubernetes集群中除Mater外的其他服务器被称为Node,Node在较早的版本中也被称为Minion。与Master一样,Node可以是一台物理主机,也可以是一台虚拟机。Node是Kubernetes集群中的工作负载节点,每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他Node上。在每个
Node上都运行着以下关键进程。
Worker、node节点、minion节点
- ◎ kubelet:负责Pod对应容器的创建、启停等任务,同时与 Master密切协作,实现集群管理的基本功能。 负责监听节点上Pod的状态,同时负责上报节点和节点上面Pod的状态,负责与Master节点通信,并管理节点上面的Pod。
- ◎ kube-proxy:实现Kubernetes Service的通信与负载均衡机制的服务。负责Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。
- ◎ 容器运行时(如Docker):负责本机的容器创建和管理。
其他组件
- Calico:符合CNI标准的网络插件,给每个Pod生成一个唯一的IP地址,并且把每个节点当做一个路由器。Cilium、eBPF
- CoreDNS:用于Kubernetes集群内部Service的解析,可以让Pod把Service名称解析成IP地址,然后通过Service的IP地址进行连接到对应的应用上。
- Docker:容器引擎,负责对容器的管理。
Node可以在运行期间动态增加到Kubernetes集群中,前提是在这个Node上已正确安装、配置和启动了上述关键进程。在默认情况下,kubelet会向Master注册自己,这也是Kubernetes推荐的Node管理方式。一旦Node被纳入集群管理范畴,kubelet进程就会定时向Master汇报自身的情报,例如操作系统、主机CPU和内存使用情况,以及当前有哪些Pod在运行等,这样Master就可以获知每个Node的资源使用情况,并实现高效均衡的资源调度策略。而某个Node在超过指定时间不上报信息时,会被Master判定为“失联”,该Node的状态就被标记为不可用(NotReady),Master随后会触发“工作负载大转移”的自动流程。
查看在集群中有多少个Node:
[root@k8s-master01 ~]#kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready <none> 73d v1.28.0
k8s-master02 Ready <none> 73d v1.28.0
k8s-master03 Ready <none> 73d v1.28.0
k8s-node01 Ready <none> 73d v1.28.0
k8s-node02 Ready <none> 73d v1.28.0
[root@k8s-master01 ~]#kubectl describe node k8s-master01
Name: k8s-master01
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=k8s-master01
kubernetes.io/os=linux
node.kubernetes.io/node=
Annotations: node.alpha.kubernetes.io/ttl: 0
projectcalico.org/IPv4Address: 10.1.2.21/16
projectcalico.org/IPv4IPIPTunnelAddr: 172.16.32.128
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Sun, 25 Aug 2024 11:49:54 +0800
Taints: <none>
Unschedulable: false
Lease:
HolderIdentity: k8s-master01
AcquireTime: <unset>
RenewTime: Wed, 06 Nov 2024 15:11:49 +0800
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
NetworkUnavailable False Mon, 04 Nov 2024 09:37:29 +0800 Mon, 04 Nov 2024 09:37:29 +0800 CalicoIsUp Calico is running on this node
MemoryPressure False Wed, 06 Nov 2024 15:11:56 +0800 Sun, 25 Aug 2024 11:49:54 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Wed, 06 Nov 2024 15:11:56 +0800 Sun, 25 Aug 2024 11:49:54 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Wed, 06 Nov 2024 15:11:56 +0800 Sun, 25 Aug 2024 11:49:54 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Wed, 06 Nov 2024 15:11:56 +0800 Sun, 25 Aug 2024 11:52:37 +0800 KubeletReady kubelet is posting ready status
Addresses:
InternalIP: 10.1.2.21
Hostname: k8s-master01
Capacity:
cpu: 8
ephemeral-storage: 81880Mi
hugepages-2Mi: 0
memory: 8143976Ki
pods: