【Kubernetes】架构与原理:核心概念、组件协同及容器化部署解析

文章目录

一、前言
二、为什么需要 Kubernetes

1. 传统部署方法
2. 虚拟化部署
3. 容器化部署

Ⅰ. 基本概念
Ⅱ. 容器编排的必要性
Ⅲ. 容器化部署的优势

4. k8s 的历史与发展

三、Kubernetes 基本概念

1. k8s 核心架构解析

Ⅰ. 控制平面与工作节点
Ⅱ. 各组件协同工作原理

2. k8s 核心概念

Ⅰ. Pod:K8s的最小调度单元
Ⅱ. 控制器:Deployment、StatefulSet等
Ⅲ. 服务发现:Service与Ingress
Ⅳ. 配置与存储:ConfigMap、Secret、Volume

四、问题

1. k8s 能做什么
2. k8s 与 docker 的差别
3. 对比:容器 vs. 虚拟机 vs. 物理机

一、前言

Kubernetes(简称K8s)作为现代云计算架构的核心组件之一,已经成为了容器编排的行业标准。随着容器技术的兴起,传统的应用部署和管理方式面临着极大的挑战,促使了Kubernetes的诞生。


二、为什么需要 Kubernetes

1. 传统部署方法

早期,各组织将应用程序运行在物理服务器上,但由于无法限制同一服务器中各应用程序的资源使用,常常导致资源分配不均。例如,多个应用程序在同一物理服务器上运行时,某个应用可能占用大部分资源,从而影响其他应用的性能。

一种解决方案是:将每个应用程序部署到不同的物理服务器上,即使用多个应用服务器。这种方式虽能避免资源争夺,但显然会增加服务器维护成本,特别是当某些应用程序的资源利用率较低时。


2. 虚拟化部署

因此,引入了虚拟化技术,它允许单台物理服务器的 CPU 同时运行多个虚拟机(VM)。虚拟化技术使得应用程序能够在不同的虚拟机之间彼此隔离,提供了一定程度的安全性,因为一个应用程序的数据无法被其他程序随意访问。

虚拟化技术能够更有效地利用服务器资源,使得对程序的操作(如添加、更新等)更加便捷,同时提升了可扩展性并降低了硬件成本。通过虚拟化,物理资源可以被整合并呈现为灵活可调整的虚拟机集群。

每个VM都作为独立的计算单元运行(看作一台完整的计算机),包含完整的操作系统栈和应用程序环境。


3. 容器化部署

Ⅰ. 基本概念

容器类似于虚拟机(VM),但其隔离特性更为宽松,容器之间可以共享操作系统(OS)。因此,容器相比虚拟机更为轻量级。尽管如此,每个容器依然拥有独立的文件系统、CPU、内存和进程空间等资源。

由于容器与基础架构分离,它具有良好的移植性,可以跨云平台和操作系统版本进行迁移。

Ⅱ. 容器编排的必要性

随着容器技术的普及,单个容器的管理变得相对简单,但当应用规模扩大,涉及数百、数千个容器时,管理工作变得异常复杂。如何协调、调度、扩展、监控容器的运行是个大问题。因此,容器编排工具应运而生。容器编排帮助开发者自动化地部署、管理和扩展容器化应用。

Kubernetes 就是为了解决这些问题而设计的容器编排平台。它能够自动化地进行容器调度、部署、扩展以及管理,使得开发者可以专注于业务逻辑的实现,而无需过多关心底层的基础设施。

Kubernetes 提供了一些能力:

自动化容器部署和复制
动态扩缩容能力
服务发现和负载均衡
自动恢复和自愈机制
声明式配置管理

Ⅲ. 容器化部署的优势

1. 环境一致性

问题:传统部署中,开发、测试、生产环境差异可能导致“在我机器上能跑”的问题。
容器化解决

容器将应用及其依赖(库、配置、运行时)打包为一个标准化单元,确保环境完全一致。
开发、测试、生产环境使用相同的镜像,避免因环境差异导致的故障。

2. 快速部署与扩展

传统方式的问题:部署新服务需手动安装依赖、配置环境,耗时且易出错。
容器化优势

启动快:容器轻量级(共享主机内核),启动速度远快于虚拟机。
弹性伸缩:结合编排工具(如 Kubernetes),可快速横向扩展实例应对流量高峰。
回滚方便:通过镜像版本控制,快速回退到旧版本。

3. 资源高效利用

与传统虚拟机对比

