美文网首页
k8s Service

k8s Service

作者: quanCN | 来源:发表于2021-11-06 17:03 被阅读0次

简介

Service是Kubernetes实现微服务架构的核心概念
通过Servic的定义,能够为客户端应用提供稳定的访问地址(域名或IP地址)和负载均衡功能,以及屏蔽后端EndPoint的变化,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载均衡分发到后端的各个容器应用上

yaml

apiVersion: v1
kind: Service
#元数据
metadata:
  #Service名称
  name: string
  #命名空间,不指定时默认为default命名空间
  namespace: string
  #自定义标签属性列表  
  labels:   
    - name: string
  #自定义注解属性列表  
  annotations:
    - name: string
#详细描述 
spec:
  #定义 NodePorts 是否会自动分配给 LoadBalancer 类型的服务,默认值为“真”
  allocateLoadBalancerNodePorts: bool
  #ClusterIP是分配给此服务的IP地址列表,通常随机分配,当为None时为headless service(无头服务)
  clusterIP: string
  #ClusterIPs 是分配给此服务的IP地址列表,通常随机分配
  clusterIPs: []string
  #externalIPs是一个 IP地址列表,集群中的节点也将接受此服务的流量。这些IP不是由Kubernetes管理的,用户负责确保流量到达具有此 IP 的节点
  externalIPs: []string
  #当type=ExternalName时,将服务映射到 DNS 名称
  externalName: string
  #externalTrafficPolicy 表示此服务是否希望路由外部到节点本地或集群范围端点的流量 Local/Cluster
  externalTrafficPolicy: string
  #healthCheckNodePort 指定服务的健康检查节点端口。这仅适用于类型设置为 LoadBalancer 和 externalTrafficPolicy 设置为本地。
  healthCheckNodePort: integer
  #InternalTrafficPolicy 指定集群内部流量是否应该仅路由到所有端点或节点本地端点 Local/Cluster
  internalTrafficPolicy: string
  ipFamilies: []string
  ipFamilyPolicy: string
  #type=LoadBalancer,指定标签样式标识符
  loadBalancerClass: string
  #type=LoadBalancer,指定ip
  loadBalancerIP: string
  #通过云供应商负载均衡器将被限制在指定的客户端 IP
  loadBalancerSourceRanges: []string
  #Label Selector配置,选择具有指定label标签的pod作为管理范围
  selector: []
  #service的类型,指定service的访问方式,默认ClusterIP
  type: string
  #是否支持session,可选值为ClietIP,默认值为空
  #ClientIP表示将同一个客户端(根据客户端IP地址决定)的访问请求都转发到同一个后端Pod
  sessionAffinity: string
  #service需要暴露的端口列表  
  ports:  
    #端口名称
  - name: string
    #端口协议,支持TCP或UDP,默认TCP
    protocol: string
    #服务监听的端口号
    port: integer
    #需要转发到后端的端口号
    targetPort: integer
    #当type=NodePort时,指定映射到物理机的端口号
    nodePort: integer
status:  
  #当前服务状态
  conditions: 
  - lastTransitionTime: string
    message: string
    observedGeneration: integer
    reason: string
    status: string
    type: string
  #外部负载均衡器
  loadBalancer:  
    #外部负载均衡器 
    ingress:
      #主机名是为基于DNS的负载均衡器入口点设置的
    - hostname: string
      #外部负载均衡器的IP地址
      ip: string
      #外部负载均衡器的机主机
      hostname: string
  • spec.type
    service的类型,指定service的访问方式,默认ClusterIP
    • ClusterIP
      虚拟的服务ip地址,用于k8s集群内部的pod访问,在Node上kube-porxy通过设置的iptables规则进行转发
    • NodePort
      使用宿主机端口,能够访问各Node的外部客户端通过Node的IP和端口就能访问服务器
    • LoadBalancer
      使用外部负载均衡器完成到服务器的负载分发,需要在spec.status.loadBalancer字段指定外部负载均衡服务器的IP,并同时定义nodePort和clusterIP用于公有云环境
    • ExternalName
      通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com),无需创建任何类型代理

Service的负载均衡机制

从服务IP到后端Pod的负载均衡机制,则是由每个Node上的kube-proxy负责实现的

kube-proxy的代理模式

  • userspace模式
    用户空间模式,由kube-proxy完成代理的实现,效率最低,不再推荐使用

  • iptables模式
    v1.2起默认为iptable,kube-proxy通过设置Linux Lernel的iptables规则,实现从Service到后端EndPoint列表的负载分发规则,效率很高。但是如果某个endpoint不可用,客户端就会得到失败的响应,相对userspace模式来说更不可靠。此时应该通过为Pod设置readinessprobe(服务可用性健康检查)来保证可用性

  • ipvs
    Kubernetes v1.8.0-beta.0 中,添加了ipvs代理
    这种模式,kube-proxy会监视Kubernetes Service对象和Endpoints,调用netlink接口以相应地创建ipvs规则并定期与Kubernetes Service对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod。
    与iptables类似,ipvs基于netfilter 的 hook 功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如:

    • rr:轮询调度
    • lc:最小连接数
    • dh:目标哈希
    • sh:源哈希
    • sed:最短期望延迟
    • nq: 不排队调度

    :当kube-proxy以ipvs代理模式启动时,kube-proxy将验证节点上是否安装了IPVS模块,如果未安装,则kube-proxy将回退到iptables代理模式。

  • kernelspace模式
    windows server上的代理模式

相关文章

网友评论

      本文标题:k8s Service

      本文链接:https://www.haomeiwen.com/subject/fvujzltx.html