k8s快速精通(一)-k8s架構和關鍵術語

1. 初識K8s

1.1. K8s 架構

在這裏插入圖片描述
在這裏插入圖片描述

1.1.1. master:負責集羣的管理和控制

  • etcd:保存了整個集羣的狀態;
  • ApiServer:提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;
  • ControllerManager:負責維護集羣的狀態,比如故障檢測、自動擴展、滾動更新等;
  • Scheduler:負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;

1.1.2. node:計算節點,負責跑任務;只和APIServer通信

  • kubelet:負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理;
  • kube-prox:y負責爲Service提供cluster內部的服務發現和負載均衡;
  • DockerEngine:負責鏡像管理以及Pod和容器的真正運行(CRI);

1.1.3. K8s各組件工作流程

  1. 運維人員向ApiServer發出指令
  2. ApiServer響應命令,通過一系列認證授權,把pod數據存儲到etcd,創建deployment資源並初始化。(期望狀態)
  3. ControllerManager通過list-watch機制,監測發現新的deployment,將該資源加入到內部工作隊列,發現該資源沒有關聯的pod和replicaset,啓用deployment controller創建replicaset資源,再啓用replicaset-controller創建pod。
  4. 所有ControllerManager被創建完成後.將deployment,replicaset,pod資源更新存儲到etcd。
  5. scheduler通過list-watch機制,監測發現新的pod,經過主機過濾、主機打分規則,將pod綁定(binding)到合適的主機。
  6. 將綁定結果存儲到etcd。
  7. kubelet每隔 20s(可以自定義)向apiserver通過NodeName 獲取自身Node上所要運行的pod清單.通過與自己的內部緩存進行比較,新增加pod。
  8. kubelet創建pod。
  9. kube-proxy爲新創建的pod註冊動態DNS到CoreOS。給pod的service添加iptables/ipvs規則,用於服務發現和負載均衡。
  10. ControllerManager通過control loop(控制循環)將當前pod狀態與用戶所期望的狀態做對比,如果當前狀態與用戶期望狀態不同,則ControllerManager會將pod修改爲用戶期望狀態,實在不行會將此pod刪掉,然後重新創建pod。

1.1.4. 存儲

  • 元數據存儲在基於Key-value結構的數據庫中

1.2. K8s 核心概念

  • Cluster:Cluster 是計算、存儲和網絡資源的集合,Kubernetes 利用這些資源運行各種基於容器的應用。
  • Master:Master 是 Cluster 的大腦,它的主要職責是調度,即決定將應用放在哪裏運行。Master 運行 Linux 操作系統,可以是物理機或者虛擬機。爲了實現高可用,可以運行多個 Master。
  • Node:Node 的職責是運行容器應用。Node 由 Master 管理,Node 負責監控並彙報容器的狀態,並根據 Master 的要求管理容器的生命週期。Node 運行在 Linux 操作系統,可以是物理機或者是虛擬機。
  • Pod:Pod 是 Kubernetes 的最小工作單元。每個 Pod 包含一個或多個容器。Pod 中的容器會作爲一個整體被 Master 調度到一個 Node 上運行。Kubernetes 引入 Pod 主要基於下面兩個目的:
    • 可管理性:有些容器天生就是需要緊密聯繫,一起工作。Pod 提供了比容器更高層次的抽象,將它們封裝到一個部署單元中。Kubernetes 以 Pod 爲最小單位進行調度、擴展、共享資源、管理生命週期。
    • 通信和資源共享:Pod 中的所有容器使用同一個網絡 namespace,即相同的 IP 地址和 Port 空間。它們可以直接用 localhost 通信。同樣的,這些容器可以共享存儲,當 Kubernetes 掛載 volume 到 Pod,本質上是將 volume 掛載到 Pod 中的每一個容器。
  • Controller:Kubernetes 通常不會直接創建 Pod,而是通過 Controller 來管理 Pod 的。Controller 中定義了 Pod 的部署特性,比如有幾個副本,在什麼樣的 Node 上運行等。爲了滿足不同的業務場景,Kubernetes 提供了多種 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等,我們逐一討論。
    • Deployment:Deployment 是最常用的 Controller,通過創建 Deployment 來部署應用的。Deployment 可以管理 Pod 的多個副本,並確保 Pod 按照期望的狀態運行。
    • ReplicaSet:ReplicaSet 實現了 Pod 的多副本管理。使用 Deployment 時會自動創建 ReplicaSet,也就是說 Deployment 是通過 ReplicaSet 來管理 Pod 的多個副本,我們通常不需要直接使用 ReplicaSet。
    • DaemonSet“DaemonSet 用於每個 Node 最多隻運行一個 Pod 副本的場景。正如其名稱所揭示的,DaemonSet 通常用於運行 daemon。
    • StatefuleSet:StatefuleSet 能夠保證 Pod 的每個副本在整個生命週期中名稱是不變的。而其他 Controller 不提供這個功能,當某個 Pod 發生故障需要刪除並重新啓動時,Pod 的名稱會發生變化。同時 StatefuleSet 會保證副本按照固定的順序啓動、更新或者刪除。
  • Job:Job 用於運行結束就刪除的應用。而其他 Controller 中的 Pod 通常是長期持續運行。
  • Service:RC、RS和Deployment只是保證了支撐服務的微服務Pod的數量,但是沒有解決如何訪問這些服務的問題。一個Pod只是一個運行服務的實例,隨時可能在一個節點上停止,在另一個節點以一個新的IP啓動一個新的Pod,因此不能以確定的IP和端口號提供服務。要穩定地提供服務需要服務發現和負載均衡能力。服務發現完成的工作,是針對客戶端訪問的服務,找到對應的的後端服務實例。在K8s集羣中,客戶端需要訪問的服務就是Service對象。每個Service會對應一個集羣內部有效的虛擬IP,集羣內部通過虛擬IP訪問一個服務。在K8s集羣中微服務的負載均衡是由Kube-proxy實現的。Kube-proxy是K8s集羣內部的負載均衡器。它是一個分佈式代理服務器,在K8s的每個節點上都有一個;這一設計體現了它的伸縮性優勢,需要訪問服務的節點越多,提供負載均衡能力的Kube-proxy就越多,高可用節點也隨之增多。與之相比,我們平時在服務器端做個反向代理做負載均衡,還要進一步解決反向代理的負載均衡和高可用問題。Kubernetes 運行容器(Pod)與訪問容器(Pod)這兩項任務分別由 Controller 和 Service 執行。
  • Namespace:名字空間爲K8s集羣提供虛擬的隔離作用,K8s集羣初始有兩個名字空間,分別是默認名字空間default和系統名字空間kube-system,除此以外,管理員可以可以創建新的名字空間滿足需要。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章