目錄
專欄介紹
作者與平臺
您將學到什么?
學習特色
Kubernetes架構概覽
1.1 Kubernetes簡介
1.2 基本架構
1.3 主要組件
1.4 核心功能
組件架構圖解
2.1 控制平面組件詳解
2.1.1 kube-apiserver
2.1.2 etcd
2.1.3 kube-scheduler
2.1.4 kube-controller-manager
2.1.5 cloud-controller-manager
2.2 工作節點組件詳解
2.2.1 kubelet
2.2.2 kube-proxy
2.2.3 容器運行時
2.2.4 網絡插件
2.2.5 Node Local Controller
核心概念詳解
3.1 Pod
3.1.1 定義
3.1.2 共享環境
3.1.3 設計初衷
3.1.4 生命周期
3.1.5 Pod示例
3.2 Deployment
3.2.1 定義
3.2.2 核心功能
3.2.3 與ReplicaSet的關系
3.2.4 Deployment示例
3.3 Service
3.3.1 定義
3.3.2 核心功能
3.3.3 類型與場景
3.3.4 Service示例
核心概念關系圖
4.1 用戶 → Deployment
4.2 Deployment → ReplicaSet
4.3 ReplicaSet → Pod
4.4 Pod → Service
4.5 Service → Node
4.6 Node → 容器運行時
實際應用場景
5.1 部署Web應用
5.1.1 創建Deployment
5.1.2 創建Service
5.1.3 訪問應用
5.2 微服務架構
5.2.1 前端服務
5.2.2 后端API
5.2.3 數據庫服務
5.2.4 架構圖
結
專欄介紹
作者與平臺
作者:庸子
用戶ID:2401_86478612
第一發表平臺:CSDN
歡迎來到《Kubernetes架構師之路:系統化學習與實踐》專欄!在這個容器化技術主導的時代,Kubernetes已成為云原生應用編排的事實標準,掌握Kubernetes已成為每位開發者和運維工程師的必備技能。
本專欄采用系統化學習方法,從基礎概念到高級實踐,循序漸進地帶您全面掌握Kubernetes技術棧。無論您是剛接觸容器技術的初學者,還是希望深入理解Kubernetes架構的資深工程師,這里都將為您提供清晰的學習路徑和實用的實戰指導。
您將學到什么?
- 基礎理論:深入理解容器、容器編排、Kubernetes核心概念和架構設計
- 核心組件:掌握etcd、API Server、Controller Manager、Scheduler等核心組件的工作原理
- 資源管理:學會Pod、Deployment、Service、Ingress等核心資源的創建與管理
- 網絡與存儲:理解Kubernetes網絡模型和存儲方案,解決實際部署中的網絡與存儲問題
- 高可用與擴展:構建高可用的Kubernetes集群,實現應用的自動擴展與故障恢復
- 監控與日志:掌握集群監控、日志收集與應用性能優化方法
- CI/CD集成:學習如何將Kubernetes與CI/CD流程結合,實現自動化部署
- 安全實踐:了解Kubernetes安全模型,掌握RBAC、網絡策略等安全配置
學習特色
- 系統化知識體系:從零開始,構建完整的Kubernetes知識框架
- 實戰導向:每個知識點都配有實際操作案例,讓您"學以致用"
- 問題驅動:針對實際部署中常見的問題提供解決方案
- 最新版本覆蓋:基于最新穩定版Kubernetes,緊跟技術發展趨勢
- 架構師視角:不僅教您"如何做",更解釋"為什么這樣設計"
無論您是想提升個人競爭力,還是為企業構建高效的云原生基礎設施,本專欄都將助您成為真正的Kubernetes專家。讓我們一起開啟這段激動人心的Kubernetes學習之旅!
立即訂閱,開啟您的Kubernetes架構師成長之路!
Kubernetes架構概覽
1.1 Kubernetes簡介
Kubernetes(簡稱K8s)是一個開源的容器編排平臺,最初由Google設計并捐贈給云原生計算基金會(CNCF)。它用于自動化部署、擴展和管理容器化應用程序,提供了靈活、可擴展的解決方案,幫助開發者和運維人員簡化應用程序的管理流程。
Kubernetes的核心價值在于它能夠自動化容器化應用的部署、擴展和管理,解決了大規模容器環境中的復雜性問題。它提供了服務發現、負載均衡、存儲編排、自動擴縮容、自我修復等關鍵功能,使開發者能夠專注于業務邏輯而非基礎設施管理。
1.2 基本架構
Kubernetes集群由一組節點組成,包括一個或多個控制平面節點和若干工作節點。控制平面節點負責管理集群的整體狀態,而工作節點負責實際運行容器化的應用程序。
1.3 主要組件
Kubernetes集群由兩種類型的節點組成:
- 控制平面(Master):負責管理整個集群的狀態和配置
- 工作節點(Node):負責運行容器化應用程序
1.4 核心功能
Kubernetes提供了一系列核心功能,使其成為容器編排領域的領導者:
容器編排:自動部署、擴展和管理容器化應用
服務發現:自動為容器分配IP和DNS名稱
負載均衡:在多個容器之間分配流量
自動擴縮容:根據資源需求自動調整應用實例數量
存儲編排:自動掛載和管理存儲系統
自我修復:自動替換失敗的容器
密鑰與配置管理:安全地存儲和管理敏感信息
批處理執行:支持一次性任務和批處理工作負載
組件架構圖解
2.1 控制平面組件詳解
控制平面是Kubernetes集群的大腦,負責管理集群的整體狀態和配置。以下是控制平面各組件的詳細說明:
2.1.1 kube-apiserver
kube-apiserver是Kubernetes集群的統一入口,負責處理所有REST請求,提供RESTful API接口服務。它是Kubernetes控制平面的核心組件,所有其他組件都通過它進行通信。
主要功能:
提供集群操作的唯一入口點
處理認證、授權和準入控制
維護集群狀態,并將狀態持久化到etcd
提供集群資源對象的CRUD操作接口
關鍵特性:
水平擴展:可以通過部署多個實例實現高可用
RESTful API:支持JSON和Protocol Buffers格式
驗證機制:確保所有操作符合Kubernetes API規范
事件通知:支持Watch機制,允許客戶端實時監控集群狀態變化
2.1.2 etcd
etcd是一個高可用的鍵值存儲系統,用于保存Kubernetes集群的所有狀態數據。它是Kubernetes集群的"真相來源",存儲了集群中所有資源對象的配置和狀態信息。
主要功能:
持久化存儲集群狀態
提供高可用性和一致性保證
支持分布式部署和故障恢復
提供Watch機制,允許客戶端監聽鍵值變化
關鍵特性:
強一致性:采用Raft算法確保數據一致性
高可用性:支持多節點部署,自動處理節點故障
快速響應:提供高效的讀寫性能
版本控制:支持數據的歷史版本查詢
2.1.3 kube-scheduler
kube-scheduler負責為新創建的Pod選擇一個合適的Node節點運行。它根據調度算法和約束條件,評估集群中各個節點的資源狀況和Pod的需求,選擇最優的節點進行調度。
主要功能:
監聽未調度的Pod
根據調度算法選擇合適的Node
將Pod綁定到選定的Node上
支持多種調度策略和插件
關鍵特性:
多種調度策略:包括資源需求、親和性/反親和性、污點容忍等
可擴展性:支持自定義調度器
并行調度:提高大規模集群的調度效率
預選和優選:兩階段調度過程,確保調度質量
2.1.4 kube-controller-manager
kube-controller-manager運行多個控制器進程,負責管理集群狀態的控制循環。這些控制器持續監控集群狀態,并確保實際狀態與期望狀態一致。
主要功能:
運行各種控制器,如Node Controller、Replication Controller等
監控集群狀態變化
自動修復不符合期望狀態的資源
處理集群中的各種事件
關鍵特性:
多控制器集成:在一個進程中運行多個控制器
自動修復:自動處理節點故障、Pod崩潰等問題
事件驅動:基于集群狀態變化觸發相應操作
可擴展性:支持自定義控制器
2.1.5 cloud-controller-manager
cloud-controller-manager是在公有云環境中負責管理與云提供商相關的資源的組件。它抽象了底層云平臺的差異,使Kubernetes可在多種云平臺上運行。
主要功能:
管理云提供商特定的資源
處理節點、負載均衡器等云資源
提供統一的接口抽象不同云平臺
減少對核心Kubernetes組件的依賴
關鍵特性:
云平臺抽象:支持多種云服務提供商
資源隔離:將云相關功能與核心組件分離
安全增強:減少對云憑證的暴露
獨立部署:可以獨立于其他控制平面組件部署
2.2 工作節點組件詳解
工作節點是Kubernetes集群中的執行者,負責實際運行容器化應用程序。以下是工作節點各組件的詳細說明:
2.2.1 kubelet
kubelet是運行在每個工作節點上的主要代理進程,負責管理節點上的Pod和容器。它是節點與控制平面的橋梁,確保Pod按照預期運行。
主要功能:
管理Pod的生命周期
與容器運行時交互,啟動和管理容器
監控節點和容器的資源使用情況
向控制平面報告節點狀態
關鍵特性:
Pod管理:負責Pod的創建、更新和刪除
容器管理:與容器運行時API交互
健康檢查:執行Pod和容器的健康檢查
資源監控:收集和報告節點和容器的資源使用情況
2.2.2 kube-proxy
kube-proxy是運行在每個工作節點上的網絡代理服務,負責維護網絡規則,管理Pod間的網絡通信和負載均衡。
主要功能:
實現Service的負載均衡
維護節點上的網絡規則
處理Service的端口轉發
實現集群內的網絡通信
關鍵特性:
負載均衡:將流量分發到多個Pod
網絡代理:支持多種代理模式(iptables、IPVS等)
服務發現:根據Service規則轉發流量
高可用:確保網絡服務的連續性
2.2.3 容器運行時
容器運行時是負責創建和管理應用程序容器的軟件。Kubernetes支持多種容器運行時,包括Docker、containerd、CRI-O等。
主要功能:
啟動和管理容器
下載和管理容器鏡像
提供容器隔離和資源限制
處理容器的生命周期事件
關鍵特性:
鏡像管理:支持多種鏡像倉庫
資源隔離:提供cgroups和namespaces隔離
安全增強:支持安全容器和鏡像掃描
標準接口:遵循OCI和CRI標準
2.2.4 網絡插件
網絡插件是實現容器之間和容器與外部網絡通信的組件。Kubernetes支持多種網絡插件,如Flannel、Calico、Weave等。
主要功能:
實現Pod間的網絡通信
提供跨節點的網絡連接
支持網絡策略和安全規則
處理服務發現和負載均衡
關鍵特性:
CNI接口:遵循容器網絡接口標準
網絡策略:支持基于標簽的網絡訪問控制
覆蓋網絡:支持跨節點的網絡通信
性能優化:提供高效的網絡轉發機制
2.2.5 Node Local Controller
Node Local Controller是負責在每個節點上執行特定控制任務的組件,如本地存儲管理、節點健康檢查等。
主要功能:
管理節點上的本地存儲
執行節點健康檢查
處理節點特定的資源分配
協助節點故障恢復
關鍵特性:
本地優化:針對節點級別的特定優化
資源管理:高效管理節點本地資源
故障檢測:快速檢測節點故障
性能監控:收集節點性能指標
核心概念詳解
3.1 Pod
3.1.1 定義
Pod是Kubernetes中最小的調度單元,可以包含一個或多個容器。Pod中的容器共享網絡和存儲資源,被作為一個整體進行調度和管理。
關鍵特性:
最小部署單元:Kubernetes調度的最小單位
多容器支持:一個Pod可以包含多個容器
共享資源:容器共享網絡和存儲
生命周期管理:Pod有明確的創建、運行和終止生命周期
3.1.2 共享環境
同一Pod內的容器共享IP地址和端口空間,可通過localhost互相通信。這種設計使得容器之間可以高效地交換數據和信息。
共享網絡:
共享IP地址:所有容器使用相同的IP地址
共享端口空間:容器間不能使用相同的端口
localhost通信:容器間可通過localhost互相訪問
域名解析:容器間可以通過容器名互相解析
共享存儲:
共享卷:Pod可以掛載共享存儲卷
數據持久化:容器間共享數據,實現數據持久化
配置共享:通過共享卷共享配置文件
臨時存儲:支持臨時存儲需求
3.1.3 設計初衷
Pod的設計初衷是支持緊密耦合的容器組或臨時任務。例如:
主容器+Sidecar容器:
主容器:運行主要應用程序
Sidecar容器:輔助主容器,如日志收集、監控等
共享資源:通過共享網絡和存儲實現高效通信
生命周期一致:Pod中的容器一起啟動和終止
臨時任務:
短期運行:執行一次性任務后自動終止
資源隔離:與其他任務隔離運行
結果收集:通過共享存儲收集任務結果
自動清理:任務完成后自動清理資源
3.1.4 生命周期
Pod有明確的生命周期狀態,反映了其內部容器的運行狀態:
Pending(創建中):
Pod已被接受,但尚未創建
可能正在下載鏡像或調度節點
用戶可以通過kubectl get pods查看狀態
Running(運行中):
Pod已被綁定到節點,且至少一個容器正在運行
如果容器啟動失敗,Pod可能處于此狀態但容器未運行
用戶可以通過kubectl describe pods查看詳細信息
Succeeded(成功):
所有容器已成功終止
適用于一次性任務
容器退出碼為0
Failed(失敗):
所有容器已終止,至少一個容器以非零退出碼終止
適用于一次性任務
用戶可以通過kubectl logs查看容器日志
Unknown(未知):
無法確定Pod狀態
通常是由于與節點通信失敗
3.1.5 Pod示例
以下是一個Pod的YAML配置示例:
apiVersion: v1
kind: Pod
metadata:
??name: nginx-pod
??labels:
????app: nginx
spec:
??containers:
??- name: nginx
????image: nginx:1.23
????ports:
- containerPort: 80
關鍵配置說明:
apiVersion: 指定API版本
kind: 資源類型,這里是Pod
metadata: 元數據,包括名稱和標簽
spec: Pod規格,包括容器定義
containers: 容器列表,每個容器指定鏡像和端口
3.2 Deployment
3.2.1 定義
Deployment是用于管理Pod副本集(ReplicaSet)的控制器,確保指定數量的Pod始終運行。它提供了一種聲明式的方式來部署和管理應用,支持聲明式配置和自動更新。
關鍵特性:
聲明式配置:用戶只需聲明期望狀態
自動更新:支持滾動更新和回滾
擴縮容:支持手動和自動擴縮容
版本管理:支持多版本管理和回滾
3.2.2 核心功能
Deployment提供了一系列核心功能,簡化了應用的部署和管理:
滾動更新(Rolling Update):
逐步替換舊Pod,實現零停機部署
通過控制更新速率,確保應用在更新過程中仍然可用
支持更新策略(如Recreate、RollingUpdate)
可配置更新最大不可用時間和最大 surge 數量
回滾(Rollback):
快速恢復到歷史版本
Deployment會保留歷史版本,允許用戶在出現問題時快速回滾
支持回滾到特定修訂版本
記錄每次變更,便于問題排查
擴縮容(Scaling):
手動或自動調整Pod副本數
支持水平Pod自動擴縮容(HPA)
根據CPU、內存等指標自動調整副本數
支持自定義指標和外部指標
3.2.3 與ReplicaSet的關系
Deployment管理ReplicaSet,ReplicaSet管理Pod。每次更新Deployment會生成新的ReplicaSet,舊ReplicaSet保留以便回滾。
關系說明:
Deployment:定義應用的期望狀態(副本數、鏡像等)
ReplicaSet:確保Pod數量符合預期,并管理Pod的標簽選擇器
Pod:實際運行容器的工作負載單元
更新過程:
- 用戶更新Deployment的配置(如鏡像版本)
- Deployment創建一個新的ReplicaSet
- 新ReplicaSet根據滾動更新策略逐步創建新Pod
- 舊ReplicaSet逐步終止舊Pod
- 更新完成后,舊ReplicaSet保留(默認保留10個歷史版本)
回滾過程:
- 用戶執行回滾命令,指定要回滾的修訂版本
- Deployment創建一個新的ReplicaSet,使用歷史配置
- 新ReplicaSet根據滾動更新策略逐步創建Pod
- 舊ReplicaSet逐步終止當前Pod
- 回滾完成,當前ReplicaSet更新為新的版本
3.2.4 Deployment示例
以下是一個Deployment的YAML配置示例:
apiVersion: apps/v1
kind: Deployment
metadata:
??name: nginx-deployment
??labels:
????app: nginx
spec:
??replicas: 3
??selector:
????matchLabels:
??????app: nginx
??template:
????metadata:
??????labels:
????????app: nginx
????spec:
??????containers:
??????- name: nginx
????????image: nginx:1.23
????????ports:
????????- containerPort: 80
關鍵配置說明:
apiVersion: 指定API版本(apps/v1)
kind: 資源類型,這里是Deployment
metadata: 元數據,包括名稱和標簽
spec: Deployment規格,包括副本數和Pod模板
replicas: 期望的Pod副本數
selector: 用于選擇要管理的Pod的標簽選擇器
template: Pod模板,定義Pod的規格
3.3 Service
3.3.1 定義
Service是Kubernetes中用于定義一組Pod訪問策略的抽象資源,為動態變化的Pod提供穩定的訪問端點(IP/DNS)。Pod的IP地址是動態分配的,可能會隨著Pod的重新調度而改變,Service通過為一組Pod提供一個穩定的虛擬IP地址和DNS名稱,使得其他應用程序可以通過該IP地址或DNS名稱與這組Pod進行通信。
關鍵特性:
穩定訪問:為動態變化的Pod提供穩定的訪問端點
負載均衡:將流量分發到多個Pod
服務發現:通過DNS名稱訪問服務,避免依賴Pod IP
會話保持:支持會話親和性,將來自同一客戶端的請求定向到同一Pod
3.3.2 核心功能
Service提供了一系列核心功能,簡化了服務間的通信:
負載均衡:
將流量分發到多個Pod
支持多種負載均衡算法(輪詢、最少連接等)
支持會話親和性(基于客戶端IP)
支持流量權重分配
服務發現:
通過DNS名稱訪問服務,避免依賴Pod IP
支持內網DNS解析
支持服務別名和端口映射
支持服務端點健康檢查
網絡策略:
控制Pod間的網絡訪問
支持基于標簽的網絡訪問控制
支持基于端口的網絡訪問控制
支持基于命名空間的網絡訪問控制
3.3.3 類型與場景
Service支持多種類型,適用于不同的場景:
ClusterIP(內部服務通信):
默認類型,僅在集群內部可訪問的虛擬IP
適用于內部微服務通信
不直接暴露給外部客戶端
通過kube-proxy實現負載均衡
NodePort(通過節點端口暴露服務):
在ClusterIP基礎上,在每個節點開放靜態端口
適用于開發測試環境
可以通過節點IP和端口訪問服務
可以與LoadBalancer類型結合使用
LoadBalancer(通過云平臺負載均衡器暴露服務):
使用云提供商的負載均衡器
適用于生產環境公網訪問
自動分配外部IP地址
支持多種云服務提供商
Headless(直接獲取Pod IP):
不分配ClusterIP,直接返回Pod的IP地址
適用于StatefulSet或DNS發現場景
支持自定義DNS記錄
適用于需要直接訪問Pod的場景
3.3.4 Service示例
以下是一個Service的YAML配置示例:
apiVersion: v1
kind: Service
metadata:
??name: nginx-service
spec:
??selector:
????app: nginx
??ports:
????- protocol: TCP
??????port: 80
??????targetPort: 80
??type: ClusterIP
關鍵配置說明:
apiVersion: 指定API版本(v1)
kind: 資源類型,這里是Service
metadata: 元數據,包括名稱
spec: Service規格,包括選擇器、端口和類型
selector: 用于選擇要關聯的Pod的標簽選擇器
ports: 定義服務的端口映射
type: Service類型,這里使用ClusterIP
核心概念關系圖
4.1 用戶 → Deployment
用戶通過Deployment定義Pod模板和副本數,聲明應用的期望狀態。用戶只需關心"想要什么",而不需要關心"如何實現"。
交互過程:
- 用戶創建或更新Deployment資源
- Deployment控制器監聽資源變化
- Deployment根據Pod模板創建ReplicaSet
- ReplicaSet根據副本數創建和管理Pod
關鍵特性:
- 聲明式配置:用戶只需聲明期望狀態
- 自動化:系統自動實現期望狀態
- 版本管理:支持多版本管理和回滾
- 擴縮容:支持手動和自動擴縮容
4.2 Deployment → ReplicaSet
Deployment控制ReplicaSet,確保Pod數量符合預期。每次更新Deployment會生成新的ReplicaSet,舊ReplicaSet保留以便回滾。
交互過程:
- 用戶更新Deployment的配置(如鏡像版本)
- Deployment創建一個新的ReplicaSet
- 新ReplicaSet根據滾動更新策略逐步創建新Pod
- 舊ReplicaSet逐步終止舊Pod
- 更新完成后,舊ReplicaSet保留(默認保留10個歷史版本)
關鍵特性:
分層管理:Deployment管理ReplicaSet,ReplicaSet管理Pod
版本控制:每次更新創建新的ReplicaSet
回滾支持:保留歷史版本,支持快速回滾
滾動更新:支持零停機更新
4.3 ReplicaSet → Pod
ReplicaSet管理Pod,確保Pod數量符合預期,并管理Pod的標簽選擇器。ReplicaSet通過標簽選擇器關聯Pod,并監控Pod的狀態。
交互過程:
- ReplicaSet根據副本數創建Pod
- Pod被調度到合適的節點上運行
- ReplicaSet監控Pod的狀態
- 如果Pod失敗,ReplicaSet會創建新的Pod替代
- 如果副本數變化,ReplicaSet會相應增加或減少Pod數量
關鍵特性:
自動修復:自動替換失敗的Pod
標簽選擇:通過標簽選擇器關聯Pod
副本管理:確保Pod數量符合預期
狀態監控:持續監控Pod的狀態
4.4 Pod → Service
Pod通過標簽關聯Service,提供訪問入口。Service通過標簽選擇器關聯一組Pod,為這組Pod提供統一的訪問入口。
交互過程:
- 用戶創建Service,指定標簽選擇器
- Service控制器根據標簽選擇器查找匹配的Pod
- Service創建端點(Endpoints),記錄Pod的IP和端口
- 客戶端通過Service的IP或DNS名稱訪問服務
- kube-proxy將流量分發到后端的Pod
關鍵特性:
動態發現:自動發現新創建的Pod
負載均衡:將流量分發到多個Pod
服務抽象:為客戶端提供穩定的訪問入口
會話保持:支持會話親和性
4.5 Service → Node
Service關聯Node,運行Pod的物理機/虛擬機。Node是Kubernetes集群中的工作節點,負責運行容器化應用程序。
交互過程:
- Pod被調度到Node上運行
- Service通過kube-proxy在Node上設置網絡規則
- 客戶端請求到達Node,根據網絡規則轉發到Pod
- kube-proxy維護Node上的網絡規則,確保流量正確轉發
- 如果Node故障,Pod會被重新調度到其他Node
關鍵特性:
負載均衡:在多個Node之間分配流量
故障轉移:自動處理Node故障
網絡代理:實現Service的負載均衡
資源管理:管理Node上的資源使用情況
4.6 Node → 容器運行時
Node關聯容器運行時,實際運行容器。容器運行時是負責創建和管理應用程序容器的軟件,如Docker、containerd等。
交互過程:
- kubelet在Node上接收Pod規格
- kubelet與容器運行時API交互
- 容器運行時下載鏡像并創建容器
- 容器運行時啟動容器并管理其生命周期
- kubelet監控容器的狀態和資源使用情況
關鍵特性:
容器管理:創建、啟動、停止和刪除容器
鏡像管理:下載和管理容器鏡像
資源隔離:提供cgroups和namespaces隔離
生命周期管理:管理容器的生命周期事件
實際應用場景
5.1 部署Web應用
部署一個簡單的Web應用是Kubernetes最常見的使用場景之一。以下是一個完整的部署流程:
5.1.1 創建Deployment
首先,創建一個Deployment來定義Nginx Pod的模板和副本數:
apiVersion: apps/v1
kind: Deployment
metadata:
??name: nginx-deployment
??labels:
????app: nginx
spec:
??replicas: 3
??selector:
????matchLabels:
??????app: nginx
??template:
????metadata:
??????labels:
????????app: nginx
????spec:
??????containers:
??????- name: nginx
????????image: nginx:1.23
????????ports:
????????- containerPort: 80
關鍵配置說明:
replicas: 期望的Pod副本數,這里設置為3,實現高可用
selector: 用于選擇要管理的Pod的標簽選擇器
template: Pod模板,定義Pod的規格
containers: 容器列表,這里使用Nginx鏡像
5.1.2 創建Service
接下來,創建一個Service來暴露Nginx應用,使其能夠被訪問:
apiVersion: v1
kind: Service
metadata:
??name: nginx-service
spec:
??selector:
????app: nginx
??ports:
????- protocol: TCP
??????port: 80
??????targetPort: 80
??type: ClusterIP
關鍵配置說明:
selector: 用于選擇要關聯的Pod的標簽選擇器,與Deployment的標簽匹配
ports: 定義服務的端口映射,將80端口映射到容器的80端口
type: Service類型,這里使用ClusterIP,僅在集群內部可訪問
如果需要從外部訪問,可以將type改為LoadBalancer:
apiVersion: v1
kind: Service
metadata:
??name: nginx-service
spec:
??selector:
????app: nginx
??ports:
????- protocol: TCP
??????port: 80
??????targetPort: 80
??type: LoadBalancer
5.1.3 訪問應用
創建Service后,可以通過以下方式訪問應用:
集群內部訪問:
使用Service的名稱:kubectl exec -it <pod-name> -- curl http://nginx-service
使用Service的ClusterIP:kubectl get svc nginx-service -o jsonpath='{.spec.clusterIP}'
集群外部訪問:
如果使用NodePort類型,可以通過節點IP和端口訪問:http://<node-ip>:<node-port>
如果使用LoadBalancer類型,可以通過外部負載均衡器的IP訪問:http://<external-ip>
DNS訪問:
在集群內部,可以通過DNS名稱訪問:http://nginx-service.default.svc.cluster.local
在同一命名空間內,可以直接使用服務名:http://nginx-service
5.2 微服務架構
Kubernetes非常適合部署和管理微服務架構。以下是一個典型的微服務架構示例:
5.2.1 前端服務
前端服務通常需要暴露給外部用戶,因此使用LoadBalancer類型的Service:
apiVersion: apps/v1
kind: Deployment
metadata:
??name: frontend-deployment
??labels:
????app: frontend
spec:
??replicas: 2
??selector:
????matchLabels:
??????app: frontend
??template:
????metadata:
??????labels:
????????app: frontend
????spec:
??????containers:
??????- name: frontend
????????image: my-frontend-app:1.0
????????ports:
????????- containerPort: 80
????????env:
????????- name: API_URL
??????????value: "http://api-service"
---
apiVersion: v1
kind: Service
metadata:
??name: frontend-service
spec:
??selector:
????app: frontend
??ports:
????- protocol: TCP
??????port: 80
??????targetPort: 80
??type: LoadBalancer
關鍵配置說明:
前端應用通過環境變量API_URL配置后端API的地址
使用LoadBalancer類型,將服務暴露給外部用戶
副本數設置為2,確保高可用
5.2.2 后端API
后端API通常只在集群內部被訪問,因此使用ClusterIP類型的Service:
apiVersion: apps/v1
kind: Deployment
metadata:
??name: api-deployment
??labels:
????app: api
spec:
??replicas: 3
??selector:
????matchLabels:
??????app: api
??template:
????metadata:
??????labels:
????????app: api
????spec:
??????containers:
??????- name: api
????????image: my-api-app:1.0
????????ports:
????????- containerPort: 8080
????????env:
????????- name: DB_HOST
??????????value: "database-service"
????????- name: DB_PORT
??????????value: "5432"
---
apiVersion: v1
kind: Service
metadata:
??name: api-service
spec:
??selector:
????app: api
??ports:
????- protocol: TCP
??????port: 80
??????targetPort: 8080
??????targetPort:?8080
關鍵配置說明:
后端API通過環境變量配置數據庫連接信息
使用ClusterIP類型,僅在集群內部可訪問
副本數設置為3,確保高可用和負載均衡
5.2.3 數據庫服務
數據庫服務通常需要持久化存儲和穩定的網絡標識,因此使用StatefulSet和Headless Service:
apiVersion: apps/v1
kind: StatefulSet
metadata:
??name: database-statefulset
spec:
??serviceName: database-service
??replicas: 1
??selector:
????matchLabels:
??????app: database
??template:
????metadata:
??????labels:
????????app: database
????spec:
??????containers:
??????- name: database
????????image: postgres:13
????????ports:
????????- containerPort: 5432
????????env:
????????- name: POSTGRES_PASSWORD
??????????valueFrom:
????????????secretKeyRef:
??????????????name: postgres-secret
??????????????key: password
????????volumeMounts:
????????- name: database-storage
??????????mountPath: /var/lib/postgresql/data
??volumeClaimTemplates:
??- metadata:
??????name: database-storage
????spec:
??????accessModes: [ "ReadWriteOnce" ]
??????resources:
????????requests:
??????????storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
??name: database-service
spec:
??clusterIP: None
??selector:
????app: database
??ports:
????- protocol: TCP
??????port: 5432
??????targetPort: 5432
關鍵配置說明:
使用StatefulSet管理有狀態應用,提供穩定的網絡標識和持久化存儲
使用Headless Service(clusterIP: None),直接返回Pod的IP地址
通過volumeClaimTemplates自動創建持久化存儲
使用Secret管理敏感信息(如數據庫密碼)
5.2.4 架構圖
以下是這個微服務架構的示意圖:
結
Kubernetes作為云原生時代的核心技術,正在改變軟件開發和運維的方式。作為一名架構師,深入理解Kubernetes的架構和核心概念,不僅能夠更好地設計和管理云原生應用,還能夠為企業數字化轉型提供技術支持。
本文系統性地介紹了Kubernetes架構概覽、組件架構圖解以及核心概念,希望能夠幫助讀者構建扎實的Kubernetes知識體系。隨著技術的不斷發展,K8s生態系統也在不斷演進,讀者需要持續學習,跟上技術發展的步伐。
在未來的技術道路上,愿讀者能夠不斷探索、實踐和創新,成為真正的Kubernetes架構師,為云原生技術的發展和應用做出貢獻。