简体   繁体   中英

kubernetes-how to subdomain localhost using nginx ingress controller?

I want to have 2 apps running on kubernetes, I wonder if I can do 2 subdomains using nginx ingress controller.

For example: app1.localhost:8181/cxf and app2.localhost:8181/cxf each one of those will have diferent services.

How can I do that?

Some more context here:

EDIT:

Note:mysql is working fine so im not posting the yaml's here so it doesn't get too long.

Note too that im using karaf with a kar.(that will be my app)

I was thinking that maybe I should have 2 nodes? one with mysql and app1 and the other one with mysql and app2? so in one I could access app1.localhost/cxf services and in the other app2.localhost/cxf services... maybe doesn't make much sense... and I was reading that I need kubeadm for that, and there is no way to install it on windows. I think I must use minikube for that instead?

These are my yaml's:

The load balancer:

apiVersion: v1
kind: Service
metadata:
  name: lb-service
spec:
  type: LoadBalancer
  selector:
    app: app1
  ports:
  - protocol: TCP
    name: app1
    port: 3306
    targetPort: 3306
  - protocol: TCP
    name: app1-8080
    port: 8080
    targetPort: 8080
  - protocol: TCP
    name: app1-8101
    port: 8101
    targetPort: 8101
  - protocol: TCP
    name: app1-8181
    port: 8181
    targetPort: 8181
status:
  loadBalancer:
    ingress:
      - hostname: localhost

app1:

apiVersion: v1
kind: Service
metadata:
  name: app1-service
spec:
  ports:
  - port: 8101
  selector:
    app: app1
  clusterIP: None
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: app1-deployment
spec:
  selector:
    matchLabels:
      app: app1
  replicas: 1
  template:
    metadata:
      labels:
        app: app1
    spec:
      containers:
      - name: app1
        image: app1:latest

app2: is the same as app1 but in a diferent version(older services)

ingress-resource:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: apps-ingress
  #annotations:
    #nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: app1.localhost # tried app1.127-0-0-1.sslip.io ass answered below too.
    http:
      paths:
      - path: /
        backend:
          serviceName: app1-service
          servicePort: 8181
  - host: app2.localhost
    http:
      paths:
      - path: /
        backend:
          serviceName: app2-service
          servicePort: 8181

I should be able to access app1 version in app1.localhost:8181/cxf , and app2 version in app2.localhost:8181/cxf

There is another doubt I have, shouldn't I be able to create another loadBalancer? I wanted to, so the selector would be app2 in that loadBalancer, but since I already have one, the new one just stays <pending> until I remove the first one.

That would make some sense, since if I have 2 replicas if app1, and 2 replicas of app2, there should be a loadBalancer for each app right?

Note that I installed the nginx ingress-controller using helm too, since the ingress-resource would not work otherwise, at least thats what I have read.

By installing that, it installed nginx load balancer too, and this one didnt go to pending. Do I need to use nginx loadBalancer? or can I delete it and use kubernetes type loadBalancer?

Huum, im missing something here...

Thanks for your time!

I want to have 2 apps running on kubernetes, I wonder if I can do 2 subdomains using nginx ingress controller.

Yes, you just need any number of DNS records which point to your Ingress controller's IP (you used 127.0.0.1, so that's what I'll use for these examples, but you can substitute whatever IP is relevant). That's the whole point of an Ingress resource: to use the host: header to dispatch requests into the cluster

I found a list of wildcard DNS providers of which I confirmed that app1.127-0-0-1.sslip.io and app2.127-0-0-1.sslip.io do as expected

Thus:

kind: Ingress
metadata:
  name: app1-and-2
spec:
  rules:
  - host: app1.127-0-0-1.sslip.io
    http:
      paths:
      - path: /
        backend:
          serviceName: app1-backend
          servicePort: 8181  # <-- or whatever your Service port is

  # then you can repeat that for as many hosts as you wish
  - host: app2.127-0-0-1.sslip.io
    http:
      paths:
      - path: /
        backend:
          serviceName: app2-backend
          servicePort: 8181

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM