Docker 为什么K8s入口在Minikube上工作,但在远程集群上返回HTTP 404?
我有一个服务(作为另一个应用程序的Helm subchart安装)可以在Minikube环境中正确访问,但在远程Kubernetes群集上部署时无法访问 服务应该可以通过入口访问 进入: 服务 部署Docker 为什么K8s入口在Minikube上工作,但在远程集群上返回HTTP 404?,docker,nginx,kubernetes,kubernetes-helm,kubernetes-ingress,Docker,Nginx,Kubernetes,Kubernetes Helm,Kubernetes Ingress,我有一个服务(作为另一个应用程序的Helm subchart安装)可以在Minikube环境中正确访问,但在远程Kubernetes群集上部署时无法访问 服务应该可以通过入口访问 进入: 服务 部署 将请求发送到helper service.example.com始终会从Nginx返回404未找到错误。给出响应后,Nginx似乎可以访问,但无法提供对入口中指定的服务的访问 但是,同一集群/命名空间上的父chart Helm应用程序可以通过节点端口服务的入口访问,并且在访问时没有问题 这两项服务
将请求发送到
helper service.example.com
始终会从Nginx返回404未找到
错误。给出响应后,Nginx似乎可以访问,但无法提供对入口中指定的服务的访问
但是,同一集群/命名空间上的父chart Helm应用程序可以通过节点端口服务的入口访问,并且在访问时没有问题
这两项服务都正常运行:
$ k get all
NAME READY STATUS RESTARTS AGE
pod/myapp-645cd66d9-g84vm 2/2 Running 0 51m
pod/myapp-helper-service-fbc6bb4d8-zklf2 1/1 Running 0 4d19h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/myapp NodePort 10.10.10.11 <none> 8080:31033/TCP 110d
service/myapp-helper-service ClusterIP 10.10.10.61 <none> 8080/TCP 110d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 1/1 1 1 110d
deployment.apps/myapp-helper-service 1/1 1 1 110d
$ k get ingresses
NAME HOSTS ADDRESS PORTS AGE
myapp myapp.example.com 37.44.1.172 80, 443 116d
myapp-helper-service myapp-helper-service.example.com 80 116d
入口详情如下:
$ k describe ingress/myapp-helper-service
Name: myapp-helper-service
Namespace: my-namespace
Address:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" is forbidden: User cannot get resource "endpoints" in API group "" in the namespace "kube-system">)
Rules:
Host Path Backends
---- ---- --------
myapp-helper-service.example.com
/ myapp-helper-service:service-port (172.25.0.207:8080)
Events: <none>
$k描述入口/myapp帮助服务
名称:myapp助手服务
名称空间:我的名称空间
地址:
默认后端:默认http后端:80()
规则:
主机路径后端
---- ---- --------
myapp-helper-service.example.com
/myapp助手服务:服务端口(172.25.0.207:8080)
活动:
部署的服务是:
$ k describe service/myapp-helper-service
Name: myapp-helper-service
Namespace: mynamespace
Labels: app.kubernetes.io/instance=myapp
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=helper-service
app.kubernetes.io/version=2.1
helm.sh/chart=helper-service-0.2.3
Annotations: meta.helm.sh/release-name: myapp
meta.helm.sh/release-namespace: mynamespace
Selector: app.kubernetes.io/instance=myapp,app.kubernetes.io/name=helper-service
Type: ClusterIP
IP: 10.10.10.61
Port: service-port 8080/TCP
TargetPort: 8080/TCP
Endpoints: 172.25.0.207:8080
Port: metrics-port 8081/TCP
TargetPort: 8081/TCP
Endpoints: 172.25.0.207:8081
Session Affinity: None
Events: <none>
$k描述服务/myapp助手服务
名称:myapp助手服务
名称空间:mynamespace
标签:app.kubernetes.io/instance=myapp
app.kubernetes.io/managed by=Helm
app.kubernetes.io/name=helper服务
app.kubernetes.io/version=2.1
舵手sh/chart=HELP-service-0.2.3
注释:meta.helm.sh/release-name:myapp
meta.helm.sh/release-namespace:mynamespace
选择器:app.kubernetes.io/instance=myapp,app.kubernetes.io/name=helper服务
类型:集群
IP:10.10.10.61
端口:服务端口8080/TCP
目标端口:8080/TCP
终点:172.25.0.207:8080
端口:metrics端口8081/TCP
目标端口:8081/TCP
终点:172.25.0.207:8081
会话关联:无
活动:
我试图启用/禁用add-Traefik
annotations
以查看是否有任何更改,但结果是相同的(仍然是来自Nginx的404我找到了解决方案
即使入口是被创建的,但显然它并没有真正起作用(或者得到了一些非更好指定的其他默认类)
入口需要缺少显式注释,指定入口类:
添加并重新部署后,入口开始正确捕获我的请求并将它们重定向到帮助程序服务
注
如果您知道以下情况,请写一条评论:
- 未指定任何类时,默认类是什么
- 如何确定已在集群上运行的入口所使用的类
kubectl get ingress
没有显示myapp helper service的地址,尽管myapp并非如此。这正常吗?您能否提供kubectl Descripte myapp helper service
的结果?ingressmyapp
是否可以正确访问?因为有时k8s中的ingress控制器是设置不好。@g.momo是的,myapp
是完全可以访问的。主要区别是myapp
属于服务类型NodePort
,而myapp助手服务
属于服务类型ClusterIP
(我无法更改)但是,据我所知,这并不重要,因为入口指向服务和服务端口。@g.momo您希望描述什么资源?服务、部署、Pod?(我还添加了部署配置)入口就足够了。顺便问一下,你的描述入口的第四行是什么意思
?defauld后端似乎有些问题。myapp ingress的另一个区别是它似乎也在https上运行。我不依赖默认后端,而是显式地将/
主机路径分配给后端/服务。myapp
做了同样的事情,并且入口工作正常。Traefikhttps代码>只是一次尝试,我实际上禁用了它;我坚持使用nginx。
$ k get ingresses
NAME HOSTS ADDRESS PORTS AGE
myapp myapp.example.com 37.44.1.172 80, 443 116d
myapp-helper-service myapp-helper-service.example.com 80 116d
$ k describe ingress/myapp-helper-service
Name: myapp-helper-service
Namespace: my-namespace
Address:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" is forbidden: User cannot get resource "endpoints" in API group "" in the namespace "kube-system">)
Rules:
Host Path Backends
---- ---- --------
myapp-helper-service.example.com
/ myapp-helper-service:service-port (172.25.0.207:8080)
Events: <none>
$ k describe service/myapp-helper-service
Name: myapp-helper-service
Namespace: mynamespace
Labels: app.kubernetes.io/instance=myapp
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=helper-service
app.kubernetes.io/version=2.1
helm.sh/chart=helper-service-0.2.3
Annotations: meta.helm.sh/release-name: myapp
meta.helm.sh/release-namespace: mynamespace
Selector: app.kubernetes.io/instance=myapp,app.kubernetes.io/name=helper-service
Type: ClusterIP
IP: 10.10.10.61
Port: service-port 8080/TCP
TargetPort: 8080/TCP
Endpoints: 172.25.0.207:8080
Port: metrics-port 8081/TCP
TargetPort: 8081/TCP
Endpoints: 172.25.0.207:8081
Session Affinity: None
Events: <none>
annotations:
kubernetes.io/ingress.class: nginx-external