跳到主要内容

认识

2024年04月19日
柏拉文
越努力,越幸运

一、认识


Kubernetes(常简称为 k8s)是一个开源的容器编排平台,由 Google 设计和开发,并由 Cloud Native Computing Foundation (CNCF) 维护。Kubernetes 的目标是为容器化应用提供自动化部署、扩展和管理的能力。提供以下基本功能:

  1. 将应用水平扩容到多个集群

  2. 为扩容的实例提供负载均衡的策略

  3. 提供基本的健康检查和自愈能力

  4. 实现任务的统一调度

Kubernetes 是一个功能强大且灵活的容器编排平台,适用于各种复杂的应用部署和管理场景。Kubernetes 适合大型项目、复杂应用和需要高度可扩展性和灵活性的场景。Kubernetes 提供了更全面的功能和更强大的编排能力,适合需要复杂部署策略、大规模集群管理和多租户隔离的企业级应用。

Preview

1.1 为什么需要 K8s

传统容器编排的痛点: 容器技术虽然解决了应用和基础设施异构的问题,让应用可以做到一次构建,多次部署,但在复杂的微服务场景,单靠 Docker 技术还不够,仍然存在以下问题没有解决:

  1. 集成和编排服务模块

  2. 提供按需自动扩容,缩容能力

  3. 健康检查,故障自愈

  4. 集群内的通信

1.2 K8s 能够解决什么问题?

  1. 按需的垂直扩容,新的服务器(Node)能够轻易的增加或者删除

  2. 按需的水平扩容,容器实例能够轻松扩容、缩容

  3. 副本控制器,不用担心副本的状态

  4. 服务发现和路由

  5. 自动部署和回滚,如果应用状态错误,可以实现自动回滚

二、功能


2.1 服务发现

通过服务和 Ingress 资源,Kubernetes 提供了内置的服务发现和负载均衡功能。

2.2 负载均衡

通过服务和 Ingress 资源,Kubernetes 提供了内置的服务发现和负载均衡功能。

2.3 自愈能力

Kubernetes 自愈能力强,支持更多健康检查和恢复机制。 Kubernetes 会监控 Pod 和节点的健康状态,并在检测到故障时自动重启或替换 Pod

2.4 水平扩展

Kubernetes 支持根据 CPU 或内存的使用情况自动扩展或缩减应用程序实例数量。

2.5 存储编排

Kubernetes 可以自动挂载所需的存储系统,包括本地存储、云存储和网络存储。

2.6 滚动更新和回滚

Kubernetes 支持更高级的滚动更新和回滚策略。 Kubernetes 可以自动化应用程序的部署和更新,并支持回滚到先前的版本,确保应用程序在更新过程中保持可用。

2.7 命名空间和资源隔离

通过命名空间实现多租户环境的资源隔离,确保不同团队或项目的资源独立管理。

三、核心


3.1 核心组件

1. Master 节点: 对集群做出全局决策(比如调度),以及检测和响应集群事件,管理集群的控制平面,负责所有管理任务。主要组件包括:

  • kube-api-server: Master 节点上负责提供 Kubernetes API 服务的组件;处理所有的 REST API 请求,并与集群的各个组件进行通信。

  • etcd: etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据等的后台数据库。 分布式键值存储,用于保存集群的所有配置信息和状态数据。

  • kube-scheduler: 负责根据资源需求和可用性将容器分配到合适的节点上。

  • kube-controller-manager: 在 Master 节点上运行控制器的组件。运行各种控制器以确保集群的状态符合预期。这些控制器包括:

    • 节点控制器Node Controller: 负责在节点出现故障时运行通知和响应

    • 副本控制器Replication Controller: 负责为系统中的每个副本控制器对象维护正确数量的 Pod

    • 终端控制器Endpoints Controller: 填充终端(Endpoints)对象(即加入 ServicePod)。

    • 服务账户和令牌控制器Service Account & Token Controllers, 为新的命名空间创建默认账户和 API 访问令牌

2. Node 工作节点: 运行容器化应用的节点,主要组件包括:

  • kubelet: 一个在集群中每个节点上运行的代理,它保证容器都运行在 Pod 中。节点级代理,确保容器在节点上运行并保持它们的健康状态。

  • Kube-Proxy: 一个在集群中每个节点上运行的网络代理。实现网络代理,处理 Pod 网络通信和负载均衡。

  • Container Runtime: 负责运行容器的软件。运行容器的实际环境,如 DockercontainerdCRI-O

3.2 核心概念

Pod: Kubernetes 中最小的部署单位,由一个或多个容器组成,这些容器共享网络和存储。每个 Pod 都有一个唯一的 IP 地址,并且可以在不同节点上移动。

Service: 提供一组 Pod 的稳定访问点,支持负载均衡。Service 可以使用 ClusterIPNodePortLoadBalancer 类型来暴露服务。服务是一种抽象,定义了一组 Pod 的逻辑集合以及访问这些 Pod 的策略。它提供了持久的 IP 地址和 DNS 名称,确保即使 Pod 重启或替换,服务地址也保持不变。

Volume: 提供 Pod 共享的持久存储,可以挂载到 Pod 中的容器上。支持多种存储类型,如 NFSiSCSI、云存储(如 AWS EBSGCP Persistent Disk)。

Namespace: 用于在同一集群中隔离资源和对象,便于管理和组织。适用于多租户环境或隔离开发、测试和生产环境。

ConfigMap: 用于存储非机密配置信息,可以挂载到 Pod 中。

Secret: 用于存储敏感信息(如密码、密钥),以加密方式存储和使用。

Deployment: 高级管理 PodReplicaSet 的控制器,用于声明和管理应用的期望状态。支持滚动更新和回滚。

ReplicaSet: 确保指定数量的 Pod 副本运行,通常由 Deployment 管理。

StatefulSet: 用于管理有状态应用,确保 Pod 有固定的标识和稳定的存储。适用于数据库和其他需要持久化数据的应用。

DaemonSet: 确保每个(或指定)节点上运行一个 Pod 副本,适用于日志收集、监控等系统服务。

Job: 管理一次性任务,确保任务成功完成。

CronJob: 管理定时任务,根据时间表定期运行 Job

四、工作


  1. 用户提交请求: 通过 kubectl 命令行工具或其他客户端向 API Server 发送请求。

  2. API Server 处理请求: API Server 处理请求并将数据存储在 etcd 中。

  3. Scheduler 调度 Pod: Scheduler 检查未绑定的 Pod 并根据资源需求和策略将其调度到合适的节点上。

  4. kubelet 管理 Pod: kubelet 在指定节点上创建和管理 Pod,确保它们按预期运行。

  5. Service 和负载均衡: Kube-Proxy 管理网络规则,确保服务请求被正确路由到对应的 Pod

  6. Controller 保持状态: Controller Manager 运行各种控制器,确保集群的实际状态与期望状态一致。

五、应用


Kubernetes 具有 强大的编排能力,支持复杂的应用部署和管理需求。具有高可用性, 自动化的自愈和扩展机制确保应用程序的高可用性。同时 具有高扩展性,通过控制器和自定义资源定义(CRD)可以扩展 Kubernetes 的功能。还 具有灵活的存储和网络解决方案, 支持多种存储和网络插件。适用场景如下:

  1. 微服务架构:适合部署和管理微服务架构的应用程序。

  2. 持续集成和持续部署(CI/CD:支持自动化的应用程序部署和更新。

  3. 多租户环境:通过命名空间和资源配额实现资源隔离和管理。

  4. 混合云和多云环境:支持跨多个云提供商的统一管理。