k8s之k8s基礎
阿新 • • 發佈:2021-11-22
二 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 排程過程
- 建立pod;
- 過濾掉資源不足的節點;
- 在剩餘可用節點進行刪選;
- 選中節點;
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為期望狀態
- controller-manager控制器每間隔5秒檢查一次node節點狀態;
- 如果controller-manager控制器沒有收到來自node節點的心跳,則將該node節點被標識為不可達;
- controller-manager將在標記為無法訪問之前等待40秒;
- 如果該node節點被標記為無法訪問後5分鐘還沒有恢復,controller-manager會刪除當前node節點的所有pod並在其它可用節點重建這些pod。
2.3.3.3 pod高可用機制
- node monitor preiod:節點監視週期,每隔5秒一次。
- node monitor grace period:節點監視寬限期預設40秒。
- 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或者使用嚮導建立新的應用。