【k8s集群应用】Kubernetes 容器编排系统

发布于:2024-12-18 ⋅ 阅读:(187) ⋅ 点赞:(0)

Kubernetes 容器编排系统

背景与发展

更高级的容器编排工具:

工具名称 描述 所属公司/组织
docker-swarm Docker旗下的容器跨主机编排工具,是实现在多机上Docker容器及其管理调度的工具 Docker
mesos + marathon mesos:分布式资源管理框架,可以对集群中的多台主机的硬件资源进行统一调度和管理
marathon:mesos的容器编排框架,用来调度和运行容器服务
Apache
kubernetes Google旗下的容器跨主机编排工具,已经成为当前容器编排工具的事实标准 Google

物理机时代
物理机存在诸多局限,如部署慢、成本高、资源浪费以及扩展和迁移困难。每台物理服务器需要单独安装操作系统和应用程序环境,配置繁琐且硬件资源利用率低。
虚拟机时代
虚拟机(如VMware)通过虚拟化技术解决了物理机的部分问题。虚拟机可以在物理机上快速部署,实现资源池化,提高资源利用率,并通过资源隔离确保虚拟机之间的独立性。然而,虚拟机仍需安装完整的操作系统,导致资源消耗较大。
容器化时代
容器化技术(如Docker)进一步解决了虚拟机的缺点。容器共享主机操作系统内核,无需安装完整的操作系统,从而实现了更高效的资源利用。容器具有一致的运行环境,启动速度快,且镜像体积小,便于分发和管理。然而,单机上的容器编排存在诸多挑战,如节点管理、负载均衡、自动化运维等。

Kubernetes 基本概念

全称与缩写
全称为 Kubernetes (K12345678S)(简称K8s)是一个用于自动部署、扩展和管理容器化应用程序的开源系统。K8s的名字来源于希腊语的舵手或飞行员,寓意着它作为容器集群的“领航者”。

由来与发展
K8s起源于Google的Borg系统(博格系统,google内部使用的大规模容器编排工具),后经GO语言重写并捐献给云原生计算基金会(CNCF)开源。随着容器的广泛使用,K8s已成为容器编排工具的事实标准。

作用与特点
K8s是一个生态极其丰富的容器编排框架工具,负责自动化运维管理多个容器化程序。它提供了自动化管理、弹性伸缩、高可用性、负载均衡和跨平台支持等特点,大大提高了应用部署和管理的效率。

Kubernetes 集群架构与组件

主从设备模型
K8s采用主从设备模型(Master-Slave架构),其中Master节点负责集群的调度、管理和运维,而Worker Node节点则负责运行工作负载。
Master组件

  • API Server:集群的统一入口,负责处理RESTful API请求。
  • Scheduler:负责根据调度算法将Pod调度到合适的Node上。
  • Controller Manager:负责集群内各种资源的自动化管理,如ReplicaSet、Deployment等。
  • etcd:一个高可用的分布式键值数据库,用于存储集群的配置信息和状态。

Worker Node组件

  • kubelet:Node的代理,负责监听API Server的指令并执行相应的操作。
  • kube-proxy:实现Service的负载均衡和内部通信。
  • Docker(或其他容器运行时):负责容器的创建和管理。

其他组件

  • Addon:K8s的扩展组件,如DNS、Ingress Controller、Dashboard等。

在这里插入图片描述

Kubernetes 核心组件

Master 组件

1. Kube-apiserver

  • 功能
    • 暴露 Kubernetes API,作为集群的统一入口。
    • 处理所有资源请求或调用操作,通过 HTTP Restful API 提供服务。
    • 验证请求的合法性,并将请求转发给相应的控制器进行处理。
    • 存储资源对象的状态到 Etcd 中。
  • 工作原理
    1. 监听特定端口,接收来自客户端的 HTTP 请求。
    2. 对请求进行认证和授权。
    3. 验证请求中的数据格式和内容。
    4. 将请求信息存储到 Etcd 中,并更新集群状态。
    5. 提供其他模块之间的数据交互和通信的枢纽。

