Kubernetes

什么是 Kubernetes?

什么是 Kubernetes?

Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展、管理和调度。最初由 Google 设计和开发,Kubernetes 现在是由云原生计算基金会(CNCF)托管的项目。它帮助开发者和运维人员高效地管理大规模容器化应用的生命周期,尤其是在多主机环境中。

Kubernetes 提供了一个统一的接口,允许用户管理跨多个主机(甚至是云环境)的容器,确保应用的高可用性、弹性、可扩展性和自动恢复能力。

Kubernetes 的核心功能

  1. 容器编排: Kubernetes 通过自动化容器的部署、扩展、管理和调度来实现容器编排。它确保容器在集群中以一致、可靠和高效的方式运行。

  2. 自动扩展与弹性: Kubernetes 可以根据负载自动扩展应用容器的副本数。当负载增加时,它会自动添加更多的容器实例;当负载减少时,自动减少容器副本数,从而优化资源的使用。

  3. 负载均衡与服务发现: Kubernetes 提供了内置的负载均衡功能,它会自动分配网络流量到多个容器副本,确保服务的高可用性。同时,Kubernetes 自动为服务提供 DNS 名称,简化了服务发现。

  4. 健康检查与故障恢复: Kubernetes 支持容器健康检查(如 Liveness Probe 和 Readiness Probe)。如果容器或节点出现问题,Kubernetes 会自动重启容器、替换容器或重新调度容器,以保证系统的稳定性和高可用性。

  5. 滚动更新与回滚: Kubernetes 提供了无中断的滚动更新功能,可以平滑地升级应用版本,而不会影响服务的可用性。如果新的版本出现问题,可以轻松回滚到之前的稳定版本。

  6. 资源调度与管理: Kubernetes 具有强大的调度能力,能够根据容器的资源需求(如 CPU、内存)和节点的资源可用情况,将容器调度到合适的节点上。它还能够确保资源的合理利用,并防止资源过度分配。

  7. 自动化部署: 通过声明式的配置文件(如 YAML 或 JSON),Kubernetes 允许用户定义应用的期望状态,Kubernetes 会自动执行所需的操作,使系统状态与期望状态一致。

  8. 持久化存储: Kubernetes 提供了持久化存储卷(Persistent Volume, PV)和卷声明(Persistent Volume Claim, PVC),确保容器中的数据在容器重启或迁移时能够持久保存。

  9. 多集群支持: Kubernetes 能够支持跨多个集群的部署、管理和扩展,这使得它成为跨多个数据中心和云环境的理想选择。

Kubernetes 组件

Kubernetes 是一个高度模块化的系统,由多个核心组件组成,它们协同工作以管理集群中的容器:

  1. Master 节点

    • 负责控制集群的管理和调度工作,维护整个集群的状态。Master 节点包含多个组件:
      • kube-apiserver:API 服务器,是 Kubernetes 集群的入口点,所有的请求都通过它进行。
      • kube-scheduler:调度器,根据资源需求和其他因素将容器调度到合适的节点上。
      • kube-controller-manager:管理不同控制器的状态,例如副本集控制器、节点控制器等。
      • etcd:一个高可用的分布式键值存储,用于保存整个集群的状态数据。
  2. Node 节点

    • 负责实际运行容器。每个 Node 节点都包含以下组件:
      • kubelet:一个代理,确保容器按预期运行并报告其状态。
      • kube-proxy:负责管理节点的网络代理功能,支持服务发现和负载均衡。
      • 容器运行时(如 Docker、containerd 或 CRI-O):负责实际运行容器。
  3. Pod

    • Kubernetes 中的最小部署单位,一个 Pod 可以包含一个或多个容器。容器在同一个 Pod 内共享网络、存储和命名空间等资源。Pod 负责管理容器的生命周期。
  4. Service

    • Kubernetes 中的服务对象,用于暴露应用程序并提供负载均衡和服务发现功能。通过 Service,Kubernetes 确保不同 Pod 之间可以进行通信。
  5. Deployment

    • 用于声明式地管理应用的副本和版本,支持滚动更新、扩容和回滚操作。
  6. ConfigMap 和 Secret

    • 用于存储和管理配置信息、环境变量以及敏感数据(如数据库密码、API 密钥等)。
  7. Namespace

    • Kubernetes 支持多租户部署,Namespace 用于将集群资源分隔成不同的环境或应用程序组。

