Kubernetes - [01] 概述

容器编排工具

 

 

一、什么是Kubernetes

  K8s,即Kubernetes,是一个开源的容器管理自动化部署平台,设计用于简化容器化应用程序的部署、扩展和管理过程。它是Google在2014年基于其内部使用的Borg系统开发并开源的项目,已经成为云原生计算基金会(CNCF)的旗舰项目。

(1)虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境。

优点:程序环境不会相互产生影响,提供了一定程度的安全性。

缺点:增加了操作系统,浪费了部分资源。

(2)容器化部署:与虚拟化类似,但是共享了操作系统。

优点:

① 可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等。

② 运行应用程序所需的资源都被容器包装,并和底层基础架构解耦。

③ 容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署。

 

 

二、Kubernetes的核心功能和特点

  1. 容器编排:自动部署、调度和管理容器化应用,确保指定数量的容器实例在任何给定时间运行。
  2. 服务发现与负载均衡:自动发现应用容器并分配网络访问,同时提供负载均衡以优化资源使用和提高应用可用性。
  3. 自我修复:当容器失败时,Kubernetes能够自动重启容器、替换容器或杀死不响应的容器,确保应用程序持续运行。
  4. 可扩展性:无论是无状态还是有状态应用,都能实现横向和纵向的扩展,以应对流量变化。
  5. 存储卷管理:支持多种存储解决方案,为应用提供持久化存储。
  6. 自动滚动更新:平滑地更新应用,无需停机,支持金丝雀发布等策略。
  7. 资源监控与管理:通过资源配额和限制,有效地管理计算资源(CPU、内存)。
  8. 声明式配置:使用YAML或JSON文件来描述期望的集群状态,Kubernetes确保实际状态与期望状态相匹配。

 Kubernetes的架构基于主从(Master-Slave)模型,其中Master节点负责集群的管理决策(如调度),而Worker(或称为Node)节点执行这些决策并运行实际的工作负载(容器)。这一设计使得Kubernetes能够跨机器、跨数据中心乃至跨云提供商进行灵活部署,支持云原生应用的微服务架构和持续集成/持续部署(CI/CD)流程。

 

 

三、组件说明

Borg系统架构

Kubernets架构

(1)api server:所有服务访问统一入口

(2)ControllerManager:维持副本期望数目(建议集群副本数 >= 3基数)

(3)Scheduler:负责介绍任务,选择合适的节点进行分配任务

(4)etcd分布式键值对数据库,存储K8s集群所有重要的信息(持久化)

(5)Kubelet:直接跟容器引擎交互实现容器的生命周期管理

(6)Kube-proxy:负责写入规则至iptables、ipvs实现服务映射访问的

(7)CoreDNS:可以为集群中的svc创建一个域名IP的对应关系解析

(8)Dashboard:给k8s集群提供一个B/S结构的访问体系

(9)Ingress Controller:官方只能实现四层代理,Ingress可以实现七层代理

(10)Federation:提供一个可以跨集群中心多k8s统一管理功能

(11)Prometheus:提供一个k8s集群的监控能力

(12)ELK:提供k8s集群日志统一分析接入平台

 

 

四、Pod概念

4.1、自主式Pod

  自主式Pod(Ad-Hoc Pod)由用户直接创建,不受到任何控制器的管理。创建方式通常是通过kubectl run命令或者直接向Kubernetes API Server提交包含Pod定义的YAML或JSON配置文件。这类Pod一旦被创建,除非手动删除,否则不会自动消失或重建。这意味着,如果Pod因某种原因(如节点故障、容器崩溃等)退出,它不会自动恢复到运行状态。

  自主式Pod适用于一次性任务或者测试场景,不适合需要确保服务高可用性的场景。

 

