Service 的基本定义
Service 是 Kubernetes 中用于定义 Pod 网络访问接口的资源。它允许你以一种稳定的方式访问一组 Pod,而无需关心这些 Pod 的具体位置和数量的变化。Service 提供了一个固定的网络接口,使得对 Pod 的访问更加可靠和灵活。
Service 的主要作用
稳定访问:Service 为一组 Pod 提供一个稳定的 IP 地址和端口,即使 Pod 的数量和 IP 地址发生变化,Service 的访问地址保持不变。
负载均衡:Service 可以将进入的流量均匀地分发到后端的 Pod 上,实现负载均衡,提高应用的可用性和扩展性。
服务发现:Service 为应用提供了服务发现机制,使得应用之间可以通过 DNS 名称或 IP 地址相互访问。
跨命名空间访问:Service 可以将不同命名空间中的 Pod 组合成一个逻辑服务,实现跨命名空间的访问。
使用网络策略:通过配置 Service 的网络策略,可以限制访问 Service 的客户端的 IP 范围或来源等条件,增强安全性。
Service 的类型
ClusterIP:默认类型,只在集群内部可用,用于集群内部的通信。
NodePort:在每个节点上开放一个端口,允许外部访问集群内的服务。
LoadBalancer:在云平台上创建一个负载均衡器,提供一个外部可访问的 IP 地址。
ExternalName:通过 CNAME 记录将服务映射到外部服务的地址,通常用于访问集群外部的服务。
类型 | 使用场景 | 访问范围 | 特点 |
---|---|---|---|
ClusterIP | 集群内部通信、内部负载均衡 | 集群内部 | 自动分配虚拟 IP,仅在集群内部可用,简单高效 |
NodePort | 小型集群、测试环境、简单外部访问 | 集群外部 | 在每个节点上开放端口,外部通过 <NodeIP>:<NodePort> 访问 |
LoadBalancer | 生产环境、复杂外部访问需求 | 集群外部 | 自动创建负载均衡器和外部 IP,高可用性和可扩展性 |
ExternalName | 访问外部服务、服务发现 | 集群内部 | 将外部服务映射为 DNS 名称,不与 Pod 通信,简化服务发现 |
Service 的 YAML 字段解析
以下是一个典型的 Service YAML 配置文件的结构及其字段解析:
type: ClusterIP 类型的 Service (所有类型都可以)也可以通过服务的主机名(DNS 名称)在集群内部进行访问。Kubernetes 会为每个 Service 自动创建一个 DNS 名称,通常格式为 ..svc.cluster.local。你可以通过这个 DNS 名称来访问 Service,而不需要知道其具体的 IP 地址。
以上的service在集群内部的主机名则是:
my-service.default.svc.cluster.local
在上一节的 Pod 部分中,我们编写并部署了一个 Nginx Pod,并通过端口转发的方式进行了访问。
kubectl port-forward pod/nginx-pod 8080:80
这种方法仅适用于临时或测试场景,因为它依赖于特定的端口和 Pod 的 IP 地址,不利于长期的生产环境使用。接下来,我们可以创建一个 type: NodePort 的 Service,这样就可以通过集群中任意节点的 IP 地址和指定的端口来访问我们的服务。
访问的方式如下:
http://k8s-node1:30007
如果不指定nodePort: 30007的具体端口号,则会在范围内自动随机一个端口。我们可以使用下面的命令来查看Service的端口和对应的Pod。
kubectl get service -n default
对于 LoadBalancer 和 ExternalName 类型的 Service 本篇文章暂时不适合深入,当遇到合适的场景后才会补充这部分内容。
欢迎大家关注我的公众号,将会为大家推荐更优质的内容!