Kubernetes 的优势

  1. 高度自动化

    • Kubernetes 自动化了容器的调度、管理、扩展、故障恢复等功能,大大减少了人工干预,提升了应用的可用性和开发效率。
  2. 跨平台支持

    • Kubernetes 支持在不同的云平台(如 AWS、Google Cloud、Azure)和本地数据中心上运行,使得企业可以实现跨平台的容器化部署。
  3. 可扩展性

    • Kubernetes 支持大规模容器部署,并能够根据实际负载进行自动扩展和缩减,保证应用的可伸缩性和资源的高效使用。
  4. 高可用性

    • Kubernetes 提供了自愈功能,能够检测并自动恢复失败的容器,保证系统的高可用性。
  5. 支持多种容器运行时

    • Kubernetes 支持多种容器运行时,如 Docker、containerd、CRI-O 等,给用户带来了灵活性。
  6. 社区支持与生态丰富

    • Kubernetes 拥有庞大的开源社区和生态系统,提供了丰富的工具、插件和解决方案,支持 CI/CD、监控、日志管理等。

Kubernetes 与 Docker 的关系

Kubernetes 与 Docker 是容器化应用的两个关键组成部分。Docker 是容器化的技术,它帮助开发者创建、管理和运行容器,而 Kubernetes 是一个容器编排平台,用于管理容器的部署、扩展和生命周期。Kubernetes 本身不负责直接运行容器,而是通过容器运行时(如 Docker 或 containerd)来执行容器。

Kubernetes 与 Docker 的关系

Kubernetes 与 Docker 的关系

KubernetesDocker 都是与容器化应用相关的核心技术,但它们在容器化生态系统中扮演的角色不同。简而言之,Docker 是一个容器平台,它使得容器化应用的构建和运行变得简单,而 Kubernetes 是一个容器编排平台,它用于管理和调度多个容器的运行。以下是它们的关系和区别:

1. Docker:容器化平台

Docker 是一个开源的容器平台,用于创建、部署和运行容器化应用。Docker 提供了以下功能:

  • 容器化应用:Docker 允许开发者将应用及其依赖(如库、配置文件等)打包成容器镜像,这些容器镜像可以在任何支持 Docker 的平台上运行,确保开发、测试和生产环境的一致性。
  • Docker 引擎:Docker 引擎是一个轻量级的容器运行时,它负责创建、管理、调度和运行容器。
  • Docker 容器:Docker 容器是独立的执行环境,可以在 Docker 引擎上运行,包含了运行某个应用所需要的所有代码和依赖项。
  • Docker Hub:Docker Hub 是一个容器镜像仓库,开发者可以在这里存储和共享 Docker 容器镜像。

2. Kubernetes:容器编排平台

Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展、管理和调度。它主要负责以下任务:

  • 容器编排:Kubernetes 管理跨多个节点和容器的资源,自动部署、调度和扩展容器,确保应用的高可用性。
  • 容器调度:Kubernetes 会根据集群资源(如 CPU 和内存)和容器需求自动将容器调度到合适的节点上。
  • 服务发现与负载均衡:Kubernetes 提供内建的负载均衡功能,自动管理服务的访问入口,并确保容器间的通信。
  • 自动扩展:Kubernetes 支持根据负载自动扩展容器实例,确保系统的可扩展性和资源利用效率。
  • 健康检查与故障恢复:Kubernetes 能够检测容器的健康状况,并在容器故障时自动重启或重新调度容器。

Kubernetes 与 Docker 的关系

  • Docker 是容器的运行时:Docker 作为容器的运行时,它负责创建和管理容器,而 Kubernetes 则依赖于 Docker 或其他容器运行时来运行容器。Kubernetes 本身并不直接运行容器,而是通过容器运行时(如 Docker、containerd 等)来执行容器操作。也就是说,Kubernetes 管理和调度容器,而 Docker 提供容器的基础设施。

  • Docker 镜像在 Kubernetes 中使用:Kubernetes 使用 Docker 镜像来运行容器。在 Kubernetes 中,当你创建一个 Pod(Kubernetes 中的最小部署单位)时,Pod 中的容器通常是通过 Docker 镜像来构建的。Kubernetes 会拉取镜像并启动容器。

  • 容器运行时接口(CRI) :Kubernetes 提供了容器运行时接口(CRI),允许它与不同的容器运行时(包括 Docker)进行集成。虽然 Kubernetes 曾经默认使用 Docker 作为容器运行时,但从 Kubernetes 1.20 开始,Kubernetes 宣布不再内建 Docker 作为容器运行时,而是推荐使用 containerdCRI-O 作为容器运行时。

