Service 是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口。借助 Service,应用可以方便的实现服务发现与负载均衡。
Service 通过标签来选取服务后端。这些匹配标签的 Pod的IP和端口列表组成 endpoints。
Service 支持四种类型:
- ClusterIP 默认,自动分配一个仅内部可以访问的虚拟 IP
- NodePort 为 Service 在每台机器上绑定一个端口,通过
NodeIP:NodePort
来访问 - LoadBalancer 借助 cloud provider 创建一个外部的负载均衡器实现
- ExternalName 将服务通过 DNS CNAME 记录方式转发到指定的域名
Service 支持三种类型的协议:
- TCP
- UDP
- SCTP
Kubernetes 最主要的哲学之一,是用户不应该暴露那些能够导致他们操作失败、但又不是他们的过错的场景。为了使用户能够为他们的Service选择一个端口号,我们必须确保不能有2个Service发生冲突,Kubernetes 通过为每个 Service 分配它们自己的 IP 地址来实现,即全局唯一的ClusterIP。
Service访问集群内部服务的方法:
apiVersion: v1
kind: Service
metadata:
labels:
run: nginx
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
selector:
run: nginx
sessionAffinity: None
type: ClusterIP
Service访问集群外部服务的方法,支持两种:
- 自定义 Endpoints。 创建 Service 的时候,不指定 selector。创建与 service同名的 endpoints,在 endpoints 中设置外部服务的 IP 和端口
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
name: http
---
kind: Endpoints
apiVersion: v1
metadata:
name: my-service
subsets:
- addresses:
- ip: 1.2.3.4
ports:
- port: 9376
- DNS 转发。 在 service 中指定 externalName,该服务不会被分配 Cluster IP,需要通过 service 的 DNS 来访问
kind: Service
apiVersion: v1
metadata:
name: my-service
namespace: default
spec:
type: ExternalName
externalName: my.database.example.com
集群外部服务访问Service的方法:
-
NodePort
-
Ingress Controller
-
Load Balancer
-
Custom Load Balancer
网友评论