90DaysOfDevOps 第 49 天:Kubernetes 全景入门——容器编排、核心组件与工作负载原理解读
文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载导读本文对应 90DaysOfDevOps 系列第 49 天内容从容器编排这一核心概念出发系统梳理 Kubernetes 的定位、六大核心能力、控制平面与工作节点上的关键组件以及 Pod、Deployment、ReplicaSet、StatefulSet、DaemonSet、Service 等核心工作负载对象。读完本文你将建立起一套完整的 Kubernetes 认知框架理解声明式模型与期望状态-实际状态的调协机制并为后续的集群搭建、YAML 编写与应用部署实战打下基础。为什么需要容器编排容器的天花板在之前的章节中我们已经覆盖了容器Container本身。容器极大加速了云原生系统的采用但单个容器在规模化与编排层面存在天然短板——仅靠容器我们能做的最多不过是用docker-compose把多个容器一起启动它无法解决自动伸缩、故障自愈、跨节点调度等生产级问题。Kubernetes 作为容器编排器Container Orchestrator补上了这一环它能够根据应用的负载自动地、或按需地对应用与服务进行伸缩scale up / scale down。需要说明的是从 DevOps 视角看Kubernetes 只是你需要的众多平台知识之一。除了 Kubernetes你还需要理解裸金属bare metal、虚拟化以及大概率会用到的云服务。Kubernetes 只是运行我们应用的又一个选项——这正是本系列一贯强调的务实视角它并非万能银弹而是基础设施谱系中的一个重要组成部分。什么是容器编排概念与技术先厘清一对容易混淆的概念容器编排Container Orchestration是一个概念/过程负责容器的部署deployment、放置placement与生命周期lifecycle管理Kubernetes是实现这一概念的具体技术/平台。Kubernetes 并非唯一的容器编排平台同赛道还有 Docker Swarm、HashiCorp Nomad 等。但 Kubernetes 的生态与影响力持续走强因此本系列选择它作为主线同时承认它不是唯一选择这一事实。容器编排除管理容器生命周期外还承担着一系列职责职责说明集群管理Cluster management将多个主机联合federate为单一的目标集群调度管理Schedule management通过调度器把容器分发到各个节点服务发现Service discovery知晓容器所在位置并把客户端请求分发到它们复制/副本Replication确保满足工作负载所需的节点与容器数量健康管理Health management检测并替换不健康的容器与节点什么是 Kubernetes定义与出身Kubernetes 官方给出的定义是Kubernetes 是一个可移植、可扩展的开源平台用于管理容器化的工作负载与服务支持声明式配置与自动化。它拥有庞大且快速成长的生态系统其服务、支持与工具广泛可得。要点拆解开源出身Kubernetes 的历史可以追溯到 GoogleGoogle 将该项目捐赠给了云原生计算基金会CNCFCloud Native Computing Foundation生态共建此后由开源社区与大型企业厂商共同推动演进才成为今天的样子。Kubernetes 的六大核心能力容器虽好但仅仅有容器无法给出生产就绪production-ready的应用体验。Kubernetes 带来了以下能力服务发现与负载均衡Service discovery and load balancingKubernetes 可以使用 DNS 名称或容器自己的 IP 暴露容器。当某个容器的流量升高时Kubernetes 能够做负载均衡、分发网络流量使部署保持稳定。存储编排Storage orchestrationKubernetes 允许你自动挂载所选择的存储系统例如本地存储、公有云厂商提供的存储等。自动化发布与回滚Automated rollouts and rollbacks你可以用 Kubernetes 描述已部署容器的期望状态Kubernetes 会以可控速率把实际状态变更到期望状态。例如可以自动化地为你的部署创建新容器、移除旧容器并把旧容器的资源全部迁移到新容器上。自动装箱Automatic bin packing你提供给 Kubernetes 一个节点node集群并告知每个容器需要多少 CPU 和内存RAMKubernetes 就能把容器塞到合适的节点上最大化利用资源。自愈Self-healingKubernetes 会重启失败的容器、替换容器、杀掉不响应自定义健康检查的容器并且在容器就绪前不会把它们通告给客户端。密钥与配置管理Secret and configuration management你可以存储并管理密码、OAuth 令牌、SSH 密钥等敏感信息。可以在不重新构建容器镜像、不把密钥暴露在堆栈配置中的前提下部署和更新 Secret 与应用配置。综上Kubernetes 提供的是一个让分布式系统韧性运行的框架。Kubernetes 核心组件Kubernetes 是一个用来供给provision、管理、伸缩应用的容器编排器它管理的是运行在节点集群中的容器化应用的生命周期——节点集群即一组工作机器可以是虚拟机也可以是物理机。声明式模型核心范式Kubernetes 的关键范式是声明式declarative模型你声明想要的状态Kubernetes 负责让它发生。如果你需要 5 个实例不必自己手动启动 5 个独立实例只需告诉 Kubernetes 你需要 5 个实例它会**自动调协reconcile**状态当某个实例失败时Kubernetes 依然记得你想要的期望状态并会在可用节点上重新创建实例。这一期望状态 vs 实际状态的持续调协正是 Controller Manager 等控制回路control loop反复运行的本质。Node控制平面与工作节点每个 Kubernetes 集群都必须有一个控制平面Control Plane节点其组件负责做出关于集群的全局决策例如调度并检测、响应集群事件工作节点Worker Node是运行 Kubernetes 工作负载的机器可以是物理裸金属机或虚拟机VM。每个节点可以承载一个或多个 Pod节点由控制平面管理除控制平面与工作节点外还有其他节点类型本系列暂不展开。kubeletkubelet是运行在集群中每个节点上的代理agent它确保容器运行在 Pod 内kubelet 接收通过各种机制提供的PodSpec集合确保这些 PodSpec 描述的容器处于运行且健康的状态kubelet 不管理并非由 Kubernetes 创建的容器。kube-proxykube-proxy是运行在集群中每个节点上的网络代理实现了 Kubernetes Service 概念的一部分在节点上维护网络规则network rules这些规则允许来自集群内部或外部的网络会话与 Pod 通信若操作系统提供了包过滤层packet filtering layer且可用kube-proxy 会使用它否则 kube-proxy 自己转发流量。容器运行时Container runtime容器运行时是负责运行容器的软件。Kubernetes 支持多种容器运行时Docker、containerd、CRI-O以及任何实现了 Kubernetes **CRIContainer Runtime Interface容器运行时接口**的实现。仓库实战佐证在 2022/Days/Kubernetes/scripts/common.sh 中可以看到一套完整的运行时与集群组件安装流程——包括加载overlay、br_netfilter内核模块、配置net.bridge.bridge-nf-call-iptables等 sysctl 参数、安装docker-ce/containerd.io并通过containerd config default生成默认配置后重启 containerd。这说明在本系列的实际动手环节中containerd正是被选用的容器运行时之一。Cluster集群层面的组件集群Cluster是一组节点的集合节点可以是物理机或虚拟机。每个节点都会运行容器运行时同时运行kubelet 服务作为代理接收来自 Master 控制器的命令后面详解Proxykube-proxy用于把来自另一组件即 Service后面详解的连接代理到 Pod。控制平面可以做成高可用highly available它相对工作节点拥有一些独特的角色其中最重要的是kube API Server——任何向集群获取或推送信息的通信都要经过它。Kube API-ServerAPI Server 负责为 API 对象包括 Pod、Service、ReplicationController 等做校验与数据配置提供 REST 操作作为集群共享状态shared state的前端所有其他组件都通过它与集群交互。Scheduler调度器调度器是控制平面进程负责把 Pod分配到节点依据约束条件与可用资源判断调度队列中每个 Pod 的合法放置节点为每个合法节点排序rank最终把 Pod **绑定bind**到合适节点。Controller Manager控制器管理器控制器管理器是一个守护进程daemon内嵌 Kubernetes 自带的核心控制回路控制回路control loop是一个永不终止的循环不断调节系统状态类似机器人/自动化领域的概念控制器通过 API Server 观察集群的共享状态并做出变更试图把当前状态移向期望状态。etcdetcd 是一致且高可用的键值存储作为 Kubernetes所有集群数据的后端存储backing storekubectl与 API Server 交互的命令行工具在命令行层面我们通过kubectl管理集群它与 API Server 交互对 Kubernetes 集群运行命令部署应用检查与管理集群资源查看日志。仓库实战佐证本系列配套的集群搭建脚本大量使用 kubectl。例如在 2022/Days/Kubernetes/scripts/master.sh 中依次执行kubectl apply -f calico.yaml安装 Calico 网络插件、安装 Metrics Server、部署 Kubernetes Dashboard、创建admin-userServiceAccount 并绑定cluster-admin角色最后用 kubectl 从 Secret 中提取 Dashboard 登录令牌。这就是kubectl 作为集群统一入口的真实工作流。核心工作负载对象Pods最小的部署单元Pod是构成一个逻辑应用的一组容器。例如一个 Web 应用同时运行 NodeJS 容器和 MySQL 容器那么这两个容器就位于同一个 Pod内Pod 内的容器可以共享数据卷Volumes并共享同一个网络命名空间networking namespacePod 是**临时ephemeral**的可能被 Master 控制器随时拉起或销毁Kubernetes 通过Labels键值对name–values来标识 Pod简单而有效。Pod 要点小结Pod 为容器处理 Volumes、Secrets 和配置Pod 是临时的死亡后会被自动重启当应用由 ReplicaSet 水平扩展时Pod 会被复制每个 Pod 运行相同的容器代码Pod 运行在工作节点Worker Node上。仓库实战佐证2022/Days/Kubernetes/nginx-stateless-demo.yaml 给出了一个完整的Namespace Deployment Service示例nginx命名空间下的nginx-deployment通过selector.matchLabels: app: nginx与 Pod 模板的 labels 关联replicas: 1声明期望副本数容器暴露containerPort: 80。这正是声明式模型写 YAML 声明期望状态Kubernetes 负责落地的最小可运行范本。Deployments让 Pod 持续运行如果只是直接运行 PodPod 死掉就真的死掉了Deployment让你的 Pod持续运行Deployment 允许你在不宕机的情况下更新运行中的应用Deployment 还指定了 Pod 死亡时的重启策略restart strategy。ReplicaSets保证期望副本数Deployment 可以创建ReplicaSetReplicaSet 确保你的应用拥有期望数量的 PodReplicaSet 会基于 Deployment 创建并伸缩 PodDeployment、ReplicaSet、Pod 之间不是互斥关系而是可以共存、层层组合的。StatefulSets有状态应用的答案你的应用是否需要保存状态信息数据库需要状态StatefulSet 的 Pod不可互换not interchangeable每个 Pod 都有一个唯一的、持久的标识符由控制器在任何重新调度rescheduling过程中持续维护。仓库实战佐证2022/Days/Kubernetes/statefulset.yaml 展示了一个 MongoDB 的 StatefulSet 实践通过serviceName: mongo关联无头服务Pod 模板挂载名为mongo-db的 PVCpersistentVolumeClaim.claimName: mongo-storage数据库密码等敏感信息通过secretKeyRef从名为mongodb-users-secret的 Secret 中注入环境变量并配置了基于mongo ... --evalquit()的就绪探针readinessProbe。这正是StatefulSet 解决有状态应用 Secret 配置管理两个核心概念在真实配置中的结合。DaemonSets每个节点一个 PodDaemonSet 面向持续运行的后台进程它保证每个节点运行一个 Pod集群中每加入一个新节点都会自动在该节点启动一个 Pod非常适合监控、日志收集这类后台任务。Services稳定的访问入口Service 是访问 Pod 的单一端点single endpoint它提供了一种统一方式把流量路由到集群、最终路由到一组 Pod由于通过 Service 访问Pod 可以随时拉起/销毁而不会影响外部访问方。将 Pod 通过 Labels 与 Service 关联正是 nginx-stateless-demo.yaml 中nginx-service的selector: app: nginx-deployment、port: 80、targetPort: 80所演示的用法——这也是后续 Kubernetes Services 与 Ingress 专题的基础。从这张全景图出发系列路线与仓库资源本节内容只是 Kubernetes 基础构建块的快速概览与笔记。基于这套知识后续还可以补上Storage存储与Ingress入口流量来增强应用同时集群运行位置也有大量选择。本系列 Kubernetes 专题将陆续覆盖Kubernetes 架构ArchitectureKubectl 命令Kubernetes YAMLKubernetes IngressKubernetes ServicesHelm 包管理器持久化存储Persistent Storage有状态应用Stateful Apps仓库配套实践资源2022/Days/Kubernetes/Vagrantfile用 Vagrant VirtualBox 一键拉起 1 个 master 节点4GB 内存、2 核与 2 个 worker 节点各 2GB 内存、1 核的三节点集群骨架并在每个节点上执行scripts/common.shmaster 额外执行scripts/master.shworker 执行scripts/node.sh2022/Days/Kubernetes/scripts/common.sh统一完成禁用 swap、加载内核模块、配置 containerd、安装并apt-mark hold固定kubelet、kubectl、kubeadm版本示例版本 1.23.32022/Days/Kubernetes/scripts/master.shkubeadm init初始化控制平面、生成join.sh加入命令、安装 Calico 网络插件与 Metrics Server、部署 Kubernetes Dashboard 并创建管理员令牌2022/Days/Kubernetes/scripts/node.sh工作节点执行join.sh加入集群并打上 worker 标签2022/Days/Kubernetes/configs/存放生成的configkubeconfig、join.sh与 Dashboardtoken。下一步本篇接下来的内容是选择在哪里运行 Kubernetes 集群——裸金属、虚拟化、本地桌面如 Minikube、托管服务如 EKS/AKS/GKE等不同路径各有取舍同时会展开探讨 Storage 的具体细节详见 第 50 天选择你的 Kubernetes 平台。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps Day 49Kubernetes 全景入门——从容器编排概念到核心组件与工作负载原语90DaysOfDevOps Day 49Kubernetes 全景入门——从容器编排概念到核心组件与工作负载原语 Kubernetes 是当前云原生基础设施文档/教程90DaysOfDevOps 第 49 天Kubernetes 全景——容器编排、集群架构与核心工作负载对象90DaysOfDevOps 第 49 天Kubernetes 全景——容器编排、集群架构与核心工作负载对象 导读 本文是 90DaysOfDevOps 学习文档/教程90DaysOfDevOps 第49天Kubernetes 全景图——从容器编排概念到集群核心组件90DaysOfDevOps 第49天Kubernetes 全景图——从容器编排概念到集群核心组件 导读 本文是 90DaysOfDevOps 学习系列中 K文档/教程上一篇MCP Python SDK 命令行实战掌握 mcp 命令的运行、调试与集成下一篇如何在手机端免root提取Android系统镜像终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考