1. 程式人生 > 其它 >k8s之k8s基礎

k8s之k8s基礎

二 kubernetes基礎

2.1kubernetes簡介

  • kubernetes最初源於Google內部的Borg,Borg是Google內部的大規模叢集管理系統,負責對Google內部很多核心服務的排程和管理,Borg的目的是讓使用者能夠不必操心資源管理的問題,讓他們專注於自己的核心業務,並且做到跨多個數據中心的資源利用率最大化。
  • Brog主要由BrogMaster、Borglet、Borgcfg和Scheduler組成。
  • https://kubernetes.io/zh/ #官網
  • https://github.com/kubernetes/kubernetes #github

2.2kubernetes 架構圖

2.3 kubernetes 元件

2.3.1 kube-apiserver

  • https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/
  • kubernetes API server提供了k8s各類資源物件的增刪改查及watch等HTTP Rest介面,這些物件包括 pods、services、replicationcontrollers 等。 API 伺服器為 REST 操作提供服務,併為叢集的共享狀態提供前端, 所有其他元件都通過該前端進行互動。
    • RESTful API:是REST風格的網路介面,REST描述的是在網路中client和server的一種互動形式。
    • REST:是一種軟體架構風格,或者說是一種規範,其強調HTTP應當以資源為中學,並且規範了URI的風格,規範了HTTP請求動作(GET/PUT/POST/DELETE/HEAD/OPTIONS)的使用,具有對應得語義。
  • kubernetes API server提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;
    • 身份認證 token
    • 驗證許可權
    • 驗證指令
    • 執行操作
    • 返回結果
  • 預設埠6443,可通過啟動引數“--secure-port”來修改預設值。該埠用於接收客戶端、dashboard等外部HTTPS請求。
  • 預設IP地址為非本地(Non-Localhost)網路埠,通過啟動引數“--bind-address”來修該。
  • 用於基於Tocken檔案或客戶端證書及HTTP Base的認證。
  • 用於基於策略的授權。

2.3.2 kube-scheduler

2.3.2.1kube-scheduler簡介

  • https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-scheduler/
  • Kubernetes 排程器是一個控制面程序,負責將 Pods 指派到節點上。 在同一個叢集中可以使用多個不同的排程器;
  • 通過排程演算法為待排程Pod列表的每個Pod從可用Node列表中選擇一個最合適的Node,並將資訊寫入到etcd中;
  • Node節點上對應得kubelet通過API Server監聽到kubernetes Scheduler產生的Pod繫結資訊,然後獲取對應得Pod清單,下載Image,並啟動容器。

2.3.2.2 排程策略

  • LeastRequestedPriority(預設)
    • 優先從備選節點列表中選擇資源消耗最小的節點(CPU+記憶體)。
  • CalculateNodeLabelPriority
    • 優先選擇含有指定Lable的節點。
  • BalancedResourceAllocation
    • 優先從備選節點列表選擇各項資源使用率最均衡的節點。

2.3.2.3 排程過程

  1. 建立pod;
  2. 過濾掉資源不足的節點;
  3. 在剩餘可用節點進行刪選;
  4. 選中節點;

2.3.3kube-controller-manager

2.3.3.1kube-controller-manager簡介

  • https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/
  • Controller Manager包括一些子控制器(副本控制器、節點控制器、名稱空間控制器和賬號控制器等),控制器作為叢集內部的管理控制中心,負責叢集內部的Node、Pod副本、服務端點(Endpoint)、名稱空間(Namespace),服務賬號(ServiceAccount)、資源定額(ResourceQuota)的管理,當某個Node意外宕機時,Controller Manager會及時發現並執行自動化修復流程,確保叢集中的Pod副本始終處於預期的工作狀態。

2.3.3.2 kube-controller-manager維護pod為期望狀態

  1. controller-manager控制器每間隔5秒檢查一次node節點狀態;
  2. 如果controller-manager控制器沒有收到來自node節點的心跳,則將該node節點被標識為不可達;
  3. controller-manager將在標記為無法訪問之前等待40秒;
  4. 如果該node節點被標記為無法訪問後5分鐘還沒有恢復,controller-manager會刪除當前node節點的所有pod並在其它可用節點重建這些pod。

