Kubernetes基础概念及核心组件
引言
Kubernetes已成为现代容器化应用程序的标准编排平台,它提供了高度自动化的容器部署、扩展和管理功能。随着容器化技术的广泛应用,了解并掌握Kubernetes的基础概念和核心组件变得越来越重要。
本文旨在对Kubernetes的基础概念及核心组件进行介绍,并帮助读者快速理解和掌握这一强大工具的基本原理和使用方法。
首先,我们将从基础概念开始,逐步深入了解Kubernetes的主要构成部分。其中,Pod(容器组)是Kubernetes中最小的可部署单元,它由一个或多个容器组成,并共享网络和存储资源。我们将了解Pod在Kubernetes中的作用和组织方式。
副本集(ReplicaSet)是确保Pod副本的可用性和高可用性的控制器。我们将介绍副本集的作用,以及如何定义副本数量,并在Pod故障时自动替换它们,以确保应用程序的平稳运行。
部署(Deployment)是定义Pod的期望状态和控制器行为的重要组件。我们将探讨如何使用部署来进行应用程序的部署和更新,并介绍滚动回滚和版本管理的功能。
服务(Service)是为了暴露Pod或一组Pod的网络连接,以便其他应用程序可以与它们进行通信。我们将讨论服务的作用,以及如何通过服务提供稳定的网络终结点和负载均衡能力。
此外,我们还将介绍命名空间(Namespace)的概念和用途。命名空间帮助组织和管理不同环境、应用程序和团队之间的逻辑分区和隔离。
在接下来的部分中,我们将深入研究Kubernetes的核心组件,包括节点(Node)和主节点(Master节点),并讨论它们在集群中的角色和作用。
基础概念
1、Pod(容器组)
Pod是Kubernetes中最小的可部署及调度单元。Pod是可以由一个或多个业务容器和一个根容器(Pause 容器)组成的群组,并共享存储、网络和其他资源。Pod被视为一个应用程序或服务的逻辑主体,用于部署、扩展和管理容器化的应用程序。
Pause容器的主要作用是为Pod中的其他容器提供一些基本的功能,比如网络和PID命名空间的共享、 负责管理Pod内其他容器的生命周期。
Pod具有独立的IP地址和端口,内部的容器之间可以通过localhost进行通信。Pod还可以通过DNS名称与其他Pod进行通信。Pod提供了一种将容器关联到一起的方式,使它们可以一起部署和管理。
Pod生命周期包括以下几个阶段:
- Pending:在此阶段,Pod已被创建,但尚未调度到运行节点上。此时,Pod可能还在等待被调度,或者因为某些限制(如资源不足)而无法立即调度。
- Running:在此阶段,Pod已被调度到一个节点,并创建了所有的容器。至少有一个容器正在运行,或者正在启动或重启。
- Succeeded:在此阶段,Pod中的所有容器都已成功终止,并且不会再次重启。
- Failed:在此阶段,Pod中的至少一个容器已经失败(退出码非零)。这意味着容器已经崩溃或以其他方式出错。
- Unknown:在此阶段,Pod的状态无法由Kubernetes确定。这通常是因为与Pod所在节点的通信出现问题。
除了这些基本的生命周期阶段之外,还有一些更详细的容器状态,用于描述容器在Pod生命周期中的不同阶段:
- ContainerCreating:容器正在创建,但尚未启动。
- Terminating:容器正在终止,但尚未完成。
- Terminated:容器已终止。
- Waiting:容器处于等待状态,可能是因为它正在等待其他容器启动,或者因为它正在等待资源可用。
- Completed:有一种Pod是一次性的,不需要一直运行,只要执行完就会是此状态。
2、ReplicaSet(副本集)
在Kubernetes中,副本集用于确保Pod的复制和高可用性。副本集允许您在集群中定义所需的副本数量,以便在Pod出现故障的情况下自动替换它们。副本集会持续监控当前运行的Pod数量,并根据需要启动或关闭新的Pod。
通过设置副本集的标签选择器,您可以控制哪些Pod属于副本集。这样,副本集可以根据标签选择器在集群中动态管理Pod的数量。
Replicaset核心作用在于用户创建指定数量的pod副本,并确保pod副本一直处于满足用户期望的数量, 起到多退少补的作用,并且还具有自动扩容缩容等制。
Replicaset控制器主要由三个部分组成:
- 1、用户期望的pod副本数:用来定义由这个控制器管控的pod副本有几个
- 2、标签选择器:选定哪些pod是自己管理的,如果通过标签选择器选到的pod副本数量少于我们指定的数量,需要用到下面的组件
- 3、pod资源模板:如果集群中现存的pod数量不够我们定义的副本中期望的数量怎么办,需要新建pod,这就需要pod模板,新建的pod是基于模板来创建的。
推荐不要直接使用ReplicaSet,用Deployments取而代之,Deployments是比ReplicaSet更高级的概念,它会管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持声明式更新,声明式更新的好处是不会丢失历史变更。所以Deployment控制器不直接管理Pod对象,而是由 Deployment 管理ReplicaSet,再由ReplicaSet负责管理Pod对象。
3、Deployment(部署)
部署是一个高级的Kubernetes概念,用于定义Pod的期望状态和控制器行为。部署允许您指定所需的Pod副本数量、容器映像、环境变量、卷挂载等配置信息,并管理应用程序的部署和更新。
当需要扩展应用程序时,可以通过增加部署的副本数量来实现自动扩展。部署还支持滚动更新,可以无缝地将新的版本部署到集群中,同时确保少量Pod的可用性。
Deployment是kubernetes中最常用的资源对象,为ReplicaSet和Pod的创建提供了一种声明式的定义方法,在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和pod资源。
通过部署对象,您可以指定以下配置信息:
- ReplicaSet模板:定义了Pod的模板,包括容器映像、环境变量、卷挂载等。部署将根据此模板创建和管理Pod的副本。
- 副本数量:指定所需的Pod副本数量,部署将确保在集群中运行指定数量的Pod。
- 滚动更新策略:控制部署新版本时的滚动更新行为。您可以定义并发更新Pod的数量、更新间隔和失败限制等参数。
- 回滚机制:在部署过程中出现问题时,可以使用回滚机制返回到之前的稳定版本。
通过部署对象,您可以实现以下功能:
1、应用程序部署:通过定义应用程序的Pod模板和副本数量,部署对象可自动创建和管理Pod的副本。它会确保所需的副本数始终运行在集群中,并处理任何Pod故障。
2、滚动更新:部署对象提供滚动更新功能,使您可以无缝地将新版本的应用程序部署到集群中,并确保在更新过程中始终有足够的副本可用。通过良好配置的滚动更新策略,您可以控制并发更新的速度和失败限制。
3、版本管理:通过创建不同的部署对象,您可以为应用程序的不同版本创建不同的部署策略,并且随时切换和管理版本。这使得在多个环境中进行测试、预发布和生产部署变得更加灵活和可控。
使用Deployment进行应用程序的管理具有许多优点,包括:
- 自动化:通过定义所需的副本数量和Pod模板,部署对象可以自动管理Pod的创建、删除和替换,以确保应用程序在集群中始终运行。
- 高可用性:副本集的自动替换和滚动更新功能可以确保在Pod故障或版本更新时,应用程序具备高可用性。
- 可伸缩性:通过调整部署的副本数量,您可以快速扩展或缩减应用程序的容量,以满足不同的流量需求。
- 简化管理:通过将应用程序的定义和管理逻辑集中在一个部署对象中,简化了对应用程序的管理和操作。
通过合理使用部署对象,您可以轻松管理和更新大规模的应用程序,提供稳定的服务和良好的用户体验。
4、Service(服务)
服务是Kubernetes中用于暴露Pod或一组Pod的网络连接的机制。服务提供了一个稳定的网络终结点,用于与服务关联的Pod进行通信,并实现负载均衡。通过服务,您可以使用服务名称来访问后端Pod,并通过内部的负载均衡机制自动将请求分发到可用的Pod。
在 Kubernetes 中,Service 是一种抽象,它定义了一组 Pod 的访问策略。通过 Service,Kubernetes 可以自动为 Pod 分配唯一的虚拟 IP 地址(ClusterIP),并将流量负载均衡到这组 Pod 中的任何一个。
Service 可以通过多种方式将流量引导到 Pod 中,包括:
- ClusterIP: 这是默认的 Service 类型,为 Service 创建一个虚拟 IP 地址,并确保只有集群内部的其他资源可以访问到该服务。通过 ClusterIP,可以在集群内部的其他资源中直接使用 Service 名称来访问该服务。
- NodePort: 创建一个公开的端口,以便外部的请求可以流量转发到 Service 上。这个端口将在每个节点上打开,并通过 NodePort 与 Service 中的 Pod 通信。
- LoadBalancer: 在支持外部负载均衡器的云平台上,通过创建 LoadBalancer 类型的 Service,可以自动创建并配置一个外部负载均衡器,并将请求转发到 Service 所代理的 Pod。这个外部负载均衡器可以是云平台提供的负载均衡器,也可以是用户自己配置的负载均衡器。
- ExternalName: 是一种比较特殊的 Service 类型,用于在集群内部将外部域名映射到集群内部的服务。通过 ExternalName 类型的 Service,可以绕过集群内部的 DNS 解析机制,直接将请求转发到指定的外部域名。
Service 配置文件示例:
1 |
|
在上面的示例中,我们创建了一个名为 “my-service” 的 Service,并指定了一个 selector,用于选择具有 “app=my-app” 标签的 Pod。该 Service 将监听集群内部的 80 端口,并将流量转发到 Pod 上的 8080 端口。
Service 在 Kubernetes 中是非常有用的工具,它可以为应用程序提供稳定可靠的网络访问,同时还支持负载均衡、故障转移和服务发现等功能,使得应用程序在 Kubernetes 集群中更具弹性和可靠性。
5、Namespace(命名空间)
Kubernetes Namespace(命名空间)是 Kubernetes 中的一个核心概念,它用于对集群资源进行逻辑上的隔离和管理。
通过使用 Namespace,Kubernetes 允许将整个集群划分为多个虚拟集群,每个 Namespace 中的资源与其他 Namespace 中的资源相互隔离。这种逻辑上的隔离性可以帮助用户在单个 Kubernetes 集群中运行多个应用程序或项目,并为它们提供一个独立的运行环境。不同的 Namespace 可以有各自独立的名称空间、网络策略、资源配额和限制等。
Namespace 在创建时具有以下一些默认的内置资源:
- Pods:位于该 Namespace 中的容器化应用程序实例。
- Services:将流量转发到某个 Namespace 中的一组 Pod。
- ReplicaSets:用于在一个 Namespace 中运行多个 Pod 的副本。
- Deployments:用于管理 Pod 和 ReplicaSets 的部署资源。
- Secrets:用于存储敏感数据,例如 API 凭据和证书等。
- ConfigMaps:用于存储应用程序的配置数据。
- PersistentVolumes 和 PersistentVolumeClaims:用于持久化存储。
核心组件
1、控制面Master节点主要组件
API Server
Apiserver是整个K8s系统的唯一入口,以RESTful API提供接口服务,并且加上了验证、授权等功能,所有其他组件都只能和它直接通信,可以说是 K8s里的联络员。
它是 Kubernetes 集群中各组件数据交互和通信的枢纽。当收到一个创建 Pod 写请求时,它的基本流程是对请求进行认证、限速、授权、准入机制等检查后,写入到 etcd 即可。
kube-apiserver
设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行kube-apiserver
的多个实例,并在这些实例之间平衡流量。
Controller-manager
- 控制中心,负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能。因为节点状态和Pod信息都存储在etcd里,所以要通过apiserver获得信息,才能够实现对资源的各种操作。
- Controller Manager包括一些子控制器,以下是一些例子
- 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
- 任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 端点分片控制器(EndpointSlice controller):填充端点分片(EndpointSlice)对象(以提供 Service 和 Pod 之间的链接)。
- 服务账号控制器(ServiceAccount controller):为新的命名空间创建默认的服务账号(ServiceAccount)。
Scheduler
- 调度器,负责容器的编排工作,检查节点的资源状态,把Pod调度到最适合的节点上运行。
- 基本原理是通过监听 kube-apiserver 获取待调度的 Pod,然后基于一系列筛选和评优算法,为 Pod 分配最佳的 Node 节点。
- 调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。
Etcd
- 是一个高可用的分布式Key-Value数据库,用来持久化存储系统里的各种资源对象和状态。
- 注意它只与apiserver有直接联系,也就是说任何其他组件想要读写etcd里的数据都必须经过apiserver。
2、Node节点主要组件
- Kubelet
- 是Master在Node节点上的Agent,运行在集群中的每个节点上,通过指挥容器引擎实现管理和维护本机运⾏容器,⽐如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等⼯作。
- Kube-proxy
- 在Node节点上实现Pod⽹络代理,维护⽹络规则和四层负载均衡⼯作。
- kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。
- 如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。
- Kube-Proxy 不同的版本可支持三种工作模式:
- UserSpace: k8s v11之前使用,k8s 1.2及以后就已经淘汰
- IPtables:k8s 1.1版本开始支持. 1.2开始为默认
- IPVS: K8s 1.9引入,1.11为正式版本,需要安装ipvsadm, ipset 工具包和加载 ipvs 内核模块
- Container-runtime
- 容器运行时,即容器引擎,例如docker、containerd、podman。是容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理Pod的生命周期。
3、Addons(插件)
Coredns
Calico
- Calico 是一个联网和网络策略供应商。 Calico 支持一套灵活的网络选项,因此你可以根据自己的情况选择最有效的选项,包括非覆盖和覆盖网络,带或不带 BGP。 Calico 使用相同的引擎为主机、Pod 和(如果使用 Istio 和 Envoy)应用程序在服务网格层执行网络策略。
Flannel
- Flannel 是一个可以用于 Kubernetes 的 overlay 网络提供者。
Cilium
- Cilium 是一种网络、可观察性和安全解决方案,具有基于 eBPF 的数据平面。 Cilium 提供了简单的 3 层扁平网络, 能够以原生路由(routing)和覆盖/封装(overlay/encapsulation)模式跨越多个集群, 并且可以使用与网络寻址分离的基于身份的安全模型在 L3 至 L7 上实施网络策略。 Cilium 可以作为 kube-proxy 的替代品;它还提供额外的、可选的可观察性和安全功能。 Cilium 是一个毕业级别的 CNCF 项目。
Web 界面(仪表盘)
- Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用户界面。 它使用户可以管理集群中运行的应用程序以及集群本身, 并进行故障排除。