Я пытаюсь развернуть простое приложение REST API в кластере Kubernetes в AWS EKS. Все остальное с обратным проксированием просто отлично.
Я использую следующую конфигурацию для развертывания. Модуль исправен, модуль перезапускается каждые 20 минут, потому что AWS прерывает соединение с моей базой данных бесплатного уровня разработки, но на всякий случай я запускаю несколько реплик.
Когда я пытаюсь подключиться к домену, я получаю ошибку 502 Bad Gateway. Я действительно не знаю, что происходит.
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
И это входная конфигурация:
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
Это бы много значило, если бы кто-то мог провести меня через это.
Просто имейте в виду, что почти каждый раз, когда вы получаете неверный шлюз 502 в nginx-ingress, это связано с проблемой привязки бэкэнд-порта/неправильными именами конфигурации бэкэнда и т. д.
Здесь ваш вход nginx настроен на перенаправление трафика с хоста «xyz.internal.staging.k8s.redacted» на порт 8080 вашей службы kubernetes «xyz-microservice-service».
Однако 8080 является целевым портом вашей службы. Нет открытого порта, который на самом деле 80.
Итак, чтобы решить эту проблему, просто измените порт серверной службы, например:
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
(Или перенастройте порт вашей службы, чтобы он соответствовал порту входной конфигурации.)
Ваш
Ingress
указывает на порт 8080, но вашService
выставляет порт 80; это почти наверняка просто опечатка