技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?

Posted Wise2C

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?相关的知识,希望对你有一定的参考价值。


【编者的话】本文分析了 NodePort,LoadBalancer 和 Ingress 这三种访问服务方式的使用方式和使用场景,指出了各自的优缺点,帮助用户基于自己的场景做出更好的决策。


最近有些同学问我 NodePort,LoadBalancer 和 Ingress 之间的区别。它们都是将集群外部流量导入到集群内的方式,只是实现方式不同。让我们看一下它们分别是如何工作的,以及你该如何选择它们。

注意:这里说的每一点都基于Google Kubernetes Engine。如果你用 minikube 或其它工具,以预置型模式(om prem)运行在其它云上,对应的操作可能有点区别。


ClusterIP


ClusterIP 服务是 Kubernetes 的默认服务。它给你一个集群内的服务,集群内的其它应用都可以访问该服务。集群外部无法访问它。


ClusterIP 服务的 YAML 文件类似如下:

快速搭建,本文基于Docker的方式来安装server。也可参考官方文档进行安装


apiVersion: v1 kind: Service metadata:   name: my-internal-service selector:     app: my-app spec: type: ClusterIP ports:   - name: http port: 80 targetPort: 80 protocol: TCP


如果 从Internet 没法访问 ClusterIP 服务,那么我们为什么要讨论它呢?那是因为我们可以通过 Kubernetes 的 proxy 模式来访问该服务!


技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?


启动 Kubernetes proxy 模式:


$ kubectl proxy --port=8080

这样你可以通过Kubernetes API,使用如下模式来访问这个服务:


http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/



http://localhost:8080/api/v1/proxy/namespaces/default/services/my-internal-service



何时使用这种方式?


有一些场景下,你得使用 Kubernetes 的 proxy 模式来访问你的服务:


  1. 由于某些原因,你需要调试你的服务,或者需要直接通过笔记本电脑去访问它们。


  2. 容许内部通信,展示内部仪表盘等。


这种方式要求我们运行 kubectl 作为一个未认证的用户,因此我们不能用这种方式把服务暴露到 internet 或者在生产环境使用。


NodePort


NodePort 服务是引导外部流量到你的服务的最原始方式。NodePort,正如这个名字所示,在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。

技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?


NodePort 服务的 YAML 文件类似如下:


apiVersion: v1 kind: Service metadata:   name: my-nodeport-service selector:     app: my-app spec: type: NodePort ports:   - name: http port: 80 targetPort: 80 nodePort: 30036 protocol: TCP


NodePort 服务区别于普通的“ClusterIP”服务在于它的类型是“NodePort”。有一个额外的端口,称为 nodePort,它指定节点上开放的端口值 。如果你不指定这个端口,系统将选择一个随机端口。大多数时候我们应该让 Kubernetes 来选择端口,因为如评论中 thockin 所说,用户自己来选择可用端口代价太大。


何时使用这种方式?


这种方法有许多缺点:


  1. 每个端口只能是一种服务

  2. 端口范围只能是 30000-32767


基于以上原因,我不建议在生产环境上用这种方式暴露服务。如果你运行的服务不要求一直可用,或者对成本比较敏感,你可以使用这种方法。这样的应用的最佳例子是 demo 应用,或者某些临时应用。


LoadBalancer



技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?


何时使用这种方式?



 

Ingress


有别于以上所有例子,Ingress 事实上不是一种服务类型。相反,它处于多个服务的前端,扮演着“智能路由”或者集群入口的角色。


你可以用 Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能力。

GKE 上的默认 ingress 控制器是启动一个 HTTP(S) Load Balancer。它允许你基于路径或者子域名来路由流量到后端服务。例如,你可以将任何发往域名 foo.yourdomain.com 的流量转到 foo 服务,将路径 yourdomain.com/bar/path 的流量转到 bar 服务。


技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?


GKE 上用 L7 HTTP Load Balancer 生成的 Ingress 对象的 YAML 文件类似如下:


apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress spec: backend: serviceName: other servicePort: 8080 rules: - host: foo.mydomain.com http:   paths:   - backend:       serviceName: foo       servicePort: 8080 - host: mydomain.com http:   paths:   - path: /bar/*     backend:       serviceName: bar       servicePort: 8080


何时使用这种方式?


Ingress 可能是暴露服务的最强大方式,但同时也是最复杂的。Ingress 控制器有各种类型,包括 Google Cloud Load Balancer, nginx,Contour,Istio,等等。它还有各种插件,比如 cert-manager,它可以为你的服务自动提供 SSL 证书。

如果你想要使用同一个 IP 暴露多个服务,这些服务都是使用相同的七层协议(典型如 HTTP),那么Ingress 就是最有用的。如果你使用本地的 GCP 集成,你只需要为一个负载均衡器付费,且由于 Ingress是“智能”的,你还可以获取各种开箱即用的特性(比如 SSL,认证,路由,等等)。


END

技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?



关于Wise2C睿云智合


技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?


睿云智合为企业级客户提供基于容器的云计算技术服务及PaaS平台产品(WiseCloud),包括容器技术应用、容器云平台建设、混合云管理、持续交付及自动化运维的成熟产品以及专业技术服务、培训、咨询等服务为企业输出容器技术落地最佳实践,帮助企业及早打造支撑未来金融科技发展战略的云计算基础平台;同时,睿云智合遵循战略规划与多家金融科技合作伙伴启动了行业应用支持项目;未来,睿云智合以Wise2C行业应用云平台产品为依托,聚焦金融科技领域,携手更多合作伙伴,为传统企业提供更多以一键部署私有化交付或SaaS服务交付的创新应用。


客户&合作伙伴

技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?


请大家关注【Wise2C】并回复【进群】,睿云小助手会第一时间拉你进入【 Docker企业落地实践群】,我们分享的各个企业案例项目的技术专家与用户代表,正在敬候您的光临!

若需要了解更多有关Wise系列PaaS产品的详情,请与我们的市场团队联系:contact@wise2c.com


关注

微信:Wise2C

官网:wise2c.com

以上是关于技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?的主要内容,如果未能解决你的问题,请参考以下文章

技术漫谈 | Kubernetes 的 NodePort,LoadBalancer 和 Ingress 该如何选择?

技术漫谈 | 使用Istio治理微服务入门

技术漫谈 | Jenkins X 还是 2.0?

漫谈容器网络

漫谈微服务与DevOps:如何在实践中快速落地?

尝试使用 helm 在 Kubernetes Pod 中启动时,Keycloak 崩溃