K8S-Service
Service 是一个定义了一组Pod的策略的抽象。 这些被服务标记的Pod都是(一般)通过label Selector决定的 。
对于Kubernete原生的应用,Kubernete提供了一个简单的Endpoints API,这个Endpoints api的作用就是当一个服务中的pod发生变化时,Endpoints API随之变化,对于哪些不是原生的程序,Kubernetes提供了一个基于虚拟IP的网桥的服务,这个服务会将请求转发到对应的后台pod。
1.Service定义
apiVersion: v1
kind: Service
metadata:
namespace: zd
name: zd-service
spec:
selector:
app: zd
#ClusterIP(默认): 分配一个集群内部 IP 地址,用于对端点进行负载平衡。
#NodePort: 建立在 ClusterIP 之上,并在每个节点上分配一个端口,该端口路由到与 clusterIP 相同的端点。
#LoadBalancer: NodePort 上并创建一个外部负载均衡器
#ExternalName: 将此服务别名为指定的 externalName。
type: NodePort
#服务的 IP 地址,通常是随机分配的。 如果一个地址是手动指定的.
#type:ExternalName(要求此字段为空)
clusterIP: None
#此服务公开的端口列表
ports:
#此服务将公开的端口。
- port: 80
#此端口的 IP 协议。 支持“TCP”、“UDP”和“SCTP”。 默认为 TCP
protocol: TCP
#要在服务所针对的 pod 上访问的端口的编号或名称。 号码必须在 1 到 65535 的范围内。名称必须是 IANA SVC NAME
targetPort: 80
#服务中此端口的名称。 这必须是 DNS_LABEL。 ServiceSpec 中的所有端口都必须具有唯一的名称。
#在考虑服务的端点时,这必须与 EndpointPort 中的“名称”字段匹配。 如果仅在此服务上定义了一个 ServicePort,则可选。
name: a
#当 type 为 NodePort 或 LoadBalancer 时,此服务在其上公开的每个节点上的端口
nodePort: 80
#用于维护会话亲缘关系。 启用基于客户端 IP 的会话亲缘关系。
#ClientIP: 确保每次都将来自特定客户端的连接传递到同一个 Pod
#None(默认)
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
#指定ClientIP 类型会话粘滞时间的秒数(当sessionAffinity:ClientIP)
timeoutSeconds: 10800
2.Service服务暴露的过程
- 根据 targetPort 连接Pod要暴露的目标端口
- 根据selector选择器,查找带有标签的pod服务
- pod 服务会被分配一个ip地址, 这个ip是给服务代理使用的
- 服务的选择器会持续的评估,并且结果会被发送到一个Endpoints 对象
注:Endpoints对象若在有selector选择器时会被自动创建,并且 Endpoints的对象的名字 为Service的name
3.虚拟IP和服务代理
每个节点都运行了一个kube-proxy
能摸鱼就很舒服
Show Disqus Comments
扫码关注公众号:纯洁的微笑
发送 290992
即可立即永久解锁本站全部文章