Configuring Multiple Forwarding Policies for a LoadBalancer Ingress
An ingress can route requests to multiple backend Services based on different matching policies. For example, requests can be routed to three different backend Services separately by accessing www.example.com/foo, www.example.com/bar, and foo.example.com/.
The URL registered in an ingress forwarding policy must be the same as the URL used to access the backend Service. Otherwise, a 404 error will be returned.
For example, the default access URL of the Nginx application is /usr/share/nginx/html. When adding /test to the ingress forwarding policy, ensure the access URL of your Nginx application contains /usr/share/nginx/html/test. Otherwise, error 404 will be returned.
Prerequisites
- An available workload has been deployed in the cluster for external access. If no workload is available, deploy a workload by referring to Creating a Deployment, Creating a StatefulSet, or Creating a DaemonSet.
- A Service for external access has been configured for the workload. Services Supported by LoadBalancer Ingresses lists the Service types supported by LoadBalancer ingresses.
Routing an Ingress to Multiple Services
You can an ingress route to multiple services using either the CCE console or kubectl.
- Log in to the CCE console and click the cluster name to access the cluster console.
- Choose Services & Ingresses in the navigation pane, click the Ingresses tab, and click Create Ingress in the upper right corner.
- Configure ingress parameters.
This example explains only key parameters for configuring forwarding policies. You can configure other parameters as required. For details, see Creating a LoadBalancer Ingress on the Console.
Table 1 Key parameters Parameter
Description
Example
Name
Enter an ingress name.
ingress-test
Load Balancer
Select a load balancer to be associated with the ingress or automatically create a load balancer.
Shared
Listener
- External Protocol: HTTP and HTTPS are available.
- External Port: specifies the port of the load balancer listener.
- External Protocol: HTTP
- External Port: 80
Forwarding Policy
- Domain Name: Enter an actual domain name to be accessed. If it is left blank, the ingress can be accessed through the IP address. Ensure that the domain name has been registered and licensed. Once a forwarding policy is configured with a domain name specified, you must use the domain name for access.
- Path Matching Rule: Select Prefix match, Exact match, or RegEx match.
- Path: Enter the path provided by a backend application for external access. The path added must be valid in the backend application, or the forwarding cannot take effect.
- Destination Service: Select an existing Service or create a Service. Any Services that do not match the search criteria will be filtered out automatically.
- Destination Service Port: Select the access port of the destination Service.
Forwarding rule 1:
- Domain Name: www.example.com
- Path Matching Rule: Prefix match
- Path: /foo
- Destination Service: nginx
- Destination Service Port: 80
Forwarding rule 2:
- Domain Name: www.example.com
- Path Matching Rule: Prefix match
- Path: /bar
- Destination Service: nginx
- Destination Service Port: 80
Forwarding rule 3:
- Domain Name: foo.example.com
- Path Matching Rule: Prefix match
- Path: /
- Destination Service: nginx
- Destination Service Port: 80
Figure 1 Routing an ingress to multiple Services
- Click OK.
- Use kubectl to access the cluster. For details, see Connecting to a Cluster Using kubectl.
- Create a YAML file named ingress-test.yaml. The file name can be customized.
vi ingress-test.yaml
An example YAML file of an ingress associated with an existing load balancer is as follows:
For clusters of v1.23 or later:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/elb.id: <your_elb_id> #Replace it with the ID of your existing load balancer. kubernetes.io/elb.class: performance # Load balancer type kubernetes.io/elb.port: '80' spec: rules: - host: 'www.example.com' http: paths: - path: '/foo' backend: service: name: <your_service_name> # Replace it with the name of your target Service. port: number: 80 # Replace 80 with the port number of your target Service. property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific - path: '/bar' backend: service: name: <your_service_name> # Replace it with the name of your target Service. port: number: 80 # Replace 80 with the port number of your target Service. property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific - host: 'foo.example.com' http: paths: - path: '/' backend: service: name: <your_service_name> # Replace it with the name of your target Service. port: number: 80 # Replace 80 with the port number of your target Service. property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce
For clusters of v1.21 or earlier:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/ingress.class: cce kubernetes.io/elb.port: '80' kubernetes.io/elb.id: <your_elb_id> #Replace it with the ID of your existing load balancer. kubernetes.io/elb.class: performance # Load balancer type spec: rules: - host: 'www.example.com' http: paths: - path: '/foo' backend: serviceName: <your_service_name> # Replace it with the name of your target Service. servicePort: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH - path: '/bar' backend: serviceName: <your_service_name> # Replace it with the name of your target Service. servicePort: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH - host: 'foo.example.com' http: paths: - path: '/' backend: serviceName: <your_service_name> # Replace it with the name of your target Service. servicePort: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
- Create an ingress.
kubectl create -f ingress-test.yaml
If information similar to the following is displayed, the ingress has been created:
ingress/ingress-test created
- Check the created ingress.
kubectl get ingress
If information similar to the following is displayed, the ingress has been created:
NAME CLASS HOSTS ADDRESS PORTS AGE ingress-test cce www.example.com,foo.example.com 121.**.**.** 80 10s
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.