2017-01-02 116 views
3

我对网络,SSL和NGINX有点新鲜,因此如果我错过了某些明显的东西,那么这些东西就会裸露出来。为了说明这一点,我正在研究GCE和Kuberenetes。我的目标仅仅是通过SSL公开群集上的所有微服务。理想情况下,它的工作方式与通过type ='LoadBalancer'公开部署并获取单个外部IP时的工作方式相同。这是我的目标,但SSL不适用于这些基本的负载平衡器。Kubernetes,GCE,负载均衡,SSL

从我的研究中,当前最好的解决方案是设置一个nginx入口控制器,使用入口资源和服务来公开我的微服务。下面是我对这个过程的理解所绘制的图表。

enter image description here

我已经得到了这一切能够成功通过HTTP。我从这里部署了默认的nginx控制器:https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx。以及缺省后端的默认后端和服务。我自己的微服务的入口将规则设置为我的域名和路径:/。

这很成功,但有两件事让我感到困惑。

  1. 当暴露的服务资源为我的后端(微服务)一个导向我跟着常用的类型=“NodePort”,另一只是把一个端口到达服务。两者都将目标端口设置为后端应用程序端口。我尝试了这两种方式,他们都似乎工作。引导一个是从上面的链接。指南2:http://blog.kubernetes.io/2016/03/Kubernetes-1.2-and-simplifying-advanced-networking-with-Ingress.html。这里有什么不同?

  2. 另一个混淆之处是我的入口总是有两个IP。我最初的思考过程是应该只有一个外部IP,这会打到我的入口,然后由nginx指导路由。或者是直接向nginx的ip?无论如何,创建的第一个IP地址似乎给了我访问第二个IP失败的预期结果。

尽管我很困惑,但事情似乎在HTTP上正常工作。通过HTTPS不是那么多。起初,当我通过https发起网络请求时,事情就会挂起。我在我的防火墙规则上打开了443个似乎可行的工作,但是我打到了默认的后端而不是我的微服务。

阅读引导我从Kubernetes文档中得知:目前,Ingress资源仅支持http规则。 这可以解释为什么我点击默认后端,因为我的规则只适用于HTTP。但是,如果是这样,我应该如何使用SSL的这种方法?

我注意到的另一件事是,如果我编写一个没有规则的入口资源,并给它我想要的后端,我仍然被定向到我原来的默认后端。这更奇怪,因为kubectl描述更新,并指出我的默认后端是我想要的后端...

任何帮助或指导将不胜感激。谢谢!

+0

您可以将您的JSON/YAML文件入口和服务的配置? –

回答

4

因此,对于#2,您可能最终会配置Google HTTP(S)LoadBalancer,可能是因为您缺少kubernetes.io/ingress.class: "nginx"注释,如此处所述:https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx#running-multiple-ingress-controllers

GKE拥有自己的入口控制器,您需要通过在nginx部署上粘贴该注释来重写。 This article对这些东西有很好的解释。

kubernetes docs有什么NodePort意味着一个很好的说明 - 基本上,该服务将从高范围在群集中的每个节点分配一个端口和节点会转发流量从该端口为你服务。这是在不同环境中设置负载均衡器的一种方式,但对于您的方法而言,这不是必需的。您可以省略微服务的服务的type字段,它将被分配默认类型,即ClusterIP

至于SSL,它可能是一些不同的东西。我会确保你已经设置了秘密,就像他们在nginx controller docs中所描述的那样,例如使用tls.certtls.key字段。

我也会检查nginx控制器的日志 - 找出它运行的是哪个pod,与kubectl get pods一样,然后拖拽它的日志:kubectl logs nginx-pod-<some-random-hash> -f。这将有助于确定您是否配置了任何错误,例如服务没有配置任何端点。大部分时间我都搞砸了入侵的东西,这是由于服务/部署的一些非常基本的错误配置。

您还需要设置DNS记录为您的主机名指向负载均衡器的静态IP,否则ping通与卷曲的-Hflag as they do in the docs您服务,否则你可能最终得到路由到默认后端404

1

直接回应你的问题,因为这是整个点...免责声明:我是一个n00b,所以把这一切都用一粒盐。

对于#2,博客文章我链接下面提示如下结构:

  • 创建部署nginx的控制器荚
  • 创建一个类型负载平衡器和静态的服务的部署IP的路由流量控制器荚
  • 创建一个入口的资源,被使用nginx的控制器荚
  • 创建被使用nginx的控制器荚终止SSL
  • 秘密
  • 和其他的东西太

据我了解,在HTTP和https的事情发生与nginx的控制器豆荚。我的所有入口规则也都是http,但是nginx入口控制器强制SSL并负责所有这些,终止控制器上的SSL,以便低于它的所有入口内容都可以是HTTP。我有所有http规则,但是通过LoadBalancer服务的所有流量都被迫使用SSL。

再次,我是一个n00b。把这一切都用一粒盐。我用外行人的话来说,因为我是一个外行人,试图把这一切都弄清楚。

我遇到你的问题,同时寻找一些自己的问题的答案。我遇到了很多与你碰到的相同的问题(我假设过去时已经过去了)。我想指出你(和/或其他有类似问题的人)的博客文章,我发现在学习nginx控制器时很有帮助。到目前为止(我还处于早期阶段,正在使用这篇文章),帖子中的所有内容都起作用了。

你可能已经过去了,现在已经过了几个月了。但也许这将帮助别人,即使它不能帮助你:

https://daemonza.github.io/2017/02/13/kubernetes-nginx-ingress-controller/

它帮助我理解需要什么样的资源来创建,如何部署控制器吊舱,以及如何公开控制器荚(创建一个静态IP控制器荚负载均衡器服务),也迫使SSL。它帮助我跳过一些障碍,让过去的“如何做所有的运动部件结合在一起”。

的Kubernetes技术文档是如何使用每件有益的,但像他这样的博客文章确实不一定把钱全出来,一巴掌拼在一起。免责声明:博客文章的模式可能不是最好的办法,虽然这样做(我没有足够的经验来打这通电话),但它确实帮助我至少也得强迫Nginx上进入控制器的工作示例SSL。

希望这可以帮助别人也说不定。

安德鲁