简介(免费开源,google开源)
#### 关键概念:
* **容器(Containers)**:Kubernetes 管理容器,通常使用 Docker,允许应用程序在隔离的环境中运行。
* **节点(Nodes)** :节点是 Kubernetes 运行的虚拟或物理机器,分为 **主节点(Master)** 和 **工作节点(Worker)**。
* **Pod**:Pod 是 Kubernetes 中最小的可部署单位,包含一个或多个共享存储、网络以及运行配置的容器。
* **服务(Services)**:服务定义了一组逻辑上的 Pod 以及访问它们的策略,确保对外暴露一个稳定的访问端点。
* **部署(Deployments)**:部署管理无状态服务,确保在任何时候都有期望数量的 Pod 副本在运行。
* **命名空间(Namespaces)**:命名空间用于在集群内隔离资源组。
* **卷(Volumes)**:Kubernetes 卷可以让数据在 Pod 生命周期之外持久化,或在容器之间共享数据。
#### 为什么使用 Kubernetes?
* **可扩展性**:根据流量自动扩展应用程序。
* **自我修复**:自动重启失败的容器、替换和重新调度容器,终止不响应的容器。
* **负载均衡**:Kubernetes 将流量分配到已部署的服务上。
* **存储编排**:可以挂载并管理来自本地系统或云提供商的存储解决方案。
* **声明式配置**:使用 YAML 或 JSON 进行配置,易于定义目标状态并进行版本控制。
#### **kubernetes:容器编排引擎**
Kubernetes核心组件
-
为了清晰展示 Kubernetes 资源对象的演进过程,我们可以通过"目的"的角度,逐步连接和解释它们的引入。
#### ### 1. \*\*Node\*\* -- 提供容器的运行环境
* 最基本的需求是为应用程序的容器提供一个实际的运行环境。\*\*Node\*\* 作为 Kubernetes 的基础工作单元,负责承载和执行容器化的工作负载。每个 Node 运行着控制器代理(如 \`kubelet\`),确保容器按计划启动并运行。
* \*\*目的\*\*:为容器提供计算资源(CPU、内存、存储)和网络支持,是工作负载运行的基础单元。
#### ### 2. \*\*Pod\*\* -- 封装和调度容器
* 有了 Node,我们需要一个机制来部署和管理容器。\*\*Pod\*\* 引入是为了解决如何在 Node 上管理和调度容器的问题。Pod 可以封装一个或多个容器,允许它们共享存储和网络资源。
* \*\*目的\*\*:在 Kubernetes 中将容器作为一个整体进行管理,实现容器的调度和隔离。
#### ### 3. \*\*ReplicaSet\*\* -- 确保应用的高可用性
* 运行一个 Pod 可以启动容器,但单个 Pod 无法保证应用的高可用性。为了解决 Pod 失效的问题,\*\*ReplicaSet\*\* 被引入。它保证在任何时刻都有指定数量的 Pod 副本在运行,自动补充失败的 Pod。
* \*\*目的\*\*:确保应用程序有足够的 Pod 副本持续运行,实现容器的冗余和高可用性。
#### ### 4. \*\*Deployment\*\* -- 提供版本管理和滚动更新
* 当应用的副本数量增加后,管理应用的更新、扩缩容变得复杂。\*\*Deployment\*\* 引入了声明式的更新机制,可以控制应用如何逐步更新、回滚,确保在不中断服务的情况下完成新版本的部署。
* \*\*目的\*\*:通过声明式更新、回滚等机制,简化应用的版本管理和生命周期控制。
#### ### 5. \*\*Service\*\* -- 提供稳定的访问和负载均衡
* 随着多个 Pod 副本的存在,应用内部以及外部需要有一个固定的方式来访问这些 Pod。\*\*Service\*\* 提供了一个稳定的访问端点,通过负载均衡将流量分发到后端的多个 Pod 副本。
* \*\*目的\*\*:提供负载均衡和稳定的服务发现机制,确保应用在副本增加时可以被可靠访问。
#### ### 6. \*\*ConfigMap\*\* 和 \*\*Secret\*\* -- 分离配置和机密数据
* 应用逐渐复杂化后,配置和敏感数据(如密码)需要被安全地管理。\*\*ConfigMap\*\* 用于管理常规的非敏感配置信息,而 \*\*Secret\*\* 专门用于存储和传递加密的敏感数据。通过将这些数据与代码分离,应用变得更加灵活且安全。
* \*\*目的\*\*:分离环境配置和敏感数据,简化应用管理并提升安全性。
#### ### 7. \*\*PersistentVolume (PV)\*\* 和 \*\*PersistentVolumeClaim (PVC)\*\* -- 提供持久化存储
* 有些应用(如数据库、文件系统)需要数据持久化,即使 Pod 被销毁或重启,数据依然需要保留。\*\*PersistentVolume (PV)\*\* 提供了实际的存储资源,而 \*\*PersistentVolumeClaim (PVC)\*\* 允许 Pod 请求这些持久存储资源。
* \*\*目的\*\*:实现数据持久化,确保应用的数据不会随着 Pod 的销毁而丢失。
#### ### 8. \*\*HorizontalPodAutoscaler (HPA)\*\* -- 实现动态扩展
* 当应用面临不稳定的流量时,手动管理 Pod 的副本数量显得效率低下。\*\*HorizontalPodAutoscaler (HPA)\*\* 能根据资源利用情况(如 CPU 或内存)自动调整 Pod 的副本数量,确保应用能够根据实际需求自动扩展或缩减。
* \*\*目的\*\*:动态调整应用的资源,确保在负载波动时应用能够自动扩展或缩减,保持高可用性和成本效益。
#### ### 9. \*\*NetworkPolicy\*\* -- 控制网络访问
* 随着集群规模增大,安全性变得至关重要。\*\*NetworkPolicy\*\* 引入了对 Pod 网络通信的控制,允许用户定义哪些 Pod 或外部流量可以访问哪些 Pod,从而确保集群内部和外部的流量受控。
* \*\*目的\*\*:提供网络隔离和流量控制,确保应用之间的通信安全。
#### ### 连接解释总结:
* 1. \*\*Node\*\* 作为基础,提供容器运行环境。
* 2. \*\*Pod\*\* 通过封装容器,实现调度和管理。一个或者多个容器集合(一般是一个)
* 3. \*\*ReplicaSet\*\* 确保 Pod 的副本足够,增强应用高可用性。
* 4. \*\*Deployment\*\* 进一步简化了应用的版本管理和升级过程。
* 5. \*\*Service\*\* 提供稳定的网络端点和负载均衡,使得多副本应用可以被统一访问。
* 6. \*\*ConfigMap\*\* 和 \*\*Secret\*\* 通过分离配置和敏感数据,提高应用的安全性和灵活性。
* 7. \*\*PersistentVolume\*\* 确保数据持久化,允许应用长期保存数据。
* 8. \*\*HorizontalPodAutoscaler\*\* 根据实际负载自动扩展应用资源,提升了资源利用效率。
* 9. \*\*NetworkPolicy\*\* 提供网络安全控制,保障集群内部和外部的通信安全。
Kubernetes架构
#### 1. 控制平面(Control Plane)
* 控制平面负责整个集群的全局决策和管理,是 Kubernetes 的大脑部分。它管理节点,调度 Pod,并确保集群中的状态符合预期。
*
##### 1.1 **API 服务器(kube-apiserver)**
* **作用**:提供 Kubernetes 的 REST API,是所有操作和查询的入口。
* **功能**:负责处理来自集群用户和其他组件的请求,并将它们传递给合适的组件进行处理。API 服务器是控制平面与外界通信的桥梁。
*
##### 1.2 **etcd**
* **作用**:分布式键值存储,用于持久化存储集群的所有配置信息、状态和元数据。
* **功能**:保存所有的集群数据,确保数据一致性,是 Kubernetes 高可用的核心组件之一。
*
##### 1.3 **调度器(kube-scheduler)**
* **作用**:负责将新创建的 Pod 分配到合适的节点上。
* **功能**:根据 Pod 的资源需求和节点的资源可用性、策略、约束等,选择最优的节点来运行每个 Pod。
*
##### 1.4 **控制器管理器(kube-controller-manager)**
* **作用**:负责集群内的各种控制循环,确保系统的实际状态与预期状态保持一致。
* **功能**:运行一组控制器,包括副本控制器(确保正确数量的 Pod 副本)、节点控制器(监控节点健康)、端点控制器等。
*
##### 1.5 **云控制器管理器(cloud-controller-manager)**
* **作用**:与云平台集成,管理云资源。
* **功能**:处理与底层云服务相关的控制逻辑,如负载均衡器、节点生命周期管理等。这是一个可选组件,主要用于集成 Kubernetes 和云平台。
#### 2. 工作节点组件(Node Components)
* 工作节点是 Kubernetes 集群中实际运行容器的地方。每个节点都有自己的组件来确保 Pod 正常运行,并与控制平面通信。
*
##### 2.1 **kubelet**
* **作用**:每个节点上的核心代理,负责确保 Pod 按照定义运行。
* **功能**:接收 API 服务器的指令,启动和停止容器,并通过健康检查确保 Pod 正常运行。它不断汇报 Pod 的状态给控制平面。
*
##### 2.2 **kube-proxy**
* **作用**:节点上的网络代理,管理 Pod 的网络通信。
* **功能**:负责在每个节点上维护网络规则,确保集群内不同 Pod 之间的通信,以及外部流量与集群的通信。
*
##### 2.3 **容器运行时(Container Runtime)**
* **作用**:运行容器的实际环境。
* **功能**:Kubernetes 支持多种容器运行时,如 Docker、containerd 和 CRI-O。容器运行时负责拉取镜像并启动、停止容器。
#### 3. 附加组件(Add-ons)
* 除了核心组件,Kubernetes 还支持多种附加组件,用来增强集群的功能。
*
##### 3.1 **DNS**
* **作用**:为 Kubernetes 服务提供服务发现。
* **功能**:每个集群通常会自动部署一个 DNS 服务,用来解析服务名称为 IP 地址,支持 Pod 间的网络通信。
*
##### 3.2 **Dashboard**
* **作用**:提供图形化用户界面。
* **功能**:为用户提供对集群资源的可视化管理和监控工具。
*
##### 3.3 **日志收集和监控**
* **作用**:为集群提供日志和监控支持。
* **功能**:常见的监控工具如 Prometheus,日志收集工具如 Fluentd,可以帮助用户了解集群的运行状况和排查问题。
#### Kubernetes 架构的工作流程
* **用户请求** :用户通过 `kubectl` 或其他客户端工具向 API 服务器发出请求(如创建、更新或删除 Pod)。
* **API 服务器处理请求** :API 服务器接收到请求后,将其持久化存储到 `etcd`,然后将任务分发给合适的控制器(如 ReplicaSet 控制器)进行处理。
* **调度器调度 Pod**:如果是新创建的 Pod,调度器会根据节点资源状况、策略和约束,决定将 Pod 分配到哪个节点上。
* **kubelet 执行指令**:kubelet 接收到调度命令后,使用容器运行时在节点上启动或停止 Pod,确保应用程序在正确的环境中运行。
* **kube-proxy 设置网络**:kube-proxy 配置网络规则,确保 Pod 之间的流量可以正确路由,同时处理外部与集群的通信。
* **持续监控**:控制平面中的控制器和 kubelet 持续监控集群状态,自动调整和修复 Pod、节点,确保集群保持在预期状态。