關於 kubernetes master 多節點以及高可用,網上的方法多采取 Active-Standby 方式,即:
通過 pacemaker 等軟件使得某種 master 服務(apiserver,scheduler,controller-manager)同一時間只運行一個實例。具體來說,如果有多台master node,上面都安裝了scheduler,controller-manager, apiserver:
- 對於schduler服務,同一時間只在一台master 節點上運行,
- 對於controller-manager,同一時間只在一台master 節點上運行,
- 對於apiserver,同一時間只在一台master 節點上運行,
這種方法的可靠性有待探討,至少我出現過這樣的問題:一旦因pacemaker出現問題或者管理員誤操作,在多個節點上同時啟動了scheduler或者controller-manager,就會造成系統故障。
實際上,參考kubernetes最新文檔,官方有相關的提示:
Master elected components
So far we have set up state storage, and we have set up the API server, but we haven’t run anything that actually modifies cluster state, such as the controller manager and scheduler. To achieve this reliably, we only want to have one actor modifying state at a time, but we want replicated instances of these actors, in case a machine dies. To achieve this, we are going to use a lease-lock in the API to perform master election. We will use the --leader-elect
flag for each scheduler and controller-manager, using a lease in the API will ensure that only 1 instance of the scheduler and controller-manager are running at once.
也就是說,controller-manager和scheduler 只要加上 --leader-elect=true 參數就可以同時啟動,系統會自動選舉leader。而apiserver本來就可以多節點同時運行,只要它們連接同一個etcd cluster 就可以了。
按照上面的思路,master ha 架構可以如下設計:
注:
1. 首先設置etcd cluster
關於etcd的cluster設置方法,網上有成熟的文檔可以參考;
2. 各個master 節點的apiserver同時啟動,指向相同的 etcd cluster
3. apiserver 服務設置 VIP
建議通過keepalived+lvs 或者 haproxy設置,支持負載均衡;
4. 各個master 節點的controller-manager 和 scheduler 加 --leader-elect=true 參數同時啟動
經過上面的設置,所有master節點上的相關服務都是 Active 狀態,如果有一個節點或者一個服務掛掉都不影響整個集群的運行。