Kubernetes,GCE,负载均衡,SSL

时间:2017-01-02 18:15:55

标签: ssl nginx load-balancing kubernetes

前言我正在研究GCE和Kuberenetes。我的目标只是通过SSL公开我的集群上的所有微服务。理想情况下,它与通过type ='LoadBalancer'公开部署并获得单个外部IP时的工作方式相同。这是我的目标,但SSL不适用于那些基本负载均衡器。

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

enter image description here

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

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

  1. 当我为后端(微服务)公开服务资源时,我使用了一个指南,使用了type ='NodePort',另一个只是放了一个端口来访问服务。两者都将目标端口设置为后端应用程序端口。我尝试了这两种方式,它们似乎都有效。指南一来自上面的链接。指南2:http://blog.kubernetes.io/2016/03/Kubernetes-1.2-and-simplifying-advanced-networking-with-Ingress.html。这有什么区别?

  2. 另一个令人困惑的地方是我的入口总是有两个IP。我最初的思考过程是应该只有一个外部ip,这将击中我的入口,然后由nginx指导路由。或者是ip直接到nginx?无论如何,创建的第一个IP地址似乎给了我预期的结果,因为访问第二个IP失败了。

  3. 尽管我的困惑似乎在HTTP上工作得很好。通过HTTPS而不是那么多。起初,当我通过https发出Web请求时,事情就会挂起。我在我的防火墙规则上打开了443这似乎有效,但是我会打到我的默认后端而不是我的微服务。

    阅读让我从Kubernetes docs了解到:目前Ingress资源仅支持http规则。 这可以解释为什么我要使用默认后端,因为我的规则仅适用于HTTP。但是,如果是这样,我应该如何使用这种方法进行SSL?

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

    非常感谢任何帮助或指导。谢谢!

2 个答案:

答案 0 :(得分:5)

因此,对于#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 docsNodePort的含义有很好的描述 - 基本上,服务将在群集中的每个节点上从高范围分配端口,节点将从该端口转发流量为您服务。这是在不同环境中设置负载平衡器的一种方法,但对于您的方法,这不是必需的。您可以省略微服务服务的type字段,并为其分配默认类型ClusterIP

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

我还要检查nginx控制器的日志 - 找出它与kubectl get pods一样运行的pod,然后拖尾它的日志:kubectl logs nginx-pod-<some-random-hash> -f。这将有助于确定您是否错误配置了任何内容,例如服务是否配置了任何端点。大多数时候我搞砸了入口的东西,这是由于服务/部署的一些非常基本的错误配置。

您还需要为指向LoadBalancer的静态IP的主机名设置DNS记录,或者使用cURL的-H flag as they do in the docs ping您的服务,否则您最终可能会被路由到默认后端404。

答案 1 :(得分:1)

直接回答你的问题,因为这就是重点......免责声明:我是一个n00b,所以要把这一切都拿出来。

关于#2,我链接到下面的博客文章提出了以下架构:

  • 创建部署nginx控制器窗格的部署
  • 使用类型LoadBalancer和将流量路由到控制器窗格的静态IP创建服务
  • 创建由nginx控制器窗格使用的入口资源
  • 创建一个由nginx控制器pod用于终止SSL的秘密
  • 还有其他东西

根据我的理解,http vs https的内容与nginx控制器pod一起发生。我的所有入口规则也都是http,但是nginx入口控制器强制使用SSL并处理所有这些,在控制器上终止SSL,以便其下面的所有内容(所有入口内容)都可以是HTTP。我有所有的http规则,但通过LoadBalancer服务的所有流量都被强制使用SSL。

同样,我是一个n00b。拿这一切都是一粒盐。我是以外行人的话说话,因为我是一个外行人试图弄明白这一切。

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

你可能已经过了这个东西了,现在已经过了几个月了。但也许这会帮助别人,即使它没有帮助你:

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

它帮助我了解需要创建哪些资源,如何部署控制器pod,以及如何公开控制器pod(使用静态IP为控制器pod创建LoadBalancer服务),还强制使用SSL。它帮助我跳过了几个障碍并超越了所有移动部件如何组合在一起#34;。

Kubernetes技术文档对于如何使用每一件作品都有帮助,但并不是必须全力以赴,像这篇博文一样把它们拼凑起来。免责声明:博客文章中的模型可能不是最好的方式(我没有足够的经验来打电话),但它确实帮助我至少得到一个nginx入口控制器的工作示例这迫使SSL。

希望这最终有助于某人。

安德鲁