如何解决入口无法获取默认的http后端
我配置为与控制器ingress-nginx一起运行的入口。
Animal a = h
我可以在本地apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
tls:
- hosts:
- XXX.XX.com
secretName: app-tls
rules:
- host: XXX.XX.com
http:
paths:
- path: /my-api(/|$)(.*)
backend:
serviceName: app
servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-api
spec:
selector:
app: my-api
ports:
- name: app
port: 3000
targetPort: 3000
上运行api,但是不能远程运行。
curl localIP:3000/testapi
我已经成功安装了ingress-nginx,所有pod均正常运行。
解决方法
您在serviceName
规则中定义的Ingress
和Service
应该相同。
赞:
...
rules:
- host: XXX.XX.com
http:
paths:
- path: /my-api(/|$)(.*)
backend:
serviceName: app
servicePort: 80
apiVersion: v1
kind: Service
metadata:
name: app
spec:
selector:
app: my-api
ports:
- name: app
port: 3000
targetPort: 3000
如果Ingress
和Service
在不同的命名空间中,则还可以将服务名称添加到入口规则中。在这种情况下,您需要为服务<service-name>.<namespace>
使用dns名称。
例如:
rules:
- host: example.com
http:
paths:
- path: /my-api
backend:
serviceName: test-service.test-namespace
servicePort: 80
apiVersion: v1
kind: Service
metadata:
name: test-service
namespace: test-namespace
,
入口控制器发现服务Endpoints
的方式是,它使用创建入口资源的名称空间中入口资源中提供的serviceName
搜索kubernetes服务。如果没有serviceName
的kubernetes服务,您将得到endpoints not found
。
该服务的Endpoints
包含kubernetes服务后面的Pod的IP。
因此,在您的情况下,要么不存在kubernetes服务,要么它的名称空间与创建入口资源的位置不同。
nginx入口控制器的某些变体不支持默认后端,为此,它应该具有error: endpoints "default-http-backend" not found
nginx入口控制器的另一个变体支持默认后端。
仔细检查您安装了哪种nginx入口控制器