Kubernetes 架構
- k8s 集群 = 多個 master node + 多個 work node
- Master 節點(主節點):負責集群的管理任務,包括調度容器、維護集群狀態、監控集群、管理服務發現等。
- Worker 節點(工作節點):實際運行應用程序的容器。每個工作節點上都運行著容器運行時(如?
containerd
),并接受來自主節點的調度指令。
節點:(Node)通常指一個物理服務器或虛擬機,承載運行容器的實際工作負載,節點可以看作是 Kubernetes 集群中的計算單元
組成結構
節點(Node)
- 定義:運行容器的物理服務器或虛擬機(在云環境中,節點通常是虛擬機;在本地環境或裸機環境中,節點可以是物理服務器)
- 節點的類型
- 主節點(Master Node 或 Control Plane)
- 工作節點(Worker Node)
主節點(Master Node)
-
定義:調度和管理整個集群的狀態的地方
-
功能:負責管理整個 Kubernetes 集群的控制平面,處理集群的調度、API 調用、集群狀態維護等任務。主節點通常不運行應用工作負載
-
組成
組件 功能描述 Kube API Server
集群的前端(類似集群的網關),負責接收和處理所有API請求,提供認證授權和訪問控制功能 Scheduler
監控集群節點資源使用情況,根據調度策略將 Pod 分配到合適的工作節點 Controller Manager
管理集群中各種資源對象(如 Node、Pod、Service) 的狀態,確保實際狀態與期望狀態一致 etcd
高可用鍵值存儲系統,保存集群的配置信息和元數據 Cloud Controller Manager
云平臺控制器,負責與云平臺的API交互
工作節點(Worker Node)
-
定義:真正運行應用負載的地方,提供實際的計算資源和服務,所有應用服務都以 Pod 的形式運行在工作節點上,每個工作節點運行多個 Pod
-
功能:實際運行應用容器的節點。所有的應用 Pod 都部署在這些工作節點上
-
組成
組件名稱 功能描述 kubelet 負責管理和維護 Pod 對象,保證 Pod 按預期運行,并定期與 Kubernetes API Server 進行通信獲取新的 pod 規范,匯報 pod 的運行情況 kube-proxy 負責為 pod 對象提供網絡代理和負載均衡,確保網絡流量正確轉發到相應的 Pod container runtime 負責拉取容器鏡像、創建容器、啟動或者停止容器等等(如 Docker-Engine 或 containerd)
架構圖
+---------------------------------------+
| kubectl |
| (用戶接口:CLI工具,與API Server交互) |
+---------------------------------------+|
+---------------------------------------+
| API Server (控制平面) |
| (接收和處理請求,管理集群狀態) |
+---------------------------------------+| | | |
+--------+ +--------+ +----------+ +---------------------+
| etcd | |Scheduler| |Controller| | Kubelet (每個節點) |
| (存儲) | | (調度器) | | Manager | | (工作節點上運行Pod) |
+--------+ +--------+ +----------+ +----------------0----+|+----------------------------+| Pod (容器) || (運行在工作節點上,提供服務) |+----------------------------+
工作流程
端口類型
- 外部訪問的端口 (
nodePort
)- 定義:一個開放在每個?節點(Node)上的固定端口,是為每個?Service?分配的固定端口,一個向外暴露的 Service 對應一個 nodePort(端口范圍通常在 30000-32767)
- 功能:NodePort?類型的 Service 暴露一個端口給外部用戶,使得外部請求可以通過固定的端口訪問集群中的應用(接收到的外部請求會轉發到 Service 暴露的端口(如 80))
- 服務暴露的端口 (
port
)- 定義:Kubernetes 使用?Service?來暴露和管理 Pod 的訪問,port 端口是集群內的其他服務或容器通過該?Service?訪問 Pod 的端口
- 功能:Service?暴露多個端口(例如 80 端口),并將流量轉發到端口對應的 Pods 中
- 服務設置的端口(
targetPort
)- 定義:targetPort?定義了 Service 轉發到容器內部的具體端口(通常為?containerPort)
- 功能:Service 通過 targetPort 決定如何調用 Pod,通常不需要手動設置
- 容器內部的端口 (
containerPort
)- 定義:Pod 內的 Container 向外暴露的端口,通過 containerPort 可以找到 port 中的一個容器
- 功能:container 監聽 containerPort 并處理請求,Service 會將請求從自己的端口轉發到對應的 Pod 的?ContainerPort?上
工作流程
- 發起請求:客戶端請求(外部請求)通過?
NodeIP:NodePort
?向 k8s 發起請求(NodeIP 決定請求的 Node,NodePort 決定請求的 Service) - 監聽與轉發:每個 Node 上的 kube-proxy 監聽多個到達?NodePort?端口的請求,并由 kube-proxy?將請求轉發到 NodePort 對應的 Service
- 監聽與轉發:每個 Service 監聽一個到達 NodePort 端口的請求,接收到請求后通過 selector 找到符合條件的?Pod,并通過負載均衡策略選擇一個 pod 并將請求發送給這個 pod 對應的 targetPort 端口
- 監聽請求:每個 pod 監聽一個 targetPort 端口發來的請求,由 pod 中的主容器監聽 containerPort(containerPort 和 targetPort 通常相同)
- 處理請求:主容器監聽一個 ContainerPort 端口發來的請求,主容器接收請求并處理請求(或轉發給其他容器處理請求)
- 處理請求:主容器接收并最終處理請求,處理過程中可能會通過 containerPort 調用其他容器的功能
服務分類
ClusterIP?服務
- 定義:僅在 Kubernetes 集群內部可訪問,服務的 IP 地址只在集群內部網絡中有效,無法從集群外部通過?ClusterIP?直接訪問服務
- 適用場景:內部服務之間的通信,如微服務架構中服務間的 RPC 調用
NodePort 服務
-
定義
:Node 中的 Service 的端口號,集群通過 NodeIP:NodePort 將服務暴露給外部用戶 -
功能
:用于將服務暴露在每個?Node(包括 Worker 和 Master)上的特定端口 -
缺點
:多個服務有多個 IP,用戶訪問哪個 IP 就會訪問對應的 Node,沒有統一的負載均衡策略 -
工作流程
- 創建服務:用戶創建一個 NodePort 類型的服務
- 分配端口號:Kubernetes 會在集群中所有節點(包括 Worker Node 和 Master Node)上分配一個特定的端口(通常在 30000-32767 之間)
- 訪問服務:外部請求可以通過?任何節點(Master 或 Worker)的IP地址 + NodePort?來訪問服務(不僅限于 Master Node)
-
示例
如果在集群中定義了一個 NodePort 服務,分配了端口號 30001,并且集群有三個節點:
- Master Node IP:?192.168.1.10
- Worker Node 1 IP:?192.168.1.20
- Worker Node 2 IP:?192.168.1.30
那么可以從集群外通過以下任意地址訪問該服務:
- http://192.168.1.10:30001?(Master Node)
- http://192.168.1.20:30001?(Worker Node 1)
- http://192.168.1.30:30001?(Worker Node 2)
LoadBalancer 服務
定義
:服務商提供的外部 IP,讓用戶通過統一的 IP 地址(External IP)訪問服務- **ExternalIP:**使外部訪問可以通過集群節點的 IP 地址訪問指定服務(很少用,更常見的是通過 NodePort 或 Ingress 暴露服務)
功能
- 自動創建一個外部負載均衡器,并將流量路由到 Kubernetes 集群中的服務
- 提供了更簡便的方式訪問服務(通過一個外部 IP) ,通常用于云環境(如 AWS、GCP、Azure)
缺點
:用戶需要知道具體的 IP 地址,可讀性不好,不便于用戶記憶工作流程
- 創建服務:用戶創建一個?LoadBalancer?類型的服務
- 分配 IP:服務商分配一個外部 IP 地址給這個服務
- 訪問服務:用戶可以通過這個外部 IP 地址直接訪問該服務,而不需要知道任何節點的 IP
??Ingress 服務
-
定義
:Kubernetes 用于 HTTP/HTTPS 路由的組件,通常配合 Ingress Controller(如 Nginx Ingress Controller)來工作 -
功能
:將外部流量轉發到內部服務,使外部訪問可以通過配置域名、路徑等規則訪問服務,而不需要知道具體的 IP -
工作流程
-
- 接收請求:Ingress 接收來自外部的 HTTP/HTTPS 請求
-
- 路由匹配:Ingress Controller 根據配置的路由規則(域名、路徑等)匹配請求
-
- 轉發請求:將請求轉發到對應的后端服務(Service)
- 支持基于路徑的轉發(如 /api -> api-service)
- 支持基于域名的轉發(如 api.example.com -> api-service)
-
- 負載均衡:Ingress Controller 可以實現請求的負載均衡
-
- SSL/TLS 終止:處理 HTTPS 請求的 SSL/TLS 終止(如果配置了證書)
-
-
組成部分
組件 功能 Ingress 資源 定義路由規則,指定如何將外部請求轉發到內部服務 Ingress Controller 實現 Ingress 資源定義的規則,通常使用 Nginx、Traefik 等 后端服務 處理實際請求的 Kubernetes Service,可以是 ClusterIP、NodePort 等類型
總結
- ClusterIP 類型的服務?:內部訪問使用的 IP,無法從集群外部訪問
- ?NodePort?類型的服務:外部可以訪問的服務,使用?”任意節點(Master 或 Worker)的 IP 地址” + “NodePort”?進行訪問
- LoadBalancer 類型的服務:在云環境中,可以使用?LoadBalancer 類型的服務來獲得一個外部 IP 地址,直接從外部訪問
- ?Ingress?類型的服務:提供了一種更加靈活的 HTTP/HTTPS 訪問方式,適合基于域名或路徑規則管理外部流量
示例
-
目標:通過 NodePort 服務將一個應用程序(MyApp)暴露給外部訪問,使外部用戶可以通過節點的 IP 地址和端口號(30080)訪問該應用
-
工作流程
- 將 myApp-service 服務通過 30080 端口暴露給外部,供外部訪問
- Kube Proxy 監聽 30080 端口請求,并將請求轉發到 myApp-service 對應的端口 80
- Service 根據 selector 選擇 app=MyApp 的 Pod ,并通過負載均衡策略選擇一個 Pod 處理請求
- Service 將請求轉發到后端 Pod 的端口(targetPort: 8080)
- Pod 處理請求并返回響應給 Service
- Service 將響應返回給 Kube Proxy
- Kube Proxy 將響應返回給用戶
-
代碼實現
apiVersion: v1 # 聲明 API 版本(如何同 API Server 進行交互),v1 最常用 kind: Service # 聲明資源類型為 Service metadata: # 聲明服務的元數據name: myApp-service # 聲明服務的名字,Kubernetes 內部和外部引用該服務時將使用這個名字 spec: # specification: 聲明資源對象的配置信息type: NodePort # 聲明該服務為節點端口類型的 (向外暴露的服務)selector: # 選擇器,用來選擇對應的 Pod,服務會將流量轉發到符合條件的 Podapp: MyApp # 選擇 pod 的 Label 中 app=nginx 的資源ports:- protocol: TCP # 指定服務使用的協議是 TCPport: 80 # 服務對集群內部公開的端口targetPort: 8080 # 服務后方 pod 的端口nodePort: 30080 # 聲明向外提供服務的端口號, 必須在30000~32767之間