Kubernetes之Service

2021/10/10

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服务暴露的过程

  1. 根据 targetPort 连接Pod要暴露的目标端口
  2. 根据selector选择器,查找带有标签的pod服务
  3. pod 服务会被分配一个ip地址, 这个ip是给服务代理使用的
  4. 服务的选择器会持续的评估,并且结果会被发送到一个Endpoints 对象

注:Endpoints对象若在有selector选择器时会被自动创建,并且 Endpoints的对象的名字 为Service的name

3.虚拟IP和服务代理

每个节点都运行了一个kube-proxy

能摸鱼就很舒服

Show Disqus Comments
扫码关注公众号:纯洁的微笑
发送 290992
即可立即永久解锁本站全部文章