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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84970.shtml
英文地址,請注明出處:http://en.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…