service

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 可以指定, 也可以不指定
posted @ 2019-07-26 17:18  你很棒  阅读(464)  评论(0编辑  收藏  举报