Nginx 入口找不到服务



我使用docker桌面使用这个链接创建了一个nginx入口。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml

我的服务:

apiVersion: apps/v1
kind: Deployment
metadata:
name: be-assinaturas
namespace: apps-space
labels:
tier: backend
app: assinaturas
spec:
selector:
matchLabels:
name: be-assinaturas
app: assinaturas
strategy:
type: Recreate
replicas: 2
template:
metadata:
name: be-assinaturas
labels:
app: assinaturas
name: be-assinaturas
spec:
containers:
- name: be-assinaturas
image: jedi31/assinaturas:latest
imagePullPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
name: svc-assinaturas
namespace: apps-space
spec:
selector:
name: be-assinaturas
app: assinaturas
type: ClusterIP
ports:
- name: be-assinaturas-http
port: 80
targetPort: 80

我的入口资源定义为:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: 
name: ingress-be-assinaturas
namespace: apps-space
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths: 
- path: /assinaturas
pathType: Prefix
backend:
service:              
name: svc-assinaturas
port:
number: 80

运行kubectl get services --all-namespaces我得到

NAMESPACE       NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
apps-space      svc-assinaturas                      ClusterIP      10.107.188.28    <none>        80/TCP                       12m
default         kubernetes                           ClusterIP      10.96.0.1        <none>        443/TCP                      66d
ingress-nginx   ingress-nginx-controller             LoadBalancer   10.102.238.173   localhost     80:32028/TCP,443:30397/TCP   5h45m
ingress-nginx   ingress-nginx-controller-admission   ClusterIP      10.98.148.190    <none>        443/TCP                      5h45m
kube-system     kube-dns                             ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP       66d

如果我在服务中执行端口转发,如下所示:kubectl port-forward -n apps-space service/svc-assinaturas 5274:80

我可以使用curl访问我的应用程序,如下所示:curl -v http://localhost:5274/hc/alive

并且响应是:

*   Trying 127.0.0.1:5274...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 5274 (#0)
> GET /hc/alive HTTP/1.1
> Host: localhost:5274
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Date: Mon, 06 Dec 2021 23:22:40 GMT
< Server: Kestrel
< Transfer-Encoding: chunked
<
* Connection #0 to host localhost left intact
{"service":"Catalogo","status":"Alive","version":"bab4653"}

但是,如果我尝试使用Ingress访问服务,它会返回404。curl -v http://localhost/assinaturas/hc/alive

*   Trying 127.0.0.1:80...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /assinaturas/hc/alive HTTP/1.1
> Host: localhost
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Date: Mon, 06 Dec 2021 23:22:51 GMT
< Content-Length: 0
< Connection: keep-alive
<
* Connection #0 to host localhost left intact

我在这里做错了什么?为什么我可以访问服务,但入口找不到?

这是因为前缀/assinaturas需要被Nginx重写省略。。这就是为什么你得到404(未找到(:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata: 
name: ingress-be-assinaturas
namespace: apps-space
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /$1 # <- 🔴 rewrite here
spec:
rules:
- http:
paths: 
- path: /assinaturas/(.*) # <--  🔴 Match the path to be rewritten
pathType: Prefix
backend:
service:              
name: svc-assinaturas
port:
number: 80

最新更新