前言我正在研究GCE和Kuberenetes。我的目标只是通过SSL公开我的集群上的所有微服务。理想情况下,它与通过type ='LoadBalancer'公开部署并获得单个外部IP时的工作方式相同。这是我的目标,但SSL不适用于那些基本负载均衡器。
从我的研究中,目前最好的解决方案是建立一个nginx入口控制器,使用入口资源和服务来公开我的微服务。下面是我对这个过程的理解所绘制的图表。
我已经通过HTTP成功完成了这一切。我从这里部署了默认的nginx控制器:https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx。以及默认后端的默认后端和服务。我自己的微服务的入口有规则设置为我的域名和路径:/。
这很成功,但有两件事让我感到困惑。
当我为后端(微服务)公开服务资源时,我使用了一个指南,使用了type ='NodePort',另一个只是放了一个端口来访问服务。两者都将目标端口设置为后端应用程序端口。我尝试了这两种方式,它们似乎都有效。指南一来自上面的链接。指南2:http://blog.kubernetes.io/2016/03/Kubernetes-1.2-and-simplifying-advanced-networking-with-Ingress.html。这有什么区别?
另一个令人困惑的地方是我的入口总是有两个IP。我最初的思考过程是应该只有一个外部ip,这将击中我的入口,然后由nginx指导路由。或者是ip直接到nginx?无论如何,创建的第一个IP地址似乎给了我预期的结果,因为访问第二个IP失败了。
尽管我的困惑似乎在HTTP上工作得很好。通过HTTPS而不是那么多。起初,当我通过https发出Web请求时,事情就会挂起。我在我的防火墙规则上打开了443这似乎有效,但是我会打到我的默认后端而不是我的微服务。
阅读让我从Kubernetes docs了解到:目前Ingress资源仅支持http规则。 这可以解释为什么我要使用默认后端,因为我的规则仅适用于HTTP。但是,如果是这样,我应该如何使用这种方法进行SSL?
我注意到的另一件事是,如果我编写一个没有规则的入口资源并给它我想要的后端,我仍然会被定向到我原来的默认后端。这更奇怪,因为kubectl描述更新并声明我的默认后端是我想要的后端......
非常感谢任何帮助或指导。谢谢!
答案 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 docs对NodePort
的含义有很好的描述 - 基本上,服务将在群集中的每个节点上从高范围分配端口,节点将从该端口转发流量为您服务。这是在不同环境中设置负载平衡器的一种方法,但对于您的方法,这不是必需的。您可以省略微服务服务的type
字段,并为其分配默认类型ClusterIP
。
至于SSL,它可能是一些不同的东西。我会确保你按照他们在nginx controller docs中描述的那样设置秘密,例如使用tls.cert
和tls.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,我链接到下面的博客文章提出了以下架构:
根据我的理解,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。
希望这最终有助于某人。
安德鲁