基于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.ctyun.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服务中,实现了负载均衡。
