I have simple ingress for virtual hosting:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-access
spec:
rules:
- host: service1.domain.com
http:
paths:
- backend:
serviceName: service1
servicePort: 80
- host: service2.domain.com
http:
paths:
- backend:
serviceName: service2
servicePort: 80Services service1 and servcie2 have definitions like:
apiVersion: v1
kind: Service
metadata:
name: service1
labels:
chart: "chart"
spec:
type: ClusterIP # LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
name: web
selector:
app: service1If I deploy services with type ClusterIP they don't work, ingress responds with error:
Error: Server Error
The server encountered a temporary error and could not complete your request.
Please try again in 30 seconds.Then I change type of one of the services to LoadBalancer, it gets external IP and I can access it using this external IP, and also I can access it though ingress (using host name service1.domain.com)
If I try to access service2 (service2.domain.com - which still has type ClusterIP) ingress responds with:
default backend - 404If I change servcice2 type to LoadBalancer it starts to work through ingress.
I think that ingress should work with ClusterIP services, because LoadBalancer service type assigns external IP, which is not needed at all, and if I get it correctly gcloud ingress resource by default should use its own load loadbalancer.
So what is wrong with the setup?
It seems that the correct answer is that Ingress requires NodePort to work with, so services should have NodePort type for this case.