首页 > 解决方案 > 入口资源未路由正确公开的服务

问题描述

我正在尝试使用 GKE 部署我的应用程序:我使用此链接https://kubernetes.io/docs/concepts/services-networking/ingress/添加了一个入口资源

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: app-ip
  labels:
    app: myapp
    part: ingress
spec:
 rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: frontapp
          servicePort: 3000
      - path: /back/*
        backend:
          serviceName: backapp
          servicePort: 9000

并将我的服务公开为 NodePort:只有映射到“/”的服务才有效(我测试了前端和后端服务)

(映射到此的路径不起作用

[IP]/back/(我的路径)

在教程中我发现了这句话:

你需要一个 Ingress 控制器来满足一个 Ingress,简单地创建资源是没有效果的。

我的问题是:

1)入口资源和控制器有什么区别?

2) GKE 默认提供入口控制器还是我应该手动添加它以解决我的路径问题?

3)我的配置还有什么问题

ps:这是我的一项服务

apiVersion: v1
 kind: Service
 metadata:
   labels:
     app: myapp
     part: back
   name: backapp
   namespace: default
 spec:
   ports:
   - port: 9000
     protocol: TCP
     targetPort: 9000 # Port on the pod with 'back' application
   selector:
     app: myapp
     part: back
   type: NodePort

当我描述我的入口时,这就是我得到的

Annotations:
  ingress.kubernetes.io/url-map:                k8s-um-default-ingress--17c7235ab3ece101
  kubernetes.io/ingress.global-static-ip-name:  app-ip
  ingress.kubernetes.io/backends:               {"k8s-be-31278--17c7235ab3ece101":"HEALTHY","k8s-be-32112--17c7235ab3ece101":"HEALTHY","k8s-be-32287--17c7235ab3ece101":"HEALTHY"}
  ingress.kubernetes.io/forwarding-rule:        k8s-fw-default-ingress--17c7235ab3ece101
  ingress.kubernetes.io/target-proxy:           k8s-tp-default-ingress--17c7235ab3ece101


Events:   Type    Reason   Age               From                     Message   ----    ------   ----              ----                    
-------

 Warning  UrlMap   46m (x5 over 4h)  loadbalancer-controller  googleapi: Error 412: Invalid fingerprint., conditionNotMet

  Normal  Service  4m (x22 over 2h)  loadbalancer-controller  no user specified default backend, using system default

标签: kubernetesgoogle-kubernetes-enginekubernetes-ingress

解决方案


1) Ingress 是一个 Kubernetes 资源,它封装了一组规则和配置,用于将外部 HTTP(S) 流量路由到内部服务。Ingress 控制器负责读取 Ingress Resource 信息并相应地处理该数据,您需要一个 Ingress 控制器来满足 Ingress,简单地创建资源将没有任何效果。

2)默认情况下是它的GLBC,您可以在不使用入口资源的情况下部署应用程序。GKE 默认使用GLBC作为 GLBC 入口控制器,您不必配置路径,因为路径是在入口资源(您的 YAML 文件)中配置的。

Ingress 与 Kubernetes 紧密集成,这意味着围绕 kubectl 的现有工作流可能会很好地扩展到管理 Ingress。请注意,入口控制器通常不会消除对外部负载平衡器的需求——入口控制器只是在负载平衡器后面添加一个额外的路由和控制层。

3)根据您的 Ingress 资源 yaml : - 将路径以 /Back/ 开头的请求路由到 backapp 服务。- 将所有其他请求路由到 frontapp 服务。

在检查 Yaml 配置和您获得的 UrlMap 后,我建议您在规则下添加主机,因为没有主机的 IngressRule 会获取通配符。


推荐阅读