总览
Kubernetes中Service一共包含4种类型,ClusterIP、NodePort、LoadBalancer、ExternalName。Service配置文件中Type定义了服务如何暴露给外部。
1.ClusterIP-集群IP
- ClusterIP 是默认且最常见的服务类型。
- Kubernetes 将为 ClusterIP类型的服务分配一个集群内部 IP 地址,只能在集群内访问。
- 不能从集群外部向服务发出请求。
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: nginx
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
2.NodePort-节点端口
- NodePort类型的Service是 ClusterIP类型Service的扩展,自动创建路由到ClusterIP。
- NodePort类型的Service会在每台节点上开设一个端口,外部流量访问每个节点上的这个端口,将流量导入到该服务。
- 您可以通过请求 <NodeIP>:<NodePort> 从集群外访问NodePort 服务。
- NodePort默认30000–32767 范围内。
- 如果您要手动指定端口,请确保该端口未被使用。
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: nginx
port: 80
protocol: TCP
targetPort: 80
nodePort: 300001(可以手动指定)
selector:
app: nginx
type: NodePort
3.LoadBalancer-外部负载均衡器
- LoadBalancer 服务是 NodePort 服务的扩展。自动创建外部负载均衡器路由到的 NodePort 和 ClusterIP 服务。
- 使用云提供商的负载均衡器在外部公开服务。
- 每个云提供商(AWS、Azure、GCP 等)都有自己的本地负载均衡器实现。云提供商将创建一个负载均衡器,然后自动将请求路由到您的 Kubernetes 服务。
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
clusterIP: 10.0.171.145
loadBalancerIP: 111.111.111.111
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
4.ExternalName-外部名称
- ExternalName 类型的服务将服务映射到 DNS 名称,而不是典型的选择器,例如 nginx。
- 您使用 spec.externalName 参数指定这些服务。
- 它将服务映射到 externalName 字段的内容(例如 foo.bar.example.com),方法是返回一条 CNAME 记录及其值。
apiVersion: v1
kind: Service
metadata:
name: db
spec:
type: ExternalName
externalName: my.database.example.com