Kubernetes 与 Docker 的区别

  1. 职责不同

    • Docker:主要负责容器的构建、镜像管理和容器的运行。
    • Kubernetes:主要负责容器的编排、调度和管理,确保在多个机器或节点上协调运行多个容器。
  2. 应用场景

    • Docker:适用于单机上的容器化应用,主要用于容器的构建和运行。
    • Kubernetes:适用于大规模分布式容器化应用,帮助管理容器在集群中的部署、扩展和管理,尤其是在需要高可用性、负载均衡、自动扩展等情况下。
  3. 功能范围

    • Docker:专注于容器的构建、执行和镜像管理。
    • Kubernetes:提供完整的容器编排解决方案,包括调度、负载均衡、服务发现、自动扩展、健康检查、故障恢复等。
  4. 使用方式

    • Docker:通过 Docker CLI 命令行工具,可以直接与 Docker 引擎交互进行容器管理。
    • Kubernetes:通过 kubectl 命令行工具与 Kubernetes 集群进行交互,管理和调度多个容器。

Kubernetes 如何与 Docker 协作

  • 容器镜像:开发者使用 Docker 构建容器镜像,并推送到容器镜像仓库(如 Docker Hub 或私有仓库)。Kubernetes 在运行时从这些镜像仓库拉取镜像并启动容器。

  • Pod 中的容器:Kubernetes 中的容器通常是通过 Docker 镜像来构建的。Kubernetes 会将这些容器部署在不同的节点上,管理它们的生命周期、扩展、负载均衡等。

  • 部署容器化应用:开发者使用 Kubernetes 的声明式配置(如 YAML 文件)来描述应用的期望状态,Kubernetes 会根据这些描述创建相应的 Pod 和容器,并利用 Docker 来运行它们。

从 Docker 到 Kubernetes 的演变

  • 在早期,Kubernetes 与 Docker 紧密集成,Kubernetes 默认使用 Docker 作为容器运行时。
  • 由于 Kubernetes 设计为一个通用的容器编排平台,它与多个容器运行时兼容,并引入了 容器运行时接口(CRI)。因此,Kubernetes 可以与多个容器运行时(如 Docker、containerd、CRI-O)协同工作。
  • 从 Kubernetes 1.20 开始,Kubernetes 不再直接与 Docker 作为容器运行时捆绑,而是推荐使用 containerdCRI-O,这些是 Kubernetes 推荐的标准容器运行时。

Kubernetes 中主节点的工作情况

Kubernetes 中主节点的工作情况

Kubernetes 集群是一个 控制平面工作节点 (Worker Node)的架构,主节点(Master Node)是控制平面的核心,负责管理和调度整个集群的操作。主节点包含了多个关键组件,这些组件共同协作,管理和调度工作节点中的容器化应用和其他资源。理解主节点的工作情况,有助于更好地管理和调优 Kubernetes 集群。

主节点包含的核心组件

  1. kube-apiserver(API 服务器)
  2. kube-scheduler(调度器)
  3. kube-controller-manager(控制管理器)
  4. etcd(分布式存储)
  5. cloud-controller-manager(云控制管理器,非必需)

这些组件各自承担着不同的职责,协同工作,确保 Kubernetes 集群的高效和可靠运行。


1. kube-apiserver(API 服务器)

  • 作用kube-apiserver 是集群的入口,负责接收所有的 RESTful 请求并处理它们。它作为集群的 API 服务器,处理来自 kubectl 客户端、控制器、调度器等的请求,负责验证、授权和存储操作。kube-apiserver 是 Kubernetes 各组件间进行通信的中枢。

  • 工作情况

    • 提供 Kubernetes 资源对象(如 Pod、Service、Deployment)的 REST API。
    • 通过 etcd 存储集群状态,并与集群的其他组件(如控制管理器、调度器)进行交互。
    • 处理来自集群外部和内部的请求,确保集群的状态与期望状态保持一致。
    • 负责集群的认证和授权,保证请求的安全性。

2. kube-scheduler(调度器)

  • 作用kube-scheduler 负责将待运行的 Pod 调度到集群中合适的节点。它根据 Pod 的资源需求、节点资源的可用性、亲和性/反亲和性、污点/容忍度等规则,做出最优的调度决策。

  • 工作情况

    • 在新 Pod 被创建时,kube-scheduler 根据集群的资源状态选择一个合适的节点来运行该 Pod。
    • 它会根据预定义的策略(如资源要求、亲和性规则、负载均衡等)来选择节点。
    • 调度器的决策会被 kube-apiserver 存储,并通过 etcd 更新到集群中。

