Kubernetes 入门学习笔记
Kubernetes 入门学习笔记Kubernetes简称 K8S是当今容器编排领域的事实标准。它能够自动化部署、扩展和管理容器化应用是云原生技术栈的核心组件。对于后端开发和运维人员来说理解 K8S 的基本架构和工作负载类型是迈向云原生的重要一步。本文将从宏观架构到微观组件带你系统了解 Kubernetes 的核心概念。[图片占位符Kubernetes 集群整体架构图]一、K8S 集群架构一个 Kubernetes 集群由一组被称为**节点Node**的机器组成这些节点上运行着 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点而 Master 节点本身也可以同时作为 Worker 节点使用。简单来说Master 节点负责集群调度和控制运行控制平面Control PlaneWorker 节点负责运行业务 Pod这种架构类似于一个公司的管理层和执行层Master 节点负责决策和调度Worker 节点负责实际执行任务。[图片占位符Master 节点与 Worker 节点关系图]二、Master 节点控制平面组件Master 节点是整个集群的大脑它由以下四个核心组件构成2.1 kube-apiserverAPI Server 是 Kubernetes 控制平面的前端也是集群的统一入口。所有的管理操作无论是通过 kubectl 命令行、Web 界面还是其他客户端都需要通过 API Server 来完成。核心职责提供 RESTful API 接口认证、授权和准入控制所有组件之间的通信枢纽是唯一与 etcd 直接交互的组件可以把 API Server 理解为 Kubernetes 的前台所有请求都要先到前台登记处理。2.2 etcdetcd 是一个兼具一致性和高可用性的键值数据库用来保存 Kubernetes 集群的所有数据包括集群配置信息节点状态Pod 定义和状态Service 和路由信息Secret 和 ConfigMap关键特性使用 Raft 一致性算法保证数据一致性生产环境通常部署 3 个或 5 个节点组成集群是整个集群的唯一数据存储后端etcd 相当于 Kubernetes 的数据库集群中的所有状态信息都存储在这里。etcd 的数据安全直接关系到整个集群的安全。2.3 kube-schedulerScheduler 负责监视新创建的、未指定运行节点的 Pod并为他们选择合适的节点运行。调度决策考虑因素资源需求CPU、内存硬件/软件/策略约束亲和性和反亲和性规则数据本地性需求服务间的负载均衡调度过程可以简化为两步过滤找出所有满足 Pod 运行条件的节点打分对满足条件的节点按优先级打分选择分数最高的节点2.4 kube-controller-managerController Manager 是运行控制器进程的控制平面组件。虽然从逻辑上讲每个控制器都是一个单独的进程但为了降低复杂性它们都被编译到同一个可执行文件中在一个进程中运行。主要控制器包括控制器职责节点控制器Node Controller节点出现故障时进行通知和响应任务控制器Job Controller监测 Job 对象创建 Pod 运行一次性任务端点控制器Endpoints Controller填充 Endpoints 对象关联 Service 与 Pod服务账户控制器Service Account Controller为新命名空间创建默认账户和 API 访问令牌副本控制器ReplicaSet Controller维护 Pod 的副本数量控制器的核心工作模式是控制循环不断观察集群的实际状态与期望状态进行对比如果不一致就采取措施使其趋向一致。[图片占位符控制平面四大组件协作流程图]三、Node 节点组件Worker 节点Worker 节点是实际运行业务容器的地方。Master 节点本身也拥有这些组件只是它主要运行业务 Pod 以外的控制平面 Pod。3.1 kubeletkubelet 是运行在每个节点上的代理程序它保证容器都运行在 Pod 中。核心职责接收 PodSpecs通过各种机制提供确保其中描述的容器处于运行状态且健康向 Master 节点汇报节点状态执行健康检查和存活探测挂载存储卷不会管理非 Kubernetes 创建的容器kubelet 可以理解为节点上的管家它忠实地执行 Master 下达的指令。3.2 kube-proxykube-proxy 是集群中每个节点上运行的网络代理是实现 Kubernetes Service 概念的重要组件。核心职责维护节点上的网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信如果操作系统提供了数据包过滤层并可用的话kube-proxy 会通过它来实现网络规则否则 kube-proxy 仅转发流量本身kube-proxy 支持三种代理模式iptables默认使用 iptables 规则进行流量转发IPVS使用 IPVSIP Virtual Server进行负载均衡性能更好userspace最老的模式性能较差基本已弃用3.3 容器运行时Container Runtime容器运行时是负责运行容器的软件。Kubernetes 支持多种容器运行时运行时说明Docker最广为人知的容器运行时K8S 1.24 后不再直接支持需通过 containerdcontainerd从 Docker 中剥离出来的容器运行时轻量高效CRI-O专门为 Kubernetes 设计的容器运行时Kubernetes 通过 CRI容器运行时接口与容器运行时交互使得用户可以根据需求选择不同的运行时实现。[图片占位符Worker 节点三大组件工作原理图]四、集群插件Addons插件使用 Kubernetes 资源DaemonSet、Deployment 等实现集群级别的功能。插件中命名空间域的资源属于kube-system命名空间。4.1 DNS必需几乎所有 Kubernetes 集群都应该有集群 DNS。它为 Kubernetes 服务提供 DNS 记录Kubernetes 启动的容器自动将此 DNS 服务器包含在其 DNS 搜索列表中。容器中的应用可以通过服务名称而非 IP 地址来访问其他服务这大大简化了服务发现和通信。4.2 Web 界面DashboardDashboard 是 Kubernetes 集群的通用 Web 用户界面用户可以管理集群中运行的应用程序进行故障排除管理集群本身的配置4.3 容器资源监控容器资源监控将关于容器的一些常见时间序列度量值保存到集中的数据库中并提供用于浏览这些数据的界面。4.4 集群层面日志集群层面日志机制负责将容器的日志数据保存到集中的日志存储中提供搜索和浏览接口。五、工作负载类型Kubernetes 提供了多种内置的工作负载资源适用于不同的应用场景。5.1 DeploymentDeployment 是最常用的工作负载类型适合管理无状态应用。核心特点所有 Pod 都是相互等价的可以在需要时被换掉声明式地管理 Pod 和 ReplicaSet支持滚动更新和回滚支持扩缩容apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentspec:replicas:3selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.14.2ports:-containerPort:80典型场景Web 服务器、API 服务、微服务等。5.2 StatefulSetStatefulSet 适合运行需要跟踪应用状态的 Pods例如数据库、消息队列等。核心特点每个 Pod 有稳定、唯一的网络标识符Pod 的启动和终止是有序的每个 Pod 可以有独立的持久化存储PersistentVolumePod 之间可以相互复制数据以提高可靠性典型场景MySQL 主从集群、ZooKeeper 集群、Kafka 集群等有状态服务。5.3 DaemonSetDaemonSet 确保每个或某些节点上运行一个 Pod 的副本。核心特点每当向集群中添加新节点时如果节点匹配 DaemonSet 的规约就会调度一个 Pod 到该节点上运行当节点从集群中移除时Pod 会被回收删除 DaemonSet 将清理它创建的所有 Pod典型场景日志收集代理如 Filebeat节点监控代理如 Prometheus Node Exporter网络插件如 Calico、Flannel存储守护进程5.4 JobJob 用于运行一次性任务任务完成后 Pod 就会停止。核心特点创建一个或多个 Pod确保指定数量的 Pod 成功完成成功完成的 Pod 不会被重新调度可以设置重试策略和超时时间apiVersion:batch/v1kind:Jobmetadata:name:data-migrationspec:template:spec:containers:-name:migrationimage:my-app:latestcommand:[python,migrate.py]restartPolicy:NeverbackoffLimit:4典型场景数据迁移、批量处理、系统初始化等一次性任务。5.5 CronJobCronJob 类似于 Linux 的 crontab用于定时执行任务。核心特点根据时间计划反复创建 Job使用 Cron 格式的时间表达式可以设置并发策略和历史限制apiVersion:batch/v1kind:CronJobmetadata:name:daily-backupspec:schedule:0 2 * * *# 每天凌晨2点执行jobTemplate:spec:template:spec:containers:-name:backupimage:backup-tool:latestcommand:[./backup.sh]restartPolicy:OnFailure典型场景定时备份、定期清理、报表生成等周期性任务。5.6 工作负载类型对比类型生命周期状态管理调度方式典型场景Deployment持续运行无状态随机调度Web 服务、APIStatefulSet持续运行有状态有序调度数据库、消息队列DaemonSet持续运行节点级每节点一个日志、监控代理Job一次性无随机数据迁移CronJob定时重复无随机定时备份[图片占位符五种工作负载类型对比与选择决策树]六、服务发现与网络基础6.1 Service在 Kubernetes 中Pod 的 IP 地址不是固定的Pod 可能会被销毁重建因此需要 Service 来提供一个稳定的访问入口。Service 定义了一个 Pod 的逻辑集合以及访问它们的策略。主要通过Label Selector来确定哪些 Pod 属于该 Service。Service 类型类型说明ClusterIP集群内部访问默认NodePort通过节点端口暴露服务LoadBalancer使用云厂商的负载均衡器ExternalName映射到外部 DNS 名称6.2 Label 与 SelectorLabel 是附加在 Kubernetes 对象上的键值对用于组织和选择对象。Selector 则用于通过 Label 筛选对象。# Pod 定义中的 Labelmetadata:labels:app:nginxtier:frontend# Service 中的 Selectorspec:selector:matchLabels:app:nginx重要提示当定义一个对象作用于另一个对象时需要在 Selector 中引用目标对象的 Label 内容。6.3 网络模型Kubernetes 的网络模型有以下基本要求所有 Pod 之间可以直接通信不需要 NAT所有 Node 与所有 Pod 之间可以直接通信不需要 NATPod 看到自己的 IP 与其他 Pod 看到它的 IP 是一致的常见的网络插件CNI有Calico、Flannel、Weave、Cilium 等。[图片占位符Kubernetes 网络模型示意图]七、扩展与第三方工作负载在庞大的 Kubernetes 生态系统中除了内置的工作负载资源外还可以通过**自定义资源定义CRD**添加第三方工作负载资源。例如如果你需要运行一组 Pod但要求所有 Pod 都就绪后才执行操作如高吞吐量的分布式任务可以通过 CRD 实现相应的扩展并安装到集群中运行。这种可扩展性是 Kubernetes 成为容器编排领域标准的重要原因之一。八、学习路线建议对于 K8S 初学者建议按以下路线循序渐进入门阶段理解集群架构、核心组件、Pod/Deployment/Service 基本概念实践阶段搭建本地集群minikube/kind部署第一个应用进阶阶段学习网络、存储、安全、Helm 包管理生产阶段高可用部署、监控告警、日志收集、故障排查[图片占位符K8S 学习路线图]九、总结Kubernetes 的核心架构可以概括为一个大脑Master 节点的控制平面API Server etcd Scheduler Controller Manager一双腿脚Worker 节点kubelet kube-proxy 容器运行时五种武器Deployment、StatefulSet、DaemonSet、Job、CronJob一座桥梁Service 实现服务发现与负载均衡理解了这些核心概念就掌握了 Kubernetes 的骨架。后续可以在实践中逐步深入网络策略、存储编排、自动扩缩容、安全策略等高级主题。来源整理自 zyh/K8S学习笔记.MD 学习笔记