外匯申報在哪個網(wǎng)站上做如何做網(wǎng)站seo
Kubernetes K8s從入門到精通系列之十三:軟件負載平衡選項
- 一、軟件負載平衡選項
- 二、keepalived and haproxy
- 三、keepalived配置
- 四、haproxy配置
- 五、選項 1:在操作系統(tǒng)上運行服務(wù)
- 六、選項 2:將服務(wù)作為靜態(tài) Pod 運行
一、軟件負載平衡選項
當設(shè)置具有多個控制平面的集群時,可以通過將 API Server 實例置于負載均衡器后面并在運行 kubeadm init 以便新集群使用它時使用 --control-plane-endpoint 選項來實現(xiàn)更高的可用性。
當然,負載均衡器本身也應(yīng)該具有高可用性。這通常是通過向負載均衡器添加冗余來實現(xiàn)的。為此,需要建立一個管理虛擬 IP 的主機集群,每個主機都運行一個負載均衡器實例,以便始終使用當前持有 vIP 的主機上的負載均衡器,而其他主機則處于備用狀態(tài)。
在某些環(huán)境中,例如在具有專用負載平衡組件(例如由某些云提供商提供)的數(shù)據(jù)中心中,此功能可能已經(jīng)可用。如果不是,可以使用用戶管理的負載平衡。在這種情況下,在引導(dǎo)集群之前需要進行一些準備。
由于這不是 Kubernetes 或 kubeadm 的一部分,因此必須單獨處理。在以下部分中,我們給出了對某些人有效的示例,當然還有可能有數(shù)十種其他可能的配置。
二、keepalived and haproxy
為了從虛擬 IP 提供負載平衡,keepalived 和 haproxy 的組合已經(jīng)存在很長時間了,并且可以被認為是眾所周知且經(jīng)過充分測試的:
- keepalived 服務(wù)提供由可配置的健康檢查管理的虛擬 IP。由于虛擬 IP 的實現(xiàn)方式,協(xié)商虛擬 IP 的所有主機都需要位于同一 IP 子網(wǎng)中。
- haproxy 服務(wù)可以配置為簡單的基于流的負載平衡,從而允許 TLS 終止由其背后的 API 服務(wù)器實例處理。
此組合可以作為操作系統(tǒng)上的服務(wù)運行,也可以作為控制平面主機上的靜態(tài) Pod 運行。兩種情況下的服務(wù)配置是相同的。
三、keepalived配置
keepalived 配置由兩個文件組成:服務(wù)配置文件和健康檢查腳本,該腳本將定期調(diào)用以驗證持有虛擬 IP 的節(jié)點是否仍在運行。
假定這些文件位于 /etc/keepalived 目錄中。但請注意,某些 Linux 發(fā)行版可能會將它們保留在其他地方。以下配置已成功用于 keepalived 版本 2.0.17:
! /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id LVS_DEVEL
}
vrrp_script check_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 3weight -2fall 10rise 2
}vrrp_instance VI_1 {state ${STATE}interface ${INTERFACE}virtual_router_id ${ROUTER_ID}priority ${PRIORITY}authentication {auth_type PASSauth_pass ${AUTH_PASS}}virtual_ipaddress {${APISERVER_VIP}}track_script {check_apiserver}
}
bash 變量樣式中有一些占位符需要填寫:
- ${STATE} 對于一臺主機來說是 MASTER,對于所有其他主機來說是 BACKUP,因此虛擬 IP 最初將分配給 MASTER。
- ${INTERFACE} 是參與虛擬IP協(xié)商的網(wǎng)絡(luò)接口,例如eth0。
- 對于所有 keepalived 集群主機,${ROUTER_ID} 應(yīng)該相同,但在同一子網(wǎng)中的所有集群中是唯一的。許多發(fā)行版將其值預(yù)先配置為 51。
- 控制平面節(jié)點上的 ${PRIORITY} 應(yīng)高于備份節(jié)點上的 ${PRIORITY}。因此 101 和 100 分別就足夠了。
- 對于所有 keepalived 集群主機,${AUTH_PASS} 應(yīng)該相同,例如42
- ${APISERVER_VIP} 是 keepalived 集群主機之間協(xié)商的虛擬 IP 地址。
上面的 keepalived 配置使用健康檢查腳本 /etc/keepalived/check_apiserver.sh 負責確保在持有虛擬 IP 的節(jié)點上 API Server 可用。該腳本可能如下所示:
#!/bin/sherrorExit() {echo "*** $*" 1>&2exit 1
}curl --silent --max-time 2 --insecure https://localhost:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Error GET https://localhost:${APISERVER_DEST_PORT}/"
if ip addr | grep -q ${APISERVER_VIP}; thencurl --silent --max-time 2 --insecure https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Error GET https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/"
fi
bash 變量樣式中有一些占位符需要填寫:
- ${APISERVER_VIP} 是 keepalived 集群主機之間協(xié)商的虛擬 IP 地址。
- ${APISERVER_DEST_PORT} Kubernetes 將通過其與 API 服務(wù)器通信的端口。
四、haproxy配置
haproxy 配置由一個文件組成:服務(wù)配置文件,假定駐留在 /etc/haproxy 目錄中。但請注意,某些 Linux 發(fā)行版可能會將它們保留在其他地方。以下配置已成功用于 haproxy 版本 2.1.4:
# /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
globallog /dev/log local0log /dev/log local1 noticedaemon#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaultsmode httplog globaloption httplogoption dontlognulloption http-server-closeoption forwardfor except 127.0.0.0/8option redispatchretries 1timeout http-request 10stimeout queue 20stimeout connect 5stimeout client 20stimeout server 20stimeout http-keep-alive 10stimeout check 10s#---------------------------------------------------------------------
# apiserver frontend which proxys to the control plane nodes
#---------------------------------------------------------------------
frontend apiserverbind *:${APISERVER_DEST_PORT}mode tcpoption tcplogdefault_backend apiserver#---------------------------------------------------------------------
# round robin balancing for apiserver
#---------------------------------------------------------------------
backend apiserveroption httpchk GET /healthzhttp-check expect status 200mode tcpoption ssl-hello-chkbalance roundrobinserver ${HOST1_ID} ${HOST1_ADDRESS}:${APISERVER_SRC_PORT} check# [...]
同樣,bash 變量樣式中有一些占位符可以擴展:
- ${APISERVER_DEST_PORT} Kubernetes 將通過其與 API 服務(wù)器通信的端口。
- ${APISERVER_SRC_PORT} API Server 實例使用的端口
- ${HOST1_ID} 第一個負載平衡 API Server 主機的符號名稱
- ${HOST1_ADDRESS} 第一個負載平衡 API Server 主機的可解析地址(DNS 名稱、IP 地址)
- 額外的服務(wù)器線路,每個負載平衡的 API 服務(wù)器主機各一條
五、選項 1:在操作系統(tǒng)上運行服務(wù)
為了在操作系統(tǒng)上運行這兩個服務(wù),可以使用各自發(fā)行版的包管理器來安裝軟件。如果它們將在不屬于 Kubernetes 集群的專用主機上運行,??那么這是有意義的。
現(xiàn)在安裝了上述配置,可以啟用并啟動服務(wù)。在最近的基于 RedHat 的系統(tǒng)上,systemd 將用于此目的:
# systemctl enable haproxy --now
# systemctl enable keepalived --now
服務(wù)啟動后,現(xiàn)在可以使用 kubeadm init 引導(dǎo) Kubernetes集群。
六、選項 2:將服務(wù)作為靜態(tài) Pod 運行
如果 keepalived 和 haproxy 將在控制平面節(jié)點上運行,則可以將它們配置為作為靜態(tài) Pod 運行。這里所需要做的就是在引導(dǎo)集群之前將相應(yīng)的清單文件放置在 /etc/kubernetes/manifests 目錄中。在引導(dǎo)過程中,kubelet 會啟動進程,以便集群在啟動時可以使用它們。這是一個優(yōu)雅的解決方案,特別是使用堆疊控制平面和 etcd 節(jié)點中描述的設(shè)置。
對于此設(shè)置,需要在 /etc/kubernetes/manifests 中創(chuàng)建兩個清單文件(首先創(chuàng)建目錄)。
keepalived 的清單 /etc/kubernetes/manifests/keepalived.yaml:
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nullname: keepalivednamespace: kube-system
spec:containers:- image: osixia/keepalived:2.0.17name: keepalivedresources: {}securityContext:capabilities:add:- NET_ADMIN- NET_BROADCAST- NET_RAWvolumeMounts:- mountPath: /usr/local/etc/keepalived/keepalived.confname: config- mountPath: /etc/keepalived/check_apiserver.shname: checkhostNetwork: truevolumes:- hostPath:path: /etc/keepalived/keepalived.confname: config- hostPath:path: /etc/keepalived/check_apiserver.shname: check
status: {}
haproxy 的清單 /etc/kubernetes/manifests/haproxy.yaml:
apiVersion: v1
kind: Pod
metadata:name: haproxynamespace: kube-system
spec:containers:- image: haproxy:2.1.4name: haproxylivenessProbe:failureThreshold: 8httpGet:host: localhostpath: /healthzport: ${APISERVER_DEST_PORT}scheme: HTTPSvolumeMounts:- mountPath: /usr/local/etc/haproxy/haproxy.cfgname: haproxyconfreadOnly: truehostNetwork: truevolumes:- hostPath:path: /etc/haproxy/haproxy.cfgtype: FileOrCreatename: haproxyconf
status: {}
請注意,這里需要再次填寫占位符:${APISERVER_DEST_PORT} 需要保持與 /etc/haproxy/haproxy.cfg 中相同的值(見上文)。
該組合已成功地與示例中使用的版本一起使用。其他版本可能也可以工作,或者可能需要更改配置文件。
服務(wù)啟動后,現(xiàn)在可以使用 kubeadm init 引導(dǎo) Kubernetes 集群。