Kubernetes架构解析

Kubernetes 技术栈的深度解析,涵盖架构设计、核心组件、生态工具及二次开发实践,结合实战案例说明其内在关联:

一、Kubernetes 架构设计

核心分层模型
调度
运行
容器
Control Plane
Worker Nodes
Pod
Docker/containerd
1. 控制平面(Control Plane)
  • API Server:唯一入口,RESTful 接口,认证/授权(如 RBAC)
  • etcd:分布式键值存储,保存集群状态(唯一有状态组件)
  • Scheduler:调度策略(Bin packing/Spread 等),通过 Watch 机制监听未绑定 Pod
  • Controller Manager:运行控制器(Deployment/Node 等),实现声明式 API 的调和循环
2. 工作节点(Worker Nodes)
  • kubelet:节点代理,管理 Pod 生命周期(通过 CRI 操作容器)
  • kube-proxy:实现 Service 的负载均衡(iptables/IPVS 模式)
  • 容器运行时:Docker/containerd,负责镜像拉取与容器运行
3. 数据流示例(创建 Deployment)
  1. kubectl apply → API Server → etcd 持久化
  2. Scheduler 检测未调度 Pod → 绑定到 Node
  3. 目标节点 kubelet 调用 CRI 创建容器
  4. Controller Manager 监控副本数,确保状态收敛

二、关键扩展机制:CNI 与 CSI

1. CNI(Container Network Interface)
  • 作用:Pod 网络配置(IP 分配/路由设置)
  • 工作流程
    1. kubelet 创建 Pod 沙盒(pause 容器)
    2. 调用 CNI 插件(如 Calico/Flannel)配置网络
    3. 插件返回 IP 信息给 kubelet
  • 实战案例
    # Calico 配置示例(/etc/cni/net.d/10-calico.conf)
    {"name": "k8s-pod-network","cniVersion": "0.3.1","plugins": [{"type": "calico","etcd_endpoints": "http://etcd:2379"}]
    }
    
2. CSI(Container Storage Interface)
  • 作用:解耦存储提供商与 K8s
  • 组件
    • Driver Registrar:注册插件到 kubelet
    • External Provisioner:监听 PVC 并创建 PV
    • External Attacher:挂载卷到节点
  • 实战流程(动态卷创建):
    1. 用户创建 PVC → PV Controller 监听
    2. 调用 CSI Provisioner 创建存储卷(如 AWS EBS)
    3. kubelet 调用 CSI Attacher 挂载卷到 Pod

三、核心工具链原理

1. Docker 核心原理
REST API
Client
Docker Daemon
containerd
runc
  • 镜像分层:UnionFS(Overlay2)实现写时复制
  • 隔离机制:Namespace(资源视图隔离) + Cgroups(资源限制)
2. Helm:K8s 包管理工具
  • 核心概念
    • Chart:应用模板(含 values.yaml)
    • Release:Chart 的运行时实例
  • 架构
    • Tiller(v2):服务端(已弃用)
    • Helm Client(v3):直接与 K8s API 交互
  • 实战命令
    helm install my-app ./chart --set replicaCount=3  # 部署时覆盖参数
    
3. Operator:自动化运维框架
  • 原理:CRD + Controller
    type EtcdCluster struct {metav1.TypeMeta   `json:",inline"`metav1.ObjectMeta `json:"metadata"`Spec   EtcdSpec   `json:"spec"`   // 期望状态Status EtcdStatus `json:"status"` // 实际状态
    }
    
  • 工作流程
    1. 监听自定义资源(如 EtcdCluster)
    2. 对比 Spec 与 Status
    3. 执行调和逻辑(如扩缩容/备份)

四、二次开发实战:构建自定义 Operator

