service作用: 可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上,实现分布式应用统一入口和负载均衡机制;
注意: pod和service都是kubernetes集群范围内的虚拟概念, 集群外的客户端无法通过podip或service的虚拟ip和虚拟端口访问它们,
为什么需要service:
1.pod的ip地址不可靠
2.容器进行分布式部署, 通过多个实例提供共同服务, 需要在这些实例前面设置一个负载均衡器来实现请求的分发
kubernetes支持两种分发策略:
1.RoundRobin : 默认模式, 轮询模式, 既轮询将请求转发到后端的各个pod上
2.SessionAffinity: 基于客户端ip地址进行会话保持的模式, 可以使用service.spec.sessionAffinity=ClientIP基于客户端会话保持
1)service基本用法
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
labels:
app: nginx
spec:
sessionAffinity: None
selector:
app: nginx
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
#说明: port: 80 name为service name, port 为service port, targetPort为pod容器port, selector是后端pod拥有的label, sessionAffinity: None表示分发策略为RoundRobin
2)service用法: 多端口
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
labels:
app: nginx
spec:
sessionAffinity: None
selector:
app: nginx
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: https
port: 443
protocol: TCP
targetPort: 443
3)service用法: headless service(无头service)
无头service特点:
1. 解析service name返回pod的ip列表, 客户端可以自己觉得那个real server
2. 在statefulset中会为每个pod分配一个dns记录, {pod name}.{service name}
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
labels:
app: nginx
spec:
sessionAffinity: None
selector:
app: nginx
clusterIP: None
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
4)service用法: node port 集群外访问pod
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
labels:
app: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
NodePort: 8888
#注意: NodePort: 8888 可以指定, 也可以不指定