Docker + Kubernetes(k8s) + Serverless详解
容器化(Docker)革命
Docker的核心架构
-
镜像(Image) :
- 只读模板,包含应用代码、运行时、库和配置文件。
- 分层存储:每层可复用(如基础OS层、Java环境层、应用层),减少重复传输。
-
容器(Container) :
- 镜像的运行实例,具有可写层(存储运行时数据)。
- 通过Linux Namespace实现隔离(PID、网络、文件系统等)。
- 通过Cgroups限制资源(CPU、内存、磁盘IO)。
-
容器仓库(Registry) :集中存储和分发镜像的平台(如Docker Hub私有仓库);支持版本控制与镜像签名(防止篡改)。
容器编排(Orchestration)
-
核心挑战:大规模容器集群的管理(调度、网络、存储、自愈)。
-
Kubernetes(K8s)的核心组件:
- Pod:最小调度单元,包含一个或多个共享网络/存储的容器。
- Deployment:定义Pod副本数与滚动更新策略。
- Service:为Pod提供稳定的IP和DNS名称,实现服务发现。
- Ingress:管理外部流量路由(如HTTP路径到后端服务)。
-
自动化能力:
- 自动扩缩容(HPA) :根据CPU使用率或自定义指标扩缩Pod数量。
- 自愈机制:Pod崩溃后自动重启,节点故障时迁移Pod。
容器网络模型
- Overlay网络:跨主机的容器通信(如Flannel的VXLAN、Calico的BGP协议);实现容器间扁平化IP互通,屏蔽底层网络差异。
- CNI(Container Network Interface) :标准化插件接口,支持多种网络方案(如AWS VPC、Cilium)。
容器存储
- Volume:持久化存储,生命周期独立于容器(如数据库数据);支持本地磁盘、云存储(AWS EBS)、分布式存储(Ceph)。
- Persistent Volume(PV) :K8s中抽象存储资源,通过PVC(Persistent Volume Claim)动态绑定。
Kubernetes深度解析
控制平面(Control Plane)
-
API Server
- 作用:所有资源操作的唯一入口(如创建Pod、更新Deployment),提供RESTful API。
- 特性:支持多版本API、认证鉴权(RBAC)、准入控制(Admission Control)。
-
etcd
- 作用:分布式键值存储数据库,保存集群状态(如节点信息、Pod配置)。
- 特性:强一致性(Raft共识算法)、高可用部署(多节点集群)。
-
Controller Manager
-
作用:运行各类控制器,持续监听集群状态并驱动其向期望状态收敛。
-
核心控制器:
Node Controller:监控节点健康状态(如心跳超时标记为不可用)。
Deployment Controller:确保Pod副本数与声明一致(如扩缩容、滚动更新)。
Endpoint Controller:维护Service与Pod的映射关系。
-
-
Scheduler
-
作用:为新创建的Pod选择最佳运行节点。
-
调度策略:
资源需求:CPU、内存、GPU等。
亲和性/反亲和性:优先部署到同一区域或分散节点。
污点与容忍(Taints and Tolerations) :限制Pod只能在特定节点运行(如GPU节点)。
-
工作节点(Worker Node)
-
kubelet
- 作用:节点上的“管家”,负责与API Server通信并管理本节点Pod的生命周期。
- 关键任务:拉取容器镜像、挂载存储卷、执行健康检查(Liveness/Readiness Probe)。
-
kube-proxy
- 作用:维护节点网络规则,实现Service的负载均衡(如iptables/IPVS)。
- 流量转发:将Service的ClusterIP请求转发到后端Pod(通过Endpoints动态更新)。
-
容器运行时(Container Runtime)
- 支持引擎:Docker、containerd、CRI-O(遵循CRI标准)。
- 职责:拉取镜像、启停容器、管理容器生命周期。
Kubernetes核心资源对象
-
Pod
- 最小调度单元:一个Pod包含一个或多个共享网络/存储的容器(如主容器 + 日志收集Sidecar)。
- 临时性:Pod销毁后IP和存储卷可能丢失(需结合Persistent Volume)。
- 重启策略:Always(默认)、OnFailure、Never。
-
Deployment:声明式管理Pod副本集(ReplicaSet),支持滚动更新和回滚。
-
Service
- 作用:为Pod提供稳定的访问入口(ClusterIP、NodePort、LoadBalancer)。
- 服务发现:通过DNS名称(如
nginx-service.default.svc.cluster.local
)访问。 - 流量分发:支持Session Affinity(会话保持)、加权负载均衡。
-
ConfigMap:存储非敏感配置(如环境变量、配置文件)。
-
Secret:加密存储敏感数据(如数据库密码、TLS证书)。
-
PersistentVolume (PV) :集群级别的存储资源抽象(如NFS卷、云存储)。
-
PersistentVolumeClaim (PVC) :用户对存储资源的请求(如“需要10GiB SSD存储”),由K8s动态绑定PV。
Kubernetes核心功能
-
自动扩缩容(HPA) :根据CPU、内存或自定义指标(如QPS)动态调整Pod副本数。
-
滚动更新与回滚
- 策略:逐步替换旧Pod,确保服务不间断。
- 回滚命令:
kubectl rollout undo deployment/nginx-deployment
。
-
服务网格集成(如Istio) :通过Sidecar代理(Envoy)实现流量管理、熔断限流、分布式追踪。
-
资源配额与限制
- Resource Quota:限制Namespace的资源总量(如CPU、内存、Pod数量)。
- LimitRange:定义Pod/容器的默认资源请求和上限。
Kubernetes网络模型
-
容器网络接口(CNI)
- 标准插件:Calico(BGP路由)、Flannel(Overlay网络)、Cilium(eBPF加速)。
- 核心要求:所有Pod可不经NAT直接通信;节点与Pod可互相访问。
-
Service网络
- ClusterIP:虚拟IP,仅集群内可访问。
- NodePort:通过节点端口暴露服务(如30080)。
- LoadBalancer:集成云厂商负载均衡器(如AWS ALB)。
- Ingress:管理外部HTTP/HTTPS流量路由(如域名、路径到后端服务)。
Kubernetes存储管理
-
Volume类型
- 临时卷:emptyDir(Pod生命周期内有效)。
- 持久卷:(云存储)awsElasticBlockStore、azureDisk;(分布式存储)Ceph RBD、GlusterFS。
-
StatefulSet
- 适用场景:有状态应用(如MySQL集群、ZooKeeper)。
- 特性:稳定网络标识(Pod名称+序号);按顺序部署/扩缩容;持久化存储(每个Pod绑定独立PV)。
无服务器(Serverless)架构
无服务器架构核心理念
- 零运维:无需管理服务器、操作系统、运行时环境。
- 事件驱动:由HTTP请求、消息队列、定时任务等事件触发执行。
- 极致弹性:从零实例瞬间扩展到数千实例,流量下降后自动缩容至零。
- 按使用付费:仅对实际消耗的计算资源(如执行时间、内存)付费,空闲时无成本。
函数即服务(FaaS)
-
代表平台:AWS Lambda、Azure Functions、阿里云函数计算。
-
工作流程:
- 事件触发:如API Gateway收到HTTP请求、S3存储桶新增文件、Kafka消息到达。
- 动态调度:云平台自动分配计算资源(如CPU、内存),启动函数实例。
- 执行函数:运行用户编写的业务逻辑(如处理图像、验证订单)。
- 释放资源:函数执行完成后,实例被回收,资源释放。
后端即服务(BaaS)
- 托管服务:云厂商提供免运维的数据库、存储、认证等服务,与FaaS配合使用。
- 数据库:AWS DynamoDB(NoSQL)、Firebase Realtime Database。
- 存储:AWS S3(对象存储)、Cloudinary(媒体处理)。
- 认证:Auth0、AWS Cognito。
事件源与触发器
- HTTP请求:通过API Gateway触发函数。
- 消息队列:如AWS SQS、Kafka消息到达时触发。
- 存储变更:如S3文件上传、数据库记录更新。
- 定时任务:Cron表达式定时触发(如每天凌晨清理日志)。
冷启动与预置并发
- 冷启动:首次请求或长时间无请求后启动函数实例的延迟(100ms~数秒)。
- 预置并发(Provisioned Concurrency) :预先分配固定实例,减少冷启动(如AWS Lambda Provisioned Concurrency)。