Kubernetes的master服務主要包括etcd(數據存儲)、control-manager(控制器)、scheduler(調度器)、apiserver(服務接口),咱們將其部署到多節點實現容錯。在 《Kubernetes探祕-etcd節點和實例擴容 》中,已經將etcd服務擴展到多個節點。這裏咱們將control-manager(控制器)、scheduler(調度器)、apiserver(服務接口)擴展到多個節點運行。nginx
control-manager(控制器)和scheduler(調度器)經過apiserver(服務接口)來進行集羣容器實例的管理,經過向apiserver中的Endpoint
加鎖的方式來進行leader election, 當目前拿到leader的實例沒法正常工做時,別的實例會拿到鎖,變爲新的leader。缺省狀況下election=true,默認安裝即支持多實例的自動選主。git
首先,使用kubeadm部署第一個主節點。github
第二步,安裝副節點。api
經過上面的方法設置多個master服務後,kube-apiserver的URL主地址所有指向的是第一個master節點IP地址,仍然存在單點失效的風險。爲了實現多點容錯,有幾種方案(原理都是同樣的,只是實現方式不一樣):服務器
使用外部的負載均衡器分配的高可用IP做爲apiserver的服務地址,全部的外部訪問以及scheduler.conf、controller-manager.conf中的server參數均指向該地址,而後將該地址映射到具體的內部服務器IP上,由外部負載均衡器來分配訪問負載。負載均衡
--apiserver-advertise-address=10.1.1.201。
這種方式部署較爲簡單,但依賴雲服務商提供的負載均衡器。spa
若是本身安裝負載均衡器設備或軟件,須要確保其自己是高可用的。.net
使用keepalived實現虛擬IP,主節點不可用時將IP自動漂移到其它節點,工做節點基本不受影響。k8s集羣按照虛擬IP進行配置,與第一種方案相似,但經過簡單的軟件便可實現k8s集羣主節點的容錯。代理
虛擬IP(其實是直接修改真實IP)每一時刻只運行於單個節點上。所以,其它的副節點上的apiserver服務處於standby模式。rest
經過添加HAProxy等作apiserver的負載均衡,之上再用keepalived作多節點的虛擬IP,能夠將多節點變爲支持負載均衡的互備模式。
每一個節點單獨運行,經過etcd共享數據。
kube-dns並不算是Master組件的一部分,能夠跑在Node節點上,並用Service
向集羣內部提供服務。但在實際環境中, 因爲默認配置只運行了一份kube-dns實例,在其升級或是所在節點當機時,會出現集羣內部dns服務不可用的狀況,嚴重時會影響到線上服務的正常運行。
爲了不故障,請將kube-dns的replicas
值設爲2或者更多,並用anti-affinity
將他們部署在不一樣的Node節點上。這項操做比較容易被疏忽,直到出現故障時才發現原來是kube-dns只運行了一份實例致使的故障。