在 Kubernetes 中,服务是一种抽象,用于定义一组 Pod 的访问方式,提供了稳定的网络终结点。服务为应用程序的组件提供了一个统一的入口,使得这些组件之间可以相互发现和通信,而无需了解底层的网络细节。
主要组成部分:
-
Pod:
- Pod 是服务的实际运行单元。Service 将流量负载均衡到 Pod,使得在应用程序升级或扩展时,Pod 的 IP 地址和端口可能发生变化时,服务仍然可以提供稳定的访问方式。
-
Service:
- Service 定义了一组 Pod,并提供一个固定的虚拟 IP 地址和端口,作为对这组 Pod 的入口。Service 可以通过多种方式暴露,如 ClusterIP、NodePort、LoadBalancer 等。
-
Selector:
- Selector 是一个用于标识将包括在服务中的 Pod 的标签选择器。Service 使用标签选择器来匹配关联的 Pod。
-
Endpoint:
- Endpoint 是 Service 后面实际运行的 Pod 的 IP 地址和端口。Endpoints Controller 负责动态更新 Service 的 Endpoint。
Service 类型:
-
ClusterIP:
- 默认类型。在集群内部创建一个虚拟 IP,仅在集群内部可访问。
-
NodePort:
- 在每个节点上绑定一个静态端口,允许从集群外访问 Service。
-
LoadBalancer:
- 在云服务提供商中创建一个外部负载均衡器,自动分配外部 IP,并将流量导向 Service。
-
ExternalName:
- 提供了一个服务的 CNAME 记录,通过这个 CNAME 记录可以访问外部服务,而不是通过 ClusterIP。
创建 Service 的示例:
以下是一个创建 ClusterIP 类型的 Service 的示例 YAML 文件:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
在这个示例中:
-
selector
指定了 Service 匹配的 Pod 的标签选择器。 -
ports
定义了 Service 暴露的端口以及要路由到的目标端口。
创建这个 Service 后,其他 Pod 可以通过 my-service
访问匹配标签选择器的 Pod,而不用关心 Pod 的具体 IP 地址和端口。这种抽象使得服务的维护更加灵活,不受底层 Pod 变化的影响。