场景:自动化 Redis 集群运维
  1. 定义 CRD(redis-operator.yaml)

    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:name: redisclusters.redis.io
    spec:scope: Namespacedgroup: redis.ioversions: [{name: v1, served: true, storage: true}]names: {kind: RedisCluster, plural: redisclusters}
    
  2. Controller 核心逻辑(伪代码)

    func Reconcile(ctx context.Context, req Request) (Result, error) {cluster := &redisv1.RedisCluster{}if err := client.Get(ctx, req.NamespacedName, cluster); err != nil {return Result{}, err}// 检查集群状态currentNodes := getRedisNodes(cluster)if len(currentNodes) < cluster.Spec.Replicas {createRedisPod(cluster) // 扩容}updateStatus(cluster, currentNodes) // 更新 Statusreturn Result{RequeueAfter: 5*time.Minute}, nil
    }
    
  3. 部署与测试

    kubectl apply -f redis-cluster-cr.yaml  # 创建自定义资源实例
    kubectl get redisclusters               # 查看 Operator 维护状态
    

五、技术栈全景关系图

API
CRI
CNI
CSI
部署
管理
K8s Control Plane
Operator
Docker
Calico
Cloud Storage
CRD
Helm
应用Chart

关键结论

  1. CNI/CSI 是 K8s 网络/存储的扩展基石,通过标准接口实现生态兼容
  2. Operator 模式 将运维知识代码化,是自动化复杂应用的核心手段
  3. Helm 解决应用分发问题,Operator 解决生命周期管理问题
  4. 二次开发 聚焦 CRD 和 Controller,需深入理解 API 机制

实战建议:从修改 kube-scheduler 策略(如自定义调度器)或开发简单 Operator(如 MySQL 备份)入手,逐步深入 K8s 内核开发。

以下是 Kubernetes 技术栈各组件的核心作用解析,结合生产级实战案例说明其协作关系:


一、控制平面组件

1. API Server
  • 作用:集群唯一入口,处理 REST 操作、认证授权、API 版本管理
  • 实战案例:开发自定义 Operator 时,Controller 通过监听 API Server 事件触发业务逻辑
    // 监听 Pod 创建事件
    informer := cache.NewSharedIndexInformer(&cache.ListWatch{},&v1.Pod{},30*time.Second,cache.Indexers{},
    )
    informer.AddEventHandler(cache.ResourceEventHandlerFuncs{AddFunc: func(obj interface{}) {pod := obj.(*v1.Pod)fmt.Println("Detected new Pod:", pod.Name)},
    })
    
2. etcd
  • 作用:分布式键值存储,持久化集群状态(Pod/Service/Node 等资源)
  • 实战故障:当 etcd 响应延迟过高时,会导致:
    • kubectl get pods 命令卡顿
    • 新 Pod 调度超时
      解决方案
    # 检查 etcd 集群状态
    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 endpoint status
    
3. kube-scheduler
  • 作用:依据资源请求、亲和性等策略选择运行节点
  • 高级调度实战:GPU 节点调度
    apiVersion: v1
    kind: Pod
    metadata:name: gpu-pod
    spec:containers:- name: cuda-containerresources:limits:nvidia.com/gpu: 2  # 请求 2 张 GPU 卡nodeSelector:accelerator: nvidia-tesla-p100  # 选择 GPU 节点
    
4. Controller Manager
  • 作用:运行内置控制器循环(如 Deployment 控制器确保副本数)
  • 扩缩容流程
    修改Deployment replicas
    Deployment Controller
    创建ReplicaSet
    调度新Pod

二、工作节点组件

1. kubelet
  • 作用:节点代理,管理 Pod 生命周期、挂载存储卷、执行探针检查
  • 实战排障:容器启动失败时检查日志
    journalctl -u kubelet | grep “Failed to start container”
    # 常见原因:镜像拉取失败/存储卷挂载冲突
    
2. kube-proxy
  • 作用:实现 Service 的 IPVS/iptables 负载均衡
  • 流量转发验证
    # 查看 IPVS 规则
    ipvsadm -Ln | grep -A 1 10.96.0.1  # ClusterIP 为 10.96.0.1 的服务
    
