博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes
阅读量:4704 次
发布时间:2019-06-10

本文共 2922 字,大约阅读时间需要 9 分钟。

原文:

当我们使用k8s集群部署好应用的Service时,默认的Service类型是ClusterIP,这种类型只有 Cluster 内的节点和 Pod 可以访问。如何将应用的Service暴露给Cluster外部访问呢,Kubernetes 提供了多种类型的 Service,如下:

ClusterIP


ClusterIP服务是Kuberntets的默认服务。它在集群内部生成一个服务,供集群内的其他应用访问。外部无法访问。

ClusterIP服务的 YAML 文件如下:

apiVersion: v1kind: Servicemetadata:    name: my-internal-serviceselector:      app: my-appspec:  type: ClusterIP  ports:    - name: http    port: 80    targetPort: 80    protocol: TCP

如果不能从互联网访问ClusterIP服务,那我们还介绍它干啥?其实,我们可以使用Kubernetes proxy来访问它!

 

开启Kubernetes Proxy:

$ 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 proxy来访问服务:

  1. 调试服务,或者是因为某些原因需要从电脑直接连接服务;

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

这个访问需要你作为一个已验证的用户去运行kubectl,所以不要通过这种方式将服务发布到互联网,或者是在生产环境下使用。

NodePort


NodePort服务是让外部流量直接访问服务的最原始方式。NodePort,顾名思义,在所有的节点(虚拟机)上开放指定的端口,所有发送到这个端口的流量都会直接转发到服务。

NodePort服务的YAML文件如下:

apiVersion: v1kind: Servicemetadata:   name: my-nodeport-serviceselector:    app: my-appspec: type: NodePort ports:   - name: http  port: 80  targetPort: 80  nodePort: 30036  protocol: TCP

从本质上来看,NodePort服务有两个地方不同于一般的“ClusterIP”服务。首先,它的类型是“NodePort”。还有一个叫做“nodePort"的端口,能在节点上指定开放哪个端口。如果没有指定端口,它会选择一个随机端口。大多数时候应该让Kubernetes选择这个端口,就像谷歌领导人Thockin说的,关于能使用哪些端口,有很多注意事项。

使用场景

这种方式有一些不足:

  1. 一个端口只能供一个服务使用;

  2. 只能使用30000–32767的端口;

  3. 如果节点 / 虚拟机的IP地址发生变化,需要进行处理。

因此,我不推荐在生产环境使用这种方式来直接发布服务。如果不要求运行的服务实时可用,或者在意成本,这种方式适合你。例如用于演示的应用或是临时运行就正好用这种方法。

LoadBalancer


LoadBalancer服务是发布服务到互联网的标准方式。在GKE中,它会启动一个Network Load Balancer,分配一个单独的IP地址,将所有流量转发到服务中。

 

使用场景

如果你想直接发布服务,这是默认方式。指定端口的所有流量都会转发到服务中,没有过滤,也没有路由。这意味着你几乎可以发送任意类型的流量到服务中,比如HTTP、TCP、UDP、Websockets、gRPC等等。

这里最大的不足是,使用LoadBalancer发布的每个服务都会有一个自己的IP地址,你需要支付每个服务的LoadBalancer 费用,这是一笔不小的开支。

Ingress 


Ingress实际上不是一种服务。相反,它在多个服务前面充当“智能路由”的角色,或者是集群的入口。

使用Ingress可以做很多事情,不同类型的Ingress控制器有不同的功能。

默认的GKE ingress控制器会启动一个 HTTP(S) Load Balancer,可以通过基于路径或者是基于子域名的方式路由到后端服务。例如,可以通过foo.yourdomain.com 发送任何东西到foo服务,或者是发送yourdomain.com/bar/路径下的任何东西到bar服务。

对于使用第 7 层HTTP Load Balancer 的GKE上的Ingress对象,其YAML文件如下:

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: my-ingressspec:  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控制器插件,比如证书管理器,可以自动为服务提供SSL认证。

如果想在同一个IP地址下发布多个服务,并且这些服务使用相同的第 7 层协议(通常是 HTTP),Ingress是最有用的。如果使用原生的GCP集成,只需要支付一个负载均衡器的费用。因为Ingress是“智能”的,你可以得到很多开箱即用的特性(比如SSL、认证、路由等)。

实践


NodePort:

Ingress:等待正在更新中.....

 

转载于:https://www.cnblogs.com/justmine/p/8628465.html

你可能感兴趣的文章
常用服务安装部署
查看>>
checkBox多项选择
查看>>
函数:数组作为函数参数进行操作
查看>>
java循环
查看>>
翻译:INSERT(已提交到MariaDB官方手册)
查看>>
p4lang/switch make bm-switchsai 出现内存不足导致的Error
查看>>
jquery倾斜的动画导航菜单
查看>>
Android的AsyncTask类的解读 分类: Android ...
查看>>
JAVA IO流的简单总结+收集日志异常信息
查看>>
人脸识别
查看>>
LINQ学前准备之Lambda Expressions
查看>>
Android开发之回调函数
查看>>
数据归一化
查看>>
系统进程 zygote(一)—— 概述
查看>>
【翻译】Delphi中类的逆向工程
查看>>
我的Cocos2d-x学习笔记(二)AppDelegate补充介绍
查看>>
java获取中文拼音首字母工具类
查看>>
HDU 1729 Stone Game【SG函数】
查看>>
如何使用Vue实现拖拽效果pageY、screenY、clientY、layerY、offsetY(转)
查看>>
[Bzoj1009][HNOI2008]GT考试(KMP)(矩乘优化DP)
查看>>