kubernetes 通过入口返回404的访问

6qqygrtg  于 2023-04-29  发布在  Kubernetes
关注(0)|答案(1)|浏览(159)

我用deployment.ymlservice.ymlingress.yml安装了pod和服务,如下所示。
deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apa000dep
spec:
  selector:
    matchLabels:
      app: apa000kube
  replicas : 3
  template:
    metadata:
      labels:
        app: apa000kube
    spec:
      containers:
        - name: apa000ex91
          image: httpd
          ports:
          - containerPort: 80

service.yml

apiVersion: v1
kind: Service
metadata: 
  name: apa000ser
spec:
  type: NodePort
  ports:
  - port: 8099
    targetPort: 80
    protocol: TCP
    nodePort: 30080
  selector:
    app: apa000kube

两者都运行良好,我可以直接访问pod localhost:30080
然后我安装了Inge。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: demo.localdev.me
    http:
      paths:
      - pathType: Prefix
        path: /*
        backend:
          service:
            name: apa000ser
            port:
              number: 8099

主机名设置正确

$kubectl get ingress 
    
NAME              CLASS    HOSTS              ADDRESS   
PORTS   AGE
example-ingress   <none>   demo.localdev.me             80      95m

但是当我访问http://demo.localdev.me时,它返回404错误。
http://localhost:30080/返回<span>it works!</span>
我猜是某个入口设置出错了。在哪里办理?
即使我停止example-ingress,结果也是一样的。
这意味着。

nginx-ingress -> ingress -> service -> pods.

每个请求都在第一个nginx-ingress中获取,而不是发送到ingress

ou6hu8tu

ou6hu8tu1#

有两件事引起了我的注意:

  • 您正在使用的Ingress控制器似乎需要在Ingress资源中定义ingressClassName,以便Ingress控制器考虑此资源(及其配置)。

关于Ingress class

  • Ingress类
  • 默认IngressClass
  • 您应该将path: /*更改为path: /
  • path: /*使Ingress控制器创建一个位置块
location /* {
  ...
}

在这种情况下,/*被解释为普通前缀,与正则表达式无关(可能不是您所假设的)。
在您的案例中:404 来自入口本身(因为请求URI /未找到-必须是'/')。为了使请求能够被代理到httpd服务器,请求必须如下所示:“ www.example.com ”,httpd将再次以404响应(因为资源“/”在httpd上默认也不存在)。

  • path: /执行以下操作:
location / {
  ...
}

location /块是一种特殊情况,它匹配任何以斜杠(/)开头的URI,包括所有URI。(这也是Nginx在没有其他位置块匹配请求的URI时使用的默认位置块。)
关于nginx location

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  ingressClassName: nginx   # add
  rules:
  - host: demo.localdev.me
    http:
      paths:
      - pathType: Prefix
        path: /           # change
        backend:
          service:
            name: apa000ser
            port:
              number: 8099

相关问题