当前位置: 首页 > news >正文

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 应用交付的事实标准工具,尤其在微服务架构、持续交付流水线中大幅降低复杂度。

相关文章:

  • Rviz2中,在rviz和launch文件中都需要配置urdf文件,二者作用上的区别?
  • 【工具教程】如何批量识别大量图片的文字并重命名图片,图片文件批量文件识别改名的详细操作步骤和注意事项
  • 水果商城管理系统笔记
  • [深度学习]目标检测YOLO v3
  • C语言状态机:从入门到精通
  • 英语~四级CET4考试——入栏需看
  • Chapter12-API testing
  • 「Linux文件及目录管理」文件及目录操作类命令
  • 【Zephyr 系列 26】跨平台测试框架设计:CLI + 自动脚本 + OTA 校验一体化方案
  • 【项目】仿muduo库one thread one loop式并发服务器前置知识准备
  • 【项目实训】【项目博客#06】大模型微调与推理优化(4.21-5.11)
  • ATSAMV71Q21B基于Microchip Studio以及ASF4.0架构使用printf打印float类型
  • Python格式化工具推荐
  • Nacos 实战指南:服务注册、分级与环境隔离
  • TabSyncer:浏览器标签页管理工具
  • 基于HPSO_TVAC与BP神经网络分类模型的特征选择方法研究(Python实现)
  • 《贵州安顺棒垒球》国家队运动员·棒球1号位
  • 2013-2023年 地级市-财政透明度数据-社科经管实证数据
  • java+vue+SpringBoo摄影师分享交流社区(程序+数据库+报告+部署教程+答辩指导)
  • PDF超强无损压缩
  • 做移动网站多少钱/seo顾问是什么
  • 阿里云网站如何做淘宝客/如何推广网站方法
  • 3. 是网站建设的重点/免费源码网站
  • 网站设计特别好的公司/网站开发教程
  • 上海平台网站建设企业/seo的定义
  • 网站内容板块调换位置/企业网站建设报价