2. Kube-controller-manager

  • 功能
    • 运行管理控制器,处理 K8S 集群中的常规任务。
    • 监控和管理集群中的各种资源,确保集群处于预期的工作状态。
  • 包含的控制器
    • Node Controller:负责节点故障发现和响应。
    • Replication Controller:确保 Pod 副本数始终保持预设值。
    • Endpoints Controller:填充端点对象,连接 Services 和 Pods。
    • Service Account & Token Controllers:为新的命名空间创建默认帐户和 API 访问令牌。
    • ResourceQuota Controller:确保资源对象不会超量占用系统资源。
    • Namespace Controller:管理 namespace 的生命周期。
    • Service Controller:K8S 集群与外部云平台之间的接口控制器。
  • 工作原理
    1. 通过 API Server 定期获取资源的状态信息。
    2. 根据资源的定义和当前状态,计算期望状态。
    3. 如果当前状态与期望状态不一致,采取相应的行动。

3. Kube-scheduler

  • 功能
    • 负责资源调度,将待调度的 Pod 分配到合适的节点上运行。
  • 调度策略
    • 预选策略(predicate):过滤不符合条件的节点。
    • 优选策略(priorities):优先级排序,选择优先级最高的节点。
  • 工作原理
    1. 从 API Server 获取尚未分配到节点的 Pod 信息。
    2. 根据 Pod 的资源需求和节点的可用资源,筛选出符合条件的节点。
    3. 为符合条件的节点计算优先级。
    4. 选择优先级最高的节点,并将 Pod 调度到该节点上。
配置存储中心

Etcd

  • 功能
    • K8S 的存储服务,保存集群的所有配置和状态信息。
    • 仅 API Server 具备读写权限,其他组件通过 API Server 接口读写数据。
  • 工作原理
    1. 以键值对的形式存储 K8S 集群的配置数据、资源对象的定义和状态等。
    2. 通过 Raft 一致性算法确保数据的一致性和可靠性。
    3. 在多个 Etcd 节点之间同步数据,实现高可用性。
Node 组件

1. Kubelet

  • 功能
    • Master 在 Node 节点上的 Agent 代理程序,管理 Pod 和容器的生命周期。
    • 将每个 Pod 转换成一组容器。
  • 工作原理
    1. 向 API Server 注册节点信息。
    2. 根据 API Server 的指令,启动、停止和监控 Pod 中的容器。
    3. 定期收集节点的资源使用情况,并上报给 API Server。

2. Kube-proxy

  • 功能
    • 实现 K8S 中的服务发现和负载均衡功能。
    • 在 node 节点上实现 Pod 网络代理,维护网络规则和四层负载均衡工作。
  • 工作原理
    1. 监听 API Server 中 service 和 endpoint 的变化情况。
    2. 根据 service 的定义,在节点上配置网络规则,实现请求的分发和负载均衡。
    3. 定期检查后端 Pod 的健康状况。

3. Container Runtime

  • 功能
    • 容器引擎,负责运行容器。
    • 常见的实现包括 Docker、Containerd 等。
  • 工作原理
    1. 根据 Pod 中容器的定义,从镜像仓库拉取所需的镜像。
    2. 创建和启动容器,并配置相应的网络和存储。
    3. 实现容器之间的资源隔离和限制。

Kubernetes核心概念

1. Pod

  • 定义:Pod是Kubernetes中最小的可部署的计算单元,它包含一个或多个容器,这些容器共享网络、存储等资源,并在同一台Node节点上运行。
  • 特点
    • 一个Pod可以运行多个容器,称为边车模式(SideCar),常用于日志收集、监控等辅助任务。
    • Pod内的容器可以通过localhost互相访问,并可以挂载Pod内的所有数据卷。
    • 不同的Pod之间不能通过localhost访问,也不能挂载其他Pod的数据卷。

2. Pod控制器

  • 定义:Pod控制器用于确保Pod按照用户的预期运行,包括副本数、生命周期、健康状态检查等。
  • 常用控制器
    • Deployment:无状态应用部署,用于管理和控制Pod和ReplicaSet。
    • ReplicaSet:确保预期的Pod副本数量,受Deployment控制。
    • DaemonSet:确保所有节点运行同一类Pod,常用于系统级后台任务。
    • StatefulSet:有状态应用部署,适用于需要稳定且唯一的网络标识符的应用。
    • Job:一次性任务,Pod完成任务后自动退出。
    • CronJob:周期性计划性任务。

3. Label与Label选择器

  • Label:用于分类管理资源对象,可以附加到Node、Pod、Service等资源上,通过key-value键值对定义。
  • Label选择器:用于查询和筛选拥有特定Label的资源对象,支持等值关系和集合关系选择器。

