[解决方案]:我的 nginx.conf 没有监听正确的端口。只要我听到正确的端口,它就起作用了。
我的目标是使用 nginx 控制器和两个入口规则将流量路由到前端 ( web-frontend
) 和后端 ( ) 服务。工作了,但没有,并返回 502 Bad Gateway。每个服务都有自己的入口,以允许单独的 url 重写。我正在使用 aws nginx 控制器(https://kubernetes.github.io/ingress-nginx/deploy/#aws)。public-api
public-api
https
web-frontend
public-api
正在监听 8000 并且其 dockerfile 中没有公开端口。在web-frontend
s dockerfile 中,已经公开了几个端口以进行良好的测量(80、443、8080)。
我不明白为什么public-api
当它的入口配置几乎与web-frontend
. 在添加 tls 证书管理之前,这两条路由都有效。
谢谢您的帮助!
基础网络:
public-api
入口/v1/
-> public-api:443
->NodePort
服务 -> 8000
-> 部署监听8000
。
web-frontend
入口/
-> public-api:443
->NodePort
服务 -> 8080
-> 部署监听8080
。
入口描述:
public-api
:
Name: public-api-rule
Namespace: default
Address: localhost
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
staging-certificate terminates <domain>
Rules:
Host Path Backends
---- ---- --------
staging.grouphouse.io
/v([0-9])/(.*) public-api:443 (10.1.3.158:8000)
Annotations: cert-manager.io/cluster-issuer: letsencrypt-staging
external-dns.alpha.kubernetes.io/hostname: <domain>
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /v$1/$2
nginx.ingress.kubernetes.io/use-regex: true
web-frontend
:
Name: web-frontend-rule
Namespace: default
Address: localhost
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
staging-certificate terminates <domain>
Rules:
Host Path Backends
---- ---- --------
staging.grouphouse.io
/(.*) web-frontend:443 (10.1.3.163:8080)
Annotations: cert-manager.io/cluster-issuer: letsencrypt-staging
external-dns.alpha.kubernetes.io/hostname: <domain>
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/use-regex: true
YAML:
public-api
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: public-api-rule
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-staging"
nginx.ingress.kubernetes.io/rewrite-target: /v$1/$2
nginx.ingress.kubernetes.io/use-regex: "true"
external-dns.alpha.kubernetes.io/hostname: {{ .Values.domain }}
spec:
tls:
- hosts:
- {{ .Values.domain }}
secretName: staging-certificate
rules:
- host: {{ .Values.domain }}
http:
paths:
- path: /v([0-9])/(.*)
pathType: Prefix
backend:
service:
name: public-api
port:
number: 443
apiVersion: v1
kind: Service
metadata:
name: public-api
spec:
type: NodePort
selector:
app: public-api
ports:
- port: 443
protocol: TCP
targetPort: 8000
apiVersion: apps/v1
kind: Deployment
metadata:
name: public-api
labels:
app: public-api
spec:
selector:
matchLabels:
app: public-api
template:
metadata:
labels:
app: public-api
spec:
containers:
- name: public-api
image: <image>
imagePullPolicy: Always
ports:
- containerPort: 8000
web-frontend
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-frontend-rule
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-staging"
external-dns.alpha.kubernetes.io/hostname: {{ .Values.domain }}
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
tls:
- hosts:
- {{ .Values.domain }}
secretName: staging-certificate
rules:
- host: {{ .Values.domain }}
http:
paths:
- path: /(.*)
pathType: Prefix
backend:
service:
name: web-frontend
port:
number: 443
apiVersion: v1
kind: Service
metadata:
name: web-frontend
spec:
type: NodePort
selector:
app: web-frontend
ports:
- port: 443
protocol: TCP
targetPort: 8080
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-frontend
labels:
app: web-frontend
spec:
replicas: 1
selector:
matchLabels:
app: web-frontend
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
template:
metadata:
labels:
app: web-frontend
spec:
containers:
- name: web-frontend
image: <image>
imagePullPolicy: Always
ports:
- name: web-frontend
containerPort: 8080