详解kubernetes五种暴露服务的方式
部署完服务终将是为了访问,那么kubernetes
中service
和ingress
都可以将集群内部的服务能够支持外部访问。service
可以让一组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”)提供功能;ingress
通过对集群中服务的外部访问进行管理,也可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
概述
这里说明如何将k8s内部服务暴露给外部服务访问的方式,宏观来说有五种,而k8s官网上讲解的是4+1种,这里探讨服务的暴露方式,而不是service
和ingress
的区别,分别是
ClusterIP
NodePort
LoadBalancer
ExternalName
Ingress
ClusterIP
介绍
ClusterIP
,顾名思义,集群IP。它的作用就是为了能够让其所属Pod能够负载均衡且需要有一个虚拟IP(VIP)提供给IPtables
。由于VIP没有挂接到网络设备,所以不能直接访问。
ClusterIP
是Service
的默认类型,如果没有指定Service
的type
,默认就是ClusterIP
典型的ClusterIP 服务的配置文件示例
apiVersion: v1
kind: Service
metadata:
name: my-internal-service
spec:
type: ClusterIP
selector:
app: mynginx
ports:
- name: http
protocol: TCP
port: 80
NodePort
介绍
如果想要让服务可以在k8s外部访问。NodePort
最原始的方式。还是使用图的方式来说明
NodePort
会在所有节点(图示中的VM)上开放一个特定端口(图示中的30007),任何发送到该端口的流量都被转发到对应服务(图示中的Service)
典型的NodePort 服务的配置文件示例
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
## 当type为NodePort时,如果不指定nodePort的值,系统将选择一个随机端口。大多数时候应该让k8s来选择端口,用户自己来选择可用端口代价太大
nodePort: 30007
使用场景
这种方式有两个缺点:
- 每个端口只能是一种服务
- 端口范围只能是 30000-32767(k8s规定)
所以在生产环境上不推荐使用这种方式暴露服务。更多的是在demo应用或临时应用上使用这种方式
LoadBalancer
介绍
LoadBalancer 服务是暴露服务到因特网的标准方式。如在GKE(Google Kubernetes Engine) 上,会启动一个Network Load Balancer[2],它将跟你一个单独的IP地址。所有通往指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,如 HTTP,TCP,UDP,Websocket,gRPC 或其它种类
使用场景
此方式最大的缺点是,每一个用LoadBalancer
暴露的服务都需要付费
ExternalName
介绍
ExternalName可以通过返回 CNAME
记录和对应值,实现在kubenetes集群内部调用外部的服务。并且不用创建代理。
使用场景
希望在Kubernetes集群内,调用外部的服务。如DB、没迁移到Kubernetes上的应用。使用ExternalName
面向的场景大多是临时调用,建议使用完后,删除或恢复为原配置
Ingress(envoy)
介绍
Ingress其实并不是一种服务类型,也就是说它并不是服务(Service
),也和Service
中Type
属性无关。但它可以充当集群的入口点,它可以将路由规则整合到一个资源中,并扮演“智能路由”的角色。
但是这种图比较不容易理解。举一个常见的例子,实现外网的流量根据不同的路由地址会转发到不同的service
上
公网IP为175.137.133.21
,设定的规则如下:
- 外网路由
175.137.133.21:443/order
映射到内网192.168.1.100:80
- 外网路由
175.137.133.21:443/logistics
映射到内网192.168.1.110:80
- 外网路由
175.137.133.21:443/goods
映射到内网192.168.1.120:80
当然也可以用 Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能力。
使用场景
Ingress 可能是暴露服务的最强大方式,但同时也是最复杂的。Ingress 控制器有各种类型,包括 Google Cloud Load Balancer, Nginx,Contour,Istio等等。
如果想要使用同一个 IP 暴露多个服务,这些服务都是使用相同的七层协议,那么Ingress 就是最有用的。同时Ingress还支持很多特性,如 SSL、认证等