3. 容器运行时(Docker)
  • 核心机制
    技术作用
    Namespace网络/进程/挂载点隔离
    Cgroups限制 CPU/内存/磁盘 I/O
    OverlayFS容器分层文件系统
  • 实战命令
    # 查看容器进程树
    docker run -d --name test nginx
    pstree -a $(pgrep docker)  # 显示 containerd-shim 子进程
    

三、关键扩展组件

1. CNI 插件(如 Calico)
  • 作用:实现跨主机 Pod 网络通信
  • 网络策略实战:禁止 frontend 访问数据库
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:name: deny-db-access
    spec:podSelector:matchLabels: role: frontendpolicyTypes: [Egress]egress:- to: - podSelector:matchLabels: role: backend  # 只允许访问 backend
    
2. CSI 驱动(如 AWS EBS)
  • 作用:动态创建/挂载云存储卷
  • 快照备份实战
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:name: db-snapshot
    spec:volumeSnapshotClassName: ebs-snapclasssource:persistentVolumeClaimName: mysql-pvc  # 备份 PVC
    
3. Helm
  • 作用:应用模板化部署与版本管理
  • 企业级 Chart 结构
    mychart/
    ├── values.yaml      # 默认参数
    ├── Chart.yaml       # 版本描述
    ├── templates/
    │   ├── deployment.yaml
    │   ├── service.yaml
    │   └── _helpers.tpl # 模板函数
    └── charts/          # 子Chart依赖
    
4. Operator
  • 作用:将运维知识代码化(如自动扩缩/备份)
  • Redis 集群 Operator 实战逻辑
    func (r *RedisClusterReconciler) Reconcile() {// 检测集群状态currentMasters := countRedisMasters()if currentMasters < 3 {r.createRedisPod("master")  // 自动修复}// 滚动升级处理if cluster.Spec.Version != runningVersion {upgradeRedisCluster() }
    }
    

四、技术栈协作全景

1. helm install
2. 存储到
3. 通知
4. 创建
5. 调度请求
6. 分配节点
7. 调用
8. 启动容器
9. 挂载卷
10. 网络配置
11. 监控状态
开发者
API Server
etcd
Controller Manager
ReplicaSet
kube-scheduler
kubelet
Docker
Pod
CSI Driver
CNI Plugin
Operator

关键协作场景

  1. 应用发布:Helm 提交 Chart → Scheduler 分配节点 → kubelet 创建容器
  2. 存储扩容:PVC 扩容请求 → CSI Driver 扩展云磁盘 → kubelet 重挂载
  3. 故障自愈:Operator 检测到 Pod 崩溃 → 删除异常 Pod → Deployment 控制器重建
  4. 网络隔离:NetworkPolicy 下发 → CNI 插件更新 iptables 规则 → 拦截异常流量

终极实践建议:在 K8s 二次开发时,优先通过 API Server 扩展 CRD 和 Controller(Operator),而非修改内核源码。例如开发一个 MySQL 备份 Operator,通过 CronJob 定时触发 mysqldump 并推送至 S3。


Helm

Helm 是 Kubernetes 的 包管理工具,核心作用在于解决应用在 K8s 上的 定义、部署、版本控制 问题,大幅简化复杂应用的交付流程。以下通过其核心能力结合实战场景展开说明:

一、核心作用解析

1. 应用模板化(Charts 机制)
  • 问题:K8s 原生 YAML 文件冗长(如 Deployment/Service/ConfigMap 需独立维护),多环境配置切换困难。
  • 解决方案
    • 使用 Go Template 语法 将 K8s 资源抽象为可配置模板(templates/ 目录)
    • 通过 values.yaml 集中管理参数(如镜像版本、副本数)
  • 实战价值
    # values.yaml
    replicaCount: 3
    image: nginx:1.25  # 仅修改此处即可升级版本
    
2. 依赖管理(Subcharts)
  • 问题:微服务架构涉及多个关联组件(如 Web 服务依赖 Redis + MySQL),手动部署易遗漏。
  • 解决方案
    • Chart.yaml 中声明依赖项(如 dependencies: - name: mysql)
    • 自动递归安装依赖组件
  • 实战场景:一键部署 WordPress(包含 MySQL)
    helm install my-site bitnami/wordpress \--set mariadb.enabled=true  # 自动部署依赖的 MariaDB
    
3. 版本控制与发布流水线(Releases)
  • 问题:应用升级/回滚需手动操作多份 YAML,版本追溯困难。
  • 解决方案
    • helm install/upgrade 生成带版本号的 Release(记录当前部署状态)
    • 内置历史记录与回滚命令
  • 实战流程
    # 升级到新版本
    helm upgrade my-app ./app-chart -f values-v2.yaml
    # 检查历史
    helm history my-app
    # 回滚到版本2
    helm rollback my-app 2
    
4. 支持 Hooks(部署生命周期管理)
  • 问题:某些操作需在安装前后执行(如数据库迁移、备份)。
  • 解决方案
    • 在模板中定义 Hook 注解(如 helm.sh/hook: pre-install)
  • 实战案例:安装前执行数据初始化 Job
    apiVersion: batch/v1
    kind: Job
    metadata:name: db-initannotations:"helm.sh/hook": pre-install  # 在安装主应用前执行
    

二、企业级实战价值

⚙️ 场景 1:多环境配置管理
  • 需求:同一应用需部署到开发/测试/生产环境(资源配置不同)
  • Helm 方案
    my-chart/
    ├── values-dev.yaml    # 开发环境(低资源)
    ├── values-prod.yaml   # 生产环境(高可用配置)
    └── templates/
    
  • 部署命令
    helm install dev-env ./my-chart -f values-dev.yaml
    helm install prod-env ./my-chart -f values-prod.yaml
    
🔁 场景 2:应用商店(Chart Repository)
  • 需求:企业内部共享可复用的应用模板
  • Helm 方案
    1. 搭建私有仓库(如 Harbor / ChartMuseum)
    2. 开发者推送 Chart 到仓库
      helm package ./app-chart          # 打包
      helm push app-chart.tgz my-repo   # 推送
      
    3. 用户从仓库搜索并安装
      helm search repo my-repo/nginx
      helm install my-nginx my-repo/nginx
      
🛡️ 场景 3:安全与合规
  • 需求:确保所有部署符合安全规范(如禁止 root 运行容器)
  • Helm 方案
    • 在共享库 Chart 中内置安全规则
      # _helpers.tpl(通用模板函数)
      {{- define "securityContext" -}}
      securityContext:runAsNonRoot: true  # 强制非 root 运行
      {{- end -}}
      
    • 所有业务 Chart 引用此模板
      containers:
      - name: app{{- include "securityContext" . | nindent 12 }}
      

三、关键原理图示

graph TDA[开发者] --> |1. 编写模板| B(Helm Chart)B --> |2. 注入配置| C(values.yaml)C --> |3. helm install| D[K8s API Server]D --> |4. 渲染为实际 YAML| E[Deployment/Service等资源]E --> |5. 创建 Release 记录| F[Helm Storage<br>(Secrets/ConfigMap)]D --> |6. 部署应用| G[K8s 集群]

技术本质:Helm 的核心是 模板引擎 + 版本化状态管理,将 K8s 资源部署从“手工操作”升级为“软件工程化”。


总结:Helm 的不可替代性

问题场景传统 K8s 方案Helm 方案
部署多个关联组件手动依次应用多份 YAMLhelm install 一键安装依赖
应用升级手动修改 YAML 并重新应用helm upgrade 自动化更新
回滚故障版本重新部署旧版 YAML(易出错)helm rollback 精准回滚
多环境参数管理复制并修改多份 YAML-f values-env.yaml 动态切换

结论:Helm 是 Kubernetes 应用交付的事实标准工具,尤其在微服务架构、持续交付流水线中大幅降低复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

langchain4j整合springboot

langchain4j整合springboot 1.搭建项目架子配置文件Controller测试测试结果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/35b8bd04f3034bd990861f065bc73d2f.png) 1.搭建项目架子 配置文件 参考官网配置引入 <?xml version"1.0" encoding"UTF…

408第一季 - 数据结构 - 平衡二叉树

平衡二叉树 定义 缩写记一下 AVL 还有下面这些&#xff0c;can you try&#xff1f; 平衡二叉树的插入 LL平衡旋转&#xff08;右单旋转&#xff09; 怎么理解&#xff1f; 首先我们可以看见啊&#xff0c;b图A左边和右边的不平衡的&#xff0c;非常的难受 于是我们可以这…

VR 地震安全演练:“透视” 地震,筑牢企业安全新护盾​

与传统的地震安全教育方式相比&#xff0c;VR 地震安全技术具有无可比拟的优势。在过去漫长的岁月里&#xff0c;我们主要依赖书本、讲座和视频等较为常规的手段来了解地震知识和逃生技巧。​ 书本上密密麻麻的文字以及静态的图片&#xff0c;虽然能够较为系统地传递理论性的信…

30-Oracle 23ai-回顾从前的Flashback设置

配置和测试了Oracle 23 ai的Flashback Log Placement后&#xff0c; 刚好身边11g,19c的环境都在&#xff0c;还是把从前的flashback整理下&#xff0c;温故知新&#xff0c;循序渐进。 一、闪回技术 Flashback Database 允许将整个数据库回退到过去的某个时间点/SCN&#xff…

Gartner《Reference Architecture for Federated Analytics》学习心得

研究背景 随着分析平台越来越易于被广泛用户使用,以及组织内用例的不断增多和多样化,分析架构的去中心化给专注于架构的分析专家带来了混乱。组织在交付一致、可复用和可信的分析方面面临挑战,分布式分析架构需要在控制和敏捷之间取得平衡,然而许多组织在这方面的控制力不…

Windows下Docker一键部署Dify教程

Windows环境下Docker部署Dify完整指南 &#x1f4cb; 目录 系统要求Docker安装验证Docker安装Dify部署访问Dify常见问题管理命令 &#x1f5a5;️ 系统要求 在开始安装之前&#xff0c;请确保你的Windows系统满足以下要求&#xff1a; 硬件要求 CPU: > 2核心内存: >…

idea maven打包很慢,怎么提速-多线程

作为一个技术运维人员&#xff0c;经常要更新程序然后重新打包发布jar包。由于程序子模块多&#xff0c;需要相互引用每次打包的时候都需要很久&#xff0c;怎么可以让打包快一点呢&#xff1f;可以启动打包的多线程。请参照下图设置&#xff0c;线程数量应该和cpu内核数量要能…

Java/Kotlin selenium 无头浏览器 [Headless Chrome] 实现长截图 三种方式

在自动化测试和网页抓取中&#xff0c;完整捕获整个页面内容是常见需求。传统截图只能捕获当前视窗内容&#xff0c;无法获取超出可视区域的页面部分。长截图技术通过截取整个滚动页面解决了这个问题&#xff0c;特别适用于&#xff1a; 保存完整网页存档生成页面可视化报告验…

【AI大模型】Elasticsearch9 + 通义大模型实现语义检索操作详解

目录 一、前言 二、Elasticsearch9 语义检索介绍 2.1 ES9 语义检索核心特性 2.2 semantic_text 字段类型说明 2.3 ES9 语义检索原理 2.4 ES9 语义检索优势与使用场景 三、 Elasticsearch9 搭建过程 3.1 环境说明 3.2 部署方式一 3.2.1 创建docker网络 3.2.2 获取es9镜…

linux开机原理以及如何开关机-linux023

