基于Ingress實現集群外訪問負載均衡
更新時間 2025-03-31 19:08:10
最近更新時間: 2025-03-31 19:08:10
分享文章
本文為您介紹如何基于Ingress實現集群外訪問負載均衡。
背景信息
Serverless集群不支持NodePort,k8s中的Ingress實現了對外部負載均衡器的自動配置,是對NodePort的替代方案。
前提條件
- 確保您已經創建Serverless集群,具體操作請參閱創建Serverless集群。
- 確保kubectl工具已經連接目標集群。
- 假設您在一個K8S的集群里面發布了兩個應用,前端應用frontend和后端應用backend,要在瀏覽器訪問前端應用。
- 確保您的Serverless集群已安裝CoreDNS插件。
實現原理
Ingress和Service在kubernetes集群中的工作原理如下:

操作步驟
步驟一:安裝nginx-ingress-controller插件
- 登錄容器服務控制臺,在左側菜單欄選擇“集群”。
- 在集群列表頁面,選擇目標集群名稱,然后在左側菜單欄選擇“插件”下的“插件市場”,點擊安裝nginx-ingress-controller插件。
- 提交安裝插件,稍后會在集群中創建2個nginx-ingress-controller pod。
- 查看nginx-ingress-controller是否正常運行。
步驟二:創建前端應用
這里使用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,由于Serverless集群不支持NodePort類型的service,這里創建LoadBalance類型,綁定ELB,參考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-elb
namespace: kube-system
annotations:
service.beta.kubernetes.io/ctyun-loadbalancer-id: lb-5jkwoaxf66 # elb id
service.beta.kubernetes.io/ctyun-loadbalancer-address-type: internet # #私網或公網類型,私網intranet,公網internet
spec:
ports:
- name: nginx-ingress
port: 30002
protocol: TCP
targetPort: 80
selector:
k8s-app: nginx-ingress-controller
type: LoadBalancer
步驟四:為前端應用創建Igress路由
創建ingress,參考如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: default
spec:
rules:
- host: myingress.com
? http:
? ? paths:
? ? - backend:
? ? ? ? service:
? ? ? ? ? name: nginx-service
? ? ? ? ? port:
? ? ? ? ? ? number: 30003
? ? ? path: /nginx
? ? ? pathType: Prefix
步驟五:使用域名訪問前端應用實現負載均衡
進入任意pod容器內部,使用myingress.com路由訪問前端應用,一共請求5次。
$curl -H "Host:myingress.com" nginx-ingress-elb.kube-system.svc:30002/nginx
可以看到通過myingress.com/nginx域名是能正常請求到前端nginx應用的,并且分別請求到了2個前端nginx服務中,實現了負載均衡。