'Nginx Kubernetes Ingress returns 502
I am trying to deploy simple REST API app in Kubernetes cluster in AWS EKS. Everything else is reverse proxying just fine.
I use following config for deployment. Pod is healthy, pod restarts every 20 minutes because AWS kills connection towards my development free tier db, but I run several replicas just in case.
When I try to connect to domain I get 502 Bad Gateway error. I really do not know what is going on.
apiVersion: apps/v1
kind: Deployment
metadata:
name: xyz-microservice
spec:
replicas: 4
template:
nodeSelector:
node.kubernetes.io/role: worker
tolerations:
- effect: NoSchedule
key: node.kubernetes.io/role
operator: Equal
value: worker
selector:
matchLabels:
app: xyz-microservice
template:
metadata:
labels:
app: xyz-microservice
spec:
hostname: xyz-microservice
containers:
- name: xyz-microservice
image: redacted
imagePullPolicy: Always
env:
- name: DB_USERNAME
value: redacted
- name: DB_PASSWORD
value: redacted
- name: DB_HOST
value: redacted
- name: DB_PORT
value: "5432"
- name: DB_NAME
value: redacted
resources:
requests:
memory: "32Mi"
cpu: "80m"
limits:
memory: "128Mi"
cpu: "100m"
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: xyz-microservice-service
spec:
type: ClusterIP
selector:
app: xyz-microservice
ports:
- port: 80
targetPort: 8080
protocol: TCP
And this is ingress configuration:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "internal"
forecastle.stakater.com/expose: "true"
forecastle.stakater.com/appName: "XYZ Microservice"
cert-manager.io/cluster-issuer: "letsencrypt-aws"
name: xyz-microservice
spec:
rules:
- host: xyz.internal.staging.k8s.redacted
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: xyz-microservice-service
port:
number: 8080
tls:
- hosts:
- xyz.internal.staging.k8s.redacted
secretName: xyz-microservice-tls
It would mean alot if someone could guide me through.
Solution 1:[1]
Just keep in mind that almost every time you got a 502 bad gateway in nginx-ingress, it's linked to a backend port binding problem / bad backend configuration names etc.
Here your nginx ingress is configured to redirect the traffic from "xyz.internal.staging.k8s.redacted" host to the port 8080 of your "xyz-microservice-service" kubernetes service.
However 8080 is the targetPort of your service. No the exposed port that is in fact 80.
So, to fix this issue just change the port of the backend service, like this:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "internal"
forecastle.stakater.com/expose: "true"
forecastle.stakater.com/appName: "XYZ Microservice"
cert-manager.io/cluster-issuer: "letsencrypt-aws"
name: xyz-microservice
spec:
rules:
- host: xyz.internal.staging.k8s.redacted
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: xyz-microservice-service
port:
number: 80
tls:
- hosts:
- xyz.internal.staging.k8s.redacted
secretName: xyz-microservice-tls
(Or reconfigure the port of your service to match the port of the ingress configuration.)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | bguess |