Kubernetes 系列(八):Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress[亲测有效]

Kubernetes 系列(八):Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress[亲测有效]
作者:池剑锋 译来源:Docker|2018-04-12 13:35 最近有些同学问我 NodePort,LoadBalancer 和 Ingress 之间…

Kubernetes 系列(八):Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress[数据库教程]

作者:池剑锋 译来源:Docker|
2018-04-12 13:35

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

注意:这里说的每一点都基于Google Kubernetes Engine。如果你用 minikube 或其它工具,以预置型模式(om prem)运行在其它云上,对应的操作可能有点区别。我不会太深入技术细节,如果你有兴趣了解更多,官方文档[1]是一个非常棒的资源。

技术分享图片

ClusterIP

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

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

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata:   
  4.   name: my-internal-service 
  5. selector:     
  6.   app: my-app 
  7. spec: 
  8.   type: ClusterIP 
  9.   ports:   
  10.   – name: http 
  11.     port: 80 
  12.     targetPort: 80 
  13.     protocol: TCP 

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

技术分享图片

启动 Kubernetes proxy 模式:

  1. $ kubectl proxy –port=8080 

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

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

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

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

何时使用这种方式?

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

  • 由于某些原因,你需要调试你的服务,或者需要直接通过笔记本电脑去访问它们。
  • 容许内部通信,展示内部仪表盘等。

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

NodePort

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

技术分享图片

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

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata:   
  4.   name: my-nodeport-service 
  5. selector:     
  6.   app: my-app 
  7. spec: 
  8.   type: NodePort 
  9.   ports:   
  10.   – name: http 
  11.     port: 80 
  12.     targetPort: 80 
  13.     nodePort: 30036 
  14.     protocol: TCP 

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

何时使用这种方式?

  1. 这种方法有许多缺点:
  2. 每个端口只能是一种服务
  3. 端口范围只能是 30000-32767

如果节点/VM 的 IP 地址发生变化,你需要能处理这种情况

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

LoadBalancer

LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个 Network Load Balancer[2],它将给你一个单独的 IP 地址,转发所有流量到你的服务。

技术分享图片

何时使用这种方式?

如果你想要直接暴露服务,这就是默认方式。所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。

这个方式的最大缺点是每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费,这将是非常昂贵的。

Ingress

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

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

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

技术分享图片

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

  1. apiVersion: extensions/v1beta1 
  2. kind: Ingress 
  3. metadata: 
  4.   name: my-ingress 
  5. spec: 
  6.   backend: 
  7.     serviceName: other 
  8.     servicePort: 8080 
  9.   rules: 
  10.   – host: foo.mydomain.com 
  11.     http: 
  12.       paths: 
  13.       – backend: 
  14.           serviceName: foo 
  15.           servicePort: 8080 
  16.   – host: mydomain.com 
  17.     http: 
  18.       paths: 
  19.       – path: /bar/* 
  20.         backend: 
  21.           serviceName: bar 
  22.           servicePort: 8080 

何时使用这种方式?

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

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

相关链接:

https://kubernetes.io/docs/concepts/services-networking/service/

https://cloud.google.com/compute/docs/load-balancing/network/

https://cloud.google.com/compute/docs/load-balancing/http/

https://cloud.google.com/compute/docs/load-balancing/http/

https://github.com/jetstack/cert-manager

Kubernetes 系列(八):Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress

原文:https://www.cnblogs.com/-wenli/p/13643781.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6695.html

(0)
上一篇 2023-04-05
下一篇 2023-04-05

相关推荐

  • Python格式化输出指南

    Python格式化输出指南在Python中,格式化输出是一种常见的需求。它可以帮助我们将变量、字符串等数据以某个特定的格式输出到屏幕上,使程序的输出更加清晰明了。在本篇文章中,我们将深入探讨Python格式化输出的方法和技巧,帮助读者更好地理解和掌握这一方面的知识。

    2024-08-02
    29
  • centos7安装docker,再在docker上安装mysql5.7「建议收藏」

    centos7安装docker,再在docker上安装mysql5.7「建议收藏」1.使用命令查看Linux内核是否在3.10以上 uname -r 如果Linux内核没有在3.10以上,则使用下面的命令升级内核版本 yum update -y 安装必要的软件包 yum inst…

    2023-03-09
    170
  • [mybatis]快速搭建一个mybatis程序,实现对数据的增删改查

    [mybatis]快速搭建一个mybatis程序,实现对数据的增删改查什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 MyB

    2023-05-28
    149
  • 如何通过Oracle实现自动发邮件功能

    如何通过Oracle实现自动发邮件功能在内网项目、外网项目中多有 需要自动监控发邮件提醒的功能,因为邮件功能最便捷、便宜、不用开接口,不用接口费用。现 提供 我在一个内网项目中的使用案例: 案例背景: 在有限的资源下,能够自动给下级单位发

    2022-12-28
    129
  • Python中的迭代器

    Python中的迭代器Python中的迭代器是Python编程中的一个重要概念,也是Python语言中实现循环结构的基础,它的使用可以简化代码、提高程序执行效率,这里我们将着重介绍Python中的迭代器,深入探究迭代器的本质和作用,帮助读者进一步了解Python编程技术。

    2024-08-11
    31
  • 墙裂推荐一波mysql学习资源[通俗易懂]

    墙裂推荐一波mysql学习资源[通俗易懂]在日常工作与学习中,无论是开发、运维、测试,还是架构师,数据库是一门必不可少的”必修课”, 也是必备的涨薪神器。在互联网公司中,开源数据库用得比较多的当属 MySQL 了。 但mysql知识面非常广,

    2023-04-15
    146
  • Python计算时间差

    Python计算时间差在Python编程中,我们通常需要计算时间差。时间差就是在两个时间点之间相隔的时间。比如我们想要知道两个事件发生的时间差,或者我们需要计算程序运行的时间等等,这时就需要用到Python的时间模块。

    2024-04-24
    48
  • Python框架入门指南:快速创建Web应用程序

    Python框架入门指南:快速创建Web应用程序Python作为一门优雅、简洁、易读的编程语言,深受开发者喜爱。随着Web应用程序的不断普及,使用Python框架创建Web应用程序也变得越来越流行。

    2023-12-09
    119

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注