天下武功起胰,為快不破捐顷。 我是Go 寫的叽唱!
K8S 的架構設計
- C-S架構
- 說明
K8S 使用的是Master —Worker 這種方式,Master 節(jié)點負責調(diào)度控制,Worker負責干活珠叔,也就是說Master 是地主老財蝎宇,天天只會別人干著干那,Worker 就是農(nóng)民祷安,埋頭耕種即可姥芥。
那么,Worker 是怎么向Master 通信及報告狀態(tài)汇鞭,Master實時怎么管理Worker的工作情況凉唐,怎么規(guī)劃資源調(diào)度的呢?
K8S 基礎組件的說明
重點
組件化霍骄,各個部門各司其職台囱,分為master 組件和節(jié)點(Node)組件。不過還有個公用的都需要的組件读整,那就是網(wǎng)絡組件玄坦,用來node 之間通信的。
master 組件
Master 組件既認為是k8s 的大腦绘沉,是控制核心組件,主要對于整個集群做決策豺总,調(diào)度车伞,檢測,事件控制喻喳。
一般情況另玖,我們至少有3個master 節(jié)點作高可用的k8s 集群。master 節(jié)點不做工作任務表伦,只負責集群的控制谦去。
- Kube-apiserver
k8s 是有http api接口的,一般蹦哼,我們操作集群會安裝一個kubeClient 客戶端鳄哭,其實,這個客戶端發(fā)出的命令既是調(diào)用了apiServer, 主要是方便用戶通信纲熏。
- ETCD
etcd 負責保存 Kubernetes Cluster 的配置信息和各種資源的狀態(tài)信息妆丘。當數(shù)據(jù)發(fā)生變化時,etcd 會快速地通知 Kubernetes 相關組件局劲。 比如pod 的狀態(tài)勺拣,deploy 的狀態(tài)等。
etcd是一個高可用的鍵值存儲系統(tǒng)鱼填,主要用于共享配置和服務發(fā)現(xiàn)药有。etcd是由CoreOS開發(fā)并維護的,靈感來自于 ZooKeeper 和 Doozer苹丸,使用Go語言編寫愤惰,并通過Raft一致性算法處理日志復制以保證強一致性
- Kube-controller-manager
運行控制器苇经,它們是處理集群中常規(guī)任務的后臺線程。邏輯上羊苟,每個控制器是一個單獨的進程塑陵,但為了降低復雜性,它們都被編譯成獨立的可執(zhí)行文件蜡励,并在單個進程中運行令花。
這些控制器包括:
- 節(jié)點控制器: 當節(jié)點移除時,負責注意和響應凉倚。
- 副本控制器: 負責維護系統(tǒng)中每個副本控制器對象正確數(shù)量的 Pod兼都。
- 端點控制器: 填充 端點(Endpoints) 對象(即連接 Services & Pods)。
- 服務帳戶和令牌控制器: 為新的命名空間創(chuàng)建默認帳戶和 API 訪問令牌.
說白了就是稽寒,控制pod 的個數(shù)扮碧,存活周期,秘鑰杏糙,賬戶權限慎王,令牌,pod 訪問控制等宏侍。
- Cloud-controller-manager
cloud-controller-manager 是用于與底層云提供商交互的控制器赖淤。云控制器管理器可執(zhí)行組件是 Kubernetes v1.6 版本中引入的 Alpha 功能。像阿里云和華為云谅河,其實都有一個pod 作為基礎其他服務的控制咱旱。說白了,既是給其他云服務商提供的一個功能組件绷耍,結合他們的服務使用的吐限。
以下控制器具有云提供商依賴關系:
節(jié)點控制器: 用于檢查云提供商以確定節(jié)點是否在云中停止響應后被刪除
路由控制器: 用于在底層云基礎架構中設置路由
服務控制器: 用于創(chuàng)建,更新和刪除云提供商負載平衡器
數(shù)據(jù)卷控制器: 用于創(chuàng)建褂始,附加和裝載卷诸典,并與云提供商進行交互以協(xié)調(diào)卷
- Kube-scheduler
kube-scheduler 監(jiān)視新創(chuàng)建沒有分配到Node的Pod,為Pod選擇一個Node崎苗。
- 插件addons
插件(addon)是實現(xiàn)集群pod和Services功能的 搂赋。Pod由Deployments,ReplicationController等進行管理益缠。Namespace 插件對象是在kube-system Namespace中創(chuàng)建脑奠。
- DNS
雖然其他插件并不是必需的,但所有 Kubernetes 集群都應該具有Cluster DNS幅慌,許多示例依賴于它宋欺。
Cluster DNS 是一個 DNS 服務器,和您部署環(huán)境中的其他 DNS 服務器一起工作,為 Kubernetes 服務提供DNS記錄齿诞。
Kubernetes 啟動的容器自動將 DNS 服務器包含在 DNS 搜索中酸休。這里插一嘴,目前一般集群用的是CoreDns 組件祷杈。
node 組件
- Kubelet
kubelet是主要的節(jié)點代理,它監(jiān)測已分配給其節(jié)點的 Pod(通過 apiserver 或通過本地配置文件)斑司,提供如下功能:
- 掛載 Pod 所需要的數(shù)據(jù)卷(Volume)。
- 下載 Pod 的 secrets但汞。
- 通過 Docker 運行(或通過 rkt)運行 Pod 的容器宿刮。
- 周期性的對容器生命周期進行探測。
- 如果需要私蕾,通過創(chuàng)建 鏡像 Pod(Mirror Pod) 將 Pod 的狀態(tài)報告回系統(tǒng)的其余部分僵缺。
- 將節(jié)點的狀態(tài)報告回系統(tǒng)的其余部分。
- Kube-Proxy
kube-proxy通過維護主機上的網(wǎng)絡規(guī)則并執(zhí)行連接轉發(fā)踩叭,實現(xiàn)了Kubernetes服務抽象磕潮。
就是前面一章說的service 概念的抽象基礎。
Docker
所有的POD都是在docker 引擎中允許的容贝。master的組件也是可以容器化運行的自脯,不過一般的云服務上都是通過二進制安裝的master,因為master 太重要了,穩(wěn)定性需要是第一位的斤富。RKT
支持 rkt 運行容器作為 Docker 的試驗性替代方案 冤今。 不常見。
- supervisord
supervisord 是一個輕量級的進程監(jiān)控系統(tǒng)茂缚,可以用來保證 kubelet 和 docker 運行。
- fluentd
fluentd 是一個守護進程屋谭,它有助于提供集群層面日志 集群層面的日志脚囊。
網(wǎng)絡組件
官方集群網(wǎng)絡說明
如何安裝網(wǎng)絡插件看這里
網(wǎng)絡組件解決的是各種通信的問題,如容器到容器桐磁,容器到service,容器到外部悔耘,外部到容器的問題。
各個廠家的選擇不一樣我擂,我們一般使用Flannel 或者Weave 作為網(wǎng)絡組件衬以。后面我們以Flannel 為例,因為他是最簡單的~校摩。 OK , 下一層我們主要說明網(wǎng)絡看峻,學習好了網(wǎng)絡知識才能更好的掌握k8s 。