虚拟机(VM)需独占完整的操作系统和内核,资源占用高。
容器共享主机内核,无需重复加载 OS,CPU/内存利用率更高,相同硬件可运行更多服务。

4. 隔离性与安全性

进程隔离:每个容器拥有独立的文件系统、网络和进程空间,避免应用间冲突(如端口占用)。
安全控制:通过命名空间(Namespace)和控制组(CGroup)限制资源访问,减少攻击面。
(注:需配合安全最佳实践,如最小权限镜像、定期漏洞扫描。)

5. 跨平台与多云支持

一次构建,跨平台运行:容器镜像可在任何支持容器运行时(如 Docker、containerd)的环境中运行,无论是物理机、公有云(AWS/Azure/GCP)还是混合云。
避免厂商锁定:标准化容器格式(OCI)使迁移成本极低。

6. 微服务架构友好

模块化拆分:每个微服务可独立容器化,单独开发、部署和扩展。
简化通信:通过容器网络(如 Docker Network 或 Service Mesh)实现服务间高效通信。

7. DevOps 与 CI/CD 集成

自动化流水线:容器与 CI/CD 工具(Jenkins、GitLab CI)天然契合,实现:

代码提交 → 自动构建镜像 → 测试 → 部署到生产。

不可变基础设施:容器镜像一旦构建即不可变,确保部署过程可重复、可审计。

8. 简化依赖管理

依赖冲突解决:例如,应用 A 需 Python 3.8,应用 B 需 Python 3.10,传统部署需复杂环境隔离,而容器可各自独立运行。
多版本共存:通过容器轻松管理同一服务的不同版本(如 API v1 和 v2 并行)。


4. k8s 的历史与发展

Kubernetes 源于Borg系统,Borg是Google内部用于大规模容器管理的系统。Google基于Borg,于2014年将Kubernetes开源,旨在为企业级应用提供一个可扩展、灵活且强大的容器管理平台。Kubernetes不仅继承了Borg的许多优点,还在可扩展性、灵活性以及社区支持方面做了大量改进。自从开源以来,Kubernetes便迅速成为了容器编排领域的领导者,并且在业界获得了广泛的应用。

即经历了下面的三个阶段:

诞生阶段(2014-2015)

Google开源Borg的简化版本
2015年7月发布1.0版本
云原生计算基金会(CNCF)成立

标准化阶段(2016-2018)

成为容器编排事实标准
主要云厂商推出托管K8s服务(EKS、GKE、AKS)
CRD(自定义资源)引入扩展能力

成熟阶段(2019至今)

发布稳定性承诺(1.16+)
服务网格、Serverless等扩展生态繁荣
2022年达到92%的容器编排市场占有率(CNCF调查)


三、Kubernetes 基本概念

Kubernetes(简称 k8s)本质上是一个服务器集群,它可以在集群中的每个节点上运行指定的程序,从而对节点中的容器进行高效管理。其主要目的是实现资源的自动化管理,提供以下功能:

自我修复:当容器崩溃时,Kubernetes能在1秒内快速启动新的容器。
弹性伸缩:根据需求自动调整集群中容器的数量。
服务发现:通过自动发现机制,便捷地找到依赖的服务。
负载均衡:当一个服务运行多个容器时,能够自动均衡请求负载。
版本回退:如果新发布的版本存在问题,可以迅速回退到之前的版本。
存储编排:根据容器需求自动创建和管理存储卷。

1. k8s 核心架构解析

Ⅰ. 控制平面与工作节点

Kubernetes的架构分为两个主要部分:控制平面(Control Plane)和工作节点(Node)。

控制平面:负责管理Kubernetes集群的整体状态,决策集群的调度和资源分配。控制平面包括多个组件,如API Server、Scheduler、Controller Manager、etcd等。

API Server:Kubernetes的“控制中心”,所有的请求都通过API Server进行处理。它是与用户交互的入口,负责接收请求并将其传递到集群的各个组件。
Scheduler:负责将待运行的Pod调度到合适的工作节点上。Scheduler会根据节点的资源使用情况、Pod的需求等进行智能调度。
Controller Manager:负责确保集群中所有资源的状态与期望状态保持一致,如副本控制器(ReplicaSet)等。
etcd:Kubernetes的分布式存储系统,用于保存集群的所有配置信息和状态数据,确保集群状态的一致性和持久性。

工作节点:每个工作节点(Node)是运行Pod的地方,负责承载应用容器。每个工作节点都包含以下几个核心组件:

