Kubernetes Ingress 高可靠部署最佳實踐
摘要: 在Kubernetes叢集中,Ingress作為叢集流量接入層,Ingress的高可靠性顯得尤為重要,今天我們主要探討如何部署一套高效能高可靠的Ingress接入層。
簡介
在Kubernetes叢集中,Ingress是授權入站連線到達叢集服務的規則集合,為您提供七層負載均衡能力,您可以通過 Ingress 配置提供外部可訪問的 URL、負載均衡、SSL、基於名稱的虛擬主機等。作為叢集流量接入層,Ingress的高可靠性顯得尤為重要,今天我們主要探討如何部署一套高效能高可靠的Ingress接入層。
高可靠部署架構
高可靠性首先要解決的就是單點故障問題,一般常用的是採用多副本部署的方式,我們在Kubernetes叢集中部署高可靠Ingress接入層同樣採用多節點部署架構,同時由於Ingress作為叢集流量接入口,建議採用獨佔Ingress節點的方式,以避免業務應用與Ingress服務發生資源爭搶。
如上述部署架構圖,由多個獨佔Ingress例項組成統一接入層承載叢集入口流量,同時可依據後端業務流量水平擴縮容Ingress節點。當然如果您前期的叢集規模並不大,也可以採用將Ingress服務與業務應用混部的方式,但建議進行資源限制和隔離。
在阿里雲容器服務叢集中部署高可靠Ingress接入層
部署說明
- Ingress SLB:Ingress接入層前端SLB例項
- Ingress Node:部署Ingress Pod的叢集節點
- Ingress Pod:Ingress服務例項
這三者之間依據標籤node-role.kubernetes.io/ingress=true進行關聯:
1.Ingress SLB後端只會掛載打標了node-role.kubernetes.io/ingress=true的叢集Node;
2.Ingress Pod只會被部署到打標了node-role.kubernetes.io/ingress=true的叢集Node;
開始部署
1、建立 Kubernetes 叢集
在建立叢集之前,我們需要依據自身具體業務場景來適當規劃叢集的規模以及叢集內各節點角色,比如業務節點數、Ingress節點數等,注意叢集預設會初始化3臺Master節點來部署叢集管控服務。
我們通過阿里雲容器服務控制檯建立一個Kubernetes叢集,這裡以建立3臺Worker節點叢集為例。
2、打標 Ingress Node
由於測試叢集規模較小,我們暫採用混部的方式:即3臺Worker節點既作為業務節點又作為Ingress節點。我們給3臺Worker節點同時打標node-role.kubernetes.io/ingress=true,注意不建議將Ingress Pod部署在叢集Master節點上,因為Master節點承載著叢集的所有管控服務,以避免叢集接入流量過高時對管控服務造成影響。
~ kubectl label no cn-hangzhou.i-bp1ecwpuisra0y0bizdb node-role.kubernetes.io/ingress=true
node "cn-hangzhou.i-bp1ecwpuisra0y0bizdb" labeled
~ kubectl label no cn-hangzhou.i-bp1ecwpuisra0y0bizdc node-role.kubernetes.io/ingress=true
node "cn-hangzhou.i-bp1ecwpuisra0y0bizdc" labeled
~ kubectl label no cn-hangzhou.i-bp1ecwpuisra0y0bizdd node-role.kubernetes.io/ingress=true
node "cn-hangzhou.i-bp1ecwpuisra0y0bizdd" labeled
~ kubectl get no
NAME STATUS ROLES AGE VERSION
cn-hangzhou.i-bp11psgsvkxklfvb8vvj Ready master 1h v1.9.3
cn-hangzhou.i-bp183t1a82uun0s12ddr Ready master 1h v1.9.3
cn-hangzhou.i-bp1ecwpuisra0y0bizdb Ready ingress 56m v1.9.3
cn-hangzhou.i-bp1ecwpuisra0y0bizdc Ready ingress 56m v1.9.3
cn-hangzhou.i-bp1ecwpuisra0y0bizdd Ready ingress 57m v1.9.3
cn-hangzhou.i-bp1gb2498ykvy23k0jsy Ready master 1h v1.9.3
3、建立 Ingress 服務
叢集初始化時預設部署了一個Ingress Controller,具體部署說明請參考。這裡我們通過DaemonSet方式將其重新部署到目標Ingress Node上,當然您也可以採用Deployment配合親和性方式來部署。
~ kubectl -n kube-system delete deploy nginx-ingress-controller
deployment "nginx-ingress-controller" deleted
~ kubectl create -f https://acs-k8s-ingress.oss-cn-hangzhou.aliyuncs.com/nginx-ingress-controller-ds.yml
daemonset "nginx-ingress-controller" created
~ kubectl -n kube-system get ds | grep nginx-ingress-controller
nginx-ingress-controller 3 3 3 3 3 node-role.kubernetes.io/ingress=true 42s
~ kubectl -n kube-system get pod -o wide | grep nginx-ingress-controller
nginx-ingress-controller-57j4l 1/1 Running 0 1m 172.16.3.2 cn-hangzhou.i-bp1ecwpuisra0y0bizdd
nginx-ingress-controller-d7cxb 1/1 Running 0 1m 172.16.5.7 cn-hangzhou.i-bp1ecwpuisra0y0bizdc
nginx-ingress-controller-m9w75 1/1 Running 0 1m 172.16.4.2 cn-hangzhou.i-bp1ecwpuisra0y0bizdb
4、更新 Ingress SLB 服務
叢集初始化時預設部署了一個Ingress LoadBalancer Service,具體部署說明請參考,這裡需要更新下Ingress LoadBalancer Service,以自動識別掛載打標的Ingress Node。
~ kubectl apply -f https://acs-k8s-ingress.oss-cn-hangzhou.aliyuncs.com/nginx-ingress-slb-service.yml
service "nginx-ingress-lb" configured
5、此時具有3個Ingress例項的高可靠接入層部署完成。
快速擴容
隨著您的業務流量不斷增長,叢集規模不斷擴大,您只需要簡單地通過打標的方式來快速擴容Ingress接入層。
全方位監控
叢集Ingress接入層的監控是必不可少的,您可以通過阿里雲容器服務監控以及阿里云云監控對Ingress Pod和Ingress Node進行全方位監控。
閱讀更多幹貨好文,請關注掃描以下二維碼: