云原生架构 - k8s基础

K8S(Kubernetes)是一个开源的容器部署和管理平台,由Google开发后捐献给云原生计算基金会(CNCF)。以下是K8S的基础知识概述:

一、K8S概述

  1. 定义:K8S的全称为Kubernetes,用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。可以理解成K8S是负责自动化运维管理多个容器化程序(比如Docker)的集群,是一个生态极其丰富的容器编排框架工具。

  2. 特性

    • 弹性伸缩:根据应用负载自动调整资源,确保应用在高负载时稳定运行,在低负载时节省资源。
    • 自我修复:自动检测并替换故障节点或容器,确保应用始终可用。
    • 服务发现和负载均衡:为应用提供稳定的网络接入点,实现服务发现和负载均衡。
    • 自动发布和回滚:支持滚动发布模式,如果更新过程中出现问题,可以回滚到之前的版本。
    • 集中化配置管理和密钥管理:方便管理应用配置和敏感数据。
    • 存储编排:支持外挂存储并对外挂存储资源进行编排,提高存储使用灵活性。

二、K8S集群架构与组件

K8S的架构采用主从设备模型(Master-Slave架构),即由Master节点负责集群的调度、管理和运维,Slave节点作为集群中的运算工作负载节点。

  1. 中央控制节点(Master Node)

    • 位于集群的中心,包含API Server、Scheduler、Controller Manager和etcd等组件。
    • 这些组件协同工作,负责集群的管理、调度和状态监控。
  2. 工作节点(Worker Node)

    • 围绕在Master Node周围,每个Node节点上运行Kubelet、Kube-Proxy和容器运行时等组件。
    • 这些节点负责执行Master节点分配的任务,运行和管理容器实例。

三、K8S核心组件

  1. etcd

    • 一个高度可靠的分布式键值存储,用于存储集群配置信息的持久化存储。
    • etcd保存了Kubernetes集群的所有状态数据,如Pods、Services等资源的定义和状态。
  2. kube-apiserver

    • Kubernetes集群的API服务器,是集群的前端服务器,提供了HTTP/HTTPS RESTful API。
    • 所有的请求都需要经过这个接口进行通信,负责接收、校验并响应所有的REST请求,并将结果状态持久化存储在etcd中。
  3. kube-controller-manager

    • Kubernetes集群中的控制器管理器,负责管理集群中所有的控制器(controller)。
    • 这些控制器包括节点控制器(Node Controller)、副本控制器(Replication Controller)等,它们不断地监听集群状态变化,并根据期望状态和实际状态的差异来进行调谐。
  4. kube-scheduler

    • Kubernetes集群的默认调度器,负责将新创建的Pod调度到合适的节点上。
    • 调度决策考虑的因素包括单个Pod及Pods集合的资源需求、软硬件及策略约束、亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限等。
  5. kubelet

    • 在每个节点上运行的代理,负责管理该节点上的容器、Pod和容器相关的资源。
    • 是节点与主节点通信的桥梁,执行主节点下发的指令。
  6. kube-proxy

    • 网络代理,负责实现Kubernetes服务的网络抽象和负载均衡。
    • 它将对服务的访问转发到后端的一组Pod上,提供服务的网络访问能力,确保服务的可靠性和可扩展性。

四、K8S核心概念

  1. Pod

    • Kubernetes中的最小调度单元,由一个或多个容器组成,这些容器共享存储和网络资源。
    • Pod是Kubernetes生态系统中的核心管理单元。
  2. Service

    • 为Pod提供稳定的网络接入点,实现服务发现和负载均衡。
  3. LabelLabel Selector

    • 用于组织和选择资源对象的标签和标签选择器。
  4. Namespace

    • 用于将集群内部的资源逻辑上划分为不同的空间,方便管理和隔离。

五、K8S工作流程

  1. 用户通过kubectl命令行工具、UI界面或API向kube-apiserver发送请求。
  2. kube-apiserver接收请求后,进行身份验证和授权,然后将请求转发给相应的控制器(如Controller Manager)或调度器(如kube-scheduler)。
  3. 控制器根据请求的类型和集群的当前状态,生成相应的资源对象(如Pod)并存储在etcd中。
  4. kubelet在Node节点上监控etcd中的资源对象变化,并相应地创建、更新或删除容器。
  5. kube-proxy负责实现服务的网络抽象和负载均衡,确保服务的可靠性和可扩展性。

综上所述,K8S是一个功能强大的容器编排工具,通过其丰富的组件和核心概念,可以实现对容器化应用程序的自动化部署、扩展和管理。