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 如何简化容器化部署

相关推荐
大G哥4 小时前
kafka使用以及基于zookeeper集群搭建集群环境
分布式·zookeeper·云原生·kafka
会飞的土拨鼠呀5 小时前
docker system df命令
运维·docker·容器
Dolphin_Home9 小时前
Docker搭建Skywalking
docker·容器·skywalking
阿里云云原生10 小时前
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
云原生
JermeryBesian13 小时前
Flink源码解析之:Flink on k8s 客户端提交任务源码分析
大数据·flink·kubernetes
州周14 小时前
Flink operator实现自动扩缩容
docker·flink·kubernetes
探索云原生14 小时前
使用 NodeLocalDNS 提升集群 DNS 性能和可靠性
linux·docker·云原生·kubernetes·go·dns
言之。16 小时前
【微服务】3、配置管理
微服务·云原生·架构
嘻嘻哈哈1716 小时前
Mac-docker配置
macos·docker·容器
搬码后生仔17 小时前
使用docker desktop提示 需要更新WSL
运维·docker·容器