尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从容器化到Kubernetes编排:核心架构、工作流程与实战入门指南

从容器化到Kubernetes编排:核心架构、工作流程与实战入门指南 1. 从“容器化”到“容器编排”为什么我们需要Kubernetes如果你接触过Docker那么恭喜你你已经迈入了现代应用部署和运维的新世界。Docker解决了“我的应用在我的机器上能跑在你的机器上跑不起来”这个经典难题它把应用及其所有依赖打包成一个轻量级、可移植的“容器镜像”。这就像把整个应用连同它需要的操作系统库、运行时环境、代码和配置一起塞进了一个标准化的集装箱里。无论这艘集装箱船服务器是Ubuntu、CentOS还是Windows只要船上有吊车容器运行时如Docker Engine就能把这个集装箱容器原封不动地吊起来运行。听起来很完美对吧但当你从开发者的单机实验走向生产环境的真实世界时问题就来了。想象一下你的应用比如一个电商网站火了访问量激增。一个集装箱容器扛不住了你需要立刻启动十个、一百个同样的集装箱来分担压力。这成百上千个集装箱你打算手动去每台服务器上启动、停止、监控健康状态吗半夜三点某个集装箱因为内存泄漏挂掉了你希望被报警电话叫醒然后手动登录服务器去重启它吗当你要更新应用版本时是让所有用户的服务中断十分钟还是能做到让新版本容器一个个无缝替换旧版本用户毫无感知这些问题的核心已经从“如何打包和运行一个容器”升级为了“如何管理成百上千个容器让它们协同工作提供稳定、可扩展、高可用的服务”。这就是容器编排要解决的难题。而Kubernetes常缩写为K8s因为K和s之间有8个字母正是这个领域当之无愧的王者它已经成为了容器编排的事实标准。简单来说Kubernetes是一个开源的容器编排平台它自动化了容器化应用的部署、扩展和管理。你可以把它理解为一个高度智能的“容器集群操作系统”或者“数据中心的调度大脑”。你不再需要关心你的容器具体在哪台物理机或虚拟机上运行你只需要告诉Kubernetes你想要什么状态“我需要运行5个副本的Web应用它们需要2核CPU、4G内存并且通过一个负载均衡器对外提供80端口服务。” Kubernetes就会自动帮你找到合适的节点服务器去创建并运行这些容器并持续监控它们确保实际状态始终与你声明的期望状态一致。2. Kubernetes的核心架构Master与Node如何协同工作要理解Kubernetes是如何运作的首先得拆解它的架构。一个典型的K8s集群由两类节点组成控制平面Control Plane 也称Master节点和工作节点Worker Nodes。这种“大脑”与“肢体”的分离设计是实现其强大自动化能力的基础。2.1 控制平面集群的“大脑”与“指挥中心”控制平面负责管理整个集群做出全局决策比如在哪个节点调度Pod以及响应集群事件。它通常由以下几个核心组件构成在生产环境中这些组件可以部署在多台机器上以实现高可用。API Server 这是整个Kubernetes系统的“前台”和“总入口”。所有与集群的交互无论是用户通过kubectl命令行工具发出的指令还是集群内部组件之间的通信都必须通过API Server。它负责验证请求、处理请求如创建、更新、删除资源并将资源对象的期望状态持久化存储到etcd中。你可以把它想象成公司的前台或总机所有内外事务都从这里流转。etcd 一个分布式、高可用的键值存储数据库。它是Kubernetes集群的“记忆中枢”存储了集群所有重要的数据包括节点信息、Pod信息、服务配置、密钥等。Kubernetes的“声明式”理念就体现在这里你声明的期望状态YAML文件内容最终会被API Server写入etcd。集群中所有其他组件都通过监听etcd的数据变化来感知集群状态并驱动自身工作以达到期望状态。etcd的数据安全性和一致性至关重要。Scheduler 集群的“调度器”。它的职责非常专一为新创建的、尚未分配节点的Pod选择一个最合适的工作节点来运行。调度器会综合考虑一系列因素比如节点的资源请求与限制、亲和性与反亲和性规则、数据局部性、污点和容忍度等做出最优的调度决策。它只负责“决策”不负责“执行”。决策完成后它会通过API Server更新Pod与节点的绑定信息。Controller Manager 这是一个运行着多种控制器Controller的守护进程。控制器是Kubernetes实现自动化的核心“机器人”。每个控制器都负责监控集群中某一类资源如Node、Pod、Service的实际状态并将其与etcd中存储的期望状态进行对比。一旦发现实际状态偏离了期望状态比如期望运行3个Pod副本但实际只有2个控制器就会采取行动比如通知API Server创建一个新的Pod驱动集群向期望状态收敛。常见的控制器包括节点控制器、副本控制器、端点控制器等。Cloud Controller Manager 这是一个可选组件当Kubernetes运行在公有云如AWS、GCP、Azure上时它会负责与底层云平台的API进行交互管理如负载均衡器、存储卷、节点虚拟机等云资源。它将Kubernetes与特定云厂商的细节解耦让核心的Controller Manager更通用。2.2 工作节点承载实际工作负载的“肌肉”工作节点是容器真正运行的地方。每个节点上都运行着以下关键组件Kubelet 节点上的“节点代理”。它是控制平面与节点通信的桥梁。Kubelet的主要职责是保证本节点上运行的Pod都处于健康状态。它从API Server接收Pod的规格定义PodSpec并按照要求通过容器运行时如Docker、containerd启动、停止容器。同时它还会向API Server汇报本节点及节点上Pod的状态如CPU、内存使用情况。容器运行时Container Runtime 负责运行容器的软件。Kubernetes最初与Docker深度集成但现在通过容器运行时接口CRI支持多种运行时如containerdDocker剥离出的核心运行时、CRI-O等。它负责拉取容器镜像、创建容器、管理容器的生命周期启动、停止、删除。Kube Proxy 节点上的网络代理。它维护节点上的网络规则实现了Kubernetes Service概念的网络部分。当你在集群内创建了一个Service比如一个负载均衡器时Kube Proxy会通过配置iptables或IPVS规则确保发往该Service虚拟IP的流量能被正确地转发到后端对应的Pod上。它是实现服务发现和负载均衡的关键。Pod 这里需要特别强调Pod虽然不是以守护进程形式运行的组件但它是Kubernetes中最小的可部署和管理单元。一个Pod可以包含一个或多个紧密关联的容器这些容器共享网络命名空间、IPC、UTS并且可以通过Volume共享存储。你可以把Pod想象成一个“逻辑主机”里面的容器就像运行在这个主机上的进程它们可以通过localhost直接通信。这是Kubernetes一个非常核心且独特的设计。3. Kubernetes的核心对象模型你如何与集群“对话”Kubernetes不鼓励你直接去服务器上敲命令。你与集群交互的方式是通过创建和操作一系列资源对象API Objects。这些对象就是你向Kubernetes“声明”的期望状态。以下是最核心的几个对象理解了它们你就理解了Kubernetes的工作模型。Pod 如前所述Pod是Kubernetes的基本构建块。它代表集群中运行的一个或多个容器进程组。通常一个Pod只运行一个主应用容器但有时也会包含一些“边车Sidecar”容器比如日志收集器Fluentd、服务网格代理Istio Envoy等它们辅助主容器工作。Pod是短暂的、一次性的。当Pod所在的节点故障或者Pod本身被删除它就会消失。Kubernetes不会修复或重启Pod本身而是会创建一个全新的Pod来替换它。注意 直接创建和管理独立的Podkubectl run或Pod类型的YAML在生产环境中非常罕见因为Pod太脆弱了。我们总是通过更高级的控制器来管理Pod。Deployment 这是管理无状态应用如Web服务器、API服务最常用的控制器。你通过Deployment声明一个“模板”Pod模板和一个“副本数”。Deployment控制器会确保在任何时候都有指定数量的、符合模板的Pod副本在运行。它为你提供了强大的滚动更新和回滚能力。当你要更新应用镜像时只需修改Deployment中的镜像版本Kubernetes就会自动以可控的方式如逐个替换将旧Pod更新为新Pod期间服务不中断。Service Pod是动态的、会生会灭的它们的IP地址也是不固定的。那么集群内部的其他应用或者外部用户该如何稳定地访问到这一组动态变化的Pod呢答案就是Service。Service定义了一个稳定的访问入口一个虚拟IP称为ClusterIP和一组访问策略。它通过标签选择器Label Selector动态地关联后端的一组Pod。无论后端的Pod如何创建、销毁、IP如何变化Service的访问地址始终不变并且它会将流量负载均衡到所有健康的Pod上。对于需要从集群外部访问的服务还可以通过NodePort或LoadBalancer类型的Service暴露出去。ConfigMap 和 Secret 将应用配置与容器镜像解耦是12-Factor应用的重要原则。ConfigMap允许你将配置数据如配置文件、环境变量以键值对的形式存储在Kubernetes中然后以卷挂载或环境变量的方式注入到Pod里。Secret与ConfigMap类似但专门用于存储敏感信息如密码、OAuth令牌、SSH密钥等。Secret的数据会以Base64编码注意这只是编码不是加密存储在传输和挂载时有更多安全考量。Volume存储卷 容器中的文件系统是临时的容器重启后写入其内部的文件就会丢失。Volume提供了在Pod生命周期内持久化存储数据的能力。Kubernetes支持多种Volume类型从简单的本地目录hostPath到复杂的网络存储系统如NFS、Ceph、云厂商的块存储。更常用的是PersistentVolumePV和PersistentVolumeClaimPVC抽象。管理员可以预先配置好一批PV存储资源而用户只需要通过PVC声明自己需要多大容量、什么访问模式的存储Kubernetes就会自动为其绑定一个合适的PV。这实现了存储供给的自动化。Namespace命名空间 这是一个逻辑上的集群分区用于在单个物理集群中实现多租户环境。你可以为不同的团队、项目或环境如开发、测试、生产创建不同的Namespace。大部分资源如Pod、Deployment、Service都属于某个特定的Namespace这提供了基本的资源隔离和组织能力。不过要注意Namespace提供的隔离主要是逻辑上的网络层面默认仍然是互通的更严格的隔离需要借助网络策略NetworkPolicy等机制。4. Kubernetes的典型工作流程从YAML文件到运行中的服务现在让我们把以上所有概念串联起来看一个从零部署一个简单Web应用的完整流程这能帮你直观地理解Kubernetes是如何协同工作的。第一步定义期望状态编写YAML作为应用开发者或运维人员你首先需要编写一个或多个YAML文件来描述你的应用应该是什么样子。例如一个最简单的deployment.yaml可能包含一个Deployment指定需要运行3个副本replicas: 3。在Deployment的Pod模板中定义容器镜像如nginx:latest、资源请求requests.cpu/memory和限制limits.cpu/memory。为Pod模板中的容器打上标签如app: my-web。再编写一个service.yaml定义一个ClusterIP类型的Service并通过标签选择器app: my-web关联到Deployment创建的Pod。第二步提交声明kubectl apply你使用kubectl apply -f deployment.yaml service.yaml命令将这些YAML文件提交给Kubernetes API Server。第三步大脑处理与存储API Server验证你的请求格式和权限然后将你定义的Deployment和Service对象的期望状态作为一条条记录持久化存储到etcd数据库中。第四步控制器驱动状态收敛Deployment控制器被唤醒它通过监听etcd发现了一个新的Deployment对象期望状态是“3个带有特定模板的Pod”。它发现当前实际Pod数为0于是它创建了一个新的ReplicaSet对象Deployment通过ReplicaSet来管理Pod副本。ReplicaSet的期望状态也是“3个Pod”。ReplicaSet控制器被唤醒它发现了这个新的ReplicaSet期望3个Pod实际0个。于是它通过API Server创建了3个Pod对象注意此时Pod还只是对象定义并未调度到节点上运行。这3个Pod对象的定义也被写入etcd。第五步调度器决策Scheduler监听到etcd中出现了这3个新的、nodeName为空的Pod对象。它开始工作过滤Filtering 扫描所有工作节点过滤掉那些不满足Pod要求的节点如资源不足、有污点且Pod不容忍。打分Scoring 对过滤后的节点进行打分考虑因素如资源平衡、亲和性等。绑定Binding 选择分数最高的节点通过API Server将Pod对象与这个节点绑定即更新Pod的nodeName字段。信息再次被写入etcd。第六步节点代理执行目标节点上的Kubelet通过监听etcd发现有一个Pod被调度到了自己身上并且该Pod处于待创建状态。Kubelet根据Pod定义指示本节点的容器运行时如containerd从镜像仓库拉取指定的nginx:latest镜像并按照配置创建和启动容器。同时节点上的Kube Proxy监听到Service和其关联的Pod通过标签选择器匹配被创建。它会更新本机的iptables或IPVS规则确保发往该Service ClusterIP的流量能被转发到刚刚创建的这3个Pod的IP上。第七步状态上报与持续保障Kubelet持续监控容器的运行状态并定期通过API Server向etcd汇报Pod的实际状态如Running、Failed。所有控制器如ReplicaSet控制器也在持续运行。它们不断对比期望状态和实际状态。如果某个Pod所在的节点宕机Kubelet无法上报状态该Pod状态会变为Unknown。一段时间后ReplicaSet控制器会发现实际运行的Pod数比如2个少于期望数3个它会立刻通过API Server创建一个新的Pod对象调度器再将其调度到健康的节点上Kubelet再启动它……如此循环确保你的服务始终有3个健康的副本。这个流程完美诠释了Kubernetes的“声明式API”和“控制器模式”。你只需关心“想要什么”声明状态而无需操心“如何做到”和“如何保持”由Kubernetes自动完成。5. 学习路径与实战建议如何开始你的K8s之旅了解了K8s是什么和它的核心原理后你可能会问我该如何开始学习并上手结合最新的网络热词我为你梳理了一条从入门到实践的学习路径和避坑指南。第一阶段概念理解与环境准备避开初期大坑夯实容器基础 务必先理解Docker的核心概念镜像、容器、仓库、Dockerfile。搞明白k8s和docker区别Docker是创建和管理单个容器的工具而K8s是管理成百上千个容器的平台。你可以不用Docker作为K8s的运行时现在更推荐containerd但容器的概念必须懂。选择实验环境 对于初学者强烈不建议一上来就尝试在物理机或虚拟机上进行复杂的k8s集群搭建尤其是centos系统上部署 k8s 单 master 集群或virtualbox搭建centos7 k8s集群这中间涉及的系统配置、网络、镜像问题足以劝退新手。首选方案 使用Minikube或Kind。Minikube会在你的本地机器Windows、macOS、Linux上创建一个单节点的K8s集群非常适合学习和实验。Kind则使用Docker容器作为“节点”快速搭建一个多节点的集群速度极快。Windows用户 可以直接使用windows docker desktop kubernetes。Docker Desktop内置了单节点的K8s集群一键启用是最简单的入门方式。注意参考windows安装k8s的相关指南确保Hyper-V或WSL2已正确配置。掌握核心命令行工具kubectl 这是你与K8s集群交互的唯一命令行工具。从kubectl get nodes/pods/deployments查看资源到kubectl apply -f部署应用再到kubectl logs/exec调试容器必须熟练掌握。第二阶段核心对象实操与YAML编程从YAML文件开始 放弃一开始就用kubectl run这种命令式创建资源的方式。学习手写YAML文件来定义Deployment、Service、ConfigMap。理解YAML的结构、缩进、apiVersion、kind、metadata、spec等关键字段。网上有很多kubernetes dashboard.yaml或k8s部署lnmp的示例可以拿来参考和修改。完成经典练习部署一个无状态应用 用Deployment部署一个Nginx或你自己的Web应用并用Service暴露它。体验kubectl scale deployment进行扩缩容。体验滚动更新 修改Deployment的镜像版本观察K8s如何逐个替换Pod并使用kubectl rollout status/history/undo进行回滚。配置与存储 创建ConfigMap存储配置并挂载到Pod中创建PVC和PV可以使用Minikube自带的hostPath类型存储类让Pod能够持久化存储数据。理解网络与访问 学习k8s ingress详解。Ingress是管理外部访问集群服务的API对象通常通过Ingress Controller如Nginx Ingress Controller实现它提供了比Service更强大的HTTP/HTTPS路由、SSL终止等功能。这是将内部服务暴露给外界的标准方式。第三阶段深入进阶与生产考量学习高级概念StatefulSet 用于部署有状态应用如数据库、中间件提供稳定的网络标识、持久化存储和有序的部署、扩缩容。DaemonSet 确保每个或部分节点上都运行一个Pod副本常用于日志收集Fluentd、节点监控Node Exporter等。Job/CronJob 用于运行一次性任务或定时任务。资源配额与限制 学习如何为Namespace设置资源配额为Pod设置资源请求和限制这是保障集群稳定的关键。安全 了解ServiceAccount、Role、RoleBinding、ClusterRole等RBAC权限控制概念。探索生态与工具监控 部署Prometheus Grafana来监控集群和应用。学习如何部署kube-state-metrics参考kubernetes 1.28 如何部署 kube-state-metrics它提供了关于K8s对象状态的指标。日志 搭建EFKElasticsearch, Fluentd, Kibana或Loki栈进行集中日志管理。包管理 学习使用Helm它是K8s的包管理器通过“Chart”来定义、安装和管理复杂的K8s应用。GitOps 了解Argo CD或Flux实现以Git仓库为唯一可信源的自动化部署。生产集群部署与管理 当你对概念足够熟悉后可以尝试用kubeadm等工具部署生产级集群。此时需要深入考虑k8s纳管新节点、高可用控制平面、网络插件选型Calico、Flannel等、存储方案、备份恢复等运维问题。也可以考虑使用rancher部署kubernetes集群Rancher提供了更友好的集群管理界面。个人经验与避坑指南不要死记硬背命令 理解每个命令和YAML字段背后的意图。多使用kubectl explain命令例如kubectl explain pod.spec.containers它会给出官方文档是学习的最佳伴侣。善用--dry-runclient -o yaml 当你不知道一个资源的YAML怎么写时可以用命令生成模板。例如kubectl create deployment my-nginx --imagenginx --dry-runclient -o yaml deploy.yaml然后在这个基础上修改。调试是常态 Pod启动失败ImagePullBackOff, CrashLoopBackOff、Service无法访问、Ingress不生效是家常便饭。掌握一套排查流程1)kubectl describe pod pod-name查看事件2)kubectl logs pod-name查看容器日志3)kubectl exec -it pod-name -- sh进入容器内部检查。网络问题是最大的坑 很多访问不通的问题都源于网络。理解你的集群网络模型CNI插件理解Pod网络、Service网络、节点网络之间的关系。学会使用kubectl get endpoints检查Service是否关联了正确的Pod使用dig/nslookup或curl在容器内进行网络测试。资源限制一定要设 不给Pod设置资源请求和限制就像开车不系安全带。一个失控的Pod可能会耗尽节点资源导致“邻居”应用被杀死。从学习初期就养成设置resources.requests/limits的好习惯。关注社区与版本 K8s迭代很快很多网络上的旧教程尤其是关于Docker集成、一些API版本可能已经过时。以官方文档kubernetes.io为第一参考并注意你使用的K8s版本。像flink kubernetes operator这类特定领域的Operator也要关注其与K8s版本的兼容性。学习Kubernetes是一个螺旋上升的过程。从在本地用Minikube跑通第一个Pod到理解其核心架构和工作原理再到能规划部署一个高可用的生产集群每一步都需要理论和实践紧密结合。它不仅仅是一个工具更代表了一种以应用为中心、声明式、自动化的运维哲学。当你开始用Kubernetes的思维方式去设计和管理应用时你会发现从前那些繁琐、重复、易出错的运维操作正在被这个强大的系统优雅地自动化解决。
返回列表