写点什么

Kubernetes NodePort vs Loadbalancer vs Ingress 在生产中如何选择?

  • 2019-09-25
  • 本文字数:2805 字

    阅读完需:约 9 分钟

Kubernetes NodePort vs Loadbalancer vs Ingress 在生产中如何选择?

最近,有人问我 NodePortLoadBalancers Ingress 之间有什么区别。它们都是将外部流量带入群集的不同方法,并且它们都以不同的方式进行。简单的说,生产环境建议使用 Loadbalancer 和 Ingress,四层(TCP/UDP)代理使用 Loadbalancer,七层(HTTP/HTTPS)代理使用 Ingress。


让我们看一下它们各自的工作方式以及何时使用它们。

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


如果您无法从 Internet 访问 ClusterIP 服务,为什么要谈论它?原来您可以使用 Kubernetes 代理访问它!



启动 Kubernetes 代理:


$ kubectl proxy --port=8080


现在,您可以使用以下方案浏览 Kubernetes API 以访问该服务:


http://localhost:8080/api/v1/proxy/namespaces//services/:/


因此,要访问我们上面定义的服务,您可以使用以下地址:


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

什么时候用代理?

在某些情况下,您将使用 Kubernetes 代理访问服务。


  1. 调试服务,或出于某些原因直接从笔记本电脑连接到服务

  2. 允许内部流量,显示内部仪表板等


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

NodePort

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



原图不准确,具有一定的误导性


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 所说,有许多关于可使用的端口的警告。

什么时候用 NodePort?

此方法有很多缺点:


  • 每个端口只能提供一次服务

  • 您只能使用端口 30000–32767

  • 如果您的节点/ VM IP 地址更改,则需要处理


由于这些原因,不建议在生产中使用此方法直接公开您的服务。如果您运行的服务不一定总是可用,或者您对成本非常敏感,则此方法将对您有用。NodePort 服务一个很好的例子是演示应用程序或临时应用程序。

LoadBalancer

LoadBalancer 服务是将服务公开到 Internet 的标准方法。在华为云 CCE 上,这将启动网络负载均衡器,该网络负载均衡器将为您提供一个 IP 地址,该地址会将所有流量转发到您的服务。

什么时候用 Loadbalancer?

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


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

Ingress

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


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


默认的 CCE Ingress 控制器将为您启动 HTTP(S)负载均衡器,这将使您可以同时进行基于路径和基于子域的到后端服务的路由。例如,您可以将 foo.yourdomain.com 上的所有内容发送到 foo 服务,并将yourdomain.com/bar/路径下的所有内容发送到bar服务。



具有 L7 HTTP 负载均衡器的 CCE 上 Ingress 对象的 YAML 可能看起来像这样:


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 可能是公开服务的最强大方法,但也可能是最复杂的。华为云端负载均衡器,Nginx,Contour,Istio 等,有很多类型的 Ingress 控制器。还有一些用于 Ingress 控制器的插件,例如 cert-manager,可以为您的服务自动设置 SSL 证书。


如果要在同一 IP 地址下公开多个服务,并且这些服务都使用相同的 L7 协议(通常为 HTTP),则 Ingress 最有用。


原文地址:


https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0


2019-09-25 13:153994

评论

发布
暂无评论
发现更多内容

Linux 6.0 第一个候选版本发布

雨果

Liunx

组件解析:基础组件button的实现

独来独往

大前端 低代码 可视化 组件化 低代码平台

GitHub标星139K的:“嵌入式Linux系统开发教程”

收到请回复

Java Linux 程序员 嵌入式 #运维

少儿编程是智商税吗?不花钱让孩子赢在起跑线!

博文视点Broadview

开源一夏 | 使用 JavaScript 将文本转换为文件

海拥(haiyong.site)

JavaScript GitHub 开源 前端 8月月更

一文搞定架构思维,DFD 的结构化分析,只需明白这3点

老崔说架构

阿里云鲍文乐:基于事件的自动化运维最佳实践

阿里云弹性计算

事件 自动化运维 CloudOps

什么是文件存储?与对象存储有什么区别?

wljslmz

文件存储 8月月更

乔布斯之后,下一代触控交互由一家中国公司重新定义

硬科技星球

Solana上的结算协议龙头,Zebec潜力颇受看好

小哈区块

迄今为止最完整的DDD实践

阿里技术

DDD 经验分享

Promise.allSettled 的 Polyfill 处理

汪子熙

JavaScript Promise Async 8月月更 web编程

设备管理|风机的日常运行与维护

PreMaint

企业设备管理 预测性维护 设备健康管理 风机的日常运维

阿里最新的Spring Boot项目开发实战手册,掀起了项目实战变革狂潮

Java面试那些事儿

Java 编程 程序员 面试 架构师

C#/VB.NET 替换 PDF 文件上的现有图像

在下毛毛雨

C# .net PDF 替换图像

怎么分辨企业转型是“真数字化”还是 “伪数字化”?

雨果

数字化转型

数据工程师越做越有成就感的7点经验分享

雨果

数据工程师

美国商务部宣布:EDA等四项技术实施新的出口管制,8月15日生效!

雨果

芯片技术

AntDB基于WAL日志的DML数据闪回实现

亚信AntDB数据库

AntDB 国产数据库 AISWare AIDB

泄露了,Alibaba697页的MySQL应用实战与性能调优手册,太强了

Java编程日记

Java 编程 程序员 面试 架构师

从入门到高手,数据从业者成长一般经过哪些阶段?

雨果

数据工程师必备技能

区块链带你避“坑”,电信诈骗退!退!退!

旺链科技

区块链 产业区块链 电信诈骗

为Bert注入知识的力量 Baidu-ERNIE & THU-ERNIE & KBert

了不起的程序猿

Java 编程 后端 java程序员 BERT

CSS

武师叔

8月月更

借我 1 小时,与 1000 人一起参与开源

腾源会

开源 腾源会

JSON 之父:JavaScript 已经成为了进步的障碍

雨果

JavaScript

如何在企业数字化团队内部实现分析建模过程全要素的可获得与成果可复现

ModelWhale

团队协作 数字化转型 全要素场景 代码复现 金融场景

QCA9880 wallys 2×2 MIMO 802.11ac Mini PCIe 2,4GHz / 5GHz Designed for E

wallys-wifi6

Node 之父着急宣布Deno 将迎来重大变革,疑为针对最近大火的“Bun”

雨果

node.js

QCA9882 wallys 802.11AC 802.11AN wifi QCA9882 Module Wireless AC/AN MiniPCIE Standard Card

wallys-wifi6

QCA9882

TiFlash 源码阅读(六)DeltaTree Index 的设计和实现分析

PingCAP

TiDB TiDB 源码解读

Kubernetes NodePort vs Loadbalancer vs Ingress 在生产中如何选择?_云原生_华为云原生团队_InfoQ精选文章