3. kube-controller-manager(控制管理器)

  • 作用kube-controller-manager 运行 Kubernetes 中的控制器,负责处理集群的管理和自动化任务。控制器是 Kubernetes 的核心概念之一,它会持续监控集群的状态,并执行自动化操作来保持集群的健康和期望状态。

  • 工作情况

    • 每个控制器都有一个循环:查看当前集群状态,和期望状态进行对比,并根据差异执行操作。常见的控制器包括 ReplicaSet 控制器Deployment 控制器StatefulSet 控制器Job 控制器 等。
    • 例如,如果期望运行 3 个 Pod,但只有 2 个 Pod 运行,ReplicaSet 控制器会创建一个新的 Pod 以达到期望数量。
    • 它会与 kube-apiserveretcd 进行交互,执行集群状态的管理操作。

4. etcd(分布式存储)

  • 作用etcd 是一个分布式键值存储系统,用于保存 Kubernetes 集群的所有元数据和状态信息。etcd 是集群的 "单一事实来源",集群的所有配置信息、资源对象的状态以及其他重要数据都存储在 etcd 中。

  • 工作情况

    • etcd 保持着集群状态的一致性,是 Kubernetes 的持久化存储。
    • 所有操作(如创建、更新、删除资源)都会通过 kube-apiserver 写入 etcd,因此它确保集群中的所有数据都是持久化的。
    • etcd 使用 Raft 协议 确保数据的一致性,并通过 日志复制 来实现高可用性。

5. cloud-controller-manager(云控制管理器)(可选)

  • 作用cloud-controller-manager 是 Kubernetes 控制平面中的可选组件,用于在云环境中与云服务提供商的 API 进行集成。它使得 Kubernetes 集群能够与不同云提供商(如 AWS、Azure、Google Cloud)之间进行交互,自动化云资源的管理。

  • 工作情况

    • 负责处理与云平台相关的操作,如云存储卷的动态供应、负载均衡的创建与管理、云网络的管理等。
    • 它包含多个子控制器,如 云节点控制器云路由控制器 等,确保 Kubernetes 集群可以在云平台上有效运行。

主节点的工作流程

  1. 接收请求

    • 用户通过 kubectl 或其他客户端工具发起请求,kube-apiserver 处理请求并验证其合法性。
  2. API 请求处理

    • 请求通过 kube-apiserver 进行处理,经过认证和授权后,kube-apiserver 将操作信息存储到 etcd 中。
  3. 资源调度

    • 如果请求涉及创建新的 Pod,kube-scheduler 会选择一个合适的节点来运行 Pod。
    • 调度器会根据节点的资源情况、负载、调度策略等因素做出决定。
  4. 控制器管理资源

    • kube-controller-manager 会监控集群资源的状态,如 Pod、ReplicaSet、Deployment 等。控制器会确保集群资源与期望状态一致。例如,确保所需的 Pod 数量、服务配置等。
  5. 集群状态存储

    • 所有集群资源的状态和配置都会存储在 etcd 中。kube-apiserveretcd 进行交互,以获取和更新集群状态。
  6. 与工作节点通信

    • 主节点通过与工作节点上的 kubelet 进行通信,确保 Pod 在工作节点上正确运行。

Kubernetes 的架构是由多个核心组件

Kubernetes 的架构是由多个核心组件组成的,这些组件协同工作来管理容器化应用的部署、调度、扩展和管理。Kubernetes 采用了 Master-Worker 模式,其中主节点(Master Node)负责管理集群的控制平面,而工作节点(Worker Node)则负责运行容器化的应用程序。

以下是 Kubernetes 架构中不同组件的详细介绍:

1. 主节点(Master Node)

主节点负责 Kubernetes 集群的管理、调度和控制任务,管理集群的状态并确保集群的各项操作能够按照预期进行。主节点包含了以下核心组件:

1.1 kube-apiserver
  • 作用:API 服务器是 Kubernetes 控制平面的入口点,它处理集群的所有 RESTful API 请求,负责验证、授权请求并将请求转发给集群的其他组件(如调度器、控制器管理器)。
  • 特点
    • 提供 REST API,支持外部客户端与集群交互。
    • 是集群各组件之间通信的桥梁。
1.2 etcd
  • 作用etcd 是一个分布式的键值存储系统,用于保存 Kubernetes 集群的所有元数据和状态信息。它是集群的"单一事实来源",所有的配置信息、状态数据等都存储在其中。
  • 特点
    • 存储 Kubernetes 集群的所有资源对象,如 Pods、Services、Deployments 等。
    • 使用 Raft 协议 保证数据的一致性和高可用性。