Kubelet:负责确保容器按期望方式运行,并且根据控制平面的指示进行工作。Kubelet会周期性地向API Server报告节点和Pod的状态。
Kube Proxy:提供服务发现和负载均衡的功能。它确保不同Pod间的网络通信,并根据Service的定义进行流量分发。

Ⅱ. 各组件协同工作原理

Kubernetes通过控制平面与工作节点的协作,完成集群管理的任务。当开发者提交一个请求(例如创建Pod)时,该请求通过API Server传递到控制平面,Scheduler根据节点资源的可用性将Pod调度到合适的工作节点上。Kubelet负责在工作节点上实际启动和运行容器,Kube Proxy则确保容器之间的网络通信。

整个过程中,Kubernetes利用控制平面的状态管理功能,确保集群的整体健康状态。例如,若某个节点故障,Scheduler会重新调度Pod到健康的节点上,从而实现高可用性。

以部署一个应用为例:

用户通过kubectl提交Deployment配置到API Server
API Server将配置写入etcd
Scheduler发现未调度的Pod,根据策略选择合适节点
目标节点的kubelet通过容器运行时拉取镜像并启动容器
Controller Manager持续监控实际状态,确保与期望状态一致


2. k8s 核心概念

Ⅰ. Pod:K8s的最小调度单元

在Kubernetes中,Pod是最小的部署和管理单元。Pod可以包含一个或多个容器,这些容器共享相同的网络和存储资源。在同一个Pod中的容器通常会共同运行,并且共享IP地址和端口,因此它们之间的通信非常高效。

一个或多个容器的组合(通常1:1)

共享网络命名空间和存储卷

生命周期短暂(设计为可随时被替换)

示例YAML:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.19
    ports:
    - containerPort: 80

上面的pod定义了一个 Pod 对象:描述了一个名为 nginx-pod 的 Pod,Pod 中包含一个容器,容器使用nginx:1.19 镜像,并暴露了 80 端口。

Ⅱ. 控制器:Deployment、StatefulSet等

控制器是Kubernetes用于管理Pod和其他资源的机制。常见的控制器有:

Deployment:用于管理无状态的应用,它可以自动进行Pod的副本管理、滚动更新等。
StatefulSet:与Deployment类似,但用于管理有状态应用(例如数据库)。它能够保证Pod的顺序部署和稳定的网络标识。
ReplicaSet:确保Pod的副本数符合期望。ReplicaSet通常由Deployment创建并管理。
DaemonSet:确保集群中每个节点上都运行一个Pod副本,通常用于日志收集、监控等场景。

Ⅲ. 服务发现:Service与Ingress

Service:Kubernetes中的Service是用于暴露一组Pod的访问入口。Service通过为Pod分配稳定的DNS名称和IP地址,解决了Pod生命周期不稳定的问题,使得应用间的通信更加简便。

四种类型:

ClusterIP(默认,集群内访问)
NodePort(通过节点端口暴露)
LoadBalancer(云提供商负载均衡器)
ExternalName(外部服务别名)

Ingress:Ingress是一种API资源,允许外部HTTP和HTTPS流量访问集群内部的服务。它通常与Ingress Controller配合使用,用于提供反向代理、负载均衡、SSL终止等功能。

Ⅳ. 配置与存储:ConfigMap、Secret、Volume

ConfigMap:Kubernetes中的ConfigMap用于存储配置数据,可以将配置信息传递给Pod,避免将配置硬编码到应用程序中。

与Pod解耦,支持热更新

Secret:Secret用于存储敏感信息,如数据库密码、API密钥等。与ConfigMap不同,Secret会对数据进行编码,以增加安全性。

默认base64编码(非加密)

Volume:Kubernetes中的Volume是用于持久化存储数据的机制。Pod中的容器可以挂载Volume,从而保证数据在容器重启后得以持久化。

类型包括:

emptyDir(临时目录)
hostPath(节点目录)
PersistentVolumeClaim(持久卷声明)


四、问题

1. k8s 能做什么

Kubernetes 是一个开源的容器编排平台,它可以帮助你自动化部署、扩展和管理容器化应用程序。以下是 Kubernetes 能做的一些主要事情:

容器编排与管理
Kubernetes 能够自动管理容器应用的生命周期,包括:

自动化部署:可以自动部署容器化应用,确保应用运行在所需的容器中。
容器调度:根据集群的资源情况,Kubernetes 会智能地选择在哪个节点上运行容器,确保负载均衡和资源的高效利用。
健康检查:Kubernetes 可以定期检查容器的健康状态,自动重启或替换失败的容器。

