Kubernetes 入口无法获取默认http后端

Kubernetes 入口无法获取默认http后端,kubernetes,kubernetes-ingress,Kubernetes,Kubernetes Ingress,入口I配置与控制器入口nginx一起运行 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: - ho

入口I配置与控制器入口nginx一起运行

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
,但它不能远程运行

# kubectl describe ingress app-ingress
Name:             app-ingress
Namespace:        default
Address:          XX.XX.XX.XX
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
  app-tls terminates www.daichenchen.cn
Rules:
  Host                Path  Backends
  ----                ----  --------
  XXX.XX.com
                      /my-api(/|$)(.*)   app:80 (<error: endpoints "app" not found>)
kubectl描述入口应用入口 名称:应用程序入口 名称空间:默认值 地址:XX.XX.XX.XX 默认后端:默认http后端:80() TLS: app tls终止www.daichensen.cn 规则: 主机路径后端 ---- ---- -------- 三十、 XX.com /我的api(/|$)(*)应用程序:80()
我已经成功安装了ingress nginx,所有pod工作正常。

您在
ingress
规则和
服务中定义的
serviceName
应该是相同的

像这样:

。。。
规则:
-主持人:XXX.XX.com
http:
路径:
-路径:/my api(/|$)(*)
后端:
服务名称:应用程序
服务端口:80
apiVersion:v1 种类:服务 元数据: 名称:应用 规格: 选择器: 应用程序:我的api 端口: -名称:应用 港口:3000 目标港:3000
如果
入口
服务
位于不同的命名空间中,您还可以将服务名称添加到入口规则中。在这种情况下,您需要为服务使用dns名称

例如:

规则:
-主持人:example.com
http:
路径:
-路径:/myapi
后端:
serviceName:test-service.test-namespace
服务端口:80
apiVersion:v1 种类:服务 元数据: 名称:测试服务 名称空间:测试名称空间
您在
入口
规则和
服务
中定义的
服务名称
应该相同

像这样:

。。。
规则:
-主持人:XXX.XX.com
http:
路径:
-路径:/my api(/|$)(*)
后端:
服务名称:应用程序
服务端口:80
apiVersion:v1 种类:服务 元数据: 名称:应用 规格: 选择器: 应用程序:我的api 端口: -名称:应用 港口:3000 目标港:3000 如果
入口
服务
位于不同的命名空间中,您还可以将服务名称添加到入口规则中。在这种情况下,您需要为服务使用dns名称

例如:

规则:
-主持人:example.com
http:
路径:
-路径:/myapi
后端:
serviceName:test-service.test-namespace
服务端口:80
apiVersion:v1 种类:服务 元数据: 名称:测试服务 名称空间:测试名称空间
ingress controller查找服务的
端点的方式是,它使用已创建ingress资源的命名空间中ingress资源中提供的
serviceName
搜索kubernetes服务。如果没有找到具有
serviceName
的kubernetes服务,则会得到
未找到的端点

服务的
端点
包含kubernetes服务后面的POD IP

因此,在您的情况下,要么kubernetes服务不存在,要么它位于与创建入口资源的名称空间不同的名称空间中

ingress controller的某些变体不支持默认后端,因此预计会出现
错误:未找到端点“默认http后端”

入口控制器的另一个变体支持默认后端


仔细检查您安装的nginx ingress controller的哪种变体ingress controller查找服务端点的方式是它使用您创建入口资源的命名空间中入口资源中提供的
serviceName
搜索kubernetes服务。如果没有找到具有
serviceName
的kubernetes服务,则会得到
未找到的端点

服务的
端点
包含kubernetes服务后面的POD IP

因此,在您的情况下,要么kubernetes服务不存在,要么它位于与创建入口资源的名称空间不同的名称空间中

ingress controller的某些变体不支持默认后端,因此预计会出现
错误:未找到端点“默认http后端”

入口控制器的另一个变体支持默认后端


仔细检查您安装的nginx ingress controller的哪个版本

是否部署了默认http后端服务并在ingress controller上进行了配置?此默认http后端似乎是ingress中的默认配置,我没有对其进行配置。如果入口配置与其配置中的任何主机不匹配,则会将流量发送到默认后端(这里似乎是这样,因为在入口中,
serviceName
正在查找
app
,但您的服务名为
myapi
)。你是在试图解决这个问题,还是在试图弄清楚为什么默认后端不能像你预期的那样工作?我正在努力检查为什么入口无法找到应用程序服务。我使用daemonset ingress nginx在master中运行,我想我会尝试使用另一种类型的nodePort来解决。您是否部署了默认的http后端服务并在ingress controller上进行了配置?此默认http后端似乎是ingress中的默认配置,我没有对其进行配置。如果入口配置与其配置中的任何主机不匹配,则会将流量发送到默认后端(这里似乎是这样,因为在入口中,
serviceName
正在查找
app
,但您的服务名为
myapi
)。你是在试图解决这个问题,还是在试图弄清楚为什么默认后端不能像你预期的那样工作?我正在努力检查为什么入口无法找到应用程序服务。我使用守护进程入口nginx在master中运行,我想我会尝试使用另一种类型的nodePort来运行