4. Service

  • 定义:Service是Kubernetes中用于访问一组Pod的抽象层,提供稳定的对外访问接口和负载均衡功能。
  • 特点
    • Service通过标签选择器定义作用于哪些Pod。
    • Service有固定的虚拟IP(Cluster IP),自动绑定后端Pod,实现流量转发和负载均衡。
    • Service支持多种流量调度模式,如iptables和ipvs。

5. Ingress

  • 定义:Ingress是Kubernetes集群的接入层,负责集群内外通讯,支持HTTP/HTTPS协议。
  • 特点
    • Ingress可以调度不同业务域、不同URL访问路径的业务流量。
    • Ingress通常与Service配合使用,实现外部访问集群内部服务。

6. Volume

  • 定义:Volume是Pod访问文件系统的抽象层,支持多种后端存储,如本地存储、NFS网络存储、云存储等。
  • 特点
    • Volume可以被挂载在Pod中一个或多个容器的指定路径下。
    • Volume提供了Pod间数据共享和持久化的能力。

7. Name与Namespace

  • Name:资源在Kubernetes中的唯一标识符,通常定义在资源的元数据(metadata)信息里。
  • Namespace:用于逻辑上隔离Kubernetes内的各种资源,不同Namespace内的资源名称可以相同,但相同Namespace内的同种资源名称必须唯一。
  • 常用Namespace
    • default:默认Namespace,未指定Namespace时使用的Namespace。
    • kube-system:Kubernetes系统创建的Namespace,用于存放系统级资源。
    • kube-public:Kubernetes自动创建的Namespace,用于存放整个集群范围内可见的资源。

K8S创建Pod资源对象的工作流程

  1. 用户通过客户端发送创建Pod的请求给apiserver
  2. apiserver接收到请求并验证后,会先将请求信息存入到etcd中,etc写入完成后,会发送创建Pod的事件给apiserver,再由apiserver转发给controller-manager
  3. controller-manager通过list-watch监听到apiserver发来的事件后,会根据请求信息中的资源配置创建Pod资源
  4. controller-manager创建好Pod资源后会通过apiserver将Pod资源的信息写入到etcd中,etc写入完成后,再发送事件给apiserver,再由apiserver转发给scheduler
  5. scheduler通过list-watch监听到apiserver发来的事件后,开始调度新创建的Pod,会先根据调度算法的预选策略过滤掉不符合条件的node节点,再根据优选策略选择优先级最高的node节点来调度Pod
  6. scheduler调度好Pod资源后会通过apiserver更新Pod资源的信息到etcd中,etc更新完成后,再发送事件给apiserver,再由apiserver转发node节点上的kubelet
  7. node节点上的kubelet通过list-watch监听到apiserver发来的事件后,会在node节点上调用容器引擎创建Pod及其容器,并管理它们的生命周期
  8. kubelet之后会定期收集Pod资源的状态并上报给apiserver
  9. 用户还可以通过apiserver在kube-proxy上创建service的网络规则,实现对Pod的网络代理和负载均衡

总结

K8S资源对象

资源对象 描述
Pod K8S能够创建和管理的最小单元,一个Pod里可以包含一个或多个容器,容器间共享网络、存储等资源
Deployment 部署无状态应用,管理replicaset和Pod
StatefulSet 部署有状态应用
DaemonSet 在每个node节点上都部署同一类的Pod
Job 一次性的部署短期任务的Pod
CronJob 周期性的部署短期任务的Pod
Service 在K8S集群内部,为通过标签选择器关联的一组Pod提供统一的访问入口和负载均衡
Ingress 作为K8S集群外部的访问入口,支持七层代理转发
Volume 存储卷,Pod中的容器可以挂载使用的文件系统

K8S资源配置字段

字段 描述
apiversion 指定资源对象使用的api版本
kind 指定资源对象的类型
metadata 指定资源对象的元数据信息
spec 指定资源对象的配置属性
status 资源对象在当前的运行状态

元数据信息配置字段

字段 描述
name 指定资源名称
namespace 指定资源对象所在的命名空间。在同一个命名空间中,同类型资源的名称是唯一的
label 指定资源使用的标签。可以给资源对象添加一个或多个键值对标签,再通过标签选择器进行资源的分组和过滤