无法通过nginx入口控制器访问Kubernetes ClusterIP服务

无法通过nginx入口控制器访问Kubernetes ClusterIP服务,nginx,kubernetes,kubernetes-ingress,Nginx,Kubernetes,Kubernetes Ingress,我是Kubernetes的业余爱好者,尝试在GKE上使用NGINX入口控制器。我正在按照谷歌云文档为我的服务设置NGINX入口,但是,我在访问NGINX位置时遇到了问题 什么起作用了 启用Helm RBAC的入口控制器部署 集群服务部署 什么不起作用 使用唯一路径扇出路由公开多个ClusterIP服务的入口资源 K8S服务 附加信息 我试图访问的服务是使用上下文的springboot服务,因此根位置不是有效的端点 相应地定义了容器的就绪性和活动性探测 例如,支付网关开发服务使用的是context

我是Kubernetes的业余爱好者,尝试在GKE上使用NGINX入口控制器。我正在按照谷歌云文档为我的服务设置NGINX入口,但是,我在访问NGINX位置时遇到了问题

什么起作用了

启用Helm RBAC的入口控制器部署 集群服务部署 什么不起作用

使用唯一路径扇出路由公开多个ClusterIP服务的入口资源 K8S服务

附加信息

我试图访问的服务是使用上下文的springboot服务,因此根位置不是有效的端点

相应地定义了容器的就绪性和活动性探测

例如,支付网关开发服务使用的是context/pgw/v1上下文,因此只能通过该上下文访问部署。要访问应用程序的招摇过市规范,可以使用URL

http:///pgw/v1/swagger-ui.html

我的部署行为

入口控制器LB ip=35.188.161.171

访问入口控制器负载平衡器会将我带到默认的404后端 访问入口控制器负载平衡器运行状况将按预期返回200 HTTP响应 尝试使用下面的URL访问服务将返回404:page not found错误
任何关于我可能做错了什么的建议或见解都将不胜感激。

+1对于这个被问得很好的问题

你的设置对我来说似乎是正确的。在你的解释中,我发现你的服务需要http:///pgw/v1/swagger-ui.html 作为上下文。但是,在您的设置中,提交到服务的路径将是http:///qa/pgw/v1/swagger-ui.html 如果您的路线是/qa/

要删除前缀,您需要做的是向入口添加重写规则:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: pgw-nginx-ingress
  namespace: payment-gateway-7682352
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: payment-gateway-dev
          servicePort: 5000
        path: /dev/(.+)
      - backend:
          serviceName: payment-gateway-qa
          servicePort: 5000
        path: /qa/(.+)
在此之后,您的服务应该会收到正确的上下文

参考:

重写: 入口路由匹配:
另一种方法是使用基于主机的路由。您只需为入口静态IP pgw-dev.foo.com、pgw-qa.foo.com创建几个CNAME DNS条目,并用host:attributes替换path:attributes。没有URL重写的必要

imo使用基于主机的方法的最佳理由是对人类的清晰性和灵活性。我在很多不同的地方工作过。几乎所有这些应用程序都使用主机名以这种方式区分环境。味道好极了,馅少了

例如,如果您将DEV和QA拆分到单独的集群中,那么没有人需要更改它们的配置,您的K8s模板将是可重用的。只需更新DNS。如果您想启动一个新的登台或性能测试环境,那么您现有的测试工具应该很容易适应新环境:只需在配置中更改主机名


随着时间的推移,我想您会发现主机名比路径前缀更能自然地区分环境。

感谢您的响应,它非常有意义。添加重写规则解决了我的问题。很高兴这解决了您的问题。如果您将此标记为答案,将不胜感激。
[msekar@ebs kube-base]$ kubectl get ing -n payment-gateway-7682352
NAME                HOSTS     ADDRESS          PORTS     AGE
pgw-nginx-ingress   *         104.198.78.169   80        6h

[msekar@ebs kube-base]$ kubectl describe ing pgw-nginx-ingress -n payment-gateway-7682352
Name:             pgw-nginx-ingress
Namespace:        payment-gateway-7682352
Address:          104.198.78.169
Default backend:  default-http-backend:80 (10.32.1.4:8080)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *     
        /dev/   payment-gateway-dev:5000 (<none>)
        /qa/    payment-gateway-qa:5000 (<none>)
Annotations:
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/ssl-redirect":"false"},"name":"pgw-nginx-ingress","namespace":"payment-gateway-7682352"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"payment-gateway-dev","servicePort":5000},"path":"/dev/"},{"backend":{"serviceName":"payment-gateway-qa","servicePort":5000},"path":"/qa/"}]}}]}}

  kubernetes.io/ingress.class:               nginx
  nginx.ingress.kubernetes.io/ssl-redirect:  false
Events:                                      <none>
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: pgw-nginx-ingress
  namespace: payment-gateway-7682352
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: payment-gateway-dev
          servicePort: 5000
        path: /dev/
      - backend:
          serviceName: payment-gateway-qa
          servicePort: 5000
        path: /qa/
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: pgw-nginx-ingress
  namespace: payment-gateway-7682352
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: payment-gateway-dev
          servicePort: 5000
        path: /dev/(.+)
      - backend:
          serviceName: payment-gateway-qa
          servicePort: 5000
        path: /qa/(.+)