Search code examples
azurekuberneteskubernetes-ingressazure-aks

Regex based routing setup for ingress in AKS


I am have a K8s cluster in Azure, in which I am wanting to host multiple web applications on with a single host. Each application has it's own service and deployment. How can I achieve something like the following routes?

MyApp.com
Partner1.MyApp.com
Partner2.MyApp.com

Here is what my yml file looks like currently:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp # the label for the pods and the deployments
    spec:
      containers:
      - name: myapp
        image: myimagename
        imagePullPolicy: Always
        ports:
        - containerPort: 6666 # the application listens to this port
---
apiVersion: v1
kind: Service
metadata:
   name: myapp
spec:
    selector:
        app: myapp
    ports:
    - protocol: TCP
      port: 6666
      targetPort: 6666
    type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: partner1-myapp
spec:
  selector:
    matchLabels:
      app: partner1-myapp
  template:
    metadata:
      labels:
        app: partner1-myapp # the label for the pods and the deployments
    spec:
      containers:
      - name: partner1-myapp
        image: myimagename
        imagePullPolicy: Always
        ports:
        - containerPort: 6669 # the application listens to this port
---
apiVersion: v1
kind: Service
metadata:
   name: partner1-myapp
spec:
    selector:
        app: partner1-myapp
    ports:
    - protocol: TCP
      port: 6669
      targetPort: 6669
    type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: partner2-myapp
spec:
  selector:
    matchLabels:
      app: partner2-myapp
  template:
    metadata:
      labels:
        app: partner2-myapp # the label for the pods and the deployments
    spec:
      containers:
      - name: partner2-myapp
        image: myimagename
        imagePullPolicy: Always
        ports:
        - containerPort: 6672# the application listens to this port
---
apiVersion: v1
kind: Service
metadata:
   name: partner2-myapp
spec:
    selector:
        app: partner2-myapp
    ports:
    - protocol: TCP
      port: 6672
      targetPort: 6672
    type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ing
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: 70m
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: partner1-myapp
            port:
              number: 6669
 - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: partner2-myapp
            port:
              number: 6672
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: myapp
            port:
              number: 6666
---

What can I do to get the above routing?


Solution

  • Please run your two applications using kubectl

        kubectl apply -f Partner1-MyApp.yaml --namespace ingress-basic
        kubectl apply -f Partner2-MyApp.yaml --namespace ingress-basic
    

    To setup for routing in your YAML file, If both application are running in Kubernetes cluster to route traffic in each application EXTERNAL_IP/static is needed to route the service, create a file name add this YAML code in below

       apiVersion: networking.k8s.io/v1
        kind: Ingress
        metadata:
          name: partner-ingress-static
          annotations:
            nginx.ingress.kubernetes.io/ssl-redirect: "false"
            nginx.ingress.kubernetes.io/rewrite-target: /static/$2
        spec:
          ingressClassName: nginx
          rules:
          - http:
              paths:
              - path: /static(/|$)(.*)
                pathType: Prefix
                backend:
                  service:
                    name: partner1-myapp
                    port: 
                      number: 6669
    

    enter image description here

    To more in detail please refer this link :

    Create an ingress controller in Azure Kubernetes Service (AKS)