概要

将服务暴露给外部的方式主要有三种:

  1. NodePort
  2. LoadBalancer
  3. Ingress

在没有上面三种方式前,集群中只有ClusterIP,它是集群内的服务,集群外部无法访问。

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

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

此时如果想不适用那三种方式来从外部访问集群的话,只能使用代理proxy,但是不能发布到IInternet上。

kubectl proxy --port=8080

访问流程如下:
在这里插入图片描述

NodePort

NodePort 服务是引导外部流量到你的服务的最原始方式。在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。
应用场景: demo 应用,或者某些临时应用。
缺点:

  1. 每个端口只能是一种服务
  2. 端口范围只能是 30000-32767
  3. 如果节点/VM 的 IP 地址发生变化,需要做处理

请求流程如下:

在这里插入图片描述

LoadBalancer

缺点:没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类。
另外每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费,这将是非常昂贵的。

请求流程如下:

在这里插入图片描述

Ingress

应用场景:使用同一个 IP 暴露多个服务。
Ingress在网络栈(HTTP)的应用层操作,并且可以提供一些服务不能实现的功能,注入基于cookie的会话亲和性等功能。
Ingress 事实上不是一种服务类型。相反,它处于多个服务的前端,扮演着“智能路由”或者集群入口的角色。
Ingress 控制器有各种类型,包括 Google Cloud Load Balancer, Nginx,Contour,Istio,等等。它还有各种插件,比如 cert-manager,它可以为你的服务自动提供 SSL 证书。

//获取Ingress的IP地址
kubectl get ingresses

请求流程如下:
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