一.Kubernetes介绍
Kubernetes(通常缩写为 K8s)是一个开源的容器编排平台,旨在自动化容器应用的部署、扩展和管理。它最初由 Google 开发,后来捐赠给了云原生计算基金会(CNCF)。
-
集群:
Kubernetes 集群由一组主机组成,这些主机运行着容器化的应用。集群包括一个或多个主节点和一组工作节点。 -
主节点(Master Node):
主节点负责管理集群的整体状态,包括调度、控制和API服务。主节点上的关键组件包括:- etcd:一个分布式键值存储,用于保存集群的所有数据和状态。
- 控制器管理器:处理各种控制循环,如副本控制器(Replication Controller)和部署控制器(Deployment Controller)。
- 调度器:负责将 Pods 调度到合适的工作节点上。
- API 服务器:提供 Kubernetes API 接口,所有的操作都通过它来完成。
-
工作节点(Worker Node):
工作节点运行实际的应用容器。它们的主要组件包括:- kube-proxy:负责网络服务的负载均衡和网络通信。
- 容器运行时:如 Docker 或 containerd,用于运行容器。
- kubelet:负责在工作节点上管理容器的生命周期。
二.重要资源
-
Pod:
Pod 是 Kubernetes 中的最小可部署单元,可以包含一个或多个容器。它们共享存储和网络资源,并且在一个节点上调度和运行。 -
Service:
Service 是一个抽象层,用于定义访问 Pod 的方法。它提供稳定的网络访问点,并进行负载均衡。 -
Deployment:
Deployment 用于声明性地管理 Pod 的副本和更新。它确保指定数量的 Pod 副本在任何时候都是可用的,并且可以进行滚动更新。 -
ConfigMap 和 Secret:
ConfigMap 用于管理配置数据,而 Secret 用于存储敏感数据(如密码和密钥)。它们可以以环境变量、命令行参数或配置文件的形式注入到 Pod 中。 -
Namespace:
Namespace 提供了逻辑上的隔离,使得不同的团队或应用可以共享一个集群而不会互相干扰。 -
Volume:
Volume 是用于存储数据的抽象层。Kubernetes 支持多种存储类型,包括本地存储、网络存储和云存储。
三.节点组件
1.master节点组件
(1)API server
API server提供了集群网关,是整个集群的控制中枢,提供集群中各个模块之间的数据交换,并将集群信息存储到ETCD集群中,同时,他也是集群管理,资源配额,提供完备的集群安全机制的入口,为集群各类资源对象提供增删改查。API server 在客户端对集群进行访问,客户端需要通过认证,并使用API server作为访问节点和pod(以及服务)的堡垒和代理/通道。
- API服务器公开kubernetes API。
- REST/kubectl的入口——它是kubernetes控制平面的前端
- 它跟踪所有集群组件的状态并管理它们之间的交互。
- 它旨在水平扩展
- 它使用YAML/JSON manifest文件
- 它验证和处理通过API发出的请求。
(2)Scheduler
Scheduler主要功能是资源调度,将pod调度到对应的主机上。依据请求资源的可用性、服务请求的质量等约束条件,K8s也支持用户自己提供的调度器
- 它将pod调度到工作节点。
- 它监视api-server以查找没有分配节点的新创建的Pod,并选择一个健康的节点让它们运行。
- 如果没有合适的节点,则Pod将处于挂起状态,直到出现这样一个健康的节点。
- 它监视APIServer的新工作任务
(3)Controller Manager
ControllerManager负责维护集群的状态,比如故障检测、内存垃圾回收、滚动更新等,也执行API业务逻辑:K8s默认提供replication controler controler daemonsetcontroller等控制器。
- 它监视它管理的对象的期望状态并通过API服务器监视它们的当前状态
- 采取纠正措施以确保当前状态与所需状态相同
- 它是控制器的控制器
- 它运行控制器进程。从逻辑上讲,每个控制器都是一个单独的进程,但为了降低复杂性,它门都被编译成一个二进制文件并在单个进程中运行
(4)etcd
etcd用于可靠的存储集群的配置数据,是一种持久性、轻量型、分布式的键值数据存储组件可以理解为一种分布式的非关系型数据库。etcd是集群的状态,K8s默认使用分布式的etcd集群整体存储用来实现发现服务和共享配置集群的所有状态部存储在etcd实例中,并具有监控的能力,因此当etcd中的信息发生变化时,能够快地通知集群中相关的组件
- 它是一个一致的、分布式的、高度可用的键值存储器(非关系型数据库)
- 它是有状态的持久存储,用于存储所有Kubernetes集群数据(集群状态和配置)
- 它是集群的真相来源
- 它可以是控制平面的一部分,也可以在外部进行配置
备注:
tcd集群最少3个节点,容错点才会有1个。
3个节点和4个节点的容错能力是一样的,所以有时候保持奇数节点更好,从这里可以判断出我们在部署k8s的时候,至少有3个节点,才保证etcd有1个节点容错性。
另外,etcd的Leader选举和数据写入都需要半数以上的成员投票通过确认,因此,集群最好由奇个成员组成,以确保集群内部一定能够产生多数投票通过的场景所以etcd集至少需要3个以上的奇数个成员。
- 偶数个节点集群不可用风险更高,表现在选主(Leader选举)过程中,有较大概的等额选票,从而触发下一轮选举。
- 偶数个节点集群在某些网络分割的场景下无法正常工作。 网络分割发生后,将集群节点对半分割开,形成脑裂。
2.node节点组件
(1)容器运行时
docker引擎是本地的容器运行时环境,负责镜像管理以及pod和容器的真正运行。K8s本身并不提供容器运行时环境,但提供了接口,可以插入所选择的容器运行时环境,目前支持Dockerrkt
- 容器运行时是负责运行容器(在Pod中)的软件
- 为了运行容器,每个工作节点都有一个容器运行时引擎
- 它从容器镜像注册表(containerimageregistry)