扩展与弹性伸缩

自动扩展:Kubernetes 可以根据负载情况自动扩展或缩减容器的数量,确保应用性能始终处于最佳状态。
水平自动伸缩:根据 CPU、内存等资源的使用情况,Kubernetes 能自动增加或减少容器实例。

负载均衡
Kubernetes 内建了服务发现和负载均衡功能:

服务发现:Kubernetes 会自动为容器应用分配 IP 地址并配置 DNS 以进行内部通信。
负载均衡:当多个容器实例提供服务时,Kubernetes 会均匀地将请求分发到这些实例,确保负载均衡。

存储管理

Kubernetes 支持多种存储解决方案(如本地存储、网络存储、云存储等),你可以动态地为容器应用提供持久化存储。
它支持存储卷(Volume)和存储类(Storage Class),以便为容器提供高效的持久数据存储。

服务发现与DNS

Kubernetes 能够自动为应用组件创建服务,提供可靠的服务发现机制,使应用组件之间的通信变得非常简单。
所有容器和服务都可以通过 Kubernetes 的内置 DNS 服务进行访问。

持续集成与持续部署(CI/CD)

Kubernetes 可以与持续集成(CI)和持续部署(CD)工具集成,帮助自动化代码的构建、测试、部署和发布。
它支持蓝绿部署、滚动更新等高级部署策略,以确保无缝发布新版本应用。

高可用性与故障恢复

高可用性:Kubernetes 可以跨多个节点部署应用,避免单点故障。如果某个节点或容器发生故障,Kubernetes 会自动将工作负载迁移到健康的节点上。
自动修复:如果容器发生故障,Kubernetes 会自动重启或者重新调度它们,确保应用始终运行。

安全性
Kubernetes 提供了多种安全机制,确保容器化应用的安全:

RBAC(基于角色的访问控制):管理和控制谁可以访问和操作 Kubernetes 资源。
网络策略:控制不同容器之间的通信,可以限制某些容器之间的访问。
密钥和凭证管理:Kubernetes 提供了管理敏感信息(如密码、API 密钥、TLS 证书等)的功能。

多云和混合云支持
Kubernetes 是跨云平台的,它支持本地数据中心、私有云、公有云以及混合云环境的部署,使得应用能够跨不同环境运行。它可以帮助企业实现云平台之间的迁移和容器化应用的统一管理。

资源管理与限额
Kubernetes 可以对资源进行精细的管理:

资源请求与限制:Kubernetes 允许你为容器设置 CPU 和内存的请求与限制,确保资源的合理分配。
资源配额:可以对项目或命名空间设置资源配额,防止某些应用过度消耗资源。

2. k8s 与 docker 的差别

Docker 是一个用于构建、分发和运行容器的平台,而 Kubernetes 是一个用于编排和管理容器化应用程序的容器编排工具。

Docker 侧重于单个容器的构建、管理和运行,而 Kubernetes 主要已关注多个容器的组织、调度和管理。
Docker 提供了容器构建、镜像推送与拉取、容器启动与停止等基础功能,而 Kubernetes 提供了更高级的功能,如自动扩缩容、负载均衡和滚动更新等。
Kubernetes 提供了多种概念和抽象(如 Pod、Service 和控制器等),用于构建复杂的应用架构,而 Docker 主要专注于单一应用容器化。
Kubernetes 在集群管理和高可用性方面具有更强的能力,适用于大规模集群的应用部署,而 Docker 更适用于单机或小规模集群的管理。
Kubernetes 支持跨平台和云平台的可移植性,可在多种云环境中运行,而 Docker 则作为容器运行时,依赖于特定的操作系统和硬件环境。

Docker 和 Kubernetes 是紧密相关的技术,Docker 主要负责容器的构建与运行,而 Kubernetes 负责容器的编排与管理,用于构建和管理复杂的容器化应用程序。
在实际应用中,二者通常配合使用,Docker 用于创建和管理容器镜像,Kubernetes 则负责在集群中进行容器的编排和管理。

3. 对比:容器 vs. 虚拟机 vs. 物理机

特性 容器 虚拟机(VM) 物理机
启动速度 秒级 分钟级 小时级(需硬件准备)
资源占用 低(共享内核) 高(独占 OS) 最高(独占硬件)
隔离性 进程级 系统级 完全隔离
部署密度 高(单机数百容器) 中(单机数十 VM) 低(单服务单机)
跨平台性 强(依赖容器运行时) 中(需兼容 Hypervisor) 弱(依赖特定硬件)
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容