linux开机原理以及如何开关机 Linux 系统启动过程概述 阶段描述内核引导启动时&#xff0c;BIOS执行自检&#xff0c;启动设备通常是硬盘。操作系统接管硬件后&#xff0c;读取/boot目录下的内核文件。运行 initinit是系统所有进程的起点&#xff0c;负责启动其他进程。它读取…

使用 socat 和 xinetd 将程序绑定到端口运行

在现代网络应用开发和系统管理中&#xff0c;经常需要将某些程序或脚本绑定到特定的网络端口上&#xff0c;以实现远程访问或服务化。例如&#xff0c;一个简单的 Python 脚本可能需要通过 TCP 端口提供服务&#xff0c;或者一个命令行工具需要通过网络接口暴露其功能。为了实现…

电阻篇---上拉电阻

一、上拉电阻的定义与本质 定义&#xff1a;上拉电阻是一端连接到电源&#xff08;VCC&#xff09;&#xff0c;另一端连接到电路节点的电阻元件&#xff0c;其核心作用是将该节点的电平 “拉” 至电源电压&#xff0c;使其在无信号输入时保持稳定的高电平状态。 本质原理&…

前端持续集成和持续部署简介

持续集成&#xff08;CI&#xff09;&#xff1a;代码提交后自动触发构建、静态检查、单元测试&#xff0c;确保代码质量。 持续部署&#xff08;CD&#xff09;&#xff1a;通过流水线将测试通过的代码自动发布到测试/生产环境&#xff0c;减少人工操作失误。 CI/CD 工具链 …

Elasticsearch高效文章搜索实践

功能 创建索引和映射 使用postman添加映射和查询 查询所有的文章信息&#xff0c;批量导入到es索引库中 server:port: 9999 spring:application:name: es-articledatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/leadnews_article?useU…

React 中除了react-router还有哪些路由方案

在用React开发时&#xff0c;常用的路由是react-router &#xff0c;但除此之外&#xff0c;还有两个路由方案&#xff0c;因为他们具备 react-router 没有的特性。 1. tanstack/router 1.1. 主要特性 100% 推断的 TypeScript 支持 类型安全的导航 嵌套路由和布局路由 内置…

VINS-Fusion 简介、安装、编译、数据集/相机实测

目录 VINS-Fusion 简介 安装 VINS-Fusion 源码安装 运行数据集 双目模式 单目IMU 模式 双目IMU 模式 D455 相机实际运行 双目IMU 模式 VINS-Fusion 简介 VINS-Fusion 是继 VINS-Mono 和 VINS-Mobile&#xff08;单目视觉惯导 SLAM 方案&#xff09;后&#xff0c;香港科 技大学…

SQL Developer 表复制

SQL Developer 表复制 此方法在数据量比较大时&#xff0c;比一条一条的insert要快得多&#xff1b;具体是会覆盖掉原数据&#xff0c;还是增量的处理&#xff0c;请自行创建demo表测试一下。 注意&#xff1a;原库版本要与目标库数据库版本一致&#xff0c;否则可能会报错的。…

影视剧学经典系列-梁祝-《吕氏春秋·应同》

1、背景 07版电视剧《梁山伯与祝英台》中&#xff0c;谢道韫作为先生&#xff0c;给学生讲了其中的句子。 2、名言 君为尊&#xff0c;以白为黑&#xff0c;臣不能从&#xff1b;父虽亲&#xff0c;以黑为白&#xff0c;子不能从”出自《吕氏春秋应同》 其意为&#xff0c;…

异步爬虫---

代码结构分析 这是一个同步新闻爬虫程序&#xff0c;主要包含以下几个部分&#xff1a; 们把爬虫设计为一个类&#xff0c;类在初始化时&#xff0c;连接数据库&#xff0c;初始化logger&#xff0c;创建网址池&#xff0c;加载hubs并设置到网址池。 爬虫开始运行的入口就是r…