概要
将服务暴露给外部的方式主要有三种:
- NodePort
- LoadBalancer
- 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 应用,或者某些临时应用。
缺点:
- 每个端口只能是一种服务
- 端口范围只能是 30000-32767
- 如果节点/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
请求流程如下: