Kubernetes 高可用叢集落地二三事
文章目錄
一、高可用拓撲
可以設定 HA 叢集:
- 使用堆疊(stacked)控制平面節點,其中 etcd 節點與控制平面節點共存;
- 使用外部 etcd 節點,其中 etcd 在與控制平面不同的節點上執行;
在設定 HA 叢集之前,應該仔細考慮每種拓撲的優缺點。
1、堆疊(Stacked) etcd 拓撲
主要特點:
- etcd 分散式資料儲存叢集堆疊在 kubeadm 管理的控制平面節點上,作為控制平面的一個元件執行。
- 每個控制平面節點執行 kube-apiserver,kube-scheduler 和
kube-controller-manager
例項。 - kube-apiserver 使用 LB 暴露給工作節點。
- 每個控制平面節點建立一個本地 etcd 成員(member),這個 etcd 成員只與該節點的 kube-apiserver 通訊。這同樣適用於本地 kube-controller-manager 和 kube-scheduler 例項。
- 簡單概況:每個 master 節點上執行一個 apiserver 和 etcd, etcd 只與本節點 apiserver 通訊。
- 這種拓撲將控制平面和 etcd 成員耦合在同一節點上。相對使用外部 etcd 叢集,設定起來更簡單,而且更易於副本管理。
- 然而堆疊叢集存在耦合失敗的風險。如果一個節點發生故障,則 etcd 成員和控制平面例項都將丟失,並且冗餘會受到影響。可以通過新增更多控制平面節點來降低此風險。應該為 HA 叢集執行至少三個堆疊的控制平面節點(防止腦裂)。
- 這是 kubeadm 中的預設拓撲。當使用
kubeadm init
和kubeadm join --control-plane
時,在控制平面節點上會自動建立本地 etcd 成員。
2、外部 etcd 拓撲
主要特點:
- 具有外部 etcd 的 HA 叢集是一種這樣的拓撲,其中 etcd 分散式資料儲存叢集在獨立於控制平面節點的其他節點上執行。
- 就像堆疊的 etcd 拓撲一樣,外部 etcd 拓撲中的每個控制平面節點都執行 kube-apiserver,kube-scheduler 和
kube-controller-manager
例項。 - 同樣 kube-apiserver 使用負載均衡器暴露給工作節點。但是,etcd 成員在不同的主機上執行,每個 etcd 主機與每個控制平面節點的 kube-apiserver 通訊。
- 簡單概況: etcd 叢集執行在單獨的主機上,每個 etcd 都與 apiserver 節點通訊。
- 這種拓撲結構解耦了控制平面和 etcd 成員。因此,它提供了一種 HA 設定,其中失去控制平面例項或者 etcd 成員的影響較小,並且不會像堆疊的 HA 拓撲那樣影響叢集冗餘。
- 但是,此拓撲需要兩倍於堆疊 HA 拓撲的主機數量。具有此拓撲的 HA 叢集至少需要三個用於控制平面節點的主機和三個用於 etcd 節點的主機。
- 需要單獨設定外部 etcd 叢集。
3、小結
官方這裡主要是解決了高可用場景下 apiserver 與 etcd 叢集的關係,以及控制平面節點防止單點故障。但是叢集對外訪問介面不可能將三個 apiserver 都暴露出去,一個節點掛掉時還是不能自動切換到其他節點。官方只提到了一句“使用負載均衡器將 apiserver 暴露給工作節點”,而這恰恰是部署過程中需要解決的重點問題。
Notes: 此處的負載均衡器並不是 kube-proxy,此處的 Load Balancer 是針對 apiserver 的。
最後,我們總結一下兩種拓撲:
- 堆疊(Stacked) etcd 拓撲:設定簡單,易於副本管理 ,不過存在耦合失敗風險。如果節點發生故障,則 etcd 成員和控制平面例項有丟失的可能,推薦測試開發環境;
- 外部 etcd 拓撲:解耦了控制平面和 etcd 成員,不會像堆疊的 HA 拓撲那樣有影響叢集冗餘的風險,不過需要兩倍於堆疊 HA 拓撲的主機數量,設定相對複雜,推薦生產環境。
二、部署架構
以下是我們在測試環境所用的部署架構:
這裡採用 kubeadm 方式搭建高可用 k8s 叢集,k8s 叢集的高可用實際是 k8s 各核心元件的高可用,這裡使用主備模式:
核心元件 | 高可用模式 | 高可用實現方式 |
---|---|---|
apiserver | 主備 | keepalived + haproxy |
controller-manager | 主備 | leader election |
scheduler | 主備 | leader election |
etcd | 叢集 | kubeadm |
- apiserver 通過 keepalived+haproxy 實現高可用,當某個節點故障時觸發 keepalived vip 轉移,haproxy 負責將流量負載到 apiserver 節點;
- controller-manager k8s 內部通過選舉方式產生領導者(由
--leader-elect
選型控制,預設為 true),同一時刻叢集內只有一個 controller-manager 元件執行,其餘處於 backup 狀態;- scheduler k8s 內部通過選舉方式產生領導者(由
--leader-elect
選型控制,預設為 true),同一時刻叢集內只有一個scheduler元件執行,其餘處於 backup 狀態;- etcd 通過執行 kubeadm 方式自動建立叢集來實現高可用,部署的節點數為奇數,3節點方式最多容忍一臺機器當機。
三、環境示例
主機列表:
這裡共有 12 臺主機,3 臺 control plane,9 臺 worker。
四、核心元件
1、haproxy
haproxy 提供高可用性,負載均衡,基於 TCP 和 HTTP 的代理,支援數以萬記的併發連線。
haproxy 可安裝在主機上,也可使用 docker 容器實現。文字採用第一種。
建立配置檔案 /etc/haproxy/haproxy.cfg
,重要配置以中文註釋標出:
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# https://www.haproxy.org/download/2.1/doc/configuration.txt
# https://cbonte.github.io/haproxy-dconv/2.1/configuration.html
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
# chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
# user haproxy
# group haproxy
# daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend kubernetes-apiserver
mode tcp
bind *:9443 ## 監聽9443埠
# bind *:443 ssl # To be completed ....
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
default_backend kubernetes-apiserver
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiserver
mode tcp # 模式tcp
balance roundrobin # 採用輪詢的負載演算法
# k8s-apiservers backend # 配置apiserver,埠6443
server k8s-master-1 xxx.16.106.208:6443 check
server k8s-master-2 xxx.16.106.80:6443 check
server k8s-master-3 xxx.16.106.14:6443 check
分別在三個 master 節點啟動 haproxy。
2、keepalived
keepalived 是以 VRRP(虛擬路由冗餘協議)協議為基礎, 包括一個 master 和多個 backup。 master 劫持 vip 對外提供服務。master 傳送組播,backup 節點收不到 vrrp 包時認為 master 當機,此時選出剩餘優先順序最高的節點作為新的 master, 劫持 vip。keepalived 是保證高可用的重要元件。
keepalived 可安裝在主機上,也可使用 docker 容器實現。文字採用第一種。
配置 keepalived.conf
, 重要部分以中文註釋標出:
! Configuration File for keepalived
global_defs {
router_id k8s-master-1
}
vrrp_script chk_haproxy {
script "/bin/bash -c 'if [[ $(netstat -nlp | grep 9443) ]]; then exit 0; else exit 1; fi'" # haproxy 檢測
interval 2 # 每2秒執行一次檢測
weight 11 # 權重變化
}
vrrp_instance VI_1 {
state MASTER # backup節點設為BACKUP
interface eth0
virtual_router_id 50 # id設為相同,表示是同一個虛擬路由組
priority 100 # 初始權重
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.106.187 # vip
}
track_script {
chk_haproxy
}
}
- vrrp_script 用於檢測 haproxy 是否正常。如果本機的 haproxy 掛掉,即使 keepalived 劫持vip,也無法將流量負載到 apiserver。
- 我所查閱的網路教程全部為檢測程式, 類似
killall -0 haproxy
。這種方式用在主機部署上可以,但容器部署時,在 keepalived 容器中無法知道另一個容器 haproxy 的活躍情況,因此我在此處通過檢測埠號來判斷 haproxy 的健康狀況。 - weight 可正可負。為正時檢測成功
+weight
,相當與節點檢測失敗時本身 priority 不變,但其他檢測成功節點 priority 增加。為負時檢測失敗本身 priority 減少。 - 另外很多文章中沒有強調 nopreempt 引數,意為不可搶佔,此時 master 節點失敗後,backup 節點也不能接管 vip,因此我將此配置刪去。
分別在三臺節點啟動 keepalived,檢視 keepalived master
日誌:
Dec 25 15:52:45 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Script(chk_haproxy) succeeded # haproxy檢測成功
Dec 25 15:52:46 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Changing effective priority from 100 to 111 # priority增加
Dec 25 15:54:06 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 25 15:54:06 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Received advert with lower priority 111, ours 111, forcing new election
Dec 25 15:54:07 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 25 15:54:07 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) setting protocol VIPs. # 設定vip
Dec 25 15:54:07 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:07 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 172.16.106.187
Dec 25 15:54:07 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:07 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:07 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:07 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:07 k8s-master-1 avahi-daemon[756]: Registering new address record for 172.16.106.187 on eth0.IPv4.
Dec 25 15:54:10 k8s-master-1 kubelet: E1225 15:54:09.999466 1047 kubelet_node_status.go:442] Error updating node status, will retry: failed to patch status "{\"status\":{\"$setElementOrder/conditions\":[{\"type\":\"NetworkUnavailable\"},{\"type\":\"MemoryPressure\"},{\"type\":\"DiskPressure\"},{\"type\":\"PIDPressure\"},{\"type\":\"Ready\"}],\"addresses\":[{\"address\":\"172.16.106.187\",\"type\":\"InternalIP\"},{\"address\":\"k8s-master-1\",\"type\":\"Hostname\"},{\"$patch\":\"replace\"}],\"conditions\":[{\"lastHeartbeatTime\":\"2020-12-25T07:54:09Z\",\"type\":\"MemoryPressure\"},{\"lastHeartbeatTime\":\"2020-12-25T07:54:09Z\",\"type\":\"DiskPressure\"},{\"lastHeartbeatTime\":\"2020-12-25T07:54:09Z\",\"type\":\"PIDPressure\"},{\"lastHeartbeatTime\":\"2020-12-25T07:54:09Z\",\"type\":\"Ready\"}]}}" for node "k8s-master-1": Patch "https://apiserver.demo:6443/api/v1/nodes/k8s-master-1/status?timeout=10s": write tcp 172.16.106.208:46566->172.16.106.187:6443: write: connection reset by peer
Dec 25 15:54:11 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:11 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 172.16.106.187
Dec 25 15:54:11 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:11 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:11 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:11 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:54:12 k8s-master-1 Keepalived_vrrp[12562]: Sending gratuitous ARP on eth0 for 172.16.106.187
檢視 master vip:
[root@k8s-master-1 ~]# ip a|grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.16.106.208/24 brd 172.16.106.255 scope global noprefixroute dynamic eth0
inet 172.16.106.187/32 scope global eth0
可以看到 vip 已繫結到 keepalived master
下面進行破壞性測試:
暫停 keepalived master 節點 haproxy:
[root@k8s-master-1 ~]# service haproxy stop
Redirecting to /bin/systemctl stop haproxy.service
檢視 keepalived k8s-master-1 節點日誌:
Dec 25 15:58:31 k8s-master-1 Keepalived_vrrp[12562]: /bin/bash -c 'if [[ $(netstat -nlp | grep 9443) ]]; then exit 0; else exit 1; fi' exited with status 1
Dec 25 15:58:31 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Script(chk_haproxy) failed
Dec 25 15:58:31 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Changing effective priority from 111 to 100
Dec 25 15:58:32 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Received advert with higher priority 111, ours 100
Dec 25 15:58:32 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) Entering BACKUP STATE
Dec 25 15:58:32 k8s-master-1 Keepalived_vrrp[12562]: VRRP_Instance(VI_1) removing protocol VIPs.
可以看到 haproxy 檢測失敗,priority 降低,同時另一節點 priority 比 k8s-master-1 節點高, k8s-master-1 置為 backup
檢視 k8s-master-2 節點 keepalived日誌:
Dec 25 15:58:35 k8s-master-2 Keepalived_vrrp[3661]: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec 25 15:58:35 k8s-master-2 Keepalived_vrrp[3661]: VRRP_Instance(VI_1) Received advert with lower priority 111, ours 111, forcing new election
Dec 25 15:58:36 k8s-master-2 Keepalived_vrrp[3661]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec 25 15:58:36 k8s-master-2 Keepalived_vrrp[3661]: VRRP_Instance(VI_1) setting protocol VIPs.
Dec 25 15:58:36 k8s-master-2 Keepalived_vrrp[3661]: Sending gratuitous ARP on eth0 for 172.16.106.187
Dec 25 15:58:36 k8s-master-2 avahi-daemon[740]: Registering new address record for 172.16.106.187 on eth0.IPv4.
可以看到 k8s-master-2 被選舉為新的 master。
五、安裝部署
1、安裝 docker / kubelet
參考上文
2、初始化第一個 master
kubeadm.conf 為初始化的配置檔案:
[root@master01 ~]# more kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.16.4
apiServer:
certSANs: #填寫所有kube-apiserver節點的hostname、IP、VIP
- k8s-master-1
- k8s-master-2
- k8s-master-3
- k8s-worker-1
- apiserver.demo
.....
controlPlaneEndpoint: "172.27.34.130:6443"
networking:
podSubnet: "10.244.0.0/16"
初始化 k8s-master-1:
# kubeadm init
# 根據您伺服器網速的情況,您需要等候 3 - 10 分鐘
kubeadm init --config=kubeadm-config.yaml --upload-certs
# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
# 安裝 calico 網路外掛
# 參考文件 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo "安裝calico-3.13.1"
kubectl apply -f calico-3.13.1.yaml
3、初始化第二、三個 master 節點
可以和第一個Master節點一起初始化第二、三個Master節點,也可以從單Master節點調整過來,只需要:
- 增加 Master 的 LoadBalancer
- 將所有節點的
/etc/hosts
檔案中 apiserver.demo 解析為 LoadBalancer 的地址 - 新增第二、三個Master節點
- 初始化 master 節點的 token 有效時間為 2 小時
這裡我們演示第一個Master節點初始化2個小時後再初始化:
# 只在 第一個 master 上執行
[root@k8s-master-1 ~]# kubeadm init phase upload-certs --upload-certs
I1225 16:25:00.247925 19101 version.go:252] remote version is much newer: v1.20.1; falling back to: stable-1.19
W1225 16:25:01.120802 19101 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
5c120930eae91fc19819f1cbe71a6986a78782446437778cc0777062142ef1e6
獲得 join 命令:
# 只在 第一個 master 節點上執行
[root@k8s-master-1 ~]# kubeadm token create --print-join-command
W1225 16:26:27.642047 20949 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join apiserver.demo:6443 --token kab883.kyw62ylnclbf3mi6 --discovery-token-ca-cert-hash sha256:566a7142ed059ab5dee403dd4ef6d52cdc6692fae9c05432e240bbc08420b7f0
則,第二、三個 master 節點的 join 命令如下:
# 命令列中,前面為獲得的 join 命令,control-plane 指定的為獲得的 certificate key
kubeadm join apiserver.demo:6443 --token kab883.kyw62ylnclbf3mi6 \
--discovery-token-ca-cert-hash sha256:566a7142ed059ab5dee403dd4ef6d52cdc6692fae9c05432e240bbc08420b7f0 \
--control-plane --certificate-key 5c120930eae91fc19819f1cbe71a6986a78782446437778cc0777062142ef1e6
檢查 master 初始化結果:
[root@k8s-master-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 2d v1.19.2
k8s-master-2 Ready master 2d v1.19.2
k8s-master-3 Ready master 2d v1.19.2
4、初始化 worker節點
針對所有的 worker 節點執行:
# 只在 worker 節點執行
# 替換 x.x.x.x 為 ApiServer LoadBalancer 的 IP 地址
export MASTER_IP=x.x.x.x
# 替換 apiserver.demo 為初始化 master 節點時所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
# 替換為前面 kubeadm token create --print-join-command 的輸出結果
kubeadm join apiserver.demo:6443 --token kab883.kyw62ylnclbf3mi6 --discovery-token-ca-cert-hash sha256:566a7142ed059ab5dee403dd4ef6d52cdc6692fae9c05432e240bbc08420b7f0
檢查 worker 初始化結果:
[root@k8s-master-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 2d v1.19.2
k8s-master-2 Ready master 2d v1.19.2
k8s-master-3 Ready master 2d v1.19.2
k8s-worker-1 Ready <none> 2d v1.19.2
k8s-worker-2 Ready <none> 2d v1.19.2
k8s-worker-3 Ready <none> 2d v1.19.2
k8s-worker-4 Ready <none> 2d v1.19.2
k8s-worker-5 Ready <none> 2d v1.19.2
k8s-worker-6 Ready <none> 2d v1.19.2
k8s-worker-7 Ready <none> 2d v1.19.2
k8s-worker-8 Ready <none> 2d v1.19.2
k8s-worker-9 Ready <none> 2d v1.19.2
本文資料:
- https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-install-HA-cluster
參考資料:
- [1]:https://www.kuboard.cn/install/install-kubernetes.html
- [2]:https://github.com/loong576/Centos7.6-install-k8s-v1.16.4-HA-cluster
- [3]:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/ha-topology/
- [4]:https://www.kubernetes.org.cn/6964.html
相關文章
- 搭建 Kubernetes 高可用叢集
- 使用Kubeadm搭建高可用Kubernetes叢集
- RabbitMQ從零到叢集高可用(.NetCore5.0) -高可用叢集構建落地MQNetCore
- Kubernetes-高可用叢集證書更新
- 部署Kubernetes v1.22.10高可用叢集
- 搭建高可用kubernetes叢集(keepalived+haproxy)
- 構建生產環境可用的高可用kubernetes叢集
- Kubernetes實戰:高可用叢集的搭建和部署
- Kubernetes — 在 OpenStack 上使用 kubeadm 部署高可用叢集
- 手動搭建高可用的 kubernetes 叢集(v1.31)
- 教你如何用Keepalived和HAproxy配置高可用 Kubernetes 叢集
- PostgreSQL repmgr高可用叢集+keepalived高可用SQL
- 實現Kubernetes跨叢集服務應用的高可用
- Redis叢集與高可用Redis
- PostgreSQL patroni高可用叢集SQL
- zookeeper 高可用叢集搭建
- MongoDB高可用叢集搭建MongoDB
- 使用kubeadm安裝kubernetes 1.13高可用叢集(使用calico網路)
- WEB叢集- 高可用服務Web
- Redis快取高可用叢集Redis快取
- 高可用mongodb叢集(分片+副本)MongoDB
- mysql高可用叢集之MMMMySql
- 10、redis哨兵叢集高可用Redis
- 用kubeadm建立高可用kubernetes叢集后,如何重新新增控制平面
- Redis高可用-主從,哨兵,叢集Redis
- 高可用叢集之corosync+pacemakerROS
- 基於 Rainbond 部署 DolphinScheduler 高可用叢集AI
- 在Rainbond上部署高可用Apollo叢集AI
- 高可用叢集環境搭建-留檔
- RabbitMQ和Kafka的高可用叢集原理MQKafka
- 高可用Flink on YARN叢集快速配置Yarn
- 使用Keepalived構建LVS高可用叢集
- 基於 ZooKeeper 搭建 Spark 高可用叢集Spark
- 基於 ZooKeeper 搭建 Hadoop 高可用叢集Hadoop
- 搭建 MySQL 高可用高效能叢集MySql
- 4 種高可用 RocketMQ 叢集搭建方案!MQ
- redis通訊與高可用叢集原理Redis
- Oracle的三種高可用叢集方案Oracle