概述
Kubernetes
Service
是集群内部的负载均衡器,它定义了如何将请求路由到一组具有相同功能和标签选择器(label selector)的Pod
上。通过创建Service
资源对象,系统会在集群网络中分配一个固定的IP地址和端口,确保即使后端Pod
发生动态变化(如扩缩容、更新等),对外提供的服务仍保持稳定可用。Service
可以配置为ClusterIP
、NodePort
、LoadBalancer
或ExternalName
等多种类型,以满足不同场景下的服务发现与负载均衡需求,从而实现应用程序间的松耦合及弹性扩展。
基本用法
对容器应用最简便的方式就是通过IP
+端口镜像访问。
yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: webapp
spec:
replicas: 2
template:
metadata:
name: webapp
labels:
app: webapp
spec:
containers:
- name: webapp
image: tomcat
ports:
- containerPort: 8080
创建该RC
bash
# 创建
[root@master1 service]# kubectl apply -f 01.yaml
replicationcontroller/webapp created
获取Pod
的IP
bash
[root@master1 service]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
webapp-hgl2t 1/1 Running 0 2m37s 10.244.166.137 node1 <none> <none>
webapp-nzxwt 1/1 Running 0 2m37s 10.244.166.139 node1 <none> <none>
可以直接通过IP
地址和端口访问Tomcat
服务
curl 10.244.166.13:8080
html
<!doctype html><html lang="en"><head><title>HTTP Status 404 -- Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 -- Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>[
虽然可以通过Pod
的IP
访问服务,但是Pod
的IP
是不稳定的,并且还要有负载均衡。这就要求Pod
前面有一个东西,既能够提供稳定IP
也要有负载均衡功能,这样Service
应运而生。
-
通过命令创建
Service
bash[root@master1 service]# kubectl expose rc webapp service/webapp exposed [root@master1 service]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE webapp ClusterIP 10.10.171.92 <none> 8080/TCP 4s
这样通过该
ClusterIP
就可以访问Pod
提供的Tomcat
服务,并且有负载均衡功能。 -
通过配置文件创建
Service
yamlapiVersion: v1 kind: Service metadata: name: webapp spec: ports: - port: 8081 targetPort: 8080 selector: app: webapp
查看创建的
Service
,生成的端口是8081。port
为Service
端口,targetPort
为Pod
端口。bash[root@master1 service]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE webapp ClusterIP 10.10.212.177 <none> 8081/TCP 2m6s
其访问效果和命令生成的Service一致
Service
提供两种负载均衡策略
RoundRobin
:轮询模式(默认)SessionAffinity
:会话保持模式
多端口Service
一个容器应用可以提供多个端口,例如Tomcat有服务端口和管理端口
yaml
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
ports:
- port: 8080
targetPort: 8080
name: web
- port: 8085
targetPort: 8085
name: management
selector:
app: webapp
创建并查看结果
bash
[root@master1 service]# kubectl apply -f 03.yaml
service/webapp created
[root@master1 service]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
webapp ClusterIP 10.10.85.175 <none> 8080/TCP,8085/TCP 6s
外部服务Service
应用系统需要后端的数据库或者其他ns的集群作为后端服务,这时可以创建一个无Selector的Service
yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
通过该定义创建了一个不带标签的Service
,无法选择后端的Pod
。k8s
不会自动创建Endpoint
,需要手动创建一个同名的Endpoint
。
Kubernetes
中的 Endpoints
资源是一个 API
对象,它存储了与某个 Service
相关联的一组后端 Pod
IP
地址和端口信息。当 Service
使用标签选择器找到匹配的 Pod
后,Endpoints
资源会自动更新以反映这些 Pod
的实际网络端点。
yaml
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: 1.2.3.4
ports:
- port: 80
创建并查看结果
bash
[root@master1 service]# kubectl apply -f 05.yaml
endpoints/my-service created
[root@master1 service]# kubectl get ep
NAME ENDPOINTS AGE
my-service 1.2.3.4:80 2m55s

结语
总结来说,Kubernetes
Services
是其核心的网络概念之一,主要用于定义集群内部的服务发现与负载均衡机制。基本用法包括以下关键步骤:
- 创建
Service
:首先,您需要定义一个Service
YAML
文件,明确服务名称、类型(如ClusterIP
、NodePort
、LoadBalancer
或ExternalName
)、标签选择器以及目标端口映射等属性。一旦应用此配置,Kubernetes
将依据标签选择器自动关联相应的Pods
,并为Service
分配一个稳定的虚拟IP
地址。 - 连接
Pod
:Service
根据定义的标签选择器查找符合要求的Pod
,将其网络端点(IP
和端口)注册到对应的Endpoints
对象中。这样,即便底层的Pod
发生变化,如因扩容或故障转移导致IP
变动,Service
仍能确保流量被正确转发至可用的Pod
。 - 访问服务:应用内的其他组件可以通过环境变量、
DNS
解析或直接使用Service
的Cluster
IP
和端口进行通信。对于外部访问,可通过NodePort
或LoadBalancer
类型Service
映射到节点的端口,使外部客户端能够连接到集群内部的服务。
总之,Kubernetes
Services
在简化服务发现、保障服务高可用性、实现灵活的负载均衡策略等方面发挥着至关重要的作用,极大地提升了云原生应用的管理和运维效率。