1、部署ETCD (主節(jié)點)
kubernetes需要存儲很多東西,像它本身的節(jié)點信息,組件信息,還有通過kubernetes運行的pod,deployment,service等等。都需要持久化。etcd就是它的數(shù)據(jù)中心。生產(chǎn)環(huán)境中為了保證數(shù)據(jù)中心的高可用和數(shù)據(jù)的一致性,一般會部署最少三個節(jié)點。
(1)、api server是和etcd通信的唯一組件。所有其他組件通過api server間接的讀取,寫入數(shù)據(jù)到etcd(增強樂觀鎖機制,保證集群狀態(tài)的一致性,減少出錯可能;把實際存儲從其他組件剝離,替換容易)
(2)、通過etcdctl命令查看存儲的資源可以發(fā)現(xiàn):所有資源都是以JSON格式存儲到etcd中的。可以想象成把資源以json格式存儲到文件系統(tǒng)中。
(3)、確保集群一致性:一致性算法:要求集群大部分節(jié)點(一半以上)參與才能進入到下一狀態(tài):三個節(jié)點的etcd集群,必須同時有兩個存活才能參與到下一狀態(tài)。
2、部署 APIServer(主節(jié)點)
kube-apiserver是Kubernetes最重要的核心組件之一,主要提供以下的功能:
- 提供集群管理的REST API接口,包括認證授權(我們現(xiàn)在沒有用到)數(shù)據(jù)校驗以及集群狀態(tài)變更等
- 提供其他模塊之間的數(shù)據(jù)交互和通信的樞紐(其他模塊通過API Server查詢或修改數(shù)據(jù),只有API Server才直接操作etcd)
- 生產(chǎn)環(huán)境為了保證apiserver的高可用一般會部署2+個節(jié)點,在上層做一個lb做負載均衡,比如haproxy
如果apiserver服務掛掉,可能會導致某個服務無法訪問
(1)、kubernetes系統(tǒng)組件之間只能通過api server進行通信,他們之間不會直接通信。
(2)、以RESTflAPI的形式提供了查詢、修改集群狀態(tài)的CRUD(Create、Read、 Update、 Delete)接口。 它將狀態(tài)存儲到etcd中。
(3)、 API服務器的客戶端之 一就是命令行工具kubectl。
(4)、api server客戶端處理步驟:通過授權插件授權客戶端(kubectl)、通過準入控制插件驗證 AND/OR 修改資源請求(準入控制插件包括: AlwaysPullImages、ServiceAccount、NamespaceLifecycle、ResourceQuota等)、驗證資源以及持久化存儲
(5)、api server如何通知客戶端資源變更:
?? ??? ?當你創(chuàng)建一個ReplicaSet資源時,它不會去創(chuàng)建pod, 同時它不會去管理服務的端點。那是控制器管理器的工作。
?? ??? ?API 服務器甚至也沒有告訴這些控制器去做什么。它做的就是,啟動這些控制器,以及其他一些組件來監(jiān)控己部署資源的變更。
?? ??? ?客戶端通過創(chuàng)建到 API 服務器的 HTTP 連接來監(jiān)聽變更。通過此連接,客戶端會接收到監(jiān)聽對象的 一 系列變更通知。
3、部署ControllerManager(主節(jié)點)
Controller Manager由kube-controller-manager和cloud-controller-manager組成,是Kubernetes的大腦,它通過apiserver監(jiān)控整個集群的狀態(tài),并確保集群處于預期的工作狀態(tài)。
(1)、kube-controller-manager由一系列的控制器組成,像Replication Controller、Node Controller、Deployment Controller、ReplicaSet DaemonSet Job?Controller、StatefulSet?Controller、Service?Controller、Endpoint?Controller、Namespace?Controller、PersistentVolume?Controller等。
(2)、controller-manager、scheduler和apiserver 三者的功能緊密相關,一般運行在同一個機器上,我們可以把它們當做一個整體來看,所以保證了apiserver的高可用即是保證了三個模塊的高可用。也可以同時啟動多個controller-manager進程,但只有一個會被選舉為leader提供服務。
(3)、 控制器執(zhí)行一個 “ 調和 “ 循環(huán), 將實際狀態(tài)調整為期望狀態(tài)(在資源 spec 部分定義), 然后將新的實際狀態(tài)寫入資源的 status 部分。
(4)、不同控制器之間不會直接通信, 它們甚至不知道其他控制器的存在。 每個控制器都連接到 API 服務器, 通過監(jiān)聽機制, 請求訂閱該控制器負責的一系列資源的變更。
(5)、 控制器不會直接運行 pod,而是將 pod 定義到發(fā)布 API server?,讓 Kubelet 創(chuàng)建容器并運行 。
4、部署Scheduler(主節(jié)點)
kube-scheduler只負責分配調度Pod到集群內的節(jié)點上,它監(jiān)聽kube-apiserver,查詢還未分配Node的Pod,然后根據(jù)調度策略為這些Pod分配節(jié)點。我們前面講到的kubernetes的各種調度策略就是它實現(xiàn)的。
(1)、過濾所有節(jié)點,找出能分配給pod的可用節(jié)點列表。
(2)、對可用節(jié)點按照優(yōu)先級進行排序,找出最優(yōu)節(jié)點。
(3)、如果多個節(jié)點有最高的優(yōu)先級分數(shù),那么則循環(huán)分配,確保平均分配給pod。
5、配置kubectl命令(任意master節(jié)點)
kubectl是Kubernetes的命令行工具,是Kubernetes用戶和管理員必備的管理工具。
kubectl提供了大量的子命令,方便管理Kubernetes集群中的各種功能。
使用kubectl的第一步是配置Kubernetes集群以及認證方式,包括:
- cluster信息:api-server地址
- 用戶信息:用戶名、密碼或密鑰
- Context:cluster、用戶信息以及Namespace的組合
6、配置kubelet(工作節(jié)點)
每個工作節(jié)點上都運行一個kubelet服務進程,默認監(jiān)聽10250端口,接收并執(zhí)行master發(fā)來的指令,管理Pod及Pod中的容器。每個kubelet進程會在API Server上注冊節(jié)點自身信息,定期向master節(jié)點匯報節(jié)點的資源使用情況,并通過cAdvisor監(jiān)控節(jié)點和容器的資源。
(1)、創(chuàng)建Node資源并向api server注冊該節(jié)點。
(2)、持續(xù)監(jiān)控api server是否把該節(jié)點分配給pod,然后啟動pod容器。(具體實現(xiàn)方式是告知配置好的容器運行時docker來從特定的容器鏡像運行容器)
(3)、kubelet隨后會持續(xù)監(jiān)控運行的容器,并向api server報告他們的狀態(tài)、事件和資源消耗。
(4)、kubelet也是容器存活探針的組件,當探針報錯時會重啟容器。
(5)、當pod從api server刪除時,kubelet會刪除容器,并通知api server pod已經(jīng)被停止。
7、為集群增加service功能 – kube-proxy(工作節(jié)點)
每臺工作節(jié)點上都應該運行一個kube-proxy服務,它監(jiān)聽API server中service和endpoint的變化情況,并通過iptables等來為服務配置負載均衡,是讓我們的服務在集群外可以被訪問到的重要方式。
(1)、 確保客戶端可以通過Kubemetes API 連接到你定義的服務。kube-proxy 確保對服務 IP 和端口的連接最終能到達支持服務(或者其他,非 pod 服務終端)的某個 pod 處。
更多內容請關注我的知乎賬號:https://www.zhihu.com/people/dengjiabo/activities