本文介紹如何部署一套高性能、高可靠的Ingress接入層。
背景信息
Nginx Ingress Controller 是一個用于 Kubernetes 環境的開源 Ingress 控制器,它基于 Nginx 服務器實現了負載均衡、SSL 終止和路由功能。通過使用 Nginx Ingress Controller,你可以輕松地在 Kubernetes 集群中管理入站流量,并將 HTTP 和 HTTPS 請求路由到不同的服務。它還支持基于規則的路由、TLS 終止和靈活的配置選項,使得在 Kubernetes 中管理和控制流量變得更加簡單和高效。作為集群流量接入層,Ingress的高可用性顯得尤為重要,為了達到生產級的閾值,我們必須要要配置ingress的高可用。
前提條件
- 確保您已經創建Serverless集群,具體操作請參閱創建Serverless集群。
- 確保kubectl工具已經連接目標集群。
實現原理
高可用首先要解決的就是單點故障問題,在Serverless集群中Nginx Ingress Controller 通常采用多副本部署的方式,同時由于Ingress作為集群流量接入口,可以在ingress前面使用ELB來統一代理ingress-controller的服務,以負載均衡到不同的ingress-controller pod。高可用架構圖如下:
如上述部署架構圖所示,由多個Ingress-controller實例組成統一接入層來承載集群入口流量,同時可依據后端業務流量水平擴縮容Ingress-controller pod。
您可以在容器服務控制臺頁面上,通過為應用創建不同的Ingress對象,來為不同的應用指定不同的域名。IngressController目前不支持配置HTTPS證書,后續會支持,所以該方案目前不支持HTTPS,只支持HTTP。
操作步驟
步驟一:安裝nginx-ingress-controller插件
- 登錄容器服務控制臺,在左側菜單欄選擇“集群”。
- 在集群列表頁面,選擇目標集群名稱,然后在左側菜單欄選擇“插件”下的“插件市場”,點擊安裝nginx-ingress-controller插件。
- 提交安裝插件,稍后會在集群中創建2個nginx-ingress-controller pod。
- 查看nginx-ingress-controller是否正常運行。
- 您可以根據業務流量水平修改nginx-ingress-controller deployment的副本數量。
步驟二:創建前端應用
這里使用nginx代表前端應用,部署2個副本。
- 登錄容器服務控制臺,在左側菜單欄選擇“集群”。
- 在集群列表頁面,選擇目標集群名稱,然后在左側菜單欄選擇“工作負載”下的“無狀態”,點擊“創建deployment”。
也可以使用yaml創建工作負載,創建nginx工作負載參考如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 2
selector:
? matchLabels:
? ? app: nginx
template:
? metadata:
? ? labels:
? ? ? app: nginx
? spec:
? ? containers:
? ? - image: registry-huadong1.crs-internal.daliqc.cn/open-source/nginx:1.25-alpine
? ? ? imagePullPolicy: Always
? ? ? name: nginx
? ? ? ports:
? ? ? - containerPort: 80
? ? ? ? protocol: TCP
步驟三:創建service服務
- 為前端nginx工作負載創建service,參考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
ports:
- port: 30003
? protocol: TCP
? targetPort: 80
selector:
? app: nginx
type: ClusterIP
- 為nginx-ingress-controller pod創建service,創建LoadBalance類型的service,并綁定ELB,參考如下:
apiVersion: v1
kind: Service
metadata:
name: ngixn-ingress-svc
namespace: kube-system
spec:
ports:
- name: nginx-ingress
port: 30002
protocol: TCP
targetPort: 80
selector:
k8s-app: nginx-ingress-controller
type: LoadBalance
步驟四:為前端應用創建Ingress路由
創建ingress,參考如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
? name: nginx-ingress
? namespace: default
? annotations:
? ? kubernetes.io/ingress.class: "nginx-ingress-controller"
spec:
? rules:
? - host: myingress.com
? ? http:
? ? ? paths:
? ? ? - backend:
? ? ? ? ? service:
? ? ? ? ? ? name: nginx-service
? ? ? ? ? ? port:
? ? ? ? ? ? ? number: 30003
? ? ? ? path: /nginx
? ? ? ? pathType: Prefix
步驟五:使用域名進行訪問前端應用
在瀏覽器訪問myingress.com域名需要在hosts中配置該域名對應的ELB的IP地址。這樣在瀏覽器通過域名訪問,DNS服務器把域名解析為ELB的IP,ELB把請求轉給其中某個IngressController,IngressController通過域名轉發到不同的集群內應用。