Service
- Service 通过 label 关联对应的 Pod
- Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
- 提供了负载均衡功能,自动转发流量到不同 Pod
- 可对集群外部提供访问端口
- 集群内部可通过服务名字访问
创建 Service
kubectl apply -f service.yamlkubectl get svc
内部访问 Service
服务的默认类型是ClusterIP
,只能在集群内部访问,我们可以进入到 Pod 里面访问:
kubectl exec -it pod-name -- bash
curl http://test-k8s:8080
如果你是用 minikube,因为是模拟集群,你的电脑并不是节点,节点是 minikube 模拟出来的,所以你并不能直接在电脑上访问到服务
外部访问 Service
如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):
kubectl port-forward service/test-k8s 8888:8080
如果你用 minikube,也可以这样
minikube service test-k8s
来将service暴露到外部
K8S中的四种端口号:
-
containerPort
:容器内部进程使用的端口 -
Port
:为service在clusterIP上暴露的端口 -
targetPort
:容器映射在pod上的端口 -
nodeport
:将端口映射到宿主机上,提供外部流量访问K8S集群中service的入口
对外暴露服务
上面我们是通过端口转发的方式可以在外面访问到集群里的服务,如果想要直接把集群服务暴露出来,我们可以使用NodePort
和 Loadbalancer
类型的 Service
。
apiVersion: v1
kind: Service
metadata:name: test-k8s
spec:selector:app: test-k8s# 默认 ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)type: NodePortports:- port: 8080 # 本 Service 的端口targetPort: 8080 # 容器端口nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767
Loadbalancer
也可以对外提供服务,这需要一个负载均衡器的支持,因为它需要生成一个新的 IP 对外服务,否则状态就一直是 pendding
,这个很少用了,后面我们会讲更高端的 `Ingress 来代替它。
多端口暴露服务
apiVersion: v1
kind: Service
metadata:name: test-k8s
spec:selector:app: test-k8stype: NodePortports:- port: 8080 # 本 Service 的端口name: test-k8s # 必须配置targetPort: 8080 # 容器端口nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767- port: 8090name: test-othertargetPort: 8090nodePort: 32000
EndPoint
EndPoint 就是将 Pod 的 IP 和端口对应起来,这样 Service 才能找到 Pod。
apiVersion: v1
kind: Endpoints
metadata:name: test-k8s
subsets:- addresses:- ip: 10.244.1.10ports:- port: 8080
- 一个或多个subset对象,每个subset中包含一组IP地址和端口号的列表。不同的subset可以根据Label Selector将后端Pod进行分类。
- addresses:一个IP地址列表,表示属于该Endpoint的Pod的IP地址。
- ports:一个端口号列表,表示属于该Endpoint的Pod所开放的端口号
- 每个subset都包含一个或多个address和ports,表示一个或多个Pod的IP地址和端口号。
- 通过使用Endpoint资源对象,Kubernetes可以动态地管理后端Pod实例的地址和端口信息。
这样,当后端Pod的数量发生变化、新的Pod加入或旧的Pod删除时,Kubernetes会及时更新Endpoint中的信息,保持负载均衡和流量路由的正确性。
总结来说,Endpoint是Kubernetes中用于关联Service与后端Pod实例
的资源对象,存储了一组IP地址和端口号
的列表。
总结service 类型 yaml中通过type指定
ClusterIP
默认的,仅在集群内可用
NodePort
暴露端口到节点,提供了集群外部访问的入口
端口范围固定 30000 ~ 32767
LoadBalancer
需要负载均衡器(通常都需要云服务商提供,裸机可以安装 METALLB 测试)
会额外生成一个 IP 对外服务
K8S 支持的负载均衡器:负载均衡器
Headless
适合数据库
clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP,通过 DNS 解析获取,以Pod名为DNS