Kubernetes NodePort、LoadBalancer和Ingress介绍

简介: 最近,有人问我NodePorts,LoadBalancers和Ingress之间有什么区别。 它们都是将外部流量引入群集的方式,但是分别以不同的方式完成。 让我们来具体看看它们是如何工作的,以及何时使用它们。
最近,有人问我NodePorts,LoadBalancers和Ingress之间有什么区别。 它们都是将外部流量引入群集的方式,但是分别以不同的方式完成。 让我们来具体看看它们是如何工作的,以及何时使用它们。

注意:此处的所有内容均适用于Google Kubernetes Engine。 如果您在另一个云上运行,使用minikube或其他东西,这些将略有不同。 我也没有深入了解技术细节。 如果您有兴趣了解更多信息, 官方文档 是一个很好的资源!

ClusterIP

ClusterIP服务是默认的Kubernetes服务。 它为您提供集群内的其他应用程序可以访问的服务。 没有外部访问权限。

ClusterIP服务的YAML如下所示:


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

如果您无法从互联网访问ClusterIP服务,我为什么要谈论它呢? 事实证明,您可以使用Kubernetes代理访问它!
1.png

启动Kubernetes代理:
$ 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:http/

什么时候使用Kubernetes Proxy访问服务?

在某些情况下,您可以使用Kubernetes代理来访问您的服务。
  1. 调试您的服务或出于某种原因直接从您的笔记本电脑连接它们
  2. 允许内部流量,显示内部dashboard等

因为此方法要求您作为经过身份验证的用户运行kubectl,所以不应使用此方法将服务公开给Internet或将其用于生产服务。

NodePort

NodePort服务是将外部流量直接发送给您的服务的最原始方式。 顾名思义,NodePort在所有节点(VM)上打开一个特定端口,并且发送到该端口的任何流量都将转发到该服务。
2.png

注意:上图并不是技术上最精确的图示,但我认为它说明了NodePort的工作原理。

NodePort服务的YAML如下所示:
apiVersion: v1
kind: Service
metadata: 
name: my-nodeport-service
spec:
selector: 
app: my-app
type: NodePort
ports: 
- name: http
port: 80
targetPort: 80
nodePort: 30036
protocol: TCP

基本上,NodePort服务与普通的“ClusterIP”服务有两点不同。 首先,类型是“NodePort”。还有一个名为nodePort的附加端口,用于指定在节点上打开的端口。 如果您不指定此端口,它将选择一个随机端口。 大多数时候你应该让Kubernetes选择端口;正如thockin所说,对于你可以使用的端口有很多必要的说明。

什么时候使用这种方法?

这种方法有许多缺点:
  1. 每个端口只能有一个服务
  2. 您只能使用端口30000-32767
  3. 如果您的Node/VM的IP地址发生变化,您需要处理好

出于这些原因,我不建议在生产中使用此方法直接公开您的服务。 如果您运行的服务不必始终可用,或者您的成本非常敏感,则此方法适合您。 比如演示应用程序或临时的东西。

LoadBalancer

LoadBalancer服务是将服务公开给Internet的标准方法。 在GKE上,这将启动 Network Load Balancer ,它将为您提供单个IP地址,以便将所有流量转发到您的服务。
3.png

什么时候使用?

如果要直接公开服务,这是默认方法。 您指定的端口上的所有流量都将转发到该服务。 没有过滤,没有路由等。这意味着您可以向其发送几乎任何类型的流量,如HTTP、TCP、UDP、Websockets、gRPC等等。

最大的缺点是您使用LoadBalancer公开的每个服务都将获得自己的IP地址,并且您必须为每个公开的服务支付LoadBalancer,这可能会变得昂贵!

Ingress

与上述所有示例不同,Ingress实际上不是一种服务。 相反,它位于多个服务的前面,充当集群中的“智能路由器”或入口点。

您可以使用Ingress执行许多不同的操作,并且有许多类型的Ingress控制器,都具有不同的功能。

默认的GKE ingress controller将为您启动 HTTP(S)负载均衡器 。 这将允许您执行基于路径和子域的路由到后端服务。 例如,您可以将 foo.yourdomain.com 上的所有内容发送到foo服务,并将 youdomain.com/bar/ 下的所有内容发送到bar服务。
4.png

使用L7 HTTP负载均衡器的GKE上的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 等。 还有Ingress控制器的插件,如 cert-manager ,可以为您的服务自动配置SSL证书。

如果要在同一IP地址下公开多个服务,Ingress是最有用的,并且这些服务都使用相同的L7协议(通常是HTTP)。 如果您使用GCP集成,您只需支付一个负载均衡器,并且因为Ingress是“智能”的,您可以获得大量开箱即用的功能(如SSL、身份验证、路由等)。

本文转自DockOne-Kubernetes NodePort、LoadBalancer和Ingress介绍

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
1231 115
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
945 2
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
2825 0
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
563 6
|
Kubernetes 网络安全 容器
在K8S中,有个服务使用service的nodeport进行暴露,发现访问不到如何排查?
在K8S中,有个服务使用service的nodeport进行暴露,发现访问不到如何排查?
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
327 0
|
Kubernetes 容器
《基于Kubernetes的互联网Ingress实践》电子版地址
基于Kubernetes的互联网Ingress实践
247 0
《基于Kubernetes的互联网Ingress实践》电子版地址
|
7月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
602 1
|
7月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
425 89

推荐镜像

更多