2.3.3.3 pod高可用機制

  1. node monitor preiod:節點監視週期,每隔5秒一次。
  2. node monitor grace period:節點監視寬限期預設40秒。
  3. pod eviction timeout:pod驅逐超時時間預設5分鐘。

2.3.4kube-proxy

2.3.4.1kube-proxy簡介

  • https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-proxy/
  • kuberbetes網路代理執行在node上,它反應了node上kuberbetes API中定義的服務,並通過一組後端進行簡單的TCP、UDP和SCTP流轉發或者在一組後端進行迴圈TCP、UDP和SCTP轉發,使用者必須使用apiserver API建立一個服務來配置代理,其實就是kube-proxy通過在主機上維護網路規劃並執行連線轉發來實現kuberbetes服務訪問。
  • kube-proxy執行在每個節點上,監聽API Server中服務物件的變化,在通過管理IPtables或者IPVS規則來實現網路轉發。

2.3.4.2 kube-proxy工作模式

2.3.4.2.1 kube-proxy工作模式介紹
  • UserSpace:k8s v1.1之前使用,k8s v1.2及以後就已經淘汰。
  • IPtables:k8s v1.1版本開始支援,v1.2開始預設。
  • IPVS: k8s v1.9引入到v1.11為正式版本,需要安裝ipvsadm、ipset工具包和載入ip_vs核心模組。IPVS相對於IPtables效率會更高一些,當kube-proxy以IPVS代理模式啟動時,kube-proxy將驗證節點上是否安裝了IPVS模組,如果為安裝則kube-proxy將回退到IPtables代理模式。
2.3.4.2.2 IPVS模式
  • 使用IPVS模式,kube-proxy會監視kubernetes Service物件和Endpoints,呼叫宿主機核心Netlink介面以相應地建立IPVS規則並定期與kubernetes Service物件Endpoint物件同步IPVS規則,以確保IPVS狀態與期望一致,訪問服務時,流量將被重定向到其中一個後端Pod,IPVS使用雜湊表作為底層資料結構並在訥河空間中工作,這意味著IPVS可以更快的重定向流量,並且在同步代理規則時具有更好的效能,此外,IPVS為負載均衡演算法提供了更多選選,例如:rr(輪詢排程)、lc(最小連線數)、dh(目標雜湊)、sh(源雜湊)、sed(最短期望延遲)、nq(不排隊排程)等。
  • https://kubernetes.io/zh/docs/reference/config-api/kube-proxy-config.v1alpha1/#ClientConnectionConfiguration

2.3.5 kubelet

2.3.5.1 kubelet簡介

  • https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
  • kubelet是執行在每個worker節點的代理元件,它會監視已分配給節點的pod。

2.3.5.2 kubelet功能

  • 向master彙報node節點的狀態資訊;
  • 接受指令並在Pod中建立docker容器;
  • 準備Pod所需的資料卷;
  • 返回Pod的執行狀態;
  • 在node節點執行容器健康檢查。

2.3.6 kubectl

  • https://kubernetes.io/zh/docs/reference/kubectl/kubectl/
  • 是一個通過命令列對kubernetes叢集進行管理的客戶端工具。

2.3.7 etcd

  • https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/
  • etcd是CoreOS公司開發目前是kubernetes預設使用的key-value資料儲存系統,用於儲存kubernetes的所有叢集資料,etcd支援分散式叢集功能,生產環境使用時需要為etcd資料提供定期備份機制。
  • https://etcd.io #官網
  • https://guthub.com/etcd-io/etcd #github

2.3.8 DNS

  • https://kubernetes.io/zh/docs/tasks/administer-cluster/dns-custom-nameservers/
  • DNS負載為整個叢集提供DNS服務,從而實現服務之間的訪問。
    • coredns
    • kube-dns:k8s v1.18之後不在支援。
    • sky-dns:k8s v1.9之後被kube-dns替代。

2.3.9 Dashboard

  • https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/
  • Dashboard是基於網頁的kubernetes使用者介面,可以使用Dashboard獲取執行在叢集中的應用的概覽資訊,也可以建立或修改kubernetes資源(如Deployment、Job、DaemonSet等等),也可以對Deployment實現彈性伸縮、發起滾動升級、重啟Pod或者使用嚮導建立新的應用。