4.2、控制器管理的Pod

  控制器管理的Pod则是通过各种控制器(如ReplicationController, ReplicaSet, Deployment, StatefulSet, DaemonSet等)来创建和管理的。控制器的主要职责是确保集群中的Pod数量和状态符合预期的配置,即维持Pod的副本数量,处理Pod的扩展、收缩、更新和故障恢复等。当控制器管理的Pod因故终止时,控制器会自动创建新的Pod来替换它,从而保证应用的高可用性和期望的状态。控制器管理的Pod适合长期运行的服务、需要自动扩缩容的应用或者有特定部署需求(如有序部署、持久化存储绑定)的场景。

 

自主式Pod vs 控制器管理的Pod ?

管理方式:自主式Pod缺乏自动管理机制,而控制器管理的Pod则具备自动化的生命周期管理。

高可用性:控制器管理的Pod能够自动恢复,提供高可用性,自主式Pod则不具备这一特性。

使用场景:自主式Pod适用于临时任务或测试,控制器管理的Pod适用于生产环境中的稳定服务。

运维复杂度:自主式Pod操作简单,但需人工干预维护,控制器管理的Pod虽然配置相对复杂,但能显著减少日常运维工作。

 

4.3、ReplicationController

  ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。在新版本的Kubernetes中建议使用ReplicaSet来取代ReplicationController

 

4.4、ReplicaSet

  ReplicaSetReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector。

 

4.5、Deployment

  虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update但Deployment支持)

 

4.6、HPA

  K8s的HPA全称为Horizontal Pod Autoscaler,即水平Pod自动扩缩放。它是Kubernetes中一个核心功能组件,用于自动调整应用的Pod副本数量,以应对工作负载的变化。HPA通过监控预定义的性能指标(主要是CPU利用率,也可以配置为内存利用率或自定义指标),根据这些指标的实时状况动态地增加或减少Pod的数量,从而保证服务的性能和资源使用的高效性。

  Horizontal Pod Autoscaler仅适用于DeploymentReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩缩容,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容。

 

HPA的工作原理概要如下:

(1)配置指标与阈值用户通过YAML配置文件或命令行工具(如kubectl)设置HPA策略,包括目标CPU(或内存)利用率、最小与最大Pod副本数等。

(2)监控与评估HPA控制器周期性地从Metrics API(通常依赖于Metrics Server)收集目标Deployment、StatefulSet、ReplicaSet、ReplicationController中Pod的资源使用情况。

(3)自动调整当实际指标超过或低于设定的阈值时,HPA将自动调整Pod的副本数量。例如,如果CPU使用率持续高于设定的目标,HPA会增加Pod副本以分担负载;反之,如果CPU使用率低于某个阈值,且存在多余的Pod,则会减少副本数以节省资源。

(4)约束与限制:HPA的操作会在用户定义的最小与最大Pod副本数之间进行,确保扩缩容操作不会超出预设边界。

 

 

4.7、StatefulSet

StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:

  • 稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现。
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现。
  • 有序部署,有序扩展,即pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个pod运行之前所有之前的pod必须都是Running和Ready状态),基于init containers来实现。
  • 有序收缩,有序删除(即从N-1到0)

 

OS:感觉星环的TCOS管理Kundb的pod就是用的StatefulSet

 

 

4.7、DaemonSet

  DaemonSet确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod

 

使用DaemonSet的一些典型用法:

  • 运行集群存储daemon,例如在每个Node上运行glusterd、ceph
  • 在每个Node上运行日志手机daemon,例如fluentd、logstash
  • 在每个Node上运行监控daemon,例如Prometheus Node Exporter

 

疑问:给Pod打污点是什么意思?kubectl taint nodes my-node special=true:NoSchedule

具体操作参考 Kubernetes - [06] k8s的"Sao"操作

 

 

五、Job & CronJob

Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束

Cron Job管理基于时间的Job,即:

* 在给定时间点只运行一次

* 周期性地在给定时间点运行

 

六、集群类型

Kubernetes 集群大体上分为两类:一主多从多主多从

(1)一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。

(2)多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。

 

 

 

— 要养成终生学习的习惯 —

posted @ 2024-05-09 11:37  HOUHUILIN  阅读(2)  评论(0编辑  收藏  举报