我用deployment.yml
、service.yml
和ingress.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
?
1条答案
按热度按时间ou6hu8tu1#
有两件事引起了我的注意:
ingressClassName
,以便Ingress控制器考虑此资源(及其配置)。关于
Ingress class
:path: /*
更改为path: /
。path: /*
使Ingress控制器创建一个位置块在这种情况下,
/*
被解释为普通前缀,与正则表达式无关(可能不是您所假设的)。在您的案例中:404 来自入口本身(因为请求URI
/
未找到-必须是'/')。为了使请求能够被代理到httpd服务器,请求必须如下所示:“ www.example.com ”,httpd将再次以404响应(因为资源“/”在httpd上默认也不存在)。path: /
执行以下操作:location /
块是一种特殊情况,它匹配任何以斜杠(/)开头的URI,包括所有URI。(这也是Nginx在没有其他位置块匹配请求的URI时使用的默认位置块。)关于nginx
location
:最终结果: