无法通过Nginx-ingress-controller访问Kubernetes ClusterIP服务

时间:2019-03-15 23:34:53

标签: nginx kubernetes kubernetes-ingress

我是一个Kubernetes业余爱好者,试图在GKE上使用NGINX入口控制器。我正在关注this谷歌云文档以为我的服务设置NGINX Ingress,但是在访问NGINX位置时遇到了问题。

正在做什么?

  1. 使用Helm的Ingress-Controller部署(已启用RBAC)
  2. ClusterIP服务部署

什么不起作用?

  1. 使用唯一路径(扇出路由)显示多个ClusterIP服务的入口资源

K8S服务

[msekar@ebs kube-base]$ kubectl get services -n payment-gateway-7682352
NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                      AGE
nginx-ingress-controller        LoadBalancer   10.35.241.255   35.188.161.171   80:31918/TCP,443:31360/TCP   6h
nginx-ingress-default-backend   ClusterIP      10.35.251.5     <none>           80/TCP                       6h
payment-gateway-dev             ClusterIP      10.35.254.167   <none>           5000/TCP                     6h
payment-gateway-qa              ClusterIP      10.35.253.94    <none>           5000/TCP                     6h

K8S入口

[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/

其他信息

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

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

例如,“ payment-gateway-dev”服务使用上下文/ pgw / v1上下文,因此只能通过该上下文访问部署。要访问应用程序的规范,您可以使用URL

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

我的部署行为

  

ingress-controller-LB-ip = 35.188.161.171

对于我可能做错的任何建议或见解,将不胜感激。

2 个答案:

答案 0 :(得分:2)

+1是这个很好问的问题。

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

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

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/(.+)

此后,您的服务应该会收到正确的上下文。

参考:

答案 1 :(得分:0)

另一种方法是使用基于主机的路由。您只需为Ingress静态IP(pgw-dev.foo.com,pgw-qa.foo.com)创建几个CNAME DNS条目,然后用host:属性替换path:属性。无需重写URL。

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

例如,如果将DEV和QA划分为单独的群集,则无需更改其配置(并且K8s模板将可重用)。只需更新DNS。如果您想启动一个新的Staging或Performance Test环境,那么,您现有的测试工具应该很容易适应新的环境:只需在配置中更改主机名即可。

随着时间的流逝,我认为您会发现主机名是比路径前缀更自然的区分环境的方式。