1.3 kube-scheduler
  • 作用:调度器负责将待运行的 Pod 调度到集群中的某个工作节点。它根据节点的资源状况、Pod 的需求、调度策略(如亲和性、污点等)来做出决策。
  • 特点
    • 监视待调度的 Pod,并根据节点的资源情况决定将其调度到哪个节点。
    • 负责保证集群中 Pod 的资源分配合理,确保负载均衡。
1.4 kube-controller-manager
  • 作用:控制器管理器负责维护集群的状态和期望状态的一致性。它运行多个控制器来处理集群中的对象(如 Pod、ReplicaSet、Deployment 等)。
  • 特点
    • 包含多个控制器,负责持续监控集群资源的状态,确保资源始终与预期状态一致(如保证 Pod 数量、部署管理等)。
    • 例如,ReplicaSet 控制器确保副本数量正确,Deployment 控制器确保应用部署状态一致。
1.5 cloud-controller-manager
  • 作用:云控制管理器用于与云平台的 API 进行集成。它帮助 Kubernetes 集群与云服务提供商的基础设施进行交互(如自动管理负载均衡器、云存储等)。
  • 特点
    • 处理云资源的管理工作,如在云环境中创建负载均衡器、云存储卷等。
    • 使 Kubernetes 能够在不同的云环境中运行。

2. 工作节点(Worker Node)

工作节点负责运行应用容器化的工作负载。每个工作节点上都会运行以下几个核心组件:

2.1 kubelet
  • 作用kubelet 是工作节点上的主要代理,它负责确保容器按照容器规格(Pod 规格)正确地运行,并向 API 服务器报告节点和容器的状态。
  • 特点
    • 监视节点上的容器,确保它们在容器内正确运行。
    • 定期向 kube-apiserver 汇报节点的健康状况、资源使用情况等。
    • 负责管理节点上的容器的生命周期(如启动、停止容器)。
2.2 kube-proxy
  • 作用kube-proxy 负责实现集群内的负载均衡和网络路由。它为每个服务创建负载均衡规则,并转发请求到合适的 Pod。
  • 特点
    • 在每个工作节点上运行,使用 iptablesIPVS 实现网络流量的转发。
    • 负责服务发现和负载均衡,确保客户端能够通过服务名称访问到集群内的 Pod。
2.3 容器运行时(Container Runtime)
  • 作用:容器运行时负责在工作节点上启动和管理容器。Kubernetes 支持多种容器运行时,如 Docker、containerd、CRI-O 等。
  • 特点
    • 容器运行时负责启动、停止、拉取容器镜像,并在节点上管理容器的生命周期。
    • Kubernetes 通过 CRI(容器运行时接口)与容器运行时进行交互,管理容器的运行。

3. 核心对象

在 Kubernetes 中,有多个核心对象,它们分别代表不同的资源和功能。以下是一些常见的核心对象:

3.1 Pod
  • 作用:Pod 是 Kubernetes 中最小的部署单元,代表一组共享网络、存储和其他资源的容器。Pod 通常包含一个或多个容器,这些容器共享相同的网络命名空间。
3.2 Service
  • 作用:Service 是 Kubernetes 中的一种抽象,提供了对一组 Pod 的访问入口。Service 负责将外部请求路由到一组 Pod 上,实现负载均衡和服务发现。
3.3 ReplicaSet
  • 作用:ReplicaSet 保证集群中某个特定应用的 Pod 数量始终满足预期。它确保指定数量的 Pod 副本运行,并自动处理 Pod 的滚动更新和故障恢复。
3.4 Deployment
  • 作用:Deployment 是用于管理一组 Pod 副本的高层抽象,它支持滚动更新、回滚等功能,是部署无状态应用的标准方式。
3.5 StatefulSet
  • 作用:StatefulSet 是用于管理有状态应用的控制器,它保证 Pod 在滚动更新过程中保持稳定的网络标识符(如主机名),适用于有持久存储要求的应用。
3.6 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)
  • 作用:PV 和 PVC 用于存储管理。PV 是集群中的一块存储资源,而 PVC 是用户对存储的请求。用户可以通过 PVC 请求存储,Kubernetes 会根据 PV 和 PVC 的匹配来分配存储资源。

Kubernetes 如何简化容器化部署

相关推荐
chuanauc4 小时前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉4 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信4 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记4 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花4 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay4 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu4 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记